Pagine

mercoledì 24 marzo 2010

Arduino e seriale python

Premessa

Quando si effettua uno sketch con arduino che invia/riceve dati verso/dalla seriale è necessario un programma che recepisca o mi permetta di scrivere dati sulla porta seriale.
Per effettuare i test solitamente si utilizza il monitor dell'IDE ma se si vuole automatizzare qualche passaggio o se si vuole rendere indipendente lo sketch è necessario "captare" le informazioni che transitano sulla seriale ed eventualmente rispondere.
Molti programmi hanno una libreria che permette di dialogare con la seriale.
In questo articolo vi parlerò con pyserial la libreria per python che comunica con la seriale.

pyserial

Si presuppone che sulla vostra macchina sia installato python.
Personalmente mi trovo bene con la versione 2.5
La pagina principale del progetto è http://pyserial.sourceforge.net/
Potete scaricare la libreria da questa pagina: http://sourceforge.net/projects/pyserial/files/ e diversi esempi qui http://pyserial.sourceforge.net/shortintro.html

Pyserial e Arduino

A questo punto vi voglio presentare una piccola parte di uno programma che ho fatto ultimamente in python.
L'idea è quella di recepire delle stringhe inviate da Arduino e in base a ciò che c'è scritto agire in diversi modi con il sistema operativo.
A questo scopo, dopo aver importato la libreria:
import serial

dopo aver inizializzato la seriale con una velocità di 9600 baud:
s=serial.Serial(1)
Su windows sarebbe COM1 mentre su Linux la /dev/ttyUSB1
Si può passare ad un ciclo che legge dalla seriale:
line=s.readline()


A questo punto il programma completo anche se depurato delle parti necessarie a me per interagire con il sistema operativo risulta molto semplicemente come segue:
import serial
s=serial.Serial(1)

while(1):

line=s.readline()
# interazioni con la variabile s

Ne consegue che è molto semplice fa interagire il PC con Arduino e questo rende questa tecnologia ancora più affascinante ai miei occhi...
Che ne pensate?

8 commenti:

  1. Da un lato mi rattrista vedere come con i PC odierni risulta difficile fare cose che con i PC di 20 anni fa erano un scherzo. Parlo del controllo di hardware esterno, dove non serviva un arduino o altra scheda programmabile per accendere led, rele', motori o leggere degli interruttori o dei sensori.
    Dall' altra parte mi fa piacere notare che comunque i linguaggi moderni come Python permettono ancora di interagire almeno con la porta seriale (anche emulata USB)... come dico sempre: finche' c'e' seriale c'e' speranza :)
    Infatti in questo modo e' possibile usare una scheda esterna (come arduino) come "controller" per generare/leggere i segnali necessari, e sul PC scrivere un programma di supervisione "ad hoc", al limite anche interrogabile da remoto attraverso internet.

    Per quanto riguarda pyserial aggiungo due tips (nel codice metto dei puntini iniziali al posto degli spazi perche' gli spazi iniziali spariscono)

    1) usando un timeout si evita di restare intrappolati in attesa di dati che magari non arriveranno mai (in questo caso 10 secondi):

    s=serial.Serial("com1",9600,8,"N",2,timeout=10)
    while True:
    ....dati = s.readline()
    ....if dati:
    ........print dati
    else:
    ........print "Nessuna risposta in 10 secondi"
    ........break


    2) Ci si puo' far dire dal sistema quali porte sono presenti (solo per windows), e chiamandole con il loro nome "com1" ecc non ci si confonde sul fatto se la numero 1 e' la prima o la seconda:

    #----------------------------------------
    # Ritorna una lista di nomi
    # validi ['com1', 'com2', ....] ecc
    #----------------------------------------
    def analizza_porte():
    ....lista = []
    ....for x in xrange(16):
    ........n = "com" + str(x+1)
    ........try:
    ............z = serial.Serial(n)
    ............z.close()
    ............lista.append(n)
    ........except:
    ............continue
    ....return lista

    RispondiElimina
  2. Caspita che bel commento.
    Grazie Claudio!

    RispondiElimina
  3. Ciao Vittorio (ti chiami come mio padre :-))
    Sono un laureando in ing elettronica e purtroppo nel mio corso di laurea non ho mai avuto a che fare con i micorcontrollori, ora sono alle prese con la mia tesi di laurea ed utilizzo arduino per il controllo di un motore.
    Ti spiego dovrei comandare in locale e in remoto un motore e altre cose come sensori ecc.... sto imparando java perchè il mio prof mi ha detto di fare un unterfaccia grafica per imposatre il duty da remoto.
    Il collegamento tra locale e remoto avviene tramite xbee ma quest'ultimo nn mi è ancora rrivato quindi ancora gli devo provare.
    Mi chiedevo se potevi aiutarmi con le tue meravigliose guide.
    Poi una cosa che nn ho capito come faccio a far comunicare xbee, io uso arduino mega , dovrei usare la serial? se si come.
    scusami se sono stato lungo ma son disperato!
    ti ringrazio

    RispondiElimina
  4. 'giorno Massimiliano,
    la seriale e xbee sono due metodi di comunicazione differenti.
    O usi la seriale o utilizzi xbee.
    Attenzione perchè se utilizzi il modulo xbee su arduino, devi avere dei terminali che supportino questo protocollo per poter comunicare con loro.
    Se mi dici il problema più nel dettaglio posso esserti di aiuto.
    Ti consiglio anche il forum di arduino dove puoi trovare molte persone competenti che ti possono essere di aiuto.
    A presto!

    RispondiElimina
  5. Ciaoo Vittorio alla fine ho deciso come comandare il mio motore in locale.. vedi questi link:
    http://real2electronics.blogspot.com/2010/01/linkduino-controlar-lcd-desde-web.html

    http://www.geocities.co.jp/arduino_diecimila/wifi/a2p_ddwrt_en.html

    e pensavo di utilizzare la libreia python.
    L'idea e di metter in locale sul fonera una piccola pag html e mettere un router centrale.
    l'idea del router centrale è dovuta alla possibilità di espandere su piu processi, mi spieg meglio potrei inserire in futuro un nuovo processo con arduino + un seocndo fonera con sopra una seconda pag html.
    Cosi dal rotuer centrale posso sotto la stessa rete accedere ai fonera.
    che ne pensi?
    Mi piacerebbe pure utilizzare una soluzione come dal link con uno script da shell.
    grazie per la risposta.

    RispondiElimina
  6. Ciao Massimiliano,
    senza dubbbio la possibilità di accedere ai fonera tramite il router è una soluzione estremamente flessibile.
    In questo modo con il fonera, python e pyserial potrai espandere le interazioni con l'ambiente esterno (la camera nella quale sta il sistema) tramite un arduino.
    Tienici aggiornati!!

    RispondiElimina
  7. Ciaoo Vittorio,
    Ora ho un bel problema sulla fonera+ con dd-wrt non riesco a farla comunicare con arduino 2009.
    scusami se mi permette ma ho gia aperto una disccussione che rende bene l'idea...mannaggia a me mi ero dimenticato di te.
    http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1278777287

    RispondiElimina