.. meta:: :language: it :description language=it: Embedded Systems Architecture: Esercitazione Comunicazione I2C tra Arduino :description language=en: Embedded Systems Architecture: Practice Arduino I2C communication :keywords: Embedded Systems Architecture, Arduino I2C communication :author: Luciano De Falco Alfano Sheet Arduino n.9 (Arduino I2C communication) ======================================================= .. contents:: :local: [*Lezione del 09 e 10 dic 2019*] Comunicazione I2C tra Arduino --------------------------------------- La `scheda della esercitazione n.9 `_, richiede di effettuare comunicazione tra due microcontrollori Arduino utilizzando il bus :math:`I^2C`, che nel seguito indicheremo come *I2C*. Come con l'esercizio con le seriali (la scheda n.8) dovremo utilizzare due microcontrollori. A differenza delle porte seriali, che collegano i sistemi in modo paritetico ma solo in modalità punto-punto, con il bus *I2C* dobbiamo scegliere per forza di assegnare un ruolo master ad un device e di slave a tutti gli altri device collegati al master. La scheda è suddivisa in due parti. Mi sono impegnato direttamente nella implementazione della seconda parte, che include anche i concetti implementati nella prima parte. In sintesi, si tratta di implementare uno slave che controlla un led e un pulsante. E di comandarlo dal master, che invia richieste dello stato del pulsante e comandi di accensione/spegnimento del led, tramite il bus *I2C*. Il seguente video sintetizza l'esercizio: .. raw:: html Anche in questo caso abbiamo due sketch: uno per lo slave e uno per il master. E anche in questo caso cominciamo con lo slave: .. literalinclude:: ./exercises/sketch_sh09_2_s.ino :language: c :linenos: Che è molto semplice: inizializzo nel ``setup`` (saltiamo le solite porte digitali) il gestore del bus alla ln 20, indicando l'indirizzo da assegnare. La presenza dell'indirizzo configura l'unità come uno slave. Dopo di che indico al gestore del bus le routine per rispondere alle richieste del master (ln 21) e per ricevere dati dal master (ln 22). Sono rispettivamente le funzioni ``answer`` e ``recive``. La ``answer`` (ln da 29 a 32) invia lo stato del pulsante: un ``ok`` se chiuso e un ``ko`` se aperto. La ``receive`` (ln da 35 a 42) accumula i caratteri inviati dal master nel buffer ``cmd``. Dopo di che lo analizza: se contiene il comando ``on`` accende il led. Se vi è il comando ``off`` lo spegne. Altri comandi sono ignorati. Il ``loop`` (ln da 25 a 27) è un ritardo puro: lo slave passa il tempo ad attendere l'arrivo di comandi dal master. Invece il master è il seguente: .. literalinclude:: ./exercises/sketch_sh09_2_m.ino :language: c :linenos: In questo caso nel setup inizializziamo una seriale verso il PC, su cui invieremo lo stato del pulsante, e il gestore del bus *I2C*. In questo caso alla ln 19 non indichiamo un indirizzo. Questo designa l'unità come master: tutto ciò che viaggia sul bus è in seguito a sollecitazioni di questo microcontrollore. Ora che ho il potere, lo uso. Nel ``loop`` effettuo: * una richiesta allo slave per conoscere lo stato del pulsante (ln 26) seguita dall'accumulo della risposta (il ``while`` alle ln da 27 a 30) subito inviata carattere per carattere al PC via seriale; * invio allo slave un comando di accensione del led (ln da 34 a 36); dopo una pausa di 500ms, * invio allo slave un comando di spegnimento del led (ln da 40 a 43). Essendo un loop l'insieme predetto è rieffettuato ciclicamente.