RepRap - elektronika

Další kapitolou stavby RepRapa je výběr, stavba a naprogramování ovládací elektroniky. I zde panuje v různých verzích poměrně značný chaos a je potřeba dobře zvažovat všechna pro a proti, než provedete závěrečné rozhodnutí.

Ovladač krokových motorů

První na co člověk narazí je ovladač krokových motorů nazývaný Pololu. Je to malá destička se šestnácti vývody osazená integrovaným obvodem Alegro A4988. Tento obvod vyžaduje od hlavního procesoru pouze dva vstupy - řízení směru a krokování a o vše ostatní včetně spínání silového proudu do vinutí motoru se stará sám. Dá se u něj navolit požadované mikrokrokování 1, 1/2, 1/4, 1/8 nebo 1/16 a dá se regulovat proud cívkami motoru.

Pochopitelně by bylo možné si vyvinout vlastní ovladač motoru nebo si nakoupit samotné obvody A4988 (jsou ale poměrně drahé a v ČR jen velmi obtížně sehnatelné (pokud vůbec)) a vymyslet si jejich zapojení po svém. Bylo by to ale hrozně práce a rozhodně by se jen velmi těžko dosahovalo elegance a rozměrů, které mají hotové destičky Pololu. Navíc titěrné obvody s rozměry cca 5x5mm a s 28 vývody po celém obvodu součástky zvládne připájet opravdu jen velmi zkušený bastlíř s dobrým vybavením.

Proto jsem hned od začátku rozhodl, že si koupím Pololu destičky, i když pro čtyři motorky to docela leze do peněz (4 x 370 Kč). Ale levněji by to člověk tak jako tak nevyrobil.

Elektronika

Po tomto rozhodnutí se trošku zúží výběr použitelných elektronik na ty, které jsou navrženy na využití Pololu destiček.

Pokud bych měl elektroniku navrhovat sám, určitě bych jí navrhnul s některým z procesorů Microchip PIC, se kterými jsem zvyklý pracovat. Dokonce i první verze elektronik pro RepRapy s těmito procesory byly navrhované, ale zdá se, že z nějakých důvodů vývoj velmi brzy přešel na procesory ATmega a z pokusů s PIC procesory se alespoň prozatím stala spíše slepá větev.

Proto jsem se rozhodl zatím následovat větev, která je nejvíce živá a po pročítání různých stránek věnovaných RepRap elektronice jsem čím dál tím víc konvergoval k elektronice Sanguinololu. Je velmi dobře vymyšlená, procesor využívá úplně maximálně, umí obsloužit čtyři motory, dvě topná tělesa, dva termostaty a tři koncové spínače, a navíc všechny volné piny jsou vyvedeny na konektor pro pozdější další rozšiřování.  Deska je navíc krásně malinká (cca 5 x 10 cm) a její vývoj je velmi živý (já jsem vyráběl v danou chvíli poslední verzi 1.3a).

Jediná nevýhoda desky je plně využitý oboustranný plošný spoj, který se díky potřebě mnoha propojek na těžko dostupných místech téměř nedá v domácích podmínkách vyrobit. Pokusil jsem se o to, desku se mi podařilo vyleprtat velmi kvalitně a obě strany proti sobě seděly téměř optimálně, přesto jsem však ještě před pájením součástek při představě o realizaci propojek další práce vzdal a objednal jsem přímo u autora profi vyrobenou destičku (na serveru je lepší se nejprve zaregistrovat, pro anonymního čtenáře neukazuje správně vše co by měl). Pokud byste trvali na vlastní výrobě destičky, doporučuji najít si jinou elektroniku pododbných vlastností navrženou na větší jednostranné desce nebo alespoň sice oboustranné, ale s využitím minimálního počtu spojů na straně součástek (určitě se takové varianty najít dají).

Stavba elektroniky

Výroba je pro toho, kdo občas drží páječku v ruce, absolutně bezproblémová. Všechny součástky se dají nakoupit v GME nebo podobném obchodě. Jediné, co jsem nesehnal byl keramický rezonátor na 16 MHz, ale ten se dá nahradit obyčejným krystalem a dvěma kondenzátory 22pF a na destičku se to při troše improvizace krásně vejde. Pájení SMD integrovaného obvodu, které by snad méně zkušeným mohlo činit menší problém je krásně popsané v tomto videotutoriálu.

Jsem ještě připraven elektroniku doplnit o dvoubarevnou svítivou diodu, která bude indikovat tok dat z a do počítače, ale to dodělám až v momentě, kdy bude základní verze oživená. 

Programování firmwaru

Když máme elektroniku postavenou, je potřeba do řídícího procesoru nějak dostat příslušný program, který bude ovládat tiskárnu. V dřevních dobách jednočipových procesorů nezbývalo nic jiného, než vlastnit programátor pro příslušný typ procesoru, a pokaždé, když došlo k upgradu firmwaru, procesor z desky vyndat, připojit k programátoru a znova naprogramovat (teprve později byly procesory vybavené mechanizmy, které umožňují programovat přímo v desce ICSP (In-Circuit Serial Programing)).

Moderní procesory se ale posunuly ještě o kus dál, a jejich architektura umožňuje provádět programování pomocí sériového (nebo u některých typů i USB) portu přímo z počítače. (V případě Sangoinololu procesor sice komunikuje sériovým portem, ale přímo na desce je převodník USB-serial, takže k počítači se uživatel připojuje USB portem.)

Bootloader

Pouhá architektura procesoru ale pro tento proces nestačí, samotný procesor totiž musí spolupracovat. Zjednodušeně řečeno to funguje tak, že v něm je malý kousek jednoduchého programu, který po resetu zinicializuje příslušný port (sériový nebo USB) a chvilku čeká, jestli mu na něj počítač posílá nějaké instrukce. Pokud zjistí, že ano, přepne se do režimu programování, začne informace načítat a zároveň zapisovat do své paměti programu. Pokud ovšem příslušné instrukce nepřicházejí, skočí na její začátek a tak se spustí hlavní program (který do něj snad už byl zapsán). Ten malý kousek obslužného programu se nazývá bootloader a je to to jediné, co do procesoru musíme naprogramovat programátorem. Hlavní firmware už posléze nahráváme velmi snadno z počítače, kdykoliv dojde například k jeho upgradu nebo se my sami rozhodneme v něm udělat nějaké úpravy.

Programování bootloaderu

Využil jsem toho, že ve škole máme programátory ASIX Presto, které jsou velmi osvědčené, snadno ovladatelné a kompatibilní s velkým množstvím procesorů různých výrobců ATmega644 nevyjímaje. Lze samozřejmě využít i jiných typů programátorů nebo lze někoho s příslušným vybavením požádat o naprogramování, neboť se jedná, jak jsem již psal, o jednorázovou akci. Samotné připojení programátoru k procesoru je jednoduché, prostě se připojí šest vývodů programátoru na příslušné nožičky procesoru (je na to vhodné použít nepájivé propojovací pole). Schéma je například zde. Používají tam sice jiný programátor, mají to opatřené zbytečnými LED diodami a krystalem (viz níže), ale princip je shodný.

Teď ovšem základní zádrhel, na který jsem narazil a trvalo mi několik hodin, než jsem stihnul nastudovat, jak přesně postupovat. V procesoru se totiž dají programovat tři oblasti. Tou první je paměť programu - to je pro nás cílová oblast zápisu bootloaderu. Druhou oblastí je paměť EEPROM, kterou lze použít pro uložení dat, ale bootloadery ji zpravidla nemají důvod používat. 

Nejmenší, ale nejprekérnější oblastí jsou stavová slova procesoru, kterým se v řeči ATmega říká pojistky (fuses). Jsou to v případě procesoru ATmega644 tři bajty, ve kterých jsou uloženy stěžejní informace popisující režim, ve kterém má procesor pracovat.

Buďte velmi obezřetní, protože špatné nastavení pojistek může vést k zablokování procesoru, které se jen velmi těžce odstraňuje!

Bohužel na Internetu jsou informace o pojistkách velmi roztříštěné a nejednotné a navíc Presto ukazuje u ATmega644 čtyři bajty pojistek namísto třech.  


Nastavení pojistek

Na tomto obrázku vidíte správné nastavení pojistek pro naprogramování bootloaderu programátorem Presto. Protože ale ne všichni budou používat Presto, pokusím se jednotlivé pojistky blíže popsat. Červeně označená políčka Lock bits slouží k uzamčení firmwaru v součástce tak, aby ho nikdo nemohl načíst (kvůli udrženi know-how a obraně proti průmyslové špionáži). V našem Open Source projektu samozřejmě nemáme k jakýmkoliv ochranám jediný důvod, proto zámky neaktivujeme.

CKDIV8 je volba určující, zda se bude kmitočet hodin dělit 8 nebo nikoliv. Necháváme hodiny napřímo bez dělení. CKOUT určuje, zda má být hodinový kmitočet vyveden na příslušný pin procesoru - nepotřebujeme, necháme disabled.

WTDON určuje, zda vyžadujeme trvalé zapnutí watchdogu. Nevyžadujeme, kolidovalo by to s funkcí bootloaderu.

Velmi důležité je pochopení volby SUT, CKSEL. To určuje, co bude pro procesor zdrojem hodinového kmitočtu. Existuje zde několik možností. Procesor má svůj vestavěný oscilátor, můžeme ho řídit různě rychlými krystaly nebo můžeme přivádět hotový hodinový signál z nějakého externího zdroje (například z pinu CKOUT jiného procesoru). Čerstvý procesor z výroby má tuto pojistku nastavenou na vnitřní oscilátor. Proto při prvotním programování nemusíme používat krystal, který je uvedený na schématu z odkazu výše. Pro správnou vlastní funkci Sangoinolula je ovšem potřeba procesor řídit 16MHz krystalem. Proto tuto pojistku musíme přeprogramovat podle nastavení na obrázku. Naštěstí k zápisu pojistek dochází až úplně na konci programování, takže je možné prvotní bootloader naprogramovat v režimu nastavení z výroby s vnitřními hodinami (tedy bez použití krystalu a přidružených kondenzátorů z již několikrát zmíněného schématu, a teprve na konci dojde k přepsání pojistky na použití krystalu. To ovšem znamená, že pokud by se nám programování z nějakého důvodu nepodařilo napoprvé a museli bychom ho opakovat, budeme už krystal a dva přidružené kondenzátory potřebovat (pojistka již je nastavena a procesor tedy neumí pracovat s použitím vlastního interního oscilátoru).

Další řádka EESAVE se týká ochrany EEPROM paměti a je pro naši aplikaci nepodstatná, nechte ji tak jak je to na obrázku. 

Naopak řádky SPIEN, BOOTSZ a BOOTRST jsou pro režim bootloaderu klíčové a musí být nastaveny tak, jak je vidíte na obrázku.

BODLEVEL není až tak důležitý parametr, říká při jak nízkém napětí se už procesor má resetovat, nastavte ho podle obrázku.

Pokud v programu Presto UP kliknete na uvedeném dialogu pravým talčítkem myši a zvolíte "Přímá editace pojistek", ukáže Vám při tomto správném nastavení hodnoty FF FF DC FD (normálně bývají na webech uváděny jen poslední tři bajty FF DC FD). Pro úplnost ještě uvedu odkaz na výbornou online kalkulačku pojistek, kde si vše můžete ověřit a vyzkoušet. 

Postup programování

Nejlepší kuchařku pro programování procesoru ATmega programátorem Presto mi poslal pan František Burian z konference hw-list , kterému tímto děkuji a mírně doplněnou ji zde uvádím:

  1. Spustit UP (softvare k programátoru presto stažitelný ze stránek ASIXu).
  2. Vybrat součástku (v našem případě ATmega 644 nebo 644P)
  3. Zapojit MISO na MISO, MOSI na MOSI, SCK na SCK, VPP na RESET, VDD na napájení a GND na zem procesoru (pozor procesor má několik zemí a vývodů pro napájení viz schéma z odkazu výše). Žádné další součástky jsem nezapojoval.
  4. Frekvence oscilátoru 2kHz (Ano, jde to, ale je to šíleně pomalé. Experimentováním s krokem 5 jsem zjistil, že se dá jít k hodnotě >100kHz, což je řádově rychlejší)
  5. Přečíst konfigurační paměť - pokud to nejde, zkontrolovat bod 3 a 4. Tohle je výborný neškodný test, jestli procesor s programátorem komunikuje.
  6. Načíst program bootloaderu z hex souboru (zvolte správnou verzi 644 nebo 644P podle použitého procesoru). Najdete ho v archivu hardware folder zde.
  7. Naklikat správnou konfiguraci pojistek (viz diskuse výše a přiložený obrázek).
  8. Zapamatovat pojistky (pravé myšítko na okně s pojistkami, tam tenhle příkaz najdete).
  9. Naprogramovat vše (menu Součástka/Programovat nebo klávesa F5). Nelekněte se, při závěrečné kontrole pojistek to zahlásí chybu, ale důvod je zřejmý. Po naprogramování pojistky zdroje hodin na krystal procesor bez krystalu přestane s programátorem komunikovat, takže tomu se oprávněně zdá, že došlo k chybě.
  10. Odpojit programátor.
  11. Otestovat procesor v aplikaci (viz další článeček).