Firmware 4.4.0 BETA2 pro 3D tiskárnu Original Prusa MINI/MINI+ je už pár dnů k dispozici na našem GitHubu a nejdůležitější novinkou je zcela jistě podpora pro Wi-Fi připojení. A nemá smysl chodit kolem horké kaše: Víme, že nám trvalo  pěkně dlouho splnit to, co jsme slíbili. Byla to dlouhá a komplikovaná cesta. Narazili jsme na několik slepých uliček, museli jsme obejít různá hardwarová omezení – a stále ještě nejsme u konce vývoje. Nicméně podpora bezdrátového nahrávání G-kódů a vzdálené správy tiskárny funguje a my se konečně můžeme rozepsat o tom, co bylo potřeba vymyslet a naprogramovat, abychom se dostali až do této fáze.

Zkuste to bez drátů!

Originální Prusa MINI+ je cenově dostupná a zároveň velmi schopná tiskárna. Když ji hardwarový tým navrhoval, bylo nutné najít rovnováhu mezi počtem funkcí a cenou. Proto nebyl Wi-Fi čip zabudován přímo na základní desce. Namísto toho jsme tedy přišli s nápadem přidat na základní desku pouze konektor, který by umožnila připojení oblíbeného modulu ESP-01. Ten by sloužil jako „most“ mezi bezdrátovou sítí a USB diskem.

Provedli jsme potřebné rešerše a našli jsme hned několik open-source projektů, které využívaly bezdrátové schopnosti desky ESP-01, takže se mohl celý projekt rozběhnout.

Co je to vlastně ESP-01? Jedná se o levný Wi-Fi modul obsahující TCP/IP stack a vestavěný mikrokontrolér, což z něj dělá kompaktní bezdrátové řešení pro širokou škálu nejrůznějších zařízení. Funguje jako samostatný jednočipový počítač, takže nevyžaduje žádný jiný mikrokontrolér (jako Arduino nebo Atmel), aby bylo možné používat jeho vstupně-výstupní piny. Zjednodušeně řečeno se jedná o „most“ pro bezdrátové připojení k sériovému portu. Má 1MB flash paměti, 32bitový procesor s nízkou spotřebou a podporu sítí Wi-Fi 802.11 b/g/n. Od roku 2014 se jedná o celosvětově populární a cenově dostupné řešení.

Original Prusa MINI/MINI+ podporuje jak ESP-01, tak mírně upravenou verzi ESP-01S – více informací najdete v seznamu změn.

Na podpoře Wi-Fi v MINI jsme začali pracovat ke konci roku 2020 s úmyslem udělat programátorskou část pořádně od začátku. Nechtěli jsme překotně uplácat „něco“, jen proto, abychom si mohli úkol odškrtnout. Stejně by to znamenalo, že bychom museli dříve nebo později všechno přepsat od začátku. Proto jsme sestavili specializovaný tým, který měl za úkol provést řádnou analýzu celého projektu a vytvořit prototyp bezdrátového řešení.

Pořádně už od začátku

Od začátku jsme hledali komplexní řešení, které by podporovalo nejen triviální přenosy G-Codů přes místní síť, ale bylo by také kompatibilní s naším softwarem pro správu farmy PrusaLink a Prusa Connect. V plánu bylo vytvořit stabilní stack TCP/IP pro Ethernet i Wi-Fi, mít možnost používat sockety BSD a využívat aplikační vrstvu – tedy webovou stránku s prvky pro dálkové ovládání běžící na serveru HTTP přímo v tiskárně. Tým dostal zadání a začal pracovat.

Jedním z klíčových rozhodnutí bylo zachovat původní firmware ESP-01. Existuje řada různých variant ESP-01 a vycházeli jsme z toho, že programování (a údržba) vlastního firmwaru pro tyto mikrokontroléry by byla obrovská nálož práce navíc. Pro ESP-01 již existuje stack LwIP, který se stará o SLIP (Serial Line IP přes UART), NTP a statické routování. Nejprve jsme zkusili přidat paralelní IP stack a LwESP, což je lightweight ESP knihovna pro parser AT příkazů, protože použití open-source řešení se zdálo být správnou cestou.

Jenže jsme začali narážet na slepé uličky. Pro ESP-01 existují různé verze firmwaru, každá s trochu jinou sadou funkcí a různou úrovní kvality/spolehlivosti. Navíc jsme museli přidat obrovské množství kódu do firmwaru Buddyho (základní deska MINI) kvůli knihovně LwESP. Tohle řešení začalo směřovat k tomu, že bychom v tiskárně měli dva paralelní IP stacky (jeden LwIP pro ethernet a druhý „rozdělený“ mezi Buddy a ESP) a přepínali bychom mezi nimi podle situace, což je zbytečně komplikované řešení.

Další problémy na sebe nenechaly čekat – počet možných připojení byl limitován na pouhých pět, chyběla podpora pro UDP server a k tomu se přidaly ještě různé další nepříjemnosti. Teoreticky bychom to sice dokázali nějak zprovoznit, ale testování a ladění by byla noční můra. Naštěstí náš šikovný kolega z SLA týmu našel jednoduše geniální řešení – podařilo se mu naprogramovat speciální „mini“ firmware pro ESP-01.

Heuréka!

Náhle jsme tedy měli prototyp malého speciálního firmwaru, který z ESP-01 udělal síťové rozhraní, tzn. ESP se chovalo podobně jako ethernetový čip na základní desce Buddy. Bylo to něco, co jsme opravdu potřebovali: krok správným směrem.

A pak našemu týmu přibyla nová posila. Vyloženě se hodí parafráze na citát z jednoho legendárního filmu: je to člověk, který toho o síťování zapomněl víc, než my všichni kdy budeme vědět. Navíc je to i špičkový C++ architekt! Navázal tam, kde předchozí pokusy skončily, a začal se zcela novou analýzou. Pouhý měsíc potřeboval na to, aby implementoval flexibilní a efektivní HTTP server, který je schopen streamovat odpovědi na požadavky (tj. vejde se do omezené paměti RAM bez ohledu na to, jak dlouhá je odpověď).

Jeho kolega převzal prototyp ESP firmwaru a začal rozvíjet funkcionalitu, kdy se ESP chová vyloženě jako síťová karta. Nejprve začal s bezdrátovým připojením a připojil ESP přes UART (sériové rozhraní) ke standardnímu notebooku. Tímto způsobem dosáhl rychlosti až 9/6 Mbit (stahování/odesílání), čímž jsme se dostali do fáze, kdy jsme měli funkční spolehlivé bezdrátové připojení s rychlostí překračující maximální propustnost rozhraní UART MINI, která je 4,6 Mbaud.

Připojení ESP k rozhraní fyzické vrstvy v LwIP stackupřineslo nejen úsporu kódu ve firmwaru, ale také odstranilo výše zmíněnou schizofrenii dvou IP stacků pro dvě různá rozhraní. Konečně jsme se blížili do cíle. Ale úplný konec to ještě nebyl.

Prokleté USB disky

V síťování jsme udělali pořádné pokroky. HTTP server nám šel pěkně od ruky a začali jsme přidávat další funkce – například nahrávání G-Codů z PrusaSliceru a stahování G-Codů z tiskárny. Do webového rozhraní jsme přidali nový prohlížeč souborů s náhledy a implementovali jsme funkce spuštění/zastavení tisku (a několik dalších).

V dubnu 2022 jsme měli stabilní bezdrátové připojení a firmware byl téměř připraven k vydání. Zbývalo vyřešit jen jednu věc. Byl to bohužel zásadní problém: zajištění stability a kompatibility různých disků USB – od nejlevnějších čínských no-name modelů až po značkové disky USB. Taková kuriozitka: mnohé z levných čínských no-name disků překvapivě fungovaly spolehlivěji než dražší značkové modely :-). Každopádně jsme museli nejprve vyřešit nesprávné timeouty v ovladači USB. To se nám podařilo vyřešit ve spolupráci s STM.

Jenže pak tu byl další zádrhel, vyloženě ďábelská věc. Zatímco SD karty mají velmi jasně specifikované doby odezvy, USB disky nic takového nemají. Mohou se „odmlčet“ i na desítky sekund, navíc rády praktikují proces zvaný „housekeeping“.

Zjednodušeně řečeno: Disky USB jsou určeny především pro fungování se standardními počítači – notebooky, multimediální přehrávače a herní konzole. Tato zařízení mají obrovské množství paměti RAM (více než 1 MB :-)), takže když začnete kopírovat soubory na jednotku USB a ta na několik sekund přestane reagovat, velká vyrovnávací paměť pomůže takový výpadek překonat.

„Housekeeping“ je automatický proces, o který se stará elektronika USB disku. Zjednodušeně řečeno jde o to, že při kopírování souborů zajišťuje elektronika více či méně rovnoměrný zápis datových bloků – je to z toho důvodu, aby se rozložila zátěž a opotřebení paměti flash (kvůil prodloužení životnosti). Toto „třídění“ ale zabírá čas.

Některé disky USB jsou tak špatně navrženy, že mohou přestat reagovat až na 10 sekund. Na základní desce Buddy jsme tudíž vyčlenili 10 kB paměti RAM, která slouží jako vyrovnávací paměť, a tím jsme tento problém potlačili. I když je teoreticky možné nahrávat kódy G i během aktivních tiskových úloh, nedoporučujeme tuto funkci používat kvůli problémům s výkonem.

A nakonec jsme museli vyřešit problém s knihovnou FATfs. Tato knihovna se používá především pro embedded zařízení a snaží se udržet souborový systém co nejkonzistentnější. To znamená, že při každém zápisu fragmentu souboru začne čip USB jednotky aktualizovat hlavní a záložní tabulku FAT. To je další zabiják výkonu, který snížuje životnost jednotky USB. Naštěstí jsme našli řešení: jakmile začneme nahrávat soubor s G-Codem, je to moment, kdy už známe celkovou velikost souboru – takže jednoduše požádáme souborový systém, aby nejprve rezervoval místo pro celý soubor a teprve po dokončení nahrávání se aktualizuje tabulka FAT.

Nejsme na konci

Současný firmware 4.4.0 BETA již nabízí rozšířené síťové funkce a spolehlivé nahrávání G-Codů. Stále však máme před sebou ještě kus práce. Zjišťujeme, zda můžeme spolehlivě streamovat G-Cody, zatímco MINI/MINI+ tiskne. Jak bylo vysvětleno výše, jsme omezeni technologií USB disků, a i když je streamování teoreticky možné, stále máme mnoho potenciálních problémů k vyřešení.

Stále jsme v procesu, kdy kód není zcela finální, takže aktuální rychlost je něco málo přes 100 kB/s v závislosti na kvalitě bezdrátového připojení a 300 kB/s na ethernetu. Je tu prostor ke zlepšení. Teoreticky bychom měli být schopni dosáhnout na UART/ESP hrubé rychlosti kolem 460 kB/s. Očekáváme, že při správné optimalizaci bude konečná rychlost někde mezi 250-350 kB/s.

Rádi bychom se také zaměřili na zlepšení uživatelské přívětivosti celého prostředí. V tuto chvíli je třeba na USB disk zkopírovat speciální INI soubor s přihlašovacími údaji, což je poněkud kostrbaté řešení. Je sice funkční, ale k uživatelské přívětivosti má ještě poměrně daleko – víme o tom. A chceme implementovat další vychytávky, například dynamický ukazatel síly signálu. Budeme rádi, když se s námi podělíte o vaše vlastní podněty a nápady!

Řešíme samozřejmě i kompatibilitu. Existuje spousta různých USB disků a různých modelů modulu ESP-01, které mohou rychlost tak či onak ovlivnit. Budeme vám velmi vděční, pokud se rozhodnete nový firmware MINI vyzkoušet a dáte nám vědět, jaká zařízení (ESP a USB) používáte a jaké s nimi máte zkušenosti!

Podívejte se na aktuální verzi firmwaru na naší stránce Github, kde najdete i zdrojové kódy pro náš speciální ESP firmware!