L’I2C Arduino master ADC ATtiny85 segue il precedente articolo dedicato all’ATtiny85 come micro controllore per acquisire dati analogici.
Se non lo hai già fatto ti consiglio di leggere il precedente articolo I2C ATtiny85 slave ADC in cui puoi leggere e apprendere le basi sia della programmazione sugli Attiny sia le operazioni di trasferimento IIC tra quest’ultimi ed arduino o tra loro.
Collegamenti dell’I2C Arduino master ADC ATtiny85
I collegamenti tra i due micro controllori è il medesimo mostrato e realizzato per il primo articolo su questo argomento, lo riporto per completezza della descrizione:
Lo sketch I2C Arduino master ADC
Lo sketch I2C Arduino master ADC ATtiny85 dovrai caricarlo su Arduino dopo aver usato la board per il trasferimento del precedente sketch sull’ATtiny.
Ricorda di rimettere l’IDE in modalità “AVR ISP” prima di trasferire il codice sull’arduino uno:
//Code for the Arduino Master #include <Wire.h> #define TARGET_ID 0x08 void setup() { Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial for output Serial.println( "Setup Success" ); } void loop() { Wire.requestFrom(TARGET_ID, 2); // request 1 byte from slave device address 4 while(Wire.available() > 0) { byte adc3H = Wire.read(); byte adc3L = Wire.read(); int adc3 = adc3H << 8 | adc3L; Serial.print( "ADC: " ); Serial.print( adc3H ); Serial.print( " | " ); Serial.print( adc3L ); Serial.print( " = " ); Serial.print( adc3 ); Serial.print( "\n" ); } delay(100); }
siccome questo codice va su una board dotata di micro controllore tipo ATmega328, ATmega2560, ATmega32u4 o successivi la libreria Wire usata alla linea 01 è quella standard a cui sei abituato;
linea 04: desfinisci l’indirizzo target, ossia quello da interrogare;
linea 07-09: inizializza sia gli oggetti Wire sia la comunicazione Seriale;
linea 13: mediante il metodo requestFrom specificando l’indirizzo a cui inviare la richiesta ed il numero di byte da leggere ( 2 ) interroghi lo slave;
linea 15: quando lo slave avrà risposto ed il buffer sarà > 0 potrei leggerlo e svuotarlo;
linee 16-17: leggi in sequenzai due byte inviati e memorizzali nelle variabili: adc3H e adc3L. L’operazione di lettura svuota anche il buffer;
Important!
Ricorda che nella trasmissione hai inviato prima i valori HIGH/alti/più significativi, e successivamente quelli LOW/bassi/meno significativi questa informazione è importante per ricostruire il valore inviato.
linea 19: definisci una variabile di tipo int in cui memorizzeremo i valori ricevuti. Il primo valore, essendo quello high, dovrai shiftarlo di 8 verso sinistra ( << ) in opposizione alla precedente ooperazione di shift eseguita sull’Attiny85. Poi concateni gli 8 bit meno significativi con il ( | );
linee 21-27: scrivi sul monitor seriale i valori ricevuti adc3H e adc3L e la risultante.
Il risultato sul monitor seriale con il potenziometro al valore minimo dovrebbe essere simile al seguente:
e ruotato al valore massimo:
Se desideri approfondire le informazioni in merito alle operazioni di conversione byte 2 int puoi leggere la Reference Guide arduino:
2 commenti
Ciao Mauro,
dai un’occhiata al commento della linea 13.
Paolo
Autore
Ciao Paolo,
grazie per la segnalazione.
Il commento corretto sarebbe: // request 2 byte from slave device address 8 come descritto nella spiegazione dello sketch.
Si è trattato di un refuso da copia e incolla di precedenti esperimenti, grazie.