Arduino e I2C

Ciao a tutti!
Premetto che sono nuovo, e che le mie esperienze relative ad arduino e alla programmazione sono basiche... Stavo cercando di capire come usare il protocollo i2c, ma navigando sui vari forum (sicuramente ho sbagliato siti...) e vedendo i vari playground sul sito di arduino ci capisco poco... esempio stupido: se voglio usare due arduino, collegati tramite i2c , in modo che premo il bottone su uno, e si accende il led sull l'altro, come faccio a indirizzarli?? Sul sito gplab: Arduino con accelerometro KXPS5 si capisce che i device hanno già dei loro indirizzi, mi sbaglio? come faccio a capire che indirizzi usare? Oppure li devo definire io in programmazione? quindi, devinisco che l'ingresso digital 1 è l'indirizzo 0x00??? Grazie a tutti, e scusate la domanda stupida!

ciao,
facendo riferimento qua: I²C - Wikipedia

L'I2C e' 1 architettura master - slave: c'e' 1 master (l'arduino) e degli slave, periferiche (nel tuo es. l'accelerometro). Questi devono avere degli indirizzi per far si che il master sappia "con chi parlare".
Come hai detto te, le device in genere hanno un loro indirizzo, di cui si puo' anche (a volte) cambiare alcuni bit, per averne piu' sullo stesso bus.

Nel caso di 2 arduini collegati in I2C su quello "slave" dovrai caricare un firmware che lo configuri come periferica I2C. E credo sia li' che definirai il suo indirizzo. Per il master, la liberia wire (se non erro) di arduino dovrebbe fare tutto.

Ultima cosa:

quindi, devinisco che l'ingresso digital 1 è l'indirizzo 0x00???

Qui non ho capito che vuoi dire, cmq su arduino i pin per l'I2C sono gia' definiti (se si vuole usare il modulo I2C hardware dell'arduino) su 2 dei pin analogici - ora non ricordo quali, ma cerca SDA e SCL sul pin reference dell arduino.

spero ti aiuti

C

guarda negli esempi della libreria wire trovi i due programmini per trasmettere i dati uno per il master e uno per lo slave, poi con un semplice "if " controlli i dati ricevuti e accendi il led se la striga ricevuta corrisponde a quella impostata

Ciao!
Primo grazie per la cortese e rapida risposta!

Secondo, vediamo se ho ben capito... Essendo che vorrei fare pratica, vorrei quindi usare 2 arduino da collegare in i2c, su uno metto un bottone, sull'altro faccio accendere il led alla pressione del bottone.

Ora, l'arduino che avrà il bottone sarà configurato come slave_sender (come esempio già presente in arduino) e l'altro Arduino, con il led, come Master_reader. Giusto?

Ora, nel mio slave definirò un indirizzo , quindi, per esempio :

Wire.begin(1)

ora il mio master, per andare a interrogare lo slave , dovrà farlo interrogando con :

Wire.requestFrom(address, quantity)

l'address 1 , è corretto?

Grazie, e scusate, sò bene che per molti di voi saranno banalità!!!

giusto

ok! stasera provo! domani vi dico!!

Ciao a tutti, allora, ho programmato i due arduino, da Hyperterminal vedo che invia ALTO oppure BASSO, ma il led rimane sempre acceso, dove sbaglio?? Allego i due firmware :


// Master reader button

#include <Wire.h>
int ledPin = 13 ;
char myChar = 'ALTO ';
void setup()
{
Wire.begin();
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // start serial for output
}

void loop()
{
Wire.requestFrom(2, 6);

while(Wire.available())
{
char c = Wire.receive();
Serial.print(c);

if (c == myChar )
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}

}

delay(500);
}


// Slave sender button

#include <Wire.h>
int inPin = 8 ;
void setup()
{
Wire.begin(2);
Wire.onRequest(requestEvent);
pinMode(inPin,INPUT);
}

void loop()
{
delay(100);
}

void requestEvent()
{
if (digitalRead(inPin) == HIGH)
{
Wire.send("alto ");
}
else
{
Wire.send("basso ");
}
}

Ho provato anche a usare come uscita per il pin il pin 3, ma si comporta nello stesso modo. In pratica lampeggia esattemente come il led di TX

possibile le maiuscole?
invii alto
ma devi ricevere ALTO
non so, se sbaglio correggetemi

ho provato a utilizzare sia maiuscole che minuscole, ma non cambia. Altra cosa curiosa è che se inverto le modalità, quindi led in high quando lo stato è basso il led rimane sempre acceso

ho provato a utilizzare sia maiuscole che minuscole, ma non cambia. Altra cosa curiosa è che se inverto le modalità, quindi led in high quando lo stato è basso il led rimane sempre acceso

ho provato a utilizzare sia maiuscole che minuscole, ma non cambia. Altra cosa curiosa è che se inverto le modalità, quindi led in high quando lo stato è basso il led rimane sempre acceso

come hai collegato i due arduini?

solo con scl e sda, senza resistenza di pull-up. Potrebbe essere quello?

no manca la massa in comune

funziona?

no, anche con massa comune non funziona... :frowning:

hai provato i due sketch di prova?
con me i primi 2 byte sono illeggibili allora aggiungo una trasmissione di due byte che leggo ma non uso perchè mi escono random

cmq per l'I2C ci vogliono anche 2 resistenze di pullup, almeno mi pare
4k7 o giu' di li'...

spero di riuscire a provare stasera