problemi i2c e comunicazione seriale tra 2 arduino

ciao a tutti
in questi giorni stavo provando a utilizzare la connessione i2c fra due arduini:leonardo (master) e uno (slave)
c'è qualcosa che non va mi sapreste aiutare?
grazie mille

//MASTER
#include <Wire.h>

int x=1;

void setup()
{
  Wire.begin(); //inizializza la libreria wire come master
  Serial.begin(9600);
}

void loop()
{
  delay(500);
  Serial.println("AVVIA");
  /* invio sul bus i2c di un byte al device che ha come indirizzo 
     il valore 0x04*/
  // avvio transmissione
  Wire.beginTransmission(0x04);
  //invio di un byte
  Wire.write(x);
  //chiude la transmissione
  Wire.endTransmission();
  delay(10);
  x=x+1;
}
//SLAVE
#include <Wire.h>
int x=0;

void setup()
{
  // inizializzo la libreria
  // imposto l'indirizzo dello slave
  Wire.begin(0x04);
  //eventi per la ricezione del dato
  //e per la richiesta del dato
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent); 
  Serial.begin(9600);
}

void loop()
{
  Serial.println(x);
}

void receiveEvent(int data)
{
  // questo evento è generato quando sul bus 
  // è presente un dato da leggere
  // eseguo la lettura
  x=Wire.read();
  
}

void requestEvent()
{
  // questo evento viene generato quando il master
  // richiede ad uno specifico slave 
  // una richiesta di dati
  // spedisco il dato al master
  Wire.write(x);
}

grazie a tutti :slight_smile:

c'è qualcosa che non va

Cos'é di preciso quel "qualcosa che non va"?
Ciao Uwe

nn saprei cosa non va i programmi li carica quindi non ci sono errori di lettura ma lo slave dovrebbe stampare su seriale i numeri che il master gli invia ma stampa sempre e solo 0

leggi questo link e prova quello che è scritto.. http://www.gammon.com.au/forum/?id=10896
A me tempo fa ha funzionato...

qua dice di collegare la porta analogica 4 e cinque di un arduino con rispettivamente la porta 4 e 5 dell'altro
io collegavo la 4 con l'sda e la 5 con scl sbagliavo?

Si perchè non è un RX-TX.. ma un pin serve per i dati e l' altro pin per il clock.
Se leggi quella pagina, ti spiegherà anche come funzioan l' I2C.

ciao

ok grazie mille :slight_smile:

ok l'ho guardato e ho continuato a provare ma non riuscivo a concludere niente quindi ho provato a utilizzare la connessione seriale ma (come era logico) non sono riuscito a concludere nulla.
ho provato sia utilizzando la seriale "normare" pin 0 e 1 sia utilizzzando software serial ma con software serial ottengo sempre valori ripetitivi (485 495 505 515 525 535 545 555 565 575 485 ...) mentre utilizzando i pin 0 e 1 sempre -1 mi puoi aiutare?

Aspetta.. inanzi tutto... cosa vorresti fare esattamente ?
Cosa non ti riusciva con i2c ?

praticamente io ho costruito un robottino che segue la luce e evita gli ostacoli (ancora da finire la programmazione) e visto che ho 2 arduini volevo farli comunicare per poter mettere anche un lcd e avere qualche pin libero per eventuali necessità future.
con il protocollo i2c non so bene che errori avessi semplicemente come ho messo i vari programmi nel primo post con l'arduino leonardo (che sarebbe il master e controlla i motori e il semsore di prossimità) invii dei dati mentre lo slave (arduino uno) in base a quello che riceve scrive sul lcd ( per esempio che vede l'ostacolo,il task avviato... ancora non so bene cosa fare) il problema è che lo slave non riceve questi dati e vedendo che non ci riuscivo pensavo " la seriale mi pare più facile proviamo quella" ma mi sbagliavo e ho già scritto cosa ottenevo.
poi in giro su internet ci sono + versioni del protocollo i2c che cambiano sia con i pin utilizzati sia con il programma e dopo aver provato tutti i vari tutorial che trovavo(o almeno credo) in italiano (con l'inglese invece faccio abbastanza a pugni).
ho provato anche a seguire la guida che mi hai scritto ma non ci capisco molto (anche per l'inglese)
sinceramente mi piace di più il protocollo i2c ma se prorpio non riesco mi "accontenterò" della seriale o di qualsiasi altro metodo di comunicazione
grazie mile per le risposte, x il tuo tempo e per il tuo aiuto :slight_smile:

Ok.. abbi solo un po' di pazienza perchè sono ko con la febbre.

si si tranquillo non preoccuparti so cosa vuol dire e grazie x l'aiuto nonostante tutto :slight_smile:
ti auguro di guarire presto :slight_smile:

Ok.. adesso sono in forze... se vuoi proviamo con l' I2C.
Dimmi se vuoi provare... ed eventualmente domani iniziamo i test..
Inanzi tutto, collega come da schema di Nick Gammon i due arduino... e dimmi quando hai fatto.

ok stasera non riesco perchè ho dei problemi con il computer e vorrei risolverli domani appena posso faccio tutto :slight_smile:

fatto solo che nell'arduino leonardo anzichè usare le porte analogiche 4-5 ho usato 2-3 (c'è scritto nell'esempio del protocollo i2c e nell'arduino playground che nell'arduino leonardo le porte sono diverse)

Non hai un altro UNO al posto del leonardo ? Cosi andiamo a piccoli step...

no solamente una uno e una leonardo

ok.. quindi hai collegato i pin SDA-->SDA e SCL-->SCL
Hai collegato i due pin GND (GND dell'UNO e GND del Leonardo) tra di loro ?

praticamente nella breadboard ho collegato i pin e trammite una resistenza da 4,7k ai 5V e poi ho collegato i GND dei due arduino

una resistenza per pin ovviamente