Ci siamo chiesti come proporre una soluzione di fotocamera su misura che fosse economica e facile da integrare nelle oltre 400.000 stampanti Original Prusa che abbiamo già spedito in tutto il mondo. Un giorno ci siamo imbattuti in un’ottima soluzione open-source realizzata appositamente per Prusa Connect da un membro della nostra community, Miroslav Pivovarský – un modulo ESP32-CAM con firmware personalizzato.
Questo modulo dal costo contenuto è dotato di flash LED e WiFi integrati e può essere acquistato praticamente ovunque, basta caricare il firmware di Miroslav, e iniziare subito a usarlo. Non è particolarmente rivoluzionario, ma fornisce una soluzione facile, economica e, soprattutto, funzionale per monitorare con una fotocamera remota la vostra stampante.
Una volta flashato il firmware, l’intera configurazione è una questione di pochi click. A questo punto è sufficiente registrare la fotocamera in Prusa Connect, copiare il suo token di accesso e in pochi secondi vedrete la sua prima istantanea nell’interfaccia. Ma non aspettatevi uno streaming video a 4K60; con l’attuale implementazione, invia un’immagine ogni qualche secondo, ma anche questo è più che sufficiente per controllare in remoto la vostra stampa. Oppure per inviare l’immagine a una rete neurale per il rilevamento automatico degli errori, come abbiamo accennato durante l’
episodio del Prusa Podcast sull’intelligenza artificiale nella stampa 3D. E poiché il firmware è dotato di aggiornamenti OTA, la funzionalità potrà essere migliorata in futuro.
Le istruzioni dettagliate per l’intera configurazione sono riportate in questo documento PDF. È anche possibile stampare un pratico supporto per la fotocamera che può essere attaccato al telaio della stampante 3D. È flessibile, ma robusto e si può regolare facilmente la posizione. È stato creato dal grande designer Michal Fanta, ed è possibile scaricarlo gratuitamente da Printables, insieme al case per il modulo della fotocamera.
E se vi state chiedendo cosa sia necessario per sviluppare una soluzione di questo tipo, tra cui l’interfaccia dell’applicazione web, gli aggiornamenti OTA del firmware e molte altre cose interessanti, lasciate che vi raccontiamo la storia dettagliata dietro il suo sviluppo!🙂
La storia ha inizio
Miroslav ha spiegato come è iniziato il lavoro sulla sua soluzione con fotocamera: “Al lavoro avevamo un paio di stampanti 3D MK3S+, collegate alla rete tramite un Raspberry Pi con il software PrusaLink”. PrusaLink consente di ottenere funzionalità di rete avanzate anche su vecchie macchine a 8 bit e permette di collegarle a Prusa Connect. “Stavo usando un vecchio smartphone come fotocamera remota (una funzione integrata in Prusa Connect), ma stavo anche cercando qualcosa di più compatto. L’ideale sarebbe stata una piccola fotocamera che funzionasse anche da sola”, ha aggiunto.
Così, nel frattempo, ha iniziato ad analizzare il funzionamento interno del sistema, in particolare il modo in cui il telefono invia l’immagine a Connect. Non ci è voluto molto per modificare lo script NodeJS che gestisce il trasferimento delle immagini, in modo da ottenere le foto catturate da una piccola fotocamera Raspberry Pi tramite il bus CSI.
Miroslav ha quindi caricato lo script su un altro Raspberry Pi, vi ha collegato la fotocamera e ha eseguito lo script per acquisire l’immagine dalla fotocamera e inviarla a Connect. Tuttavia, c’era comunque un inconveniente: richiedeva due schede RPi: una per la gestione della fotocamera, l’altra per l’esecuzione di PrusaLink. Funzionava, ma come ha detto Miroslav, era tutt’altro che ideale.
Fotocamera collegata all’Original Prusa MK4
Come spesso accade, la svolta è arrivata per pura coincidenza. “L’altro giorno stavo pulendo la mia scrivania e i miei cassetti, perché ho un sacco di moduli e addon Arduino, ed eccolo lì! Un piccolo modulo ESP32-CAM“. Ricorda Miroslav. Questa MCU (Micro Controller Unit) economica ha un proprio processore ARM, una grande memoria Flash, abbastanza RAM e anche un modulo Wi-Fi. Era perfetto!
Ovviamente, il processo che ha portato a una soluzione funzionante non è stato del tutto semplice. Sebbene potesse sembrare che l’IDE di base di Arduino (l’ambiente di sviluppo) fosse sufficiente, non era esattamente così. Alla fine Miroslav ha creato un proprio server HTTP per ricevere e salvare le immagini in arrivo, proprio come Prusa Connect. Con questo server ha testato le prime versioni dei suoi script, quelle che già funzionavano su Raspberry Pi.
Funziona sul mio Raspberry Pi!
Il passo successivo era abbastanza scontato: far sì che la ESP32-CAM facesse lo stesso lavoro del Raspberry Pi. È stato necessario capire come funziona il modulo della fotocamera e come inviare le foto non solo tramite HTTP, ma anche tramite HTTPS, che Prusa Connect utilizza e con cui è più complesso lavorare. Tuttavia, dopo alcune ricerche, dopo aver ottenuto e impostato correttamente il certificato necessario, Miroslav ha inviato correttamente i dati dall’ESP32-CAM al server e anche a Prusa Connect! Sembrava che tutto funzionasse bene, ma subito sono comparsi i primi problemi.
Uno dei problemi maggiori riguardava le dimensioni e la risoluzione dell’immagine inviata. La risoluzione massima, che è stata inviata senza problemi, era di 320×240 pixel, che non è particolarmente elevata. Questa limitazione era causata dal modulo ESP32-CAM stesso, in cui il problema si verificava quando la dimensione del file inviato tramite HTTPS era superiore a 9kB. Dopo alcune ricerche e diversi tentativi, Miroslav ha scoperto che se divide il file in frammenti da 5kB e li invia in sequenza, tutto funziona correttamente. Anche se i caricamenti sarebbero stati leggermente più lenti, si trattava di una soluzione ideale, almeno per il momento.
Era persino sufficiente per creare un flusso video per una rete locale. La preoccupazione iniziale era che il framerate massimo fosse di circa 1FPS, ma dopo aver risolto alcuni problemi, in cui lo streaming causava vari artefatti di colore e una scarsa sincronizzazione orizzontale, i risultati hanno mostrato 5-7FPS a una risoluzione di 1024×768, un ottimo risultato. E l’MCU dovrebbe avere il potenziale per ottenere ancora più FPS e una migliore risoluzione, quindi Miroslav continua a lavorarci.
Ora, Miroslav aveva una soluzione software semplice ma funzionale, che ha immediatamente condiviso su GitHub e sul forum Prusa, perché voleva essere il primo a proporre questa soluzione.
È possibile vedere l’ultima immagine della fotocamera nell’applicazione Prusa Connect.
C’erano ancora molte cose da risolvere, ad esempio non era ottimale che l’intera configurazione dell’MCU fosse integrata nel codice sorgente: il token, l’impronta digitale, l’SSID WiFi, la configurazione della fotocamera e altro ancora. L’intero pacchetto viene compilato e inserito nella memoria dell’MCU, senza la possibilità di apportare ulteriori modifiche. Miroslav ha quindi iniziato a cercare una soluzione in un campo con cui aveva poca esperienza: l’interfaccia web.
Sebbene lo sviluppo web non fosse l’obiettivo principale di Miroslav, quest’ultimo ha accolto la sua idea con entusiasmo e dopo diverse serate di programmazione ha realizzato un’applicazione web funzionale per la configurazione della fotocamera, che funzionava direttamente sul relativo modulo. “Sembrava uscita direttamente dagli anni ’90, ma funzionava, quindi mi andava bene così”. Miroslav ha riso.
Una delle prime versioni dell’interfaccia web della fotocamera
Sui binari dello sviluppo
Anche noi abbiamo notato la sua soluzione e ci è piaciuta molto, così lo abbiamo contattato via e-mail e gli abbiamo offerto una collaborazione per lo sviluppo. “Sono rimasto piacevolmente sorpreso dall’offerta e ho accettato immediatamente. Tra le altre cose, perché mi piacerebbe contribuire maggiormente alla community open-source“, ha detto Miroslav.
Dopo alcune discussioni e la revisione del codice, abbiamo proposto diverse idee per migliorare il software e l’interfaccia web, ad esempio l’implementazione di un’interfaccia utente dall’aspetto più moderno, ecc. Miroslav ha accolto tutti questi punti con entusiasmo e ha iniziato a lavorarci immediatamente. “La parte più impegnativa dell’intero progetto per me è stato lo sviluppo dell’applicazione web stessa”, ha detto Miroslav. Il sito web doveva avere un aspetto gradevole e moderno, idealmente in un stile Prusa, pur adattandosi alla limitata memoria Flash dell’MCU. D’altra parte, dopo aver analizzato e letto diversi articoli, ha valutato che la sua soluzione attuale, che prevede una combinazione di HTML e JavaScript con jQuery, è la strada giusta da percorrere.
Miroslav ha anche colto l’occasione per lavorare con l’IA, che lo ha aiutato nella creazione del sito. Ad esempio, ha consigliato e spiegato i singoli componenti, come si chiamano, come si usano, ecc. “È stato divertente. Ho cercato di spiegare all’IA cosa volevo, ma non sapevo nemmeno esattamente cosa volevo. Sapevo solo come volevo che fosse alla fine”, ha detto Miroslav. Ha anche ammesso che, anche se l’interfaccia web avrebbe potuto essere migliorata e ottimizzata, si è divertito molto a svilupparla e ha imparato molte cose nuove..
L’esigenza di una configurazione
Ora che il progetto dell’interfaccia web era praticamente terminato, ha iniziato a pensare ad altre funzionalità. Ad esempio, gli aggiornamenti del firmware dovevano essere possibili tramite l’interfaccia web: la fotocamera poteva controllare l’ultima versione del firmware e scaricarla se necessario, e tutto doveva essere il più semplice possibile.
Aspetto attuale dell’interfaccia web della fotocamera
Ora era il momento di occuparsi di una delle cose più importanti, ovvero il primo avvio e la configurazione della MCU. Miroslav ha proposto due soluzioni diverse, che possono esistere l’una accanto all’altra e ognuno può scegliere il modo preferito di inizializzare la fotocamera.
La prima soluzione è la modalità AP, in cui un punto di accesso con un SSID specifico viene creato dopo l’accensione dell’MCU. Il client può connettersi all’AP tramite WiFi e qui può impostare i dettagli di accesso alla propria rete wireless e configurare ulteriormente la fotocamera. Per evitare che gli AP inutilizzati interferiscano inutilmente con la banda WiFi a 2,4 GHz (immaginate di averne decine accesi), se nessun dispositivo si connette entro cinque minuti dall’accensione della fotocamera, la modalità AP viene disattivata automaticamente.
Una volta impostata la fotocamera, è possibile individuare la sua amministrazione nella rete tramite l’indirizzo IP, ma questo non è molto comodo, soprattutto se non si conosce l’indirizzo IP e non si ha accesso al pannello di controllo del router. Per facilitarlo, Miroslav ha anche aggiunto la funzionalità mDNS al software della fotocamera, il che significa che è possibile accedere al dispositivo nella rete locale tramite un record DNS (si può pensare a un nickname), quindi non è necessario conoscere o ricordare il suo indirizzo IP. Il record mDNS è configurabile: per esempio, adesso è http://prusa-esp32cam.local
Tuttavia, la soluzione in modalità AP ha comportato un problema, perché l’interfaccia web deve funzionare in modalità offline, mentre l’utente si connette alla fotocamera in modalità AP. Per questo motivo, è stato necessario memorizzare la libreria jQuery direttamente nel codice sorgente dell’MCU. Fortunatamente, esistono già librerie jQuery piccole e ottimizzate per questo scopo, anche se richiedono comunque circa 86kB di memoria Flash dell’MCU, una quantità non indifferente.
Un altro modo per configurare la fotocamera è caratterizzato da un’interfaccia di comunicazione seriale, che gli utenti possono utilizzare al posto della modalità AP se non possono o non vogliono usarla. Qui l’utente può impostare le credenziali WiFi e il token di autorizzazione per l’applicazione backend, visualizzare l’indirizzo IP della fotocamera nella rete o utilizzare altri comandi tramite la console.
Più diventa grande…
A questo punto, il progetto è cresciuto parecchio. Miroslav ha riscritto il sito web circa 3-4 volte perché ha sempre trovato qualcosa che poteva essere fatto meglio. La prima versione del codice era scritta in C, quindi ora ha cercato di riscrivere tutto in C++, cosa che non è ancora stata fatta completamente, ma il codice viene modificato e migliorato pezzo per pezzo. Sebbene il progetto sia cresciuto parecchio, è iniziato e continua ad essere un progetto Arduino, in modo che la community possa facilmente modificare il codice sorgente senza dover usare un altro IDE dedicato con un compilatore.
A questo punto si trattava di capire come implementare l’aggiornamento del firmware OTA (over-the-air). L’attuale versione dell’MCU ha 4 MB di memoria Flash, il che significa che solo 1,9 MB di Flash possono essere utilizzati per l’intera applicazione. Se vi chiedete perché, è perché per l’aggiornamento del firmware viene utilizzato il cosiddetto “double banking”, ovvero la memoria viene divisa in due settori (in realtà sono di più, ma per semplicità diciamo due). In un settore è presente un’applicazione valida e aggiornata (la chiameremo settore A). Nell’altro settore è presente una versione dell’applicazione non valida e obsoleta (indovinate, si tratta del settore B).
Informazioni sul sistema della fotocamera, comprese le opzioni di aggiornamento del firmware OTA
Quando viene scaricato il nuovo firmware, il settore B (l’applicazione non valida) viene sovrascritto. Quindi viene verificata l’integrità del firmware installato e, se tutto è a posto, l’applicazione nel settore B viene impostata come applicazione attiva. Grazie a questo sistema, un aggiornamento OTA non sovrascrive mai l’applicazione in esecuzione.
Limitazioni hardware
Oltre ai vari problemi software, si sono verificati anche alcuni problemi con l’hardware stesso. Alcuni dei campioni di prova hanno smesso di inviare foto, si sono disconnessi dal WiFi, si sono riavviati, ecc. “Erano molti problemi diversi, ma mi stavo divertendo a risolverli. È stato molto interessante vedere come si verificano e trovare soluzioni per eliminarli”, ha commentato Miroslav.
Il problema maggiore è stato causato dalla progettazione della scheda ESP32-CAM. Ad esempio, poiché il processore ha pochi pin e un numero relativamente elevato di periferiche, il progettista ha utilizzato il pin per l’accensione del LED anche come uno dei pin per la comunicazione con la scheda microSD. Ciò comportava un problema di comunicazione tra l’MCU e la scheda microSD quando il LED era acceso. Il problema è stato risolto utilizzando la modalità “one wire” della scheda microSD, in cui i dati vengono letti e scritti solo attraverso un ingresso/uscita digitale.
Il problema più grave riguarda il LED flash sulla scheda: il progettista ha collegato questo LED direttamente a 3,3 V senza una resistenza di limitazione della corrente, il che fa sì che la corrente che scorre attraverso il LED sia troppo alta e che il diodo si bruci dopo un certo tempo. Su una scheda il LED si è spento dopo un mese di lampeggiamento ogni 30 secondi. Miroslav ha proposto diverse soluzioni a questo problema, tra cui la saldatura di una resistenza tra il collettore del transistor e la scheda, oppure l’utilizzo di una sorgente luminosa esterna, commutata da un relè, un MOSFET o qualcosa di simile. Alcuni componenti della scheda si riscaldano anche abbastanza, ma dipende dal lotto in uso. Questo problema è ancora in fase di lavorazione, perché sono stati fatti diversi tentativi come la riduzione della frequenza di clock del processore, ma non hanno portato grandi miglioramenti.
Le poche soluzioni possibili per il problema dei LED suggerite da Miroslav
Come potete vedere, ci sono ancora molte cose da risolvere e migliorare in questo progetto. Tuttavia, Miroslav continua a divertirsi e a lavorarci. La cosa che più gli piace è scoprire cosa si può fare con un modulo fotocamera piccolo ed economico. Vorrebbe lavorare ancora di più sul multitasking, dato che tutto viene eseguito contemporaneamente su un solo core del processore, anche se il processore ha due core (dual core). E ci sarà sicuramente un mucchio di altre modifiche/miglioramenti che vorrebbe aggiungere.
Quindi, non esitate a provare questa interessante soluzione per la fotocamera e condividete i vostri commenti o le vostre domande con noi e con l’autore. Buona stampa!
Devi essere connesso per inviare un commento.