Ruka, oko, noha… Tedy pardon: výstava, hraní s displejem a hraní s klávesnicí.
V Praze se konala konference Devel a já byl požádán nejmenovaným operátorem O2, zdali bych pro ně mohl na tuto akci připravit něco, co by spojovalo starou a novou techniku. Chvilku jsme si ujasňovali, co by to asi tak mělo být, nápad pustit mezi geeky drona, řízeného starým Commodorem, jsem zavrhl (dovedete si představit ten žižkovský masakr roztočenou vrtulí?) a nakonec jsme se shodli na robotické ruce, řízené starým Didaktikem.
Jenže času nebylo nazbyt, ruka se stále ne a ne objevit, a pak se objevila. Přiložené Botboarduino bylo skvělé, ale bohužel nereagovalo na jakékoli pokusy o naprogramování. Čas se chýlil a chýlil… Narychlo jsem koupil servo shield od Adafruit a přidal vlastní Arduino. [sc:ebay item=“Adafruit 16-Channel 12-bit PWM Servo shield I2C“]
Pak už se ruka hýbala. Bohužel jsem si neuvědomil, že při prvním spuštění, když se serva dostávají do definované polohy, sebou tak jako mocně škubnou, navíc v tom robotu jich je hned několik, a hodně silných, takže ta škuba byla opravdu velkolepá, a já dostal poprvé ve svém životě přes hubu od robota… Naštěstí opět zvítězil lidský intelekt nad hrubou silou, a pak už jen poslušně mávala a manipulovala.
Připojení k Didaktiku bylo pak docela prosté. Didaktik má vyvedený interface od 8255. Dva piny (PC4 a PC7, kdyby vás to zajímalo) jsem vyhradil pro komunikaci s Arduinem. Po jednom jde čas, po druhém data, a víceméně jsem simuloval něco jako SPI. A jelikož bylo málo času na rozchození, tak jsem to z Didaktika pouštěl v BASICu. Nahrubo. OUT, OUT, OUT… a jedem.
Šlo by to určitě i jinak. Třeba z toho Didaktika rovnou ovládat servo shield. A přepsat rutiny do strojáku. Jasně že by to všechno šlo, jenom ten čas se chýlil a chýlil a kvačil… Ale nakonec to dobře dopadlo.
Na akci jsem přivezl i několik starších kousků, zapojil jsem je k televizím a nechal jsem návštěvníky, ať si hrají.
—
S Michalem Průšou jsme před časem řešili problém, jak předejít rušení na přívodech k displeji u 3D tiskárny. Displej je klasický 20×4 s HD řadičem, a je řízený pomocí čtyřbitového rozhraní. [sc:ebay item=“20×4 display module backlight“]
Bohužel, ty čtyři bity (a další řídicí signály) jsou vedené plochým kabelem asi 30 cm na délku, a to je docela dost. Funguje to, ale ne stoprocentně. Lepší by bylo nějaké sériové vedení signálu… Michal navrhoval nějaký posuvný registr s latchem, třeba 74HC595, já navrhoval použít speciální řešení s PCF8574. [sc:ebay item=“display I2C 1602 2004 module“]
Teď před víkendem přišel, a kupodivu fungoval na první zapojení. S drobnou výhradou teda – nejdřív jsem myslel, že nefunguje, ale stačilo poštelovat trimr, který řídí kontrast, a hned bylo dobře…
—
A když už jsem měl u Arduina ten hezký displej, tak jsem si vzpomněl na svou letitou ideu udělat nějaký retrohold starým kapesním počítačům SHARP PC, kde byla QWERTY klávesnice, dvou- nebo čtyřřádkový LCD displej a zadrátovaný BASIC, a hleděl jsem připojit PS/2 klávesnici k Arduinu. [sc:ebay item=“ps2 keyboard module“]
Ne že by to nešlo. Jde to. Ne že by to nikdo nezkoušel. Zkoušeli to. Ale ta knihovna, kterou jsem našel a která se hojně používá, má takový jeden nešvar: Moc to neumí. Snaží se překódovat scankódy na ASCII, ale trošku to dře.
Totiž, pokud nevíte, jak taková PS/2 klávesnice komunikuje, tak vězte, že to není moc hezké. Připojené to je přes dva signály – hodiny a data. To je OK. Hodiny řídí klávesnice. To už není tak OK, protože to znamená, že buď musíte obětovat jeden vstup se schopností vyvolat přerušení při sestupné hraně, nebo musíte neustále sledovat dění na pinu a ztrácíte tak výkon… Jo a ten protokol, co vám jde, tak tam samozřejmě jdou jen scankódy, tedy vlastně jakási čísla kláves. Jeden scankód přijde, když je klávesa stisknutá, druhý, když ji pustíte. To, jaké znaky a významy jim přiřadíte, je už zcela na vás.
No a jestli si myslíte, že LEDky blikají díky magii a že třeba Caps Lock si klávesnice rozsvítí sama poté, co zmáčknete tlačítko Caps Lock, tak jste na omylu, protože LEDky řídí počítač pomocí příkazů, co do klávesnice posílá. Nejdřív si sebere oba signály pro sebe, pak pošle definovanou sekvenci, která řekne klávesnici, že následuje příkaz, a pak pustí hodiny (=nastaví opět na příjem). Klávesnice začne generovat hodinové pulsy, vy po datovém výstupu posíláte data, po devíti bitech (8+lichá parita) přepnete data na vstup, počkáte si na potvrzení, a pak vám klávesnice pošle na oplátku informaci o tom, že rozuměla.
Což skvěle fungovalo do soboty, 15:00. LEDky blikaly, klávesnice odpovídala jak má, tedy 0xFA, jako že rozuměla, a pak jsem zkusil poslat dvě změny LEDek po sobě. A najednou se to celé úplně… napsal bych rozbilo, ale to je málo pro to, co se stalo. Ono se to celé rozesralo! Příjem od klávesnice byl o bit posunutý, klávesnice najednou vracela úplně nesmyslné kódy, na příkazy reagovala statusem 0xFC, a tak jsem ladil a posouval a ošetřoval, kontroloval jsem, jestli nechodí nějaké falešné přerušení, nuloval jsem počítadla bitů, RESETy jsem posílal, a nic, přátelé, ani ťuk!
Takže nakonec mám knihovnu, která umí krásně číst scankódy, včetně těch rozšířených, umí poslat Arduinu zprávu onPress a onRelease, ale nebliká, přátelé, nebliká! 🙁
A to jsem se s tím crcal ještě půl neděle!
Ale co, aspoň ty scankódy mám, krok 2 pak může být jejich překlad na ASCII znaky. Tralala… Někdy příště!