
Oggi riprendiamo in mano il nostro Arduino e cerchiamo di farlo comunicare con un altro linguaggio molto semplice e versatile: il Python.
L'obiettivo finale sarà quello di realizzare un sistema fisico di notifica per la ricezione di email ma ne discuteremo più a fondo nel prossimo articolo. Per adesso ci limiteremo ad esplorare le basi di questa fortunata accoppiata.
Quello che vedremo sarà molto semplice ed elementare in modo da darvi una base rapida dalla quale partire in pochi minuti a programmare la vostra scheda con Python.
Cosa ci serve
- Arduino UNO.
- Python installato sul nostro computer, potete scaricarlo da QUI.
- Pyserial, la libreria per la comunicazione tramite porta seriale con la nostra board. Potete scaricarla dalla pagina di download oppure dalla pagina su sourceforge dove trovate anche un pratico installer per Windows.
Comunicazione Arduino-Python
Per prima cosa trasformeremo il nostro terminale nel serial monitor di Arduino, leggendo i caratteri inviati dalla nostra scheda. Il codice per Arduino è decisamente semplice:
void setup(){ // Apre la connessione seriale. Serial.begin(9600); } void loop(){ Serial.print("Hello World!"); delay(1000); }
Carichiamolo sulla board e verrà inviata al serial monitor la stringa "Hello World!" ogni secondo. Adesso dobbiamo riuscire a leggerla con il nostro script in Python e stampare a video quello che viene ricevuto.
import serial import time arduino = serial.Serial('COM3', 9600, timeout=0) while True: print arduino.readline() time.sleep(1)
Il codice Python apre un collegamento con la porta seriale COM3 e inizia un ciclo infinito in cui ogni secondo legge dalla porta e stampa a video. Ovviamente controllate che la porta seriale sia quella corretta dall'Arduino IDE in Strumenti->Porta Seriale. Per evitare problemi ed trovare la porta già occupata prima mettiamo in funzione il nostro Arduino e poi, con il serial monitor chiuso, eseguiamo lo script Python.
Se siete sotto LINUX il codice va modificato leggermente. Il collegamento deve essere specificato nel seguente modo, dove ttyACM0 è il nome della porta alla quale è collegato Arduino:
arduino = serial.Serial('/dev/ttyACM0', 9600)
Comunicazione Python-Arduino
Adesso facciamo la procedura inversa, controlliamo Arduino con uno script Python. Quello che faremo sarà accendere il LED incorporato nella scheda sul pin 13. L'operazione è anche qui basilare, ma se possiamo accendere un LED possiamo fare tutto.
#define LED 13 void setup() { pinMode(LED, OUTPUT); Serial.begin(9600); } void loop() { if (Serial.available()) { char c = Serial.read(); if (c == 'H') { digitalWrite(LED, HIGH); } else if (c == 'L') { digitalWrite(LED, LOW); } } }
Il codice si spiega da solo: il LED 13 viene impostato in modalità output e viene acceso se riceve il carattere H o spento se riceve il carattere L.
Il codice Python è, se possibile, ancora più semplice.
import serial import time arduino = serial.Serial('COM3',9600,timeout=0) time.sleep(2) # il LED viene acceso arduino.write('H') print("LED acceso") time.sleep(2) # il LED viene spento arduino.write('L') print("LED OFF") time.sleep(2) arduino.close()
Come nell'esempio precedente viene stabilita la connessione con Arduino attraverso la porta COM3 e viene poi inviata una sequenza di caratteri H e L intervallati da due secondi di pausa. Infine la comunicazione viene chiusa.
Se avete Python3, che per default gestisce le stringhe in unicode, per comunicare attraverso la porta seriale dovrete forzare l'encoding ASCII utilizzando:
arduino.write('H'.encode('latin_1'))
invece di
arduino.write('H')
Oppure, in forma compatta:
arduino.write(b'H')
Si ringrazia Davide Moreo, che ci ha fatto notare questa differenza.
Con questo finiamo l'introduzione, presto vedremo come sfruttare quello che abbiamo imparato per scrivere un sistema di notifica per email che sia in grado di avvertirci anche quando non siamo al computer. Intanto vi invito a segnalarci i vostri progetti con Arduino e Python nei commenti. Avete mai realizzato qualcosa? Avete qualche idea che vi piacerebbe approfondire? Fateci sapere.