pátek 12. září 2014

Arduino Pro Micro USB peklo

Teď trošku přeskočím frontu 12 rozepsaných blogpostů a napíšu něco zcela aktuálního, čerstvého jak dnešní ranní pečivo, protože mě to dostalo až skoro do kolen a musí to ze mě ven.

Poslední dva-tři měsíce jsem pracoval téměř výhradně na doplnění USB k mému oblíbenému Arduino Pro Mini osazenému procesorem ATMEGA328P. Existuje projekt V-USB, který dokáže takřka nemožné - softwarově na pouhém 12MHz procesoru simulovat 1,5Mbps proud dat USB 1.1. Je to ale skutečně krutě optimalizovaný kód, který pro správnou funkci vyžaduje splnit celou řadu podmínek, ze kterých se nesmí ustoupit ani o píď (a kdo to zkusí, jako např. já, zbytečně promarní mnoho času trápením se, proč to nefunguje jak má).

Takže po týdnech tvrdé práce a bezpočtu bezesných nocí se mi podařilo vyladit V-USB dostatečně dobře, aby bylo spolehlivé, rychlé a jelo všude (ještě se k tomu budu muset někdy vrátit a popsat podrobněji, co všechno jsem zkusil, abych ušetřil ctěným čtenářům nervy, vlasy atd.). No a tady na konci USB cesty, v tu nejméně pochopitelnou chvíli, jsem se rozhoupal a koupil si kopii Arduino Pro Micro, kterému jsem se z důvodů cenových celou dobu vyhýbal. Toto Arduino oplývá procesorem ATMEGA32U4, který má USB přímo v sobě, implementované v HW!


Chtěl jsem si zkusit zažít tu pohodu mít funkční USB bez práce, bez nervů, bez SW berliček a plně kompatibilní se specifikací USB 2.0 Full Speed. Včera Pro Micro dorazilo, tak jsem se ihned pustil do testů. Bohužel, po necelé hodině hrátek se mašinka odmlčela = přestala se hlásit na USB sběrnici. Zkoušel jsem všechno možné i nemožné (různé OSy, různé PC, přeflašování firmware, proměření všech cestiček od USB až k samotnému procesoru, dokonce i přepájení micro USB konektoru), ale nic nepomohlo.

O půlnoci jsem po mnoha dalších kombinačních testech všeho HW, co doma mám, zjistil, že se mašinka překvapivě přihlásí a dokonce i funguje, pokud je zapojena do takového slabého USB hubu, který mám v podložce notebooku. To mě povzbudilo v dalších pokusech, které pokračovaly až do čtyř hodin do rána. V tu chvíli jsem si byl už docela jistý, že je něco velmi krutě špatně snad v samotném procesoru, protože ten USB hub dělá akorát jednu (nečekanou) věc: svou slabostí sráží napájecí napětí na USB z 5,0 na 4,2 V, což obvody na desce Arduina dál sníží až na 3,8 V (ochranná dioda o 0,3 V a stabilizátor na 5 V o dalších 0,1 V) - a při takto nízkém napětí procesoru funguje USB správně!

Vím, jak šíleně to zní, ale sérií pokusů jsem se skutečně dostal až k tomuto závěru. Krom jiného jsem například přemostil tu ochrannou diodu a stabilizátor, takže místo 3,8 V dostal procesor 4,2 V a už to nejelo. Zkoušel jsem taky jiný hub, který nesrazil napětí o tolik - a přes něj se sice Arduino na USB sběrnici objevilo, ale další komunikace nefungovala. Prostě při vyšším napětí to zlobí až nejede vůbec. Podezřívám nějaký zkrat snad někde uvnitř jádra, který nějak přetahuje D+ na VCC a tím blokuje celou USB sběrnici nebo co.

Dnes ráno jsem vzal celou tu parádu do práce a chtěl ještě zkusit jiný USB hub, ale věci nabraly rychlý spád - těžký kabel od hubu vylomil celý mikro USB konektor z desky a tím brutálně degradoval drahé Pro Micro na obyčejné Pro Mini. Teď už jen zbývá, abych k němu připojil svůj vyladěný V-USB převodník a nasadil tak celému tomu peklu korunu (nebo parohy?)