“Ho rivisto quell’incidente e penso di aver imparato qualcosa anche da quello. C’è sempre qualcosa da imparare.”
Gilles Villeneuve
Qualche giorno fa ho scritto un post sull’importanza di avere installata nella propria vettura una dashcam in grado di registrare ciò che avviene durante la guida, per avere una prova concreta nel malaugurato caso di incidente, considerando soprattutto la normativa sull’omicidio stradale che punisce molto severamente anche solamente in caso di feriti: tutelarsi, pertanto, diventa sempre più importante.
A tal proposito, ho iniziato a lavorare alla possibilità di costruire una dashcam sfruttando il Raspberry Pi Zero W e poche altre periferiche, per realizzare un dispositivo che fosse in grado di registrare, attraverso una telecamera, ciò che avviene sulla strada davanti a noi e salvarlo sulla scheda di memoria. Oltre a questo, registrare la posizione GPS e, grazie ad un sensore di movimento, capire quando la macchina è in movimento oppure ferma, ed agire di conseguenza. Per accedere ai video ed agli altri dati, il Raspberry Pi Zero W sfrutterà l’interfaccia bluetooth incorporata.
Quindi, ricapitolando, il materiale per la realizzazione del progetto è:
- Raspberry Pi Zero W
- CSI camera (5 Megapixel sensore OV5647)
- modulo GPS Neo-6M (Ublox-NEO-6M-GPS-Module)
- modulo giroscopio e bussola digitale (GY-80 Gyroscope and compass with Barometric and Temperature sensor)
oltre a questo, ho utilizzato 3 porte GPIO per un Led RGB da utilizzare per segnalare lo stato di funzionamento.
Assemblare i moduli
Prima di prendere in mano il saldatore, ho buttato giù su carta un breve diagramma dei collegamenti con il connettore a 40 pin del Raspberry Pi. Il modulo GPS Neo 6-M deve essere collegato alla UART (seriale), piedini 8 e 10, oltre all’alimentazione a 5V (pin 2 o 4) e GND (pin 6,9,14,25,30,34,39). Il gyroscopio GY-80 lavora sul bus I2C, pertanto lo collegheremo ai pin 3 (SDA) e 5 (SDL).
ATTENZIONE: per il modulo GPS sulla UART è importante collegate il TX all’RX e viceversa, quindi il TX (pin 8) va al pin RX sul GPS ed il RX (pin 9) va al pin TX sul GPS.
Adesso, con molta attenzione alle saldature, si procede a realizzare i collegamenti. Personalmente, ho usato una basetta millefori, sfruttando un connettore a 40 pin femmina da saldare sul RPi così da poterlo sempre rimuovere all’occorrenza. Ecco qualche foto del lavoro:
Una volta concluso, assicurandosi di aver realizzato per bene tutte le saldature e che non vi siano cortocircuiti che potrebbero bruciare la scheda e/o i moduli, possiamo procedere con la parte software.
Installare il sistema operativo
Ho usato una miniSD da 16GByte per installare la Raspbian Lite (senza desktop), usando Etcher per scrivere l’immagine sulla scheda. Prima di effettuare il boot, ho modificato la configurazione per permettere l’accesso via SSH su USB:
- aggiungere al file config.txt la riga “dtoverlay=dwc2“
- appendere al file cmdline.txt la stringa “modules-load=dwc2,g_ether“
- create un file vuoto “ssh” in /boot (touch /boot/ssh) ber abilitare il server SSH
(Istruzioni più dettagliate sono disponibili qui: Connect To A Raspberry Pi Zero With A USB Cable And SSH)
Consideriamo che il Raspberry Pi si aspetta un server DHCP da cui ottenere la configurazione di rete. Su sistemi GNU/Linux è abbastanza facile, poiché spesso già udhcpd è installato di default (se no, apt install udhcpd) e quindi sarà sufficiente una veloce configurazione del file /etc/udhcpd per riflettere i nomi delle interfacce. Ad esempio, collegando il Raspberry Pi al mio PC ottengo:
usb 3-8: new high-speed USB device number 7 using xhci_hcd usb 3-8: new high-speed USB device number 8 using xhci_hcd usb 3-8: New USB device found, idVendor=0525, idProduct=a4a2 usb 3-8: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 3-8: Product: RNDIS/Ethernet Gadget usb 3-8: Manufacturer: Linux 4.9.35+ with 20980000.usb cdc_subset: probe of 3-8:1.0 failed with error -22 cdc_ether 3-8:1.0 usb0: register 'cdc_ether' at usb-0000:00:14.0-8, CDC Ethernet Device, e2:a1:58:ae:xx:xx cdc_ether 3-8:1.0 enp0s20u8: renamed from usb0
e viene predisposta l’interfaccia di rete enp0s20u8, dove arriveranno le richieste DHCP Request. Ho deciso di usare la rete 192.168.0.x, pertanto nel file /etc/udhcpd.conf ho:
start 192.168.0.200 end 192.168.0.254 interface enp0s20u8 opt dns 192.168.0.1 option subnet 255.255.255.0 opt router 192.168.1.1 option domain local option lease 864000
Impostiamo l’interfaccia di rete con l’IP 192.168.0.1 (ifconfig enp0s20u8 192.168.0.1) e rinfreschiamo il demone udhcpd con la nuova configurazione (service udhcpd reload). In pochi istanti sul log /var/log/syslog compariranno le righe:
DHCPDISCOVER from 52:15:cd:89:xx:xx via enp0s20u8 DHCPOFFER on 192.168.0.200 to 52:15:cd:89:xx:xx (pidashcam) via enp0s20u8 DHCPREQUEST for 192.168.0.200 (192.168.0.1) from 52:15:cd:89:xx:xx (pidashcam) via enp0s20u8 DHCPACK on 192.168.0.200 to 52:15:cd:89:xx:xx (pidashcam) via enp0s20u8
A questo punto possiamo accedere via SSH con l’utente ‘pi‘ e password ‘raspberry‘ sull’IP appena fornito al nostro RPi (ssh -l pi 192.168.0.200).
Installare gli applicativi base e configurare il sistema
Per poter accedere più comodamente al nostro Raspberry Pi, soprattutto mentre siamo in mobilità, conviene sfruttare l’interfaccia bluetooth configurandola come server RFCOMM. Abbiamo però bisogno di installare qualche applicativo, pertanto la cosa più comoda è configurare la rete in modo che possa accedere ad Internet. Immaginando che il PC dove abbiamo configurato il demone udhcpd sia connesso in rete, possiamo sfruttare le potenzialità di iptables e del masquerading:
A questo punto possiamo verificare la connettività lanciando l’aggiornamento dei pacchetti con sudo apt update e, successivamente, sudo apt upgrade.
Configurazione della rete
Se volete sfruttare anche l’interfaccia WiFi per connettere il RPi (e connettervi) attraverso un access-point casalingo (il router wifi per l’ADSL…), potete configurare wpa_supplicant con il BSSID della vostra WiFI e le credenziali di accesso (WPA e WPA2).
Con un editor qualsiasi, ad es. nano, editate il file /etc/wpa_supplicant/wpa_supplicant.conf ed aggiungere le righe:
fast_reauth=1 ap_scan=1 network={ ssid="[il BSSID della vostra wifi]" psk="[la vostra chiave di autenticazione]" }
Riavviate la rete con sudo /etc/init.d/networking restart e dovreste avere, in pochi secondi, il vostro RPi connesso alla WiFi di casa…
Accedere ai files via SMB
Sicuramente il modo più comodo è quello di installare sul RPi un demone SMB, per accedere ai files con il popolare sistema di condivisione.
Installare il software è banale, sudo apt install samba, e anche la configurazione non è complicata. Ad esempio, per usare le medesime credenziali dell’utente ‘pi‘, copiate la seguente configurazione in /etc/samba/smb.conf:
e poi eseguire sudo smbpasswd -a pi, digitando la password desiderata. Riavviamo il demone samba (sudo /etc/init.dsamba restart) e a questo punto potete connettervi via smb al vostro RPi.
Ultime configurazioni al sistema e all’hardware
Con l’utility raspi-config abilitiamo il connettore CSI per la pi-camera, porta SPI e la porta seriale, necessaria per il collegamento con il GPS.
Sempre come root, lanciamo l’utility raspi-config ed entriamo in “Interfacing Options”:
da qui, seguiamo le istruzioni a video per abilitare la camera (P1), il bus I2C (P5) e la porta seriale (P6):
Adesso installiamo le utility per la diagnostica al bus i2c, apt install i2c-tools, per verificare la corretta installazione del modulo GY-80.
Lanciando il comando i2cdetect -y 1 dovreste ottenere:
i2cdetect effettua una scansione di tutti gli indirizzi sul bus i2c, rilevando tutti i dispositivi connessi. In questo caso, ha rilevato, correttamente:
- 0x1e 3-Axis magnetometer HMC5883L
- 0x53 Triple-Axis Accelerometer ADXL345
- 0x69 Tri-Axis Gyro L3G4200D
- 0x77 BMP085 pressure and temp sensor
Verificate la PiCamera
Avendo particolare cura nell’installazione del connettore CSI della telecamera (abbastanza delicato), dobbiamo verificare se la telecamera funziona come previsto. Raspbian già incorpora alcune utility per la verifica, come raspistill: eseguiamo da terminale il comando raspistill –o output.jpg e verifichiamo che il file output.jpg abbia effettivamente ripreso ciò che la telecamera stava inquadrando…
Un eccellente tutorial sulla PiCamera, che ho usato come fonte per alcuni esperimenti, lo trovate qui: Accessing the Raspberry Pi Camera with OpenCV and Python
A questo punto l’hardware ed il sistema di base sono predisposti e funzionanti. E’ giunto il momento di scrivere il software per far funzionare il tutto….ma questo, nella seconda parte !
1 comment
Ciao Michele,
bellissimo e dettagliato articolo, ma la seconda parte con il codice ed un eventuale case?