Retročipení v březnu

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.

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í.

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.

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.

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ě!

Příspěvek byl publikován v rubrice Hardware se štítky , , , , , , , , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.
  • Roman Bórik

    S časovaním PS/2 klávesnice je to fakt veľmi nejednoznačné. Rôzne zdroje s popisom komunikácie s PS/2 klávsenicou deklarujú to časovanie rôzne.
    Tiež som s tým bojoval, keď som si robil KeyFace k PMD 85, nakoniec mi ale funguje komunikácia s klávesnicou obojsmerne.
    V zdrojáku sú aj odkazy na zdroje, z ktorých som čerpal dané múdra. Teraz si už ale nepamätám, ktoré riešenie bolo to správne, alebo som sériou pokusov a omylov dospel k výsledku sám. Z toho kódu sa to snáď dá vysledovať.
    http://pmd85.borik.net/wiki/Keyface

    • http://www.maly.cz Martin Malý

      Díky, kouknu se, jestli mi tvůj zdroják nenapoví. Já mám svůj tajný tip, ale uvidím, až to vyzkouším…

  • odpad

    Komunikace PS/2 klávesnice – jednoduché to není (ty sekvence pro stisk a uvolnění), ale ona to taky není úplně triviální problematika. Chvíli jsem to taky „studoval“, když jsem ji připojoval j PMI-80 🙂 Tam jsem ale neměl ambice řešit ovládání diod, tam jsem byl rád, že jsem si namapoval základní klávesy. Ale funguje to zajímavě – pokud člověk zná PMIčko a vidí na něm psát z „normální“ klávesnice. Nicméně kvůli řešení vzpomenutému zde – tedy čtení přerušením – se kvůli nešťastnému vyvedení INT u PMIčka musí na CLK z klávesnice dát dioda pro zamezení kladného vstupu, jinak se odpálí invertující tranzistor před INT 8080. (Stálo mě to 4 kusy těch tranzistorů, než mi to došlo – trapas – naštěstí to však nic jiného neodneslo.) Jo – napsal jsem si totiž takový „skoro-assembler“ – člověk napíše klasicky adresu, mnemo-kód instrukce, operandy a ono to po odenterování přeloží a uloží a předvyplní další adresu, atd. Vypadá a funguje to hezky. Jenže kvůli minimálním dispozicím toho superpočítače a potřebě jak obsluhovat klávesnici (mapování kláves), displej (znaky) a k tomu dekódovat všechny mnemo-kódy instrukcí 8080 a taky onu obslužnou část kódu „editoru“, se mi to všechno do 1kB nevešlo, takže jsem musel dát čast kódu do 1kB uživatelské ROM a využít i část 1kB RAM pro samotný kód.
    … no – ono je to už trochu OT. Omlouvám se. Ale chtěl jsem říct, že obsluha PS/2 klávesnice není nijak super, ale podle mne je veškeré tohleto „hraní si“ stejně provozováno právě kvůli tomu, že to je výzva.