pondělí 24. července 2017

OctoPrint - instalace na Orange Pi

Jak se vlastně 3D tiskne

Už přes půl roku mám 3D tiskárnu i3 MK2 a tisknu na ní různé roztodivné věci:


Vybraný model k tisku je obvykle ve formátu STL. Ten musím nařezat na plátky (naslicovat) a pak z nich vygenerovat instrukce pro pohyb tiskové hlavy, tiskové podložky a dávkování roztaveného plastu - tzv. G kód (čistě textový soubor s koncovkou .gcode).

Tento soubor s pokyny potom načítá mikrokontrolér v tiskárně a jednotlivé pokyny postupně vykonává. Tiskárna má k tomu vestavěný vlastní maličký mikropočítač se čtečkou SD karet, displejem a jedním otočným ovládacím knoflíkem. Stačí soubor s G kódem nahrát na PC na (mikro)SD kartu, tuto přenést k tiskárně, vložit do její čtečky karet a nechat vytisknout.


Toto funguje spolehlivě, ale brzy začne být přenášení paměťové karty mezi PC a tiskárnou méně a méně zábavné, později dokonce více a více otravné. Displej na tiskárně má malé rozlišení, není jednoduché vybrat mezi vícero soubory připravenými k tisku. Informace během tisku jsou minimální - jen procenta načtení souboru a aktuální výška výtisku. Chtělo by to nějak vylepšit.

Tiskárnový mikrokontrolér jde ovládat i přes USB. Můžeme například připojit tiskárnu přímo k pracovnímu PC a díky programu Pronterface posílat instrukce G kódu přímo z PC po USB kabelu. Během tisku vidíme mnohem víc informací, třeba grafy s teplotami podložky a tiskové hlavy, nebo aktuální pozici hlavy na tiskové vrstvě atd. Vypadá to, že takto je to pohodlnější než neustálé přenášení karty sem a tam.

Ovšem pak zjistíme, že u 12hodinového tisku nemůžeme vypnout PC, protože by se tisk přerušil. Nemůžeme ho ani restartovat (třeba kvůli aktualizacím). A když se rozhodne nejmenovaný systém jedné monopolní firmy restartovat sám (jak to má v oblibě), zničí tím celý mnohahodinový tisk. Program taky nesmí spadnout, USB nesmí nikdo rozpojit, s notebookem nesmíme nikam odejít atd. Ani toto není ideální.

Nejlepší řešení by bylo věnovat jeden počítač jen a pouze tiskárně. Mohl by být přístupný po síti nebo i z Internetu, umožnit tisky pouštět, hlídat a v případě poruchy zastavovat i na dálku, mohl by mít připojenou kamerku, takže bychom mohli tisknout a přitom si třeba odskočit na pár hodin "na jedno" a přitom mít dokonalý vizuální přehled, jako bychom se od tiskárny nevzdálili ani na krok. Nic jiného by na tomto počítači neběželo, žádné aktualizace a další zdroje poruch - prostě specializovaný, dedikovaný počítač jen pro tiskárnu. A mohl by mít pěkné webové rozhraní, které by všechno umožnilo řídit. To by asi bylo ideální.

OctoPrint

No a protože žijeme v úžasném světě svobodného software, tak tento řídicí program s pěkným webovým rozhraním a mnoha dalšími vymoženostmi už existuje - jmenuje se OctoPrint - a je dostupný zdarma a se všemi zdrojovými kódy (vývoj probíhá na GitHubu). Kdybych chtěl být genderově nekorektní, nebo dokonce pozitivně diskriminační, zmínil bych i tu zajímavost, že tento skvělý program vyvíjí žena - Gina Häußge. Ale protože na pohlaví u programátorů nehledíme, tak jen zmíním, že je dobré jí přispět nejen kvalitním bug reportem, pull requestem s nějakým vylepšením, ale i třeba drobnou mincí (Patreon, Paypal), protože OctoPrintu věnuje spoustu času a musí taky z něčeho žít.

Takže software máme (v Pythonu, tedy přenositelný na jakoukoliv platformu) a chybí už jen počítač. Místo PC, které je neskladné, žere elektřinu a točí se v něm součástky, bude mnohem lepší volbou jednodeskový minipočítač. Například něco jako Raspberry Pi za 35 dolarů (plus dražší poštovné plus smrt na poštovní celnici za překročení limitu). Pro Raspberry Pi existuje hotový obraz paměťové karty s předinstalovaným operačním systémem a OctoPrintem - jmenuje se OctoPi a není s ním žádná práce, takže tady by mohl tento návod končit.

Orange Pi

Pokud jste ale fandové levnějšího ovoce než Malin z Anglie, můžete číst dál. Popíšu totiž, jak jsem OctoPrint nainstaloval na Pomeranč z Číny, tedy Orange Pi od Shenzhen Xunlong Software. To ale není moc důležité, protože rozumný operační systém pro tyto malé počítače - Armbian - běží na desítkách různých desek, takže tento postup jde aplikovat i na Banány, Borovice a mnohé další stroje.

Konkrétně jsem použil Orange Pi One za necelých 10 dolarů (plus levné poštovné $3.61). K němu jsem rovnou přikoupil i originální 2Mpix kamerku. Není to žádný zázrak, ale za necelých 6 dolarů paráda. Tím pádem jsem byl hluboko od obávaným celním limitem a za pouhých 400 českých korun získal počítač, který bude jen a pouze sloužit tiskárně.

Pokud bych nechtěl použít originální kamerku k Orange Pi, ale sáhl místo toho po nějaké s USB rozhraním, mohl bych vzít ještě levnější počítač - Orange Pi Zero za neuvěřitelných 6 dolarů. Zero totiž nemá CSI konektor pro kameru, bohužel. Anebo kterýkoliv jiný Orange Pi, jejich výrobce se zbláznil a skoro každý měsíc vychrlí nový typ...

Instalace HW

Instalace "železa" vyžaduje vyrobit či sehnat kryt na počítač, protože nechceme nic zkratovat. Nejlepší je kryt si sám vytisknout. Na Thingiverse jsem našel krásný hotový model.


Dále potřebujeme držák na kameru. Opět nejlépe vytisknout, a zase jde najít hotový model držáčku kamery na Thingiverse.



Teď je potřeba počítač přichytit třeba na rám tiskárny, kde nebude zavazet, zatímco kameru je potřeba postavit tak, aby viděla na tiskovou plochu. Bohužel, originální kamerka připojená přes CSI rozhraní může mít jen kratičký kablík, takže je nutno najít takovou pozici pro počítač, kde bude mít kamerka dobrý výhled. Toto jsem v době psaní tohoto článku ještě nevyřešil...

USB kamerka by zde byla výhodnější, neboť USB kablík může být mnohem delší, takže počítač by mohl být zezadu na rámu tiskárny, a kamerka jen na nějakém měkkém drátku nastavena někde z boku tak, aby pěkně viděla na scénu.

Počítač můžeme napájet originálním zdrojem z další zásuvky, ale do budoucna se chystám spíš udělat rozdvojku na USB vedoucím z mikrokontroléru tiskárny a napájet Orange Pi přímo z tiskárny. Jestli si na to koupím kablík pro napájení z USB, nebo jestli se připojím přímo na piny konektoru v Orange Pi, ještě netuším, ale obě možnosti jsou schůdné.

V neposlední řadě je dobré nezapomenout na osvětlení tiskové plochy. Určitě postačí pár jasně bílých LEDek, nejlépe taky napájených z USB tiskárny, ať je všechno na jednom zdroji. Fajnšmekr by dokonce mohl k počítači připojit senzor úrovně okolního světla a řídit svit LEDek podle toho (přes den vůbec, v noci na max, ale jen při tisku, samozřejmě).

Zajímavé by mohlo být osvětlit pracovní plochu infračervenými LEDkami a snímat kamerkou bez IR filtru. Pak by tisková sestava nepřispívala ke světelnému smogu (zbývá ještě hlukový smog a plastový smrad, což vyřeší jedině separátní tiskařská kobka s odsáváním zplodin).

Instalace SW

Tak za prvé nainstalujeme určitě operační systém, tedy rozhodně Armbian. Stáhnout správnou verzi na PC, zapsat na paměťovou kartu, vložit do Pomeranče a nastartovat. Napoprvé se tam dějí věci (rozšiřují diskové oddíly), tak je potřeba to nechat, případně restartovat, updatovat balíčky atd. Přesný návod najdete u Armbianu.

Dále můžeme instalovat samotný OctoPrint. Postupujeme podle návodu pro Raspberry Pi, protože Debian jako Debian (tj. Raspbian jako Armbian). Jeden důležitý balíček jim tam (kvůli chybě v Debian Wheezy) ale chybí - "virtualenv". Takže do příkazové řádky napište:
sudo apt-get install python-pip python-dev python-setuptools python-virtualenv virtualenv git libyaml-dev build-essential
Zajímavé je (pro lidi jako já, kteří neznají python a jeho virtualenv), že po zkompilování všech těch zbytečných věcí není možné výsledný adresář někam přesunout, protože všechny ty blbosti mají v sobě zakompilovanou absolutní cestu. Takže když jsem to zkompiloval na zkoušku v /tmp/OctoPrint-master/, tak už to tam musím pořát mít, i když nechci (protože /tmp/ se po každém restartu promazává). "Vyřešil" jsem to tak, že jsem ten zkompilovaný adresář přejmenoval a přesunul do /home/, a teď si jen vždy před spuštěním udělám symbolický link - nějak takto:

ln -s /home/OctoPrint /tmp/OctoPrint-master

Tím jsem se nechtěl pochlubit, je to takové škrábání se levou rukou za pravým uchem - spíš jsem chtěl jen upozornit na něco, co jsem původně netušil, a že to jde obejít i bez kompletní rekompilace. Počítám, že v diskusi mě nějaký pythonista upozorní, že to jde vyřešit ještě nějak jinak - to jsem zvědav.

OctoPrint máme spouštět v tom adresáři, kde jsme ho zkompilovali, a navíc s parametrem "serve", takže v mém popleteném případě nějak takto:
cd /tmp/OctoPrint-master && ./venv/bin/octoprint serve

V tu chvíli se spustí web server na portu 5000, takže v dobře nakonfigurované síti je možné hned poté otevřít webový prohlížeč na PC/tabletu/mobilu a napsat do něj http://orangepione:5000/

Trošku oříšek může být zařídit spuštění programu hned po startu operačního systému. Zkušený uživatel Debianu by napsal init skript (do /etc/init.d/), případně systemd službu, a nejspíš by přitom využil parametr "daemon" OctoPrintu. Je ale možné i trošku "podvádět" a spustit program přímo z /etc/rc.local, což je skript, který se pouští při startu systému. Jen je potřeba spustit OctoPrint pod správným uživatelem a navíc mu zprostředkovat terminál, tedy jeho emulaci programem screen:

su - ja -c "/usr/bin/screen -dmS octoprint /X/venv/bin/octoprint"

V předchozím řádku je potřeba nahradit "ja" jménem vybraného uživatele a "X" cestou ke zkompilovanému OctoPrintu.

Video streaming

Na Orange Pi s originální kamerkou je zajímavý fakt, že přestože používá ovladač "gc2035" přítomný v Armbianu, tak přesto nefunguje ŽÁDNÝ program pro práci s videem kromě jediného - "motion". Proto drtivá většina návodů na Internetu popisuje konfiguraci programu "motion" - například na cnx-software.com.

Fór je v tom, že motion na tohle není dělaný, resp. je kanónem na vrabce. Motion má totiž hlavně hlídat změny v obraze, zatímco nám by stačilo obyčejný video streaming, jak to umí například program mjpg-streamer.

Kdysi jsem našel vysvětlení, proč ostatní programy nefungují, a zajímavý návod, jak to obejít: zavede se modul "v4l2loopback", který vytvoří virtuální video zařízení, a pak se spustí jednoduchý prográmek nazvaný "vidcopy", který kopíruje data z reálného video zařízení (z kamery) do toho virtuálního, se kterým už poté umí pracovat běžné video programy. Ta stránka už na Internetu neexistuje, ale popsáno je to třeba i na tomto blogu.

Poté je možné například zkompilovat mjpg-streamer (potřebujeme ale jistý fork s doplněným klíčovým parametrem "-u"), který bude brát obraz z virtuálního zařízení a streamovat přes web.

Výsledný skript (nazvaný třeba streaming.sh) na zavedení modulů do kernelu ve správném pořadí a spuštění nezbytných programů je zde:
sudo modprobe gc2035
sleep 2
sudo modprobe vfe_v4l2
sleep 2
sudo modprobe v4l2loopback
sleep 2
SIRKA=1280
VYSKA=720
FPS=5
ROZLISENI=$SIRKA"x"$VYSKA
cd $HOME/streaming
(cd vidcopy && ./vidcopy -w $SIRKA -h $VYSKA -r $FPS -i /dev/video0 -o /dev/video1 -f UYVY &)
sleep 3
cd mjpg-streamer/mjpg-streamer-experimental && ./mjpg_streamer -i "./input_uvc.so -r $ROZLISENI -f $FPS -n -u -d /dev/video1" -o "./output_http.so -w ./www"
Tento skript opět spustíme při startu systému přidáním následujícího řádku do /etc/rc.local:
su - ja -c "/usr/bin/screen -dmS streaming /cesta/k/streaming.sh"
Tím se spustí další web server, tentokrát na portu 8080: http://orangepione:8080/

Konfigurace OctoPrintu

Ještě bych rád zdokumentoval pár drobností, které jsem objevil při počáteční konfiguraci OctoPrintu. Například určitě chceme, aby se hned po startu serveru připojil k tiskárně, protože to trvá asi 20 sekund a kdo má na to čekat. Úvodní nastavení komunikačního portu je "AUTO" a když klikneme na "Connect", tak se připojí. "Auto-connect" po startu serveru ale nefunguje, dokud nezvolíme konkrétní sériový port ("/dev/ttyACM0").

Dále, názvy souborů na kartě se objevují ve zkráceném tvaru (jen prvních šest znaků, pak vlnka a číslo) - tohle je známá, ale stále nevyřešená chyba OctoPrintu. Vzhledem k tomu, že SD kartu už nebudeme potřebovat, to asi nevadí.

Zajímavá je též chyba "pozor, tištěný objekt se nevejde na tiskovou plochu". Je to kvůli tomu, že Průšův Slic3r přidává před samotný tisk jakési "rozcvičení" tiskové hlavy, kdy na samém předním okraji tiskové plochy vyjede asi 5cm proužek plastu. Tento proužek je na souřadnici -3, což OctoPrint správně prohlásí jako mimo tiskovou plochu. Vidím několik způsobů, jak to vyřešit. Přesunout inicializační G kód ze Slic3ru do OctoPrintu, nahlásit jako chybu a prosit Ginu o "opravu" (ignorováním počáteční sekvence), anebo to prostě rovnou ignorovat selským rozumem (když v náhledu vidím, že se na plochu vejde, tak věřím, že to bude OK).

V nastavení "Webcam & timelapse" zadáme URL video streamu, který je: http://orangepione:8080/?action=stream. Timelapse jsem neřešil, takže URL na fotky si v mjpg-streameru najdete sami.

Propojení se Slic3rem

Když Slic3r vygeneruje G kód, tak jak ho dostaneme do Orange Pi? Jedna z možností je přes sdílenou složku na Orange Pi (to bysme si tam ale museli nainstalovat Sambu, NFS nebo použít sshfs či něco podobného). Druhou možností je použít tlačítko "Upload" ve webovém rozhraní a nahrát G kód přes prohlížeč.

To je pořád ale "ruční práce". Přitom existuje fantastická možnost automatizace - Slic3r umí vygenerovaný kód poslat přímo do OctoPrintu! V záložce "Printer Settings" je sekce "OctoPrint upload", kam stačí zadat adresu a port našeho nového tiskového prohlížeče ("orangepione:5000") a pak "API Key", který zkopírujeme z OctoPrintu z nastavení "API". Tím se v hlavní obrazovce Slic3ru objeví nové tlačítko "Send to printer" a svět začne být zase o notný kus automatizovanější :-)

Printoid

OctoPrint se svým webovým rozhraním je bezva na práci v lokální síti, ale pokud člověk vyrazí ven, tak prý tou pravou bombou je mobilní aplikace Printoid. To jsem ještě nestihl vyzkoušet, takže sem případně doplním osobní zkušenosti posléze.

Credits:
Tomáš Vít, můj strážný anděl 3D tisku, mě krom jiného upozornil, že Cura má stejnou integraci jako Slic3r.
Pavel Novotný mě doslova dotlačil k instalaci OctoPrintu slovy "čas strávený instalací se ti tisíckrát vrátí při tisku". Také neustále pěje ódy na Printoid, že šetří mnoho času při ladění tiskových profilů.

čtvrtek 20. července 2017

WiFi lednička

Tohle v plánu vůbec nebylo, ale okolnosti si to doslova vynutily. Z ničeho nic mi žena říká, že v ledničce (nebo vlastně v chladničce) je nějak teplo - a skutečně, uvnitř byla stejná teplota jako v kuchyni. Zřejmě opět odešel termostat:


Termostat je takový malý mechanický bazmek, od kterého vede dlouhá kapilára (spíš drátek) až někam za zadní stěnu ledničky. Otočný prvek nahoře má umožnit uživateli nastavit, při jaké teplotě se začně lednička kompresorem ochlazovat. Číslování 0 - 7 znamená, že jeden nikdy neví, na jakou teplotu si ledničku nastavil - jen tuší, že "1" znamená tepleji a "7" chladněji (možná). V ledničce má být kolem 5 ℃, což tímto bazmekem těžko půjde nastavit. Termostat je schovaný uvnitř tohoto plastového modulu:


Jak vidno, je tam integrováno i osvětlení, a tohle je snad ještě původní žárovka, které by tak bylo přes 20 (slovy dvacet) let - a pořád svítí :) V modulu je ještě mechanický spínač světla otevřením dveří (vpravo nahoře):


Celé je to namontováno někde nahoře na boku ledničky. Modul dozadu pokračuje apartním krytem kabeláže a v rohu z něj doleva trčí ta kapilára termostatu.


 Kabel ke světlu a od termostatu vychází zadní stěnou ledničky ven:


Stál jsem před volbou okamžitě koupit novou ledničku (což zavání průšvihem), nebo zavolat opraváře na tuto již historickou (už minule brblal a dal tam nejspíš nevhodný termostat), anebo si zkusit termostat opravit výměnou za nový sám. Ale proč kupovat za 200 - 400 Kč zase jen nějaký mechanický krám, který nejde pořádně nastavit na žádanou teplotu, hysterezi (rozptyl mezi sepnutím a rozepnutím) má zcela neovladatelnou a navíc se opět kdykoliv pokazí, aniž bychom se o tom včas dověděli?

Nebylo by mnohem lepší vrazit do ledničky oblíbené digitální teplotní čidlo DS18B20, teplotu měřit přesně a řídit spínání kompresoru mikrokontrolérem? No samozřejmě! Neměl jsem ale po ruce žádnou destičku s Arduinem a relé, a tak jsem prostě sáhl po něčem už hotovém - WiFi Teploměru! Díky tomu teď lednička teplotu nejen měří a řídí, ale zároveň ji i hlásí na server, který kreslí šikovný graf a navíc hlídá, že teplota nepřekročí nastavené meze. To bych pak dostal varovný mail, že něco není v pořádku a mohl bych reagovat dřív, než se potraviny uvnitř ledničky zazelenají...


Jak na to? Stačí vytáhnout kabel k termostatu z ledničky ven, bez schématu prostudovat dráty v konektoru, pochopit podle barev či původního zapojení, které dva je potřeba spojit pro spuštění kompresoru a tyto ustřihnout od konektoru a zapojit do relé ve WiFi Teploměru:


Dále je potřeba dovnitř dostat teplotní čidlo, a když už jsme v tom, tak průchodkou natáhnout i napájecí kabel pro budoucí LEDové osvětlení:


WiFi Teploměr jsem postavil na lednici a zapojil do něj jak kabel ke kompresoru, tak samozřejmě i teplotní čidlo:



Při tom se mi povedlo najít schéma zapojení, které bylo nalepeno na zadní stěně lednice:


Překladač nebo Ostravák by mi přeložili barvy kablíků, kdyby bylo potřeba...

A to je vlastně vše, přátelé (tádydádydáá). Lednička opět chladí potravu, ale nyní to dělá digitálně s přesností na setiny stupně Celsia, s rozumně nastavenou hysterezí a ještě je navíc dálkově ovladatelná a hlídaná. Takový funkční upgrade ledničky o dobrých 25 let - a to se vyplatí :-)

EDIT: přidávám graf teplot v ledničce po první noci - chlazení je nastaveno na 8 ℃ s hysterezí 2,5 ℃ (takže kompresor spíná při dosažení 8 stupňů a jede dokud teplota neklesne pod 5,5 stupně).  Neuvěřitelné, jak to jede v nočním klidu stejnoměrně - by se podle toho snad daly seřizovat hodinky :-)