Attiny84 IIC Leonardo segue i precedenti articoli dedicati al protocollo I2C o IIC con gli Attiny
La maggior parte degli articoli che ho letto sulla comunicazione i2c dei microcontrollori attiny è dedicato all’attiy85
Ho voluto quindi sperimentare con l’attiny84 per sfruttare più ingressi ed uscite analogiche di quelle disponibili sul modello 85.
Pinout Attiny84 IIC Leonardo
il pinout dell’attiny84 ti permette di individuare che i pin IIC sono:
- SDA: pin 7 o PA6
- SCL: pin 9 o PA4
l’alimentazione è invertita, rispetto all’asse longitudinale del componente, per cui trovi:
- +5v al pin 1 ( sulla sinistra )
- Gnd sul pin 14 ( sulla destra )
i restanti pin hanno funzioni specifiche che ti invito ad approfondire nel pin out o sul datasheet ufficiale.
Il circuito Attiny84 IIC Leonardo
Il circuito lo puoi realizzare sulla board come in figura:
da cui noti che ho utilizzato 4 pin per acquisire informazioni di tipo analogico e 2 per i segnali di tipo digitale.
Avrai certamente intuito che se nei precedenti articoli il joystick era solo uno in questo esempio ne potrai utilizzare due:
nota che i cavi giallo e blu sono stati usati rispettivamente per il +5v e Gnd.
Infine i collegamenti verso Arduino:
Lo sketch Attiny84 IIC Leonardo
Lo sketch Attiny84 IIC Leonardo usa il primo come slave I2C per acquisire i sei segnali descritti nel paragrafo precedente:
#define I2C_SLAVE_ADDRESS 0x8 // Address of the slave #include <TinyWireS.h> #define ADC0 A0 #define ADC1 A1 #define ADC2 A2 #define ADC3 A3 #define SWH1 5 #define SWH2 7 void setup() { TinyWireS.begin(I2C_SLAVE_ADDRESS); // join i2c network TinyWireS.onRequest(requestEvent); pinMode(ADC0, INPUT_PULLUP); pinMode(ADC1, INPUT_PULLUP); pinMode(ADC2, INPUT_PULLUP); pinMode(ADC3, INPUT_PULLUP); pinMode(SWH1, INPUT_PULLUP); pinMode(SWH2, INPUT_PULLUP); } void loop() { TinyWireS_stop_check(); } void requestEvent() { int val=analogRead(ADC0); uint8_t valLow = val & 0xff; uint8_t valHigh = (val >> 8); TinyWireS.send(valHigh); TinyWireS.send(valLow); val=analogRead(ADC1); valLow = val & 0xff; valHigh = (val >> 8); TinyWireS.send(valHigh); TinyWireS.send(valLow); val=analogRead(ADC2); valLow = val & 0xff; valHigh = (val >> 8); TinyWireS.send(valHigh); TinyWireS.send(valLow); val=analogRead(ADC3); valLow = val & 0xff; valHigh = (val >> 8); TinyWireS.send(valHigh); TinyWireS.send(valLow); byte swval=digitalRead(SWH1); TinyWireS.send(swval); swval=digitalRead(SWH2); TinyWireS.send(swval); }
la linea 01: definisci l’indirizzo a cui il componente risponderà alle richieste del master;
linea 03: includi la libreria Wire slave per attiny;
linee 05-11: definisci i pin che utilizzi per collegare i 4 senali analogici ed i due digitali;
linee 13-24: la setup() è simile a quello che abbiamo già usato per gli sketch precedenti a parte la proliferazione dei comandi di pinMode necessari per acquisire tutti i pin definiti alle linee 05-11;
linea 27: la loop non è variata assolutamente in quanto il suo unico scopo è fermare la comunicazione dopo che questa è stata instradata al master;
linee 31-35: è il primo dei blocchi in cui leggi un valore a 10bit su un pin analogico e lo converti in due variabili di tipo byte per poter inviare questa informazione via IIC, se vuoi approfondire l’argomento ti consiglio la lettura dei precedenti articoli dedicati all’I2C;
linee 37-53: ripeti le medesime operazioni per tutti gli altri pin analogici;
linee 55-59: preleva il segnale digitale dai pin 5 e 7 e spediscilo al master senza ulteriori elaborazioni.
Nel prossimo articolo leggerai il codice da caricare sulla Leonardo per la lettura dei dati i2c inviati dai sensori attraverso Attiny84 IIC Leonardo.
1 ping
[…] « Attiny84 IIC Leonardo […]