Comunicazione I2C tra due arduino
Questo progetto serve a spiegare a neofiti (come me), come si fa a collegare in modo semplice e veloce 2 schede arduino o anche due microcontrollori qualsiasi che hanno a disposizione le porte I2C. Nell'esempio che propongo accenderò un led collegato ad una scheda con la pressione di pulsante su l'altra scheda.
Descrizione
Materiale occorrente:
2 resistenze da 4,7kohm
2 resistenze da 10k ohm
1 led
1 button switch
2 schede arduino uno
_______________________________
Lo schema sopra è stato sviluppato con fritzing, bisogna prima di tutto che il 5v ed il GND delle due schede siano condivise (obbligatorio), poi collegare le porte 4(SDA) e 5(SCL) delle due schede, tutte e due le porte vanno collegate in pull up con una resistenza su ogni porta di 4,7k, nel nostro caso sono collegate solo le due schede, ma I2C prevede fino a 128 collegamenti.
Scheda 1 "slave"
Per continuare su una scheda verrà collegato il pulsante switch alla porta 4, il pulsante ha una resistenza di 10k su GND.
di seguito il codice:
#include <Wire.h>
const int buttonPin = 4;
void setup()
{
pinMode(buttonPin, INPUT);
Wire.begin(2); // entra nel bus I2C con indirizzo 2
Wire.onRequest(requestEvent); // esegue la funzione quando ha una richiesta
}
void loop()
{
delay(10);
}
void requestEvent()
{
if (digitalRead(buttonPin) == HIGH){
Wire.write("acceso"); // se il pulsante è premuto invia acceso
} else {
Wire.write("spento"); // altrimenti invia spento
}
}
Scheda 2 "Master"
Nella seconda scheda verrà collegato un led sulla porta 2 digitale, con una resistenza su vdd di 10k almeno,
#include <Wire.h>
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop()
{
Wire.requestFrom(2, 6);
String b = "";
while(Wire.available()) // slave may send less than requested
{
char c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
b += c;
}
if (b == "acceso") {
digitalWrite(10, HIGH);
} else {
digitalWrite(10, LOW);
}
delay(10);
}
Il master invia una richiesta allo slave con indirizzo 2 che risponde inviando lo stato del pulsante sullo slave in quel momento, se il pulsante viene premuto invia "accesso" altrimenti "spento". Il master riceve il valore inviato dallo slave che attraverso una condizione accende il led oppure lascia spento.
Conclusioni
Mi rendo conto che questo esempio sia molto banale, ma per chi come me è all'inizio credo possa essere utile sapere come far cominicare tra loro due microcontrollori, l'esempio usa arduino, ma comunque è possibile usare anche altri microcontrollori, inoltre va detto che I2C non è il più veloce, e nemmeno quello che offre più distanza, infatti si parla di circa 2 metri come distanza massima, ma ha il vantaggio di poter collegare più periferiche con solo 2 fili.