BlueCar

Da raspibo.
Jump to navigation Jump to search

In un mercatino dell'usato abbiamo trovato una macchinina radiocomandata a forma di tavola di Lego (anche se non sono proprio Lego) e l'idea era di integrare o sostituire l'elettronica con un Raspberry Pi per aumentarne le funzioni. Il nome BlueCar è stato dato per via del fatto che si sarebbe dovuta comandare tramite Bluetooth. Sebbene sia ancora possibile farlo, al momento attuale c'è un adattatore Wi-Fi USB, poiché su Bluetooth non siamo ancora riusciti a fare lo streaming video.

BlueCar1.jpeg

Cosa c'è (c'era) all'interno

L'interno del giocattolo è composto da due semplicissimi motori elettrici DC, un circuito con un integrato, responsabile dell'azionamento dei motori e della decodifica dei segnali radio, un'antenna, gli ingranaggi dello sterzo (è uno sterzo un po' rudimentale: un motore collegato a un ingranaggio fa sterzare le ruote e una molla le rimette dritte quando il motore non è acceso; questo crea problemi perché ogni tanto la molla si incastra) e lo scomparto delle batterie (4xAAA).

I primi fallimenti

Il primo tentativo è stato di collegare il Raspberry direttamente all'elettronica già esistente all'interno del giocattolo. Purtroppo la corrente dei pin del Raspberry era troppa, oppure nel tentativo di saldare i fili all'integrato si è creato un corto circuito. Fatto sta che il tutto ha cominciato a scaldare moltissimo e infine ha smesso di funzionare.

Di nuovo il nostro amico ponte ad H L298

BlueCar2.jpeg

Vista la pregressa esperienza avuta con l'Ardubottino il tutto sommato non costoso ponte ad H L298 era la scelta scontata per azionare i due motori della BlueCar. Anche in questo caso abbiamo deciso di separare l'alimentazione del Rasperry Pi da quella dei motori, così da proteggere il nostro piccolo computer da spike di corrente e quant'altro. Per maggiori informazioni su come usare questo prezioso componente vi rimandiamo alla pagina dell'Ardubottino#Il_board_ponte_ad_H_L298.

Una nuova interfaccia NON grafica

I comandi della BlueCar funzionano come nei videogame di corse automobilistiche, vanno tenuti premuti e la macchina frena quando rilasciati, a differenza del RaspiTank dove la pressione di un tasto faceva continuare l'azione fino al comando contrario. Questo è dato da due funzioni di curses, timeout e flushinp. Potete leggerne sulla guida ufficiale [1].

#!/usr/bin/python
import curses
import time
import os
import wiringpi

scr = curses.initscr()
curses.cbreak()
curses.noecho()
scr.keypad(1)
curses.curs_set(0)
scr.refresh()
key=0
scr.timeout(100)

def stop():
       motor.digitalWrite(10,motor.LOW)
       motor.digitalWrite(11,motor.LOW)
       motor.digitalWrite(12,motor.LOW)
       motor.digitalWrite(13,motor.LOW)

motor = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_PINS)
motor.pinMode(10,motor.OUTPUT)
motor.pinMode(11,motor.OUTPUT)
motor.pinMode(12,motor.OUTPUT)
motor.pinMode(13,motor.OUTPUT)
while (key != 27):
       key=0
       curses.flushinp()
       key = scr.getch()
       if key == ord('q'):
               motor.digitalWrite(10,motor.HIGH)
               motor.digitalWrite(11,motor.LOW)
               motor.digitalWrite(12,motor.HIGH)
               motor.digitalWrite(13,motor.LOW)
       elif key == ord('w'):
               motor.digitalWrite(10,motor.LOW)
               motor.digitalWrite(11,motor.LOW)
               motor.digitalWrite(12,motor.HIGH)
               motor.digitalWrite(13,motor.LOW)
       elif key == ord('e'):
               motor.digitalWrite(10,motor.LOW)
               motor.digitalWrite(11,motor.HIGH)
               motor.digitalWrite(12,motor.HIGH)
               motor.digitalWrite(13,motor.LOW)
       elif key == ord('d'):
               motor.digitalWrite(10,motor.LOW)
               motor.digitalWrite(11,motor.HIGH)
               motor.digitalWrite(12,motor.LOW)
               motor.digitalWrite(13,motor.HIGH)
       elif key == ord('s'):
               motor.digitalWrite(10,motor.LOW)
               motor.digitalWrite(11,motor.LOW)
               motor.digitalWrite(12,motor.LOW)
               motor.digitalWrite(13,motor.HIGH)
       elif key == ord('a'):
               motor.digitalWrite(10,motor.HIGH)
               motor.digitalWrite(11,motor.LOW)
               motor.digitalWrite(12,motor.LOW)
               motor.digitalWrite(13,motor.HIGH)
       else:
               stop()

curses.endwin()

I tasti sono QWE e ASD. Q va avanti e sterza a sinistra, W va solo avanti e E va avanti e a destra. A, S e D fanno lo stesso con la retro. Essendo molto primordiale, come interfaccia, lo streaming del video occorre farlo partire prima:

raspivid -t 0 -fps 15 -w 640 -h 480 -rot 180 -o - |nc -l 9999 &

Questo comando trasmette uno streaming del video del modulo camera del Raspberry Pi sulla porta 9999 tramite netcat. Per leggerlo, scrivete sul vostro computer locale:

nc bluecar.local 9999 |mplayer -fps 150 -demuxer h264es -

(sostituite bluecar.local con l'IP del Raspberry, se non volete usare Avahi[2], e mplayer con il vostro player di video preferito, come VLC)

Sì, ma il Bluetooth?

Per ora non lo si usa perché non siamo ancora riusciti a trasmettere lo streaming video. In teoria dovrebbe essere possibile, creando una rete PAN [3], ma finora non ci sono stati risultati soddisfacenti. Per abilitare il Bluetooth occorre installare il pacchetto "bluez", avviare col comando:

sudo rfcomm watch 0 3

questo apre la porta seriale Bluetooth sul Raspberry. Sull'altro computer invece occorre scrivere:

sudo rfcomm connect 0 <indirizzo MAC> 3

(l'indirizzo MAC si trova con il comando hciconfig) questo comando crea un device rfcomm0 che altro non è che una porta seriale che collega i due computer. Per vedere cosa c'è in quella porta basta usare screen:

sudo screen /dev/rfcomm0 9600

e voilà, il Raspberry e il nostro computer sono connessi. Se vogliamo che il Raspberry ci risponda lanciando un programma allora possiamo usare getty:

sudo getty 9600 rfcomm0

questo farà partire un login (se non specificato diversamente) sul terminale rfcomm0. Collegandoci con screen chiederà username e password e poi potremo collegarci. Se vogliamo che tutto quanto parta in automatico allora occorrerà aggiungere sudo rfcomm watch 0 3 & a /etc/rc.local, lo script che viene lanciato alla fine del boot e /sbin/getty 9600 rfcomm0 nel file /etc/inittab con l'azione respawn. Su come modificare inittab vi rimando a questa guida[4].