RepRap - firmware, sotware a uvádění do provozu

Konečně se zase po delší odmlce dostávám k tomu, abych popsal další kroky stavby RepRapa. Prostoj byl zapříčiněn jednak začátkem školního roku, který je pro mě vždy šílený - dělám admina sítě s cca 200 počítači pro cca 900 lidí, takže kdo k téhle práci někdy přičichnul, dovede si jistě ten šrumec představit. Ale abych se nevymlouval jen na síť, RepRap, kterému jsem se útržkovitě po volných chvilkách také snažil věnovat, mě docela vytrápil. Doufám proto, že mé poznatky pomohou ostatním stavitelům začátečníkům. 

Minulý díl jsme skončili tím, že jsme do procesoru Sanguinolola nahráli bootloader. Co dál? Teď už vše bude víceméně jen softwarovou záležitostí. Tiskárna je ovládaná takzvaným G-kódem - textovými příkazy, které jí říkají, kam se má který krokový motor pohnout, jak se má natopit topné tělísko extruderu či základny nebo se jí ptají na aktuální polohu, teplotu nebo třeba verzi softwaru.

Aby to celé fungovalo, musíme na počítači zprovoznit software, který je schopen G-kódy vysílat - takzvaný host software, a v procesoru tiskárny musí být naopak software, který je schopen G-kódy interpretovat a fakticky vykonávat to, co přikazují (otáčet příslušnými motory, zapínat a vypínat topná tělesa atd.) - takzvaný firmware. (Zpočátku jsem v terminologii softwarů na RepRap wiki dost bloudil, ale když zadáte správné termíny "host software" nebo "firmware", najdete to, co potřebujete najít. 

Firmware - ale nejdřív na chvilku zpět k hardwaru

Začnu firmwarem, ale po pravdě řečeno, ono je to všechno propojené...

Poté, co jsem zažil několik večerů s Sanguinololem na jednom konci USB kabelu a počítačem s Ubuntu na druhém, a vůbec jsem netušil, zda ty věci spolu vůbec komunikují, dohnalo mě to k hardwarové úpravě desky, o které jsem přemýšlel už při jejím osazování. Čip FT232 převádějící USB komunikaci na sériovou má totiž v základním firemním nastavení vyvedeny na piny CBUS0 (nožička 23) respektive CBUS1 (nožička 22) signály pro LED diody indikující přenos TX respektive RX viz například zapojení na straně 27 datasheetu tohoto obvodu. Rozhodl jsem se proto přidat na desku dvoubarevnou LED diodu se společnou anodou (například L-59GYW nebo jakákoliv podobná, pozor nelze ovšem použít diodu se společnou katodou!), která bude indikovat veškerou komunikaci mezi počítačem a deskou. Mimo LED diody potřebujeme ještě dva rezistory s hodnotou kolem 270 ohmů (viz datasheet FT232) a nějaké vhodné hodně tenké drátky. Aby montáž co nejméně narušila původní desku, rozhodl jsem se pro použití SMD rezistorů velikosti 0805.

Postup

Nejvhodnější místo pro LED diodu jsem našel ve druhém rohu desky než je umístěna LED dioda indikující napájení, tedy poblíž dvou tranzistorů pro spínání topných těles (viz první obrázek). Dioda má rozteč vývodů cca 2,5 mm, je tedy potřeba vyvrtat tři dírky vrtákem 0,8mm s touto roztečí. Na horní straně desky je v tom místě souvislá vrstva mědi (se zemí), zatímco na spodní je dělící čára oddělující pás mědi u okraje desky na kterém je zem od plochy více ke středu desky, kde je vyvedeno napětí pro motory (obvykle +12V). Rozhodl jsem se udělat díry pro LED právě v této části, cca 1mm pod dělící čárou. Doporučuji nejprve místa děr naznačit na spodní straně tenkou lihovou fixou, a pak vyvrtat. Ani na horní ani na spodní straně desky se vývody diody nesmí dotýkat původních měděných plošek. Na horní straně jsem proto opatrně vrtáčkem 2 mm udělal jakési zapuštění (jako se dělá pro zápustné šrouby), které odbrousilo měděnou vrstvičku do bezpečné vzdálenosti od nožiček diody (je to trošku vidět na prvním obrázku). Pro úpravu spodní strany jsem vzal lámací skalpel a asi 1mm pod dírkami a 1mm na každé straně od nich prořízl měď ve tvaru malého obdélníčku (cca 7 x 3 mm), a ten pak ještě rozparceloval mezi budoucími třemi vývody LED diody. Pro každý vývod tak budeme mít samostatný ostrůvek ve tvaru zhruba čtverečku 2 x 2 mm. Pokud máme desku z profi výroby, je opatřena nepájivým lakem, proto je třeba nakonec čtverečky opatrně oškrábat skalpelem na čistou měď. Pečlivě pod lupou zkontrolujeme, zda jsou proškrábnutí dostatečná a zda se nám někde nezatoulala nějaká hoblinka mědi, která by plošky mezi sebou zkratovala. Pak můžeme diodu připájet (je jedno, jak ji orientujeme). K prostřední plošce připájíme tenký drátek, který na druhém konci vede k nejbližšímu místu s +5V (viz bílý drátek na druhém obrázku). Ke dvěma krajním ploškám opatrně připájíme jedním koncem SMD rezistory tak, aby jejich druhý konec čouhal do vzduchu. Následně na tyto druhé konce připájíme tenké drátky (v mém případě modrý a červený). Zapneme napájení desky a druhými konci těchto drátků se někde dotkneme země a vyzkoušíme, který patří zelené a který červené diodě (já jsem to vyzkoušel předem a rovnou jsem si červený drátek připájel k červené diodě a modrý (nemaje zelený) k zelené. Ale vpodstatě je to jedno, ovlivníte tím jen to který směr komunikace bude svítit jakou barvou.

Konečně můžeme druhé konce drátků připojit k nožičkám 23 a 22 obvodu FT232 (viz třetí obrázek) a vše zajistit několika bloby lepidla z tavné pistole. Je to celé docela piplačka, ale s lupou a trochou trpělivosti to určitě zvládnete!

Umístění LED diody

Zpět k firmwaru

Deska Sanguinololu vychází z velmi populární desky Arduino firmy Atmel. Ta je tak populární proto, že k ní existuje snadno ovladatelné vývojové prostředí komunikující s deskou právě prostřednictvím bootloaderu, který v procesoru už máme. Než přeložíme a nainstalujeme firmware musíme si tedy nejprve na počítači nainstalovat toto prostředí. Pravděpodobně existují implementace i pro MS Windows, ale já jsem jednoznačně volil cestu Linuxu (kterou budu dále výhradně popisovat), protože i vše ostatní pro RepRapa je primárně vyvíjené pro Linux a teprve druhotně vznikají implementace některých softwarů také pro Windows nebo MacOS.

Pokud tedy doposud nemáte počítač s Linuxem, začněte jeho instalací. Je asi o trochu jednodušší nainstalovat si ho na samostatný počítač (já jsem pro ten účel oprášil staršího notebooka), ale pokud nemáte nebo nechcete na RepRapa obětovat jiný stroj, stejně dobře můžete Linux nainstalovat ve virtuálním počítači například s využitím VirtualBoxu. Jediné, na co pak nesmíte zapomenout, je zprovoznit ve virtuálním stroji USB port, ale to je pouze několik kliknutí a zpravidla to bez problémů funguje.

Já osobně používám na serverech Debian a na workstejšnách Ubuntu, takže moje volba byla jasná. Hodně věcí kolem RepRapa se točí kolem Javy a většina z nich vyžaduje originál Sun Javu a pod jinými klony nefungují nebo fungují špatně. Proto po instalaci Ubuntu nainstalujte Javu od Sun (jsou na to na netu návody a není to složité).

Pak už můžeme začít instalovat věci pro překlad a instalaci firmwaru. Já jsem si pro Sanguinololu vybral firmware Sprinter, který tato deska podporuje a postupoval jsme podle návodu, který najdete v textovém souboru přímo u něj. Shrnu to proto jen velmi stručně:

  1. instalace překladače a knihoven pro arduino: sudo apt-get install arduino-core
  2. stažení poslední stabilní verze softwaru k arduinu a jeho rozbalení do nějakého vhodného adresáře
  3. Sanguino vychází z arduina, ale v některých detailech se liší. Proto je třeba stáhnout a přesně podle návodu do správných míst v adresáři arduina rozbalit doplňky a modifikace Sanguina.

Tím je nainstalované prostředí pro Arduino modifikované pro Sanguino. Teď už je jen třeba z git úložiště stáhnout poslední verzi softwaru Sprinter (pravděpodobně si předtím budete muset nainstalovat samotný git (sudo apt-get install git)) a můžete se pokusit ho přeložit a nahrát do desky tiskárny. (Na základě mailů některých čtenářů přikládám svoji současnou verzi souboru Configuration.h, ale berte to spíše jako inspiraci a vylaďte si svůj Configuration.h podle návodu u Sprinteru a vlastní tiskárny.) Tím se ovšem dostávám k tomu, co mě v celém procesu vytrápilo úplně nejvíc - strávil jsem nad tím po večerech více než týden času. 

Sanguinololu je postavené na procesoru ATmega644P.  Ten se vyráběl původně ve verzi Atmega644, ale později byl přidáním druhého sériového portu vylepšen na verzi 644P. Ačkoliv se všude píše, že Sanguinololu může běžet na obou verzích procesoru, vše je připravené pro verzi s P na konci. Na českém trhu ovšem v době, kdy jsem nakupoval součástky (a obávám se že i doposud), byla dostupná jen starší verze bez P. Když jsem poprvé provedl podle návodu u Sprinteru nastavení a překlad, zdálo se, že je vše OK. Narazil jsem ovšem při pokusu o nahrání přeloženého firmwaru do desky, protože prostředí arduino celkem poprávu hlásilo, že v desce je procesor s jinou signaturou (verze bez P) a že nic nahrávat nebude. 

Nejprve jsem se snažil podle komentáře u chybové hlášky nastavit parametr -F, který má povolit nahrání firmwaru i přesto, že je osazen jiný typ procesoru. Ale (zřejmě) protože jsem s vývojovým prostředím arduina pracoval poprvé, stále se mi nedařilo najít to správné místo, kde toto nastavení provést, takže jsem to po jednom stráveném večeru vzdal.  

Řekl jsem si, že když jsou oba typy procesorů tak podobné, že bych mohl v souborech týkajících se překladu modifikovat řetězce 644P na pouhých 644. Bylo to velmi krkolomné, protože po změně na zjevných místech začal překladač házet "milióny" chyb, že nemůže najít sekce pro tento procesor v různých dalších částech programu. Bývají tam totiž sekce typu:

#ifdef MCU=Atmega644P ....

Snažil jsem se je podle chybových hlášek postupně všechny upravovat na 644, až se mi konečně po cca dvou večerech čochnění se v různých souborech podařilo přeložit kód bez chyby. Jaká byla moje radost, když dokonce i nahrání do procesoru tentokrát proběhlo bez výhrad a s OK na konci!

Radost ovšem netrvala dlouho, protože procesor se sice tvářil, jako že má snahu komunikovat (napsal úvodní nápis), ale jak jsem později zjistil, dále téměř vůbec nekomunikoval (v této fázi jsem právě přidal na desku LED diodu, protože vůbec nebylo zřejmé, co se děje, a jestli nápis na obrazovce skutečně pochází od samotného procesoru na desce, nebo ho jen vypisuje ovládací program bez závislosti na chování procesoru). O tom, jak se s deskou komunikuje se dočtete o kousek níže, ale nejdříve popíšu konečné řešení mého problému (občas jsem měl sto chutí desku rozšlapat angry, ale nebojte, vydržel jsem a deska také).

Po dalším večeru stráveném neúspěšným hledáním alternativních host softwarů, které by nějak lépe zobrazovaly, co se děje na drátě mezi počítačem a deskou, jsem si řekl: "zpátky na stromy". Smazal jsem a znova si gitnul čistou verzi Sprinteru (mezitím jsem ještě (také neúspěšně) pokoušel Teacup firmware).

Řekl jsme si, že prostě musím nějak překonat tu hlášku chybné signatury procesoru a nikoliv se snažit upravovat samotný kód zásahy do mnoha různých souborů. Moje úvahy vedly k tomu, že vývojové prostředí arduino musí mít někde zapsané signatury procesorů a pokud se mi podaří je najít a pozměnit, mám vyhráno. Po nedlouhém pátrání se mi to skutečně podařilo. Je to v souboru avrdude.conf který se nachází v adresáři X/arduino-0022/hardware/tools (kde X je to místo, kam jste si vše nainstalovali (já to mám v adresáři Sanguinololu na ploše)). Tam na řádku zhruba 3729 (může se to verzi od verze trochu hýbat) začíná sekce ATmega644P. V ní si najděte řádek 

signature = 0x1e 0x96 0x0a;

Ten zakomentujte a pod něj napište upravenou verzi takže výsledek bude vypadat nějak takhle:

# signature = 0x1e 0x96 0x0a; puvodni hodnota signature
signature = 0x1e 0x96 0x09;

Soubor uložte a avrdude si bude při nahrávání do procesoru 644 myslet, že komunikuje se 644P a bude spokojený smiley

Sláva! Po této úpravě již všechno začíná chodit tak jak má.

Komunikace a první pokusy o ovládání desky

První pokusy s deskou samozřejmě doporučuji dělat s neosazenými Pololu moduly (přeci jenom nejsou nejlevnější a byla by škoda je zbytečně zničit hned v úvodu) a s napájením desky pouze z USB portu. Teprve až ověříme, že si s námi deska povídá, můžeme začít pomalu osazovat moduly a připojovat skutečné periférie.

Jako software na ovládací počítač v této fázi doporučuji Printrun, což je skupina několika užitečných prográmků psaných v jazyce python. Proto bude nejprve potřeba podle README v Printrunu nainstalovat Python, pyserial a wxPython. Pak si stáhneme a rozbalíme Printrun a spustíme nejužitečnější utiitku nazvanou pronterface. Vypadá následovně:

Jak vidíte, dole ve stavové řádce program píše, že tiskárna není připojena, a nahoře v okénku Port: nelze nic zvolit. Pronterface zavřete a připojte USB kabelem holou (bez Pololu destiček a čehokoliv připojeného) desku tiskárny. Pokud jste si osadili LED diodu pro komunikaci, měla by po zastrčení USB portu do počítače poměrně výrazně zablikat a zároveň se rozsvítí dioda napájení desky. 

Když teď znovu spustíte pronterface (mimochodem doporučuji vytáhnout si ikonu na plochu, budete s ním pracovat opravdu hodně často), mělo by se v okénku Port: objevit /dev/ttyUSB0 a pokud stisknete Connect, po trošce blikání diody a cca 5 vteřinách by se v pravém bílém okně mělo vypsat:

start
Printer is now online
SD init fail

Pokud tyto nápisy vidíte, klikněte na tlačítko GET TEMP a v okně výpisu by mělo přibýt:

SENDING:M105
ok T:0 B:0

Což volně přeloženo znamená: Posílám Gcode M105 (zjištění teploty) a tiskárna odpoví T:0 (teplota extruderu) a B:0 (teplota vyhřívané podložky). Chcete-li se ujistit, zda procesor dělá vše jak se patří, můžete na konektor jednoho z termistorů připojit buďto termistor topného tělesa, nebo pokud ho ještě nemáte alespoň odpor v řádech desítek kohmů (třeba 39k), a zkusit příkaz GET TEMP znova. Tentokrát by už příslušná teplota měla být nenulové číslo, a pokud máte připojený termistor a zahřejete ho rukou, měla by se i mírně měnit.

Další pokus, který můžete udělat je napsat do okénka před tlačítko Send příkaz M115 a pomocí Send ho odeslat. Tiskárna by měla odpovědět několikřádkovým výpisem s informacemi o použitém firmwaru.  

Pokud až sem vše fungovalo, můžeme se pustit do experimentu s prvním krokovým motorem. V pronterface nejprve odpojte tlačítkem Disconnect tiskárnu. Pokud to zapomenete udělat, vytáhnete USB kabel a zase ho vrátíte, tiskárna se obvykle připojí na další volný port, protože ten původní zůstane obsazen, takže příště se musíte připojit na /dev/ttyUSB1 namísto ttyUSB0. 

Při odpojené desce do konektoru osy X zastrčte Pololu destičku. POZOR, ať jí tam strčíte správným směrem, jinak hrozí, že jí odpálíte! Ke konektoru připojte příslušné cívky volného motorku. Zatím ještě nepoužívejte přímo motory zamontované v tiskárně, abyste si jí přejezdem motoru na doraz dráhy zbytečně nepochroumali. Já jsem použil motor extruderu, který jsem v tu dobu ještě neměl přišroubovaný (a i pokud by byl osazený v extruderu, můžete ho beze strachu použít, protože extruder nemá žádný doraz dráhy).

Připravte si voltmetr s rozsahem do cca 2V a mikrošroubováček nebo třeba vhodně seříznuté párátko, kterým budete moci kroutit s minitrimrem na destičce Pololu. Připojte nejprve USB port a pak i silové napájení pro motory (četl jsem, že při zapnutém napájení nesmíte z konektoru vytáhnout připojený motor, protože v tom případě hrozí zničení Pololu destičky) a nakonec tlačítkem Connect v pronterface připojte tiskárnu.

Vezměte voltmetr, jeho zemnící hrot připojte na hlavní desce na kteroukoliv zem (používám pro to šroubek svorky pro připojení zemní svorky silového napájení), a druhým hrotem se opatrně, abyste něco nezkratovali, dotkněte titěrného měřícího bodu na Pololu destičce (na obrázku jsem ho označil A). Trimrem (označeným B) otáčejte tak dlouho, až naměříte cca 0,25 až 0,3V. Napětí 0,4V by mělo odpovídat proudu do motoru 0,5A (našel jsem kdesi na Internetu), takže pro naše pokusy s volným motorem by mělo 0,25 až 0,3V na měřícím bodu a tomu odpovídající nižší proud rozhodně stačit. Pokud by se později zdálo, že motor při tomto proudu neutáhne tiskármu, je možné ho seřídit na vyšší hodnotu, ale pro první pokusy i s ohledem možnosti dojetí motoru na dorazy doporučuji raději hodně nízké hodnoty, a tím i malý kroutící moment motoru.

Odpojte voltmetr a zkuste kliknout na tlačítko HomeX. To dá tiskárně příkaz, aby s osou X dojela na domovskou pozici (na koncový spínač nebo fotozávoru, podle toho, co v tiskárně budeme používat). Motor jede pomalu jedním směrem a po dosažení domovské pozice ještě cukne kousek zpět a zase dopředu, aby se ujistil o správné funkci koncového spínače. Protože zatím žádný koncový spínač nemáme připojený, motor se bude točit a točit, až za chvíli software na desce vyhodnotí, že už přece musel konce dosáhnout a tak ho vypne. Zároveň se podívejte, kterým směrem se motor točí při cestě "domů" a srovnejte to se skutečným osazeným motorem osy X (vozík s extruderem). Pokud zjistíte, že se točí opačně než by měl, otočte po odpojení desky v pronterface, vypnutí zdroje a vytažení USB kabelu jeho konektor o 180° a příště by se měl točit správně. Než to ale vyzkoušíte, připojte ještě koncový spínač osy X (ať už je osazený na tiskárně nebo ho máte zatím volně). 

Po znovuzapnutí a připojení desky opět klikněte na HomeX, ale tentokrát při točení motoru nasimulujte sepnutí koncového spínače (stiskem nebo vložením něčeho neprůhledného, pokud používáte optospínač). Motor by měl okamžitě zastavit a po rozepnutí trochu cuknout a zastavit. 

Pokud osa X funguje, zopakujte celý postup i na osách Y (pojezd stolku) a Z (výška extruderu) a na jejich koncových spínačích. Doporučuji přitom postupně vkládat a seřizovat příslušné Pololu destičky, ale motorek používejte zatím pořád ten stejný, nezastavěný do tiskárny.  Teprve až budou všechny koncové spínače prověřené, zapojte zastavěné motorky s tou polaritou, kterou jste zjistili při pokusech s volným motorkem, spínače umístěte na správná místa tiskárny, ručními pojezdy se ujistěte, že na konci dráhy sepnou a připojte je k desce do správných konektorů. Pak doporučuji ručně najet s motorky X a Y doprostřed jejich dráhy a s osou Z dostatečně vysoko, zapnout tiskárnu a s rukou na síťovém vypínači (pro případ, že by motorek jel na druhou stranu nebo nezafungoval koncový spínač) zkusit postupně tlačítka HomeX, HomeY a HomeZ. 

V případě, že vše funguje jak má, můžete si v pronterface pomocí příslušných tlačítek FL, FR, BL, BR a CENTRE zkusit pojezdit s osami X a Y z rohu do rohu, na střed a zase zpátky domůa tlačítky Z+ a Z- pojezdit osou Z nahoru a dolů. Také můžete zkusit připojit topné těleso extruderu (případně stolku, pokud máte vyhřívaný typ), zapnout topení a na termistorech sledovat změny teploty.

Pokud jste dospěli až sem gratuluji, a až seženu první špulku ABS, popíšu závěrečné seřízení a první pokusy o tisk.