problemi i2c e comunicazione seriale tra 2 arduino

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

Aspetta... intanto le resistenze le puoi togliere.. per adesso non sono indispensabili ...
Salta la breadboard e collega direttamente con i cavi i pin dei due arduino.

Poi sullo slave (penso il leonardo) fai girare questo sketch.

// Written by Nick Gammon
// February 2012

#include <Wire.h>

const byte MY_ADDRESS = 42;

#define BETA_ARDUINO ARDUINO < 100

void setup () 
{
  Wire.begin (MY_ADDRESS);
  for (byte i = 2; i <= 7; i++)
    pinMode (i, OUTPUT);
  Wire.onReceive (receiveEvent);
}  // end of setup

void loop() 
{
// nothing in main loop
}

// called by interrupt service routine when incoming data arrives
void receiveEvent (int howMany)
 {
  while (Wire.available () > 0)
  {
    byte c;
#if BETA_ARDUINO    
    c = Wire.receive ();
#else
    c = Wire.read ();
#endif 
    // toggle requested LED
    if (digitalRead (c) == LOW)
      digitalWrite (c, HIGH);
    else
      digitalWrite (c, LOW);
  }
}  // end of receiveEvent

caricato visto che uso l'arduino uno come slave l'ho caricato su quello

ok
Ora carica questo sketch sul master.

// Written by Nick Gammon
// February 2012

#include <Wire.h>

const byte SLAVE_ADDRESS = 42;
const byte LED = 13;

#define BETA_ARDUINO ARDUINO < 100

void setup () 
{
  Wire.begin ();
  pinMode (LED, OUTPUT);     
}  // end of setup

void loop () 
{

  for (int x = 2; x <= 7; x++)
    {  
    Wire.beginTransmission (SLAVE_ADDRESS);
#if BETA_ARDUINO    
    Wire.send (x);
#else
    Wire.write (x);
#endif
    if (Wire.endTransmission () == 0)
      digitalWrite (LED, HIGH); 
    else
      digitalWrite (LED, LOW); 
      
    delay (200);
    }
}  // end of loop

Quindo lo farai partire si dovrebbe vedere il led dello slave accendere.

Riesci a fare una foto dei collegamenti e postarla?

ok ho caricato
il led 13 si accende subito indipendentemente che i cavi siano collegati o no e se attacco un led esterno quest'ultimo non si accende e si spegne alche quello interno all'arduino uno.
per la foto non so se riesco a metterla comunque posso provare ma i due arduini sono montati su un robot ed è tuto abbastanza incasinato tra fili e roba varia quindi non so se ti può servire a qualcosa
vuoi lo stesso che provo a fare delle foto?