«

»

Apr 12

Stampa Articolo

I2C Attiny85 slave ADC

Impara ad usare l’I2C Attiny85 slave ADC ossia il micro controllore della famiglia Atmel a 8 pin per leggere un segnale analogico ( ADC ) e trasferirlo via I2C.

I2C Attiny85 slave ADC potenziometer

L’Attiny85 è uno dei micro controllori della famiglia Atmel a cui appartiene anche l’Atmega328, su cui si basa sia Arduino sia Genuino Uno.

In particolare si tratta di un AVR Core, programmabile con l’IDE Arduino, in modaliltà programmatore ISP.

Già in passato ho dedicato alcuni articoli alla programmazione dell’Attiny85 che ti segnalo come approfondimento sull’argomento:

la programmazione puoi eseguirla attraverso l’Arduino Uno ed i collegamenti sui pin 13,12,11,10.

L’invio dello sketch “Arduino ISP” sulla scheda Arduino è necessario per consentirti di utilizzarla come programmatore.

Connessioni per I2C Attiny85 slave ADC

In questo esperimento l’Attiny85 lo userai in modalità slave i2c ( o iic ) per raccogliere le informazioni relativi e ad un sensore analogico, un potenziometro, e trasferirle ad una arduino uno:

I2C Attiny85 slave ADC

e quest’ultimo li invierà al monitor seriale perchè li possa leggere.

Lo schema di collegamento dell’I2C Attiny85 slave ADC è il seguente:

I2C Attiny85 slave ADC schema

i cui oltre all’alimentazione tra Arduino Uno e Attiny85 ci sono solo i collegamenti I2C: SDA ed SCL.

Il potenziometro è collegato al pin 2 ( fisico ) dell’ATtiny85 che corrisponde al pin A3 o ADC3 da datasheet:

ATtiny85 pinout

Ecco come appaiono i collegamenti nell’esempio che ho costruito per testare lo sketch:

I2C Attiny85 slave ADC connection

e lato Arduino Uno:

I2C Attiny85 slave ADC i2c connection

Sketch I2C Attiny85 slave

Lo sketchI2C Attiny85 slave ADC  che per primo dovrai caricare sull’Attiny85 in quanto la medesima board arduino la userai, probabilmente prima come programmatore ISP e successivamente come Master del progetto per leggere i valori dall’IIC e trasferirli al monitor seriale.

Il codice della componente I2C Attiny85 slave ADC è:

// Code for the ATtiny85
#define I2C_SLAVE_ADDRESS 0x8 // Address of the slave
 
#include <TinyWireS.h>

#define ADC3 A3

void setup() {
    TinyWireS.begin(I2C_SLAVE_ADDRESS); // join i2c network
    TinyWireS.onRequest(requestEvent);
 
    pinMode(ADC3, INPUT_PULLUP);
}

void loop() {
    // This needs to be here
    TinyWireS_stop_check();
}
 
// Gets called when the ATtiny receives an i2c request
void requestEvent() {
    int val=analogRead(ADC3);
    byte valLow = val & 0xff;
    byte valHigh = (val >> 8);
    TinyWireS.send(valHigh);
    TinyWireS.send(valLow);
}

in cui avrai di certo già individuato le parti fondamentali:

linea 02: definisci l’indirizzo IIC su cui dovrà rispondere lo slave;

linea 04: includi la libreria TinyWireS ossia la libreria Wire scritta per gli Attiny nella sua componente S ( Slave );

linee 09-10: inizializza la classe TinyWireS con il metodo begin in modo che il micro controllore conosca l’indirizzo su cui rispondere al Master e imposta lo sketch in modo che ad ogni richiesta da parte di quest’ultimo venga richiamata la funzione requestEvent;

linea 12: imposta il pin A3 ( ADC3 ) come INPUT_PULLUP ossia attivando la resistenza interna di pull-up anche se non necessario con un potenziometro, come sai;

linea 17: ad ogni ciclo di loop reimposta lo stop del check;

linea 21: definisci la funzione requestEvent;

linea 22: acquisici il valore analogico letto sul pin A3 e inserisci il risultato in una variabile di tipo int;

linee 23-24: poichè il valore acquisito è di tipo integer ed il metodo send della Wire ( anche della TinyWireS ) lavora con variabili di tipo byte, ossia invia un byte alla volta, dovrai scomporre il valore intero in byte. Leggendo nella doccumentazione arduino.cc trovi che una variabile di tipo int è composta da due byte per cui la conversione è fatta estraendo gli 8 bit meno significativi ( Low ) con ua maschera 0xFF in & ( And ) per cui se il valore fosse ad esempio 325:

0000 0001 0100 0101 in & con

0000 0000 1111 1111 avrebbe come risultato:


0000 0000 0100 0101 ossia 69

questo valore lo assegni alla variabile valLow. Il secondo byte sarà quindi dato dagli 8 bit più significativi per cui puoi recuperarlo facendo shiftare verso destra di 8 posizioni il valore letto usando l’operazione bitwise >> da cui sempre con il valore 325:

0000 0001 0100 0101   shift 8 bit 0000 0000 0000 0001 ossia 1 

che assegni alla variabile valHigh.

linee 25-26: invia prima i bit più significativi e successivamente quelli meno significativi;

Puoi consultare la Reference Guide sulle funzioni Bitwise:

Il risultato, che potrai leggere sul monitor seriale dopo aver trasferito su arduino la parte Master del I2C Attiny85 slave ADC, sarà simile al seguente:

I2C Attiny85 slave ADC low values

e ruotando il potenziometro verso il +5v:

I2C Attiny85 slave ADC high values

Nel prossimo articolo analizzeremo la parte Master e la ricomposizione delle variabili byte 2 int.

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/i2c-attiny85-slave-adc.html

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>