Ratcam ti permette di controllare la fotocamera del RaspberryPi da un bot di Telegram, e ti allerta in caso di movimento inviando video e foto.
L'idea è nata quando ho trovato tracce di topi in casa, e volevo scoprire da dove entravano pittosto che adottare misure più drastiche (e dovermi occupare dei resti).
Ho sviluppato una versione iniziale, ma vorrei includere dei miglioramenti.
— Pietro Saccardi 2018/07/26 00:04
Ho realizzato il pcb usanto il sapiente aiuto di g5pw, wifasoi e ziongate con Kicad . Il circuito deve semplicemente alimentare dei LED infrarossi dal pin a 5V del Raspberry Pi. In più, vorrei poterli pilotare da uno dei pin a 3v3 del Raspberry; in questa maniera posso regolare la luminosità usando PWM.
Tutti i file del progetto sono reperibili su Gitlab.
I componenti che ho trovato nella miriade dei semiconduttori disponibili online sono:
VSMY2850G
, LED 850 nm, adatto per operare in PWM, quantità: 12.RK73H-5715
, resistenza da 15 Ohm, quantità: 6.DMG1012UW
, n-channel MOSFET, quantità: 1.VEML7700-TR
, sensore di luce ambientale nello spettro visibile, quantità: 1.M20-8750342
, connettore a 3 pin, quantità: 1.C0805C104Z3VACTU
, condensatore da 0.1 uF, quantità: 1.RK73H2ATTDD4701F
, resistenza da 4.7 KOhm, quantità: 2.Un lavoro (noioso) di lettura dei datasheet su vari siti di elettronica finché non ho trovato i componenti che andavano bene insieme.
Ho identificato prima i LED infrarossi, confrontando le specifiche su quanta luce emettono rispetto alle specifiche di alcuni LED in mio possesso. 10 LED sembrava la giusta quantità per avere (almeno) il doppio dell'illuminazione (emessa) della versione 1. Con i dati dei LED, ho calcolato quanti ne posso mettere al massimo in serie (2 al massimo) con i 5V del Raspberry Pi. A quel punto ho selezionato in base ai componenti fissati il MOSFET per controllare i LED dal pin 3v3.
Nello scegliere i componenti ho tenuto conto che non fossero eccessivamente piccoli, dato che non ho esperienza di saldatura SMT.
Volevo disporre i LED in maniera circolare, ma Kicad non ha strumenti adatti; non è possibile disegnare curve con le tracce o con i fill. Per cui ho preso spunto da qui per disegnare degli elementi circolari con Kicad.
All'inizio avevo scritto il codice minimo indispensabile per generare tracce circolari, ma mi sono reso conto che per allineare correttamente i componenti e calcolare i fill c'era bisogno di un supporto più estensivo per lavorare in coordinate polari, per cui ho scritto qualche classe per manipolare corde e settori circolari, ed un layer di interfaccia a Kicad più “pythonico” di quello offerto da Kicad. Il set di script è su Gitlab, consta di
cad.py
data model e astrazione degli oggetti di Kicad (limitata solo a quello che serviva per questo progetto)pcb.py
conversione da e a Kicadpolar.py
primitivi geometriciradial_illuminator.py
placer e router per un circuito tipo Ratcam, configurabile.Kicad si può controllare via python, ma la documentazione è scarsa e spesso bisogna ricorrere ad ispezionare il codice sorgente di Kicad per capire cosa una certa funzione fa. Gli oggetti sono trasportati via Swig direttamente da C(++) a Python, per cui sono relativamente scomodi da utilizzare. Alcuni link utili per chi tentasse di seguire la stessa strada:
Segue l'outline dell'algoritmo di placement e routing usato.
Componenti frontali:
Componenti posteriori (il codice è attivo ma non usato perché ho fatto il routing manuale per alloggiare anche il sensore di luminosità):
Successivamente ho aggiunto il QR code e le scritte.
Nella documentazione del modulo videocamera del Raspberry Pi ho trovato le misure della videocamera. Ho disegnato gli stessi elementi in Kicad, in maniera che la videocamera fosse al centro della circonferenza. Ho aggiunto delle footprint per i fori e ho fatto realizzare il PCB da Elecrow; aggiungo qui le impostazioni di esportazioni che wifasoi ha suggerito dato che ho trovato opinioni discordanti online.
Nel corso del montaggio mi sono reso conto di alcune limitazioni del design corrente.
A quanto pare il mosfet che sto usando sembra operare bene in PWM. Ho fatto alcuni test con la libreria WiringPi. A quanto pare, RPi.GPIO
usa software PWM, il che usa alcune risorse della CPU, ma wiringPi e il tool gpio
possono sfruttare il pin fisico 12 che ha accesso ad hardware PWM. Ho scritto un breve programma in C++ (C sarebbe bastato) che fa oscillare linearmente il duty cycle del PWM hardware del Raspberry Pi, e registrato il risultato.
Una nota importante: usare il PWM richiede permessi di root. Il tool gpio
è SUID, per cui non ci sono di questi problemi, ma il programma che segue dev'essere eseguito come sudo
.
Per compilare è richiesta la libreria wiringpi:
sudo apt-get install wiringpi build-essential g++ -lwiringPi oscillate.cpp -o oscillate sudo ./oscillate
#include <wiringPi.h> #include <iostream> int main() { wiringPiSetupPhys(); pinMode(12, PWM_OUTPUT); std::div_t div; for (int i = 0; ; i = (i + 1) % 2048, div = std::div(i, 1024), delay(1)) { const int duty_cycle = div.rem * (1 - 2 * div.quot) + 1024 * div.quot; pwmWrite(12, duty_cycle); if (i % 64 == 0) { std::cout << int(100.f * duty_cycle / 1024.f) << std::endl; } } return 0; }
Il risultato segue qui sotto. Da notare anche come l'illuminazione sia più che sufficiente per registrare foto e video con Ratcam.
Idealmente, i LED dovrebbero attivarsi e disattivarsi autonomamente in base alla luminosità ambientale. Tuttavia non è possibile identificare l'intensità della luce ambientale solo a partire dall'esposizione della telecamera: una volta che i LED IR sono accesi, l'immagine è ben illuminata, e resta tale anche quando sorge il sole. Per cui non c'è maniera di “vedere se è buio fuori”, dato che “buio” significa “nello spettro visibile”, ma nello spettro visibile + IR, c'è invece luce.
Per cui dal momento che dovevo modificare il circuito per cambiare il pin header, ho aggiunto un sensore di luminosità. Ho scelto questo VEML7700
perché ha una risposta nel visibile, è digitale via I2C, e taglia gli infrarossi in maniera netta (in realtà non ce n'erano molti che potessi saldare a mano :D).
Dal momento che lo userò in Python, ho scritto un controller in Python per il sensore. È disponibile qui. Ho implementato tutte le funzionalità offerte dal sensore, un apprezzamento alla Vishay che ha rilasciato una guida pratica su come usarlo.
Lo sviluppo del case è stato un processo più semplice del PCB, ma ha richiesto diverse rifiniture. L'idea principale è di avere un case per il Raspberry collegato con uno snodo vincolato cavo per far scorrere i cavi e il flex. I dettagli sullo snodo vincolato sono nella voce dedicata. Qui alcuni dettagli tecnici:
Ho sviluppato prima lo snodo, poi il case dell'illuminatore, poi del Raspberry. Il render è fatto con Blender e il progetto è sviluppato in Rhino.