Arduino Uno je fajn, pokud si člověk chce hrát a zkoušet nová zapojení, především pak pokud dokupuje další shieldy. Ovšem když potřebuje připojit periferie, které nepasují do Uno pinů přesně (třeba třípinový IR měřič vzdálenosti, třípinové relé či ten 8pinový LC displej), musí stejně přidat nějakou pomocnou chlebovou destičku, propojit všechno dráty a elegance Arduino skládání na sebe se začíná vytrácet. Navíc výsledek složený z několika desek nad sebou je relativně objemný. Jelikož chci krom jiného postavit nový, inteligentnější pokojový termostat, kam by se Uno sendvič rozumně nevešel, hledal jsem něco jako Arduino Uno, ale menší, skladnější, vhodnější pro hotové výrobky. A našel jsem:
Arduino Pro Mini (originální čínská kopie) |
Co naopak tomuto Pro Mini chybí? Nemá USB port ani čip, který by USB komunikaci zajišťoval. To mi ovšem nadmíru vyhovuje, protože v běžném provozu není USB na nic potřeba. Ale jak Arduino Pro Mini naprogramovat? Má jen sériové rozhraní s TTL úrovněmi (RX/TX). Tím bych ho mohl připojit k PC do sériového portu, kdybych do cesty vřadil převodník úrovní z TTL na RS232 (obvykle MAX232). No ale proč dávat převodník na RS232, když můžu dát rovnou převodník ze sériového rozhraní na USB, které je dnes u PC mnohem častější?
Takže kromě tohoto Arduino Pro Mini jsem si objednal také sério-USB převodník. Měl jsem na výběr ze dvou typů - levnější s čipem PL2303 a dražší s čipem CP2102. Po "skvělých" zkušenostech jsem delší dobu váhal, a nakonec opět zvolil řešení s PL2303, protože jsem si nebyl jistý, jestli je CP2102 v Linuxu dobře podporován. Výsledek vypadal nějak takto:
Propojil jsem tedy Arduino Pro Mini s tím převodníkem pomocí dodaných kabelů - napájení, zem, RX a TX, a zkusil poslat do Arduina první program. Místo úspěchu jsem obdržel error stk500_recv(). Začal jsem se pídit na Internetu a prakticky okamžitě zjistil krutou skutečnost: nejsem sám, na tuhle chybu už narazili všichni ostatní přede mnou, kteří se pokoušeli programovat jen přes RX+TX signály.
Proč tomu tak je? Arduino obsahuje ve své paměti tzv. boot loader (obouvač bot, krátce nazouvák, nebo také obvykleji zvaný zavaděč), který ihned po resetu naslouchá velmi krátkou dobu (pár stovek milisekund), posílá-li do něj někdo přes sériový port nový program. Neposílá-li nikdo nic v tomto krátkém časovém okně, tak boot loader předává řízení uživatelskému programu, který je nahrán v paměti Arduina od minula, tím pádem na sériovém portu už nikdo nic neposlouchá/nepřijímá a IDE posílající nový program z PC do Arduina se s ním nedomluví a skončí s errorem stk500_recv().
Ctěného čtenáře možná zajímá, proč jsem neznal tento problém z dřívějšího hraní si s Arduino Uno. Tam probíhá komunikace PC <-> Arduino celá přes USB a tak je tam ten nutný reset vyvolán v pravý čas automaticky, řízený některým z USB signálů z PC. Celé to funguje tak pěkně, že mě ani nenapadlo, že se tam v průběhu nahrávání nové verze programu do Arduina děje nějaká magie.->
Palčivou otázku, proč jsem si tohle nezjistil PŘEDTÍM, než jsem objednal Pro Mini a ten serio-USB převodník, ponechme raději stranou a hledejme nějaké řešení. Jsou v podstatě tři možnosti: ruční, keš nebo páječka. Ruční řešení je popsáno na Internetu docela jednoduše: stačí v pravou chvíli při posílání programu z PC do Arduina stisknout ten maličký reset na Arduinu. Jednoduché, že? Ovšem trefit tu "pravou chvíli" je dost obtížné. Prý se to dá nacvičit, ale závisí to na rychlosti daného PC, velikosti nahrávaného programu a ještě několika dalších faktorech, takže mě po pár desítkách minut neúspěchů přestalo počítání milisekund od kliku myši na tlačítku Upload k mačkání resetu bavit a šel jsem hledat jiný způsob.
Řešení přes keš je na Internetu popsáno taky docela jednoduše: tento převodník stačí vyhodit z okna a koupit místo něj jiný, který má vyvedený i DTR signál (tedy například ten s CP2102, který je obvykle 6pinový). DTR signálem potom Arduino IDE z PC hlásí Arduinu připojenému přes sériový port, že začíná nahrávat nový program. Tento DTR signál pak přivedeme na RST vstup Arduina a je vymalováno - PC resetne Arduino přesně v ten pravý okamžik automaticky.
Jelikož mi bylo líto vyhazovat PL2303 a čekat další dlouhé týdny na jiný převodník, šel jsem do třetího, nejkrkolomnějšího řešení. On ten čip PL2303 totiž převádí všechny RS232 signály, i DTR. Zrovna DTR je vyvedený na vývod č. 2. Takže teoreticky stačí napájet dráteček na SMD nožičku toho čipu a vyvést ho někam na pin tak, aby šel připojit k Arduinu. Návod je například na http://www.instructables.com/id/Arduino-USB/ a výsledek pájení má vypadat zhruba takto:
No jo, jenže ty nožičky toho čipu jsou teňounké asi tak čtvrt milimetru, a mezera mezi nimi je zrovna tak úzká! Trefit se tam páječkou na správnou nožičku, připájet k ní dráteček, a nespojit přitom dvě-tři sousední nožky v jednu hroudu cínu vyžaduje kromě pevných rukou a dobrých nástrojů v mém případě také kus štěstí. To se na mě usmálo (po několika pokusech) a tak jsem výsledek okamžitě zafixoval pomocí tavné pistole s lepidlem:
Výsledkem je tedy USB<->serial převodník s PL2303, který má celkem 6 pinů - 5 V, 3,3 V, zem, RX, TX a DTR (na spojení posledních třech zmíněných signálů s Arduinem používám audio kabel od CD-ROM :-).->
Takto upraveným převodníkem se dá programovat Arduino Pro Mini zcela parádně a pohodlně, s jedinou zvláštní výjimkou: převodník není možné připojit k PC přes USB prodlužku delší než velmi krátkou. Konkrétně mně tu dobře funguje 30 cm prodlužka, ale cokoliv delšího (v jakékoliv kvalitě, včetně super stíněné USB 3.0) nefunguje - jednoduše ztrácí data a programování ani jiná komunikace se nezdaří. Dá se říct, že jsem si na to časem zvykl a při pokusech se holt hrbím pod stolem - aspoň že fungují přední USB porty a nemusím být vlezený pod stolem celý až u zadní strany PC :-)
A co pouzit k programovani Mini Pro jinou Arduino desku.
OdpovědětVymazathttp://www.youtube.com/watch?v=AXYhe07aG2c
nebo
http://physicalcomputingaustria.blogspot.cz/2011/04/programmieren-eines-arduino-pro-mini-5v.html
Ano, je možné použít (nejen vybrakované) Arduino Uno k programování, ale je to nejméně 5x dražší než ten USB-serial převodník, nemluvě o nešikovnosti celého řešení. Ty převodníky jsou zkrátka v pohodě, jen je potřeba mít ten DTR signál vyveden :-)
OdpovědětVymazatJe to ještě jednodušší, stačí stisknout a držet tlačítko reset a až dáte upload v IDE, počkat až se objeví hlášení o délce výsledného programu, v té chvíli pustíte reset a vše funguje. A právě tak to má být. :-)
OdpovědětVymazatDržet není třeba. Jakmile proběhne kompilace programu, a IDE nahlásí "nahrávám" tak stačí onen reset jen 1x stisknout, a vše se nahraje. Máte na to asi 3-4 vteřiny což - pokud nejste namol - zvladnete s přehledem ;) Tedy alespoň ve verzi 1.8.5.
VymazatVe skutečnosti to závisí na několika faktorech, jak píšu v článku. V době, kdy jsem to zkoušel, byla to časování skutečně v desítkách milisekund. Ovšem s jiným bootloaderem, jiným USB to serial převodníkem atp. se to může dramaticky lišit.
VymazatA přez USB hub položenej na stole by to nefungovalo?
OdpovědětVymazatUSB hub jsem nezkoušel, a tento konkrétní převodník jsem už prodal dál, takže to ani nevyzkouším. A ten nový, který popisuju v dalším dílu Arduino "seriálu", funguje i přes dlouhé USB kabely.
OdpovědětVymazatTak jsem dopadl podobně, že jsem si z neznalosti objednal USB<->TLL bez resetu. Nicméně "trefit" reset v pravý čas opravdu není žádný problém a ani jsem nic trénovat nemusel. Čas který si nechává bootloader na start komunikace je docela "velkorysý". Samozřejmě řešení s DTR je mnohem pohodlnější.
OdpovědětVymazatstačí v preferences zapnout show upload, pak vám v informačním bloku naskočí červený text který ukazuje nastavení portu a posílání dat, v ten okamžik stači pustit tlačítko reset 98% uspšnost :)
Vymazatjen 98%? to se nedá nedat když má člověk 10 pokusů, stačí si počítat prodlevu a těsně před dalším posláním pustit reset :D akorát to vyhodí nějakou chybu že se to nepovedlo zapsal, ale ono to kecá aby to chudáká člověka zmátlo :D
VymazatDobrý den,
OdpovědětVymazatmám problém s uvedením zavaděče v Arduino mini.
nevím jak se mám s tím poprat
najděte někoho, s kým se můžete potkat osobně a kdo vám s tím pomůže.
VymazatDobrý den, mám problém s nahráním programu do arduina mini. Převodník USB mám s DTR pinem spojeným s DTR na destičce arduna, dále mám propojené VCC, GND, TX a RX. Neustále mi IDE píše: avrdude: stk500_recv(): programmer is not responding. Nevím co s tím. Poradí mi někdo? Jaký programátor v IDE nastavit? Díky za rady
OdpovědětVymazatProgramátor v IDE není rozhodující, když nahráváte přes sériový port. Důležitější je nastavit správný typ Arduina. Máte propojeno RX převodníku s TX Arduina (a naopak)?
OdpovědětVymazatDíky za odpověď, typ arduina mám správný a RX na TX a naopak taky, nefunguje mi to ani když mačkám reset tlačítko.
OdpovědětVymazatJeště mně napadlo že může být vadný převodník nebo arduino,dá se arduino naprogramovat pomocí USBASP převodníku ? Ten mám
OdpovědětVymazatano, tím by to bylo lepší.
VymazatPo dvou letech už to asi nikoho nezajímá, ale: je správně nastavena komunikační rychlost? Mě Arduino nano nešlo programovat, musel jsem jako Dueminalove. Pak jsem si všiml, že v boards.txt má rychlost 115200, D...e má 57200. Přepsal jsem ji a už mi i Nano jde. Nevím, jestli je to čínským klonem, nebo je v Arduino IDE chyba.
OdpovědětVymazat