Riprendendo il discorso del post precedente, stiamo continuando gli esperimenti con il robot. Sempre nell’ottica d’introdurre la computer vision, per fare object detection, abbiamo equipaggiato il bot con un netbook Aspire One della Acer e una webcam esterna. Questa aggiunta consente al robot di avere piu` potenza di calcolo, una connessione WIFI e di superare molti dei limiti che si hanno con il solo uso di Arduino: un aumento di versatiita` che consente di avere maggiori applicazioni.

GigginoBot + Aspire One + Webcam

GigginoBot + Aspire One + Webcam

L’idea e` quella di usare il PC come cervello, su cui far girare tutto il software che permette di prendere decisioni e di comunicare con il mondo, rendendo Arduino solo una mera interfaccia con  motori e sensori vari. Il PC e` collegato ad Arduino tramite cavo USB. Ovviamente, i programmi che controlleranno il bot saranno scritti in Python 😉

Ma come far interfacciare Python con Arduino??? si potrebbe progettare una soluzione personalizzata, come e` stato fatto per GraphDuino. Ma li` le cose erano molto semplici… qui, andando avanti nel progetto, le cose potrebbero diventare piu` complesse. Serve una soluzione che possa essere scalabile. Perche` reinventare la ruota??? Esiste gia` qualcosa che fa al caso nostro: Firmata. Questo protocollo consente di avere il controllo di Arduino, attraverso qualsiasi software che lo implementa. Per giunta, esistono gia` librerie Python che lo implementano…

Lato Python, la scelta della libreria e` ricaduta su pyFirmata, in quanto sembra essere regolarmene mantenuta e supporta versioni recenti del protocollo Firmata. Per installare la libreria basta seguire le istruzioni riportate sul sito. Lato Arduino, nelle ultime versioni dell’IDE,  Firmata e` disponibile out of the box: e` uno sketch che basta compilare e caricare.

Firmata - Arduino IDE

Firmata – Arduino IDE

Per testare questo nuovo connubio,  si e` scelto di rendere GigginoBot controllabile da remoto, sfruttando la connessione dati WIFI. Inoltre, e` stata usata la webcam mandando in streaming le immagini riprese, rendendo il robot controllabile, anche laddove non ci fosse contatto visivo.

Per comandare i movimenti del robot, si e` pensato di usare i tasti di direzione. Per implementare questa funzionalita`, senza perdere tempo nella realizzazione di interfacce grafiche, si e` fatto uso del modulo Curses. A seguire vi e` lo script Python completo e commentato.

#import moduli
import curses
from pyfirmata import Arduino, util

stdscr = curses.initscr()
curses.cbreak() # input senza invio
stdscr.keypad(1)
curses.halfdelay(1) # timeout per evitare che getch() resti in attesa di input

#messaggio di benvenuto
stdscr.addstr(0,10,"GigginoBot RC Command Utility")
stdscr.addstr(1,10,"...premi 'q' per uscire! o i tasti di direzione per muovere il bot :-)")
stdscr.refresh()

#### Arduino functions
board = Arduino('/dev/ttyACM0') #selezione Arduino

#setup pin digitali, per controllo motori
DI = board.get_pin('d:10:o')
DA = board.get_pin('d:11:o')
SI = board.get_pin('d:12:o')
SA = board.get_pin('d:13:o')

#funzioni per gestione movimento
def destra():
    SI.write(True)
    DI.write(False)
    DA.write(True)
    SA.write(False)

def sinistra():
    SI.write(False)
    DI.write(True)
    DA.write(False)
    SA.write(True)

def stop():
    SI.write(False)
    DI.write(False)
    DA.write(False)
    SA.write(False)

def indietro():
    SI.write(True)
    DI.write(True)
    DA.write(False)
    SA.write(False)

def avanti():
    SI.write(False)
    DI.write(False)
    DA.write(True)
    SA.write(True)

key = ''
while key != ord('q'): #cicla fin quando l'utente non digita il tasto 'q'
    key = stdscr.getch() #cattura tasti
    if key == curses.KEY_UP:
        avanti()
    elif key == curses.KEY_DOWN:
        indietro()
    elif key == curses.KEY_RIGHT:
        destra()
    elif key == curses.KEY_LEFT:
        sinistra()
    else:    #se l'utente non preme nessun tasto
        stop()

curses.endwin()

La vera e propria capacita` di controllo remoto e` stata fatta via SSH. Si accede tramite la Secure Shell al PC del robot, e si lancia lo script, che gira in locale.

Per lo streamig del flusso video della webcam, e` stato usato MJPG-streamer. Per installarlo su Ubuntu e` necessario seguire i seguenti passi:

svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
cd mjpg-streamer/mjpg-streamer
make clean all
export LD_LIBRARY_PATH=.

Probabilmente, prima di riuscirlo a compilare,  sara` anche necessario installare i seguenti pacchetti:

sudo apt-get install libjpeg-dev imagemagick

Per lanciarlo:

sudo mjpg_streamer -i "./input_uvc.so  -d /dev/video0  -y -f 15 -n -r 160x120" -o "./output_http.so -w ./www"

Fatto cio`, ci si potra` collegare tramite un browser alla macchina, specificando la porta di ascolto del server e vedere lo stream video!

Voila`! Abbiamo realizzato un “giocattolo” che puo` aiutarci a tenere d’occhio la casa, quando non ci siamo. Infatti esponendo il PC del bot su Internet, potremmo gestirlo da qualunque posto.