Il firmware 4.4.0 BETA2 per la Original Prusa MINI/MINI+ è disponibile sulla nostra pagina GitHub e la novità più importante è il supporto per le connessioni Wi-Fi. È impossibile dirlo in un altro modo: Ci è servito un sacco di tempo per ottenere ciò che avevamo promesso. È stato un processo lungo e complicato. Ci siamo imbattuti in diversi vicoli ciechi, abbiamo dovuto trovare soluzioni alle limitazioni hardware e non abbiamo ancora completato l’opera. Tuttavia, il supporto per il caricamento wireless dei G-code e la gestione remota della MINI funziona e possiamo finalmente parlare di quello che abbiamo dovuto fare per arrivare a questo punto..

Aggiungere il Wi-Fi alla MINI+

La Original Prusa MINI+ è una macchina economica ma molto versatile. Quando il team hardware l’ha progettata, è stato fondamentale trovare un equilibrio tra la quantità di funzioni e il costo. Inoltre, supportare tutti i modelli di crittografia dei moderni access point sarebbe stato impossibile con l’attuale CPU della MINI. Per questo motivo il chip Wi-Fi non è stato integrato nella scheda madre. Abbiamo quindi pensato di aggiungere alla scheda madre un semplice header che permettesse di collegare una scheda ESP-01 economica, trasformando il microcontrollore esterno in un ponte tra la rete wireless e l’unità USB. Abbiamo fatto delle ricerche e abbiamo trovato diversi progetti open-source che utilizzavano le capacità di rete dell’ESP-01, quindi abbiamo dato il via al progetto.

Cos’è un ESP-01? È un modulo Wi-fi economico composto da uno stack TCP/IP e da un microcontrollore integrato. La sua funzione principale è quella di portare la comunicazione wireless nei progetti embedded. Funziona come un microcontrollore autonomo, quindi non necessita di altri microcontrollori (come Arduino o Atmel) per utilizzare i suoi pin di I/O. In pratica, è un modulo wireless che non richiede l’uso di un microcontrollore. Si tratta in sostanza di un ponte wireless-seriale con 1 MB di memoria flash, una CPU a 32 bit a basso consumo e il supporto per le reti Wi-Fi 802.11 b/g/n. Dal 2014 è una soluzione incredibilmente diffusa e alla portata di tutti. La Original Prusa MINI/MINI+ supporta sia l’ESP-01 che la versione leggermente modificata ESP-01S – maggiori informazioni sono disponibili nel registro delle modifiche. Abbiamo iniziato a lavorare sul supporto Wi-Fi della MINI verso la fine del 2020 con l’intenzione di svolgere la parte di programmazione correttamente fin dall’inizio, anziché buttare giù un po’ di codice e rilasciarlo in fretta e furia, perché in questo modo avremmo dovuto riscrivere tutto da zero, prima o poi. Abbiamo creato un team dedicato con il compito di analizzare l’intero progetto e prototipare la soluzione wireless.

Facciamolo come si deve

Fin dall’inizio, eravamo alla ricerca di una soluzione complessa che supportasse non solo i semplici trasferimenti di G-code attraverso la rete locale, ma che fosse anche compatibile con i nostri software di gestione della farm PrusaLink e Prusa Connect (allora in fase di lancio). Il piano prevedeva la creazione di uno stack TCP/IP stabile per Ethernet e Wi-Fi, la possibilità di utilizzare socket BSD e l’utilizzo di un livello applicativo, ovvero un sito web con funzionalità di controllo remoto in esecuzione su un server HTTP direttamente sulla stampante. Il team ha preso in consegna l’intero incarico e ha iniziato a lavorare. Una delle idee chiave era quella di mantenere intatto il firmware attuale dell’ESP-01. Esistono diverse varianti dell’ESP-01 e si pensava che programmare (e mantenere) un proprio firmware per questi microcontrollori fosse eccessivo. Esiste già uno stack LwIP per l’ESP-01 che si occupa di SLIP (Serial Line IP via UART), NTP e routing statico. Per prima cosa, abbiamo provato ad aggiungere uno stack IP parallelo e LwESP, una libreria leggera di parser di comandi ESP AT. L’utilizzo di una soluzione open-source sembrava la strada giusta.

Ma a questo punto abbiamo iniziato a imbatterci in un vicolo cieco. Esistono diverse versioni del firmware per l’ESP-01, ognuna con una serie di funzionalità leggermente diverse e con livelli di qualità/affidabilità variabili. Inoltre, abbiamo dovuto aggiungere un’enorme quantità di codice nel firmware di Buddy (la scheda madre di MINI) a causa della libreria LwESP. Alla fine, sarebbe stato necessario avere due stack IP paralleli (uno LwIP per l’Ethernet e un altro diviso tra Buddy ed ESP) e passare da uno all’altro quando necessario. E c’erano altri problemi: solo 5 connessioni, mancanza di supporto per un server UDP e vari altri problemi. In teoria, potremmo farlo funzionare in qualche modo, ma i test e il debug sarebbero un incubo. Tuttavia, il nostro collega del team SLA ha trovato una soluzione piuttosto ingegnosa: ha messo a punto uno specifico firmware su misura per l’ESP-01.

Il momento Eureka!

Alla fine abbiamo quindi ottenuto un prototipo di un piccolo firmware speciale che trasformava l’ESP-01 in un’interfaccia di rete, qualcosa di simile al chip Ethernet della scheda madre del Buddy. Era qualcosa di cui avevamo davvero bisogno: un primo passo nella giusta direzione. A quel punto il nostro team ha potuto contare su un nuovo rinforzo. Per citare un film classico: una persona che ha dimenticato più cose sulle reti di quanto tutti noi potremo mai sapere. E per di più un architetto C++ altamente qualificato! Ha ripreso da dove si erano conclusi i tentativi precedenti e ha iniziato un’analisi completamente nuova. Gli è bastato un mese per implementare un server HTTP flessibile ed efficace, in grado di trasmettere le risposte alle richieste (cioè di adattarsi alla RAM limitata, indipendentemente dalla lunghezza della risposta). Il suo collega ha raccolto il firmware personalizzato e ha iniziato a sviluppare il prototipo di ESP che agisce come una scheda di rete. Per prima cosa, ha iniziato con la connessione wireless e ha collegato l’ESP tramite UART (interfaccia seriale) a un computer portatile standard. In questo modo, abbiamo raggiunto velocità fino a 9/6 Mbit (download/upload). Finalmente avevamo una connessione wireless affidabile con una velocità superiore al massimo throughput dell’interfaccia UART della MINI, che è di 4,6 Mbaud. Collegare l’ESP all’interfaccia del livello fisico nello stack LwIP del firmware Buddy ha comportato non solo un risparmio di codice, ma anche l’eliminazione della già citata sintomatologia di stack IP misti per due interfacce diverse. Le cose dunque iniziarono ad andare molto bene.

Unità USB maledette

Stavamo facendo notevoli progressi. Il server HTTP stava procedendo bene e abbiamo iniziato ad aggiungere altre funzioni, come il caricamento dei G-code da PrusaSlicer e il download dei G-code dalla stampante. Abbiamo aggiunto un nuovo browser di file con miniature nell’interfaccia web e implementato le funzioni di avvio/arresto della stampa (e molte altre). 
Ad aprile 2022 avevamo una connessione wireless stabile e il firmware era quasi pronto per essere pubblicato. Restava solo una cosa da risolvere. Purtroppo si trattava di un problema importante: garantire la stabilità e la compatibilità delle varie chiavette USB, dai più economici modelli cinesi senza nome ai dischi USB di marca. Giusto una piccola curiosità: molte delle chiavette cinesi a basso costo e senza nome funzionavano in realtà in modo più affidabile rispetto ai modelli più costosi. 🙂 In ogni caso, abbiamo dovuto prima risolvere i timeout errati nel driver USB. Siamo riusciti a risolvere questo problema in collaborazione con STM. Ma poi c’era un altro problema, qualcosa di veramente diabolico. Mentre le schede SD hanno tempi di risposta ben definiti, i dischi USB non hanno niente di simile. Possono rimanere ” muti” anche per decine di secondi, e in più c’è un’altra cosa chiamata “housekeeping”.

In parole povere: le unità USB sono fatte per funzionare principalmente con computer standard, come laptop, lettori multimediali e console per videogiochi. Queste macchine hanno una quantità pazzesca di RAM (più di 1 MB :-)), quindi quando si inizia a copiare i file su un’unità USB e questa smette di rispondere per alcuni secondi, c’è comunque un grosso buffer che aiuta a superare il ritardo. L'”Housekeeping” è qualcosa che l’unità USB fa automaticamente, è una routine responsabile della copia interna dei blocchi di dati per distribuire il livello di usura in modo più o meno uniforme sulla memoria flash e prolungare la vita del dispositivo di archiviazione. Tuttavia, questo “smistamento” richiede del tempo. Alcune unità USB sono così mal progettate che possono smettere di rispondere anche per 10 secondi. Abbiamo allocato 10 kB di RAM sulla scheda madre del Buddy per fungere da buffer, eliminando così questo problema. Sebbene sia teoricamente possibile caricare i G-code anche durante i lavori di stampa attivi, non è consigliabile utilizzare questa funzione a causa di problemi di prestazioni. 
Infine, abbiamo dovuto risolvere il problema con la libreria FATfs. Questa libreria è usata principalmente per i dispositivi incorporati e cerca di mantenere il filesystem il più coerente possibile. Ciò significa che ogni volta che viene scritto un frammento di un file, il chip dell’unità inizia ad aggiornare la tabella FAT principale e quella di backup. Si tratta di un altro problema di prestazioni che finirà per ridurre la durata di vita dell’unità USB. Fortunatamente, abbiamo trovato una soluzione: una volta iniziato il caricamento di un file G-code, conosciamo già la dimensione totale del file, quindi chiediamo semplicemente al filesystem di riservare spazio per l’intero file. Una volta terminato il caricamento, solo allora la tabella FAT viene aggiornata.

Il percorso che ci attende

L’attuale firmware 4.4.0 BETA offre già una funzionalità di rete avanzata e un caricamento affidabile del G-code. Tuttavia, abbiamo ancora del lavoro da fare. Stiamo verificando se sia possibile effettuare uno streaming affidabile dei file G-code quando la MINI/MINI+ sta stampando. Come spiegato sopra, siamo limitati dalla tecnologia delle unità USB e, sebbene lo streaming sia teoricamente possibile, ci sono ancora molti problemi potenziali. Stiamo ancora migliorando il codice, quindi la velocità attuale è di poco superiore a 100 kB/s a seconda della qualità della connessione wireless e di 300 kB/s su Ethernet. C’è ancora un po’ di margine. In teoria, dovremmo essere in grado di raggiungere circa 460 kB/s di velocità grezza sull’UART/ESP. Ci aspettiamo che la velocità finale sia compresa tra 250 e 350 kB/s se ottimizzata correttamente. Vorremmo anche concentrarci sul rendere l’intera esperienza più facile da usare. Al momento, è necessario copiare uno speciale file INI sull’unità USB, una soluzione piuttosto scarna. Funziona, ma c’è sicuramente margine di miglioramento. Vogliamo inoltre implementare ulteriori miglioramenti in termini di semplicità di utilizzo, come ad esempio un indicatore della potenza del segnale. Fateci sapere cos’altro vorreste vedere! Esistono molte unità USB diverse e vari modelli del modulo ESP-01 che possono influenzare la velocità in un modo o nell’altro. Vi saremo molto grati se deciderete di provare il nuovo firmware MINI e ci farete sapere quali dispositivi (ESP e USB) state utilizzando e qual è la vostra esperienza con essi!

Ovviamente, l’intero firmware incluso di tecnologia Wi-Fi ESP è completamente open-source e i codici sorgente sono gratuitamente disponibili su GitHub. Quindi, se volete sperimentare l’ESP, sentitevi liberi di prendere i codici sorgente qui!

E potete anche dare un’occhiata al rilascio attuale del firmware sulla nostra pagina Github.