In questa guida vedremo come inviare dati da un computer a una scheda Arduino attraverso una comunicazione seriale con Python. La comunicazione seriale tra Python e Arduino avviene attraverso una libreria molto utilizzata: Pyserial.
Installare libreria PySerial per comunicazione seriale
PySerial è una libreria Python che viene utilizzato per leggere e scrivere dati seriali su Arduino o qualsiasi altro microcontrollore. Per installare la libreria, visita la pagina di download di PySerial e seguire i passaggi seguenti:
Scarica PySerial dal link sopra o apri CMD e digita
pip install pyserial
Ora all’interno del programma principale possiamo inserire il comando
import serial
Se nessun errore viene visualizzato, allora la libreria è installata correttamente.
Codice Python
Creiamo il nostro script Python che invia sulla porta seriale un valore immesso da tastiera. Nella creazione dell’oggetto Serial dobbiamo inserire il nome della port a cui è connesso Arduino, nell’esempio è ‘COM4’
# Importing Libraries
import serial
import time
arduino = serial.Serial(port='COM4', baudrate=115200, timeout=.1)
def write_read(x):
arduino.write(bytes(x, 'utf-8'))
time.sleep(0.05)
data = arduino.readline()
return data
while True:
num = input("Enter a number: ") # Taking input from user
value = write_read(num)
print(value) # printing the value
Codice Arduino
Il codice Arduino è molto semplice, inizializza la velocità della porta seriale a ‘115200’ e setta un Timeout di 1ms. Attraverso un ciclo while e l’istruzione ‘available‘ attende la ricezione di nuovi byte sulla porta seriale.
Alla ricezione di nuovi dati, essi vengono letti dalla porta con l’istruzione ‘readString‘ ed assegnati alla variabile x.
int x;
void setup() {
Serial.begin(115200);
Serial.setTimeout(1);
}
void loop() {
while (!Serial.available());
x = Serial.readString().toInt();
Serial.print(x + 1);
}
Funzioni principali per la comunicazione seriale
Le funzioni più importanti che possiamo utilizzare con l’oggetto Serial sono:
- void Serial.begin(int baudrate): inizializza la comunicazione con i parametri standard (8 bit di dati, no parità e 1 bit di stop) e con la velocità baudrate.
- int Serial.available(): fornisce il numero di bytes letti e presenti nel buffer di lettura (max 64 bytes).
- int Serial.parseInt(): restituisce il primo int presente nel buffer di lettura
- float Serial.parseFloat(): restituisce il primo float presente nel buffer di lettura
- size_t Serial.readBytes(byte buffer[], int length): legge un numero di bytes dal buffer di lettura, e li mette nell’array buffer partendo dall’indice 0 (size_t corrisponde a unsigned int).
- int Serial.read(): restituisce il primo byte presente nel buffer. Se il buffer di lettura è vuoto, restituisce -1.
- size_t Serial.write(byte buffer[], int length): scrive un numero di bytes dalla posizione 0 del buffer sul canale. Restituisce il numero di bytes scritti.
- size_t Serial.print(value): scrive il valore fornito in ASCII sul canale. Può essere un numero, una stringa, … . Restituisce il numero di bytes scritti
- size_t Serial.println(value): uguale al precedente comando, ma termina l’invio con il termiantore return (carattere di ritorno).