Volně navazuje na článek v časopise Praktická Elektronika 1/2018.
Před nějakou dobou jsem potřeboval vytvořit zařízení, které ponese digitální vzkaz. Nahrát vzkaz jako soubor na USB flash disk se mi zdálo trochu nudné, ale zase jsem nechtěl vytvořit něco, co by vyžadovalo složité ovladače. Zařízení spíš jednodušší a hlavně levné.
Vzpoměl jsem si na Igor Plug a implementaci USB do levného AVR procesoru. Rozhodl jsem se, že si tedy udělám klávesnici bez kláves. V podstatě to není nic převratného. Na internetu lze najít spoustu podobných projektů, které propagují různé USB vizitky a podobné hračky. Když už jsem měl hotový hardware, zjistil jsem, že je možné jej použít jako platformu pro další hry s jiným softwarem.
Hardware je velmi základní, vychází z minimálních potřeb USB portu. Při připojování zařízení k USB musíme vyřešit několik drobností. Nejzákladnější je napájení. Na sběrnici je přítomen signál V-BUS, který je často nesprávně označován jako +5V. Jedná se o výkonový signál, který je možné použít pro napájení energeticky nenáročných zařízení. Kapacita připojená k tomuto signálu nesmí přesáhnout 10μF a proudové zatížení po připojení nesmí přesáhnout 100mA (500mA je maximum, které je platné až po té, co si zařízení přepne USB port do režimu "High power", počítač může tento režim odmítnout). Napětí na tomto signálu je definováno jako 4,4V až 5,25V. Signálové vývody (D+ a D-) pracují s logickou úrovní 3,3V (±0,3V). Proto většina USB zařízení napájených z USB používá LDO regulátory. Takový regulátor by však nepříjemně zvětšil celé zapojení a tomu jsem se chtěl vyhnout. Další možnost byla použít sériový rezistor a zenerovu diodu. Takové zapojení je poměrně náročné na filtrační kondenzátor. Proto jsem se rozhodl použít menší trik s využitím napěťového úbytku na diodě. Pokud máme napájecí napětí 5V a dáme do série dvě běžné diody (D1 a D2) s úbytkem 0,7V, dostaneme napětí 5 - 0,7 - 0,7 = 3,6V, což je v toleranci. Toto napětí použijeme pro napájení procesoru. Pro jistotu ještě na signály D+ a D- přidáme sériové rezistory R2 a R3 = 68Ω, které jsou stejně doporučované pro řešení případných napěťových nesrovnalostí. Filtrační kondenzátor C1 = 1μF je vrstvený keramický, tím pádem při použití na stejnosměrné napětí u něj dojde k mírnému poklesu kapacity. Při jeho volbě je důležité věnovat pozornost hmotě, ze které je vyroben (pro stejnosměrné nabíjení má hmota NP0 nemá téměř žádný pokles, X7R (pokles 10-20% při maximálním napětí) má lepší vlastnosti než X5R a Z5U (25-30%) asi nejhorší je Y5V (kolem 50%)). Odrušovací kondenzátor C2 je zcela běžný 100nF. Poslední, avšak velmi důležitá součástka je rezistor R1 = 1k5. Pokud je připojen na signál D- jako v našem případě, indikuje zařízení že je připraveno komunikovat na nižší přenosové rychlosti (low speed device) s přenosovou rychlostí do 1,5Mb/s (pro klávesnici až dost). Vlastní procesor je běžný ATtiny85 (lze použít i ATtiny45, ale ten je paradoxně dražší). Pro procesor je důležité, aby signál D+ byl přivedený na vstup INT0, program jej používá pro přerušení při čtení. signál D- může být připojený na libovolný GPIO bit stejného portu.
DPS je v této konstrukci asi nejzásadnější část. Možná by se dalo říci, že by mohlo být zařízení použité jako prezentace schopností výrobců plošných spojů. Pro prvotní účel jsem použil větší jednostrannou desku. Na desce je rovnou vytvořen motiv USB konektoru. Aby konektor příliš nepodléhal degradaci, je deska upravená povrchovým zlacením. Když už šly desky na zlacení, tak jsem si dovolil na spodní stranu udělat malého zlatého ducha jako estetický prvek. Proto je na spodní straně zemnící plocha, pro funkci není podstatná, pokud si desku uděláte jednostrannou, bude fungovat stejně. Pro tuto desku je nutné si pamatovat, že tloušťka USB konektoru je zhruba 2,5mm, zatímco běžná deska DPS má jen kolem 1,5mm. Proto na spodní stranu lepím kousek plastu. Náramně se hodí plast na tabulky, které se používají na stavbách jako různé zákazy a upozornění. Na fotce je ještě v bílé barvě, následně je lepší jí nabarvit stejnou barvou, jako je DPS.
Druhá deska, kterou jsem vytvořil je již oboustranná. Má na jedné straně součástky a na straně druhé konektor. Je to hlavně proto, aby se téměř celá vešla do USB portu a moc nevyčnívala. Největší součástka je procesor s tloušťkou 1,7 mm - 2,16 mm. Tím pádem máme na desku maximálně 0,8 mm, ale potřebujme ještě nějakou tloušťku mědi a alespoň minimální pocínování. Proto jsem použil PCB tloušťky 0,6 mm. U této verze jsem musel udělat několik malých kompromisů. Zmenšil jsem součástky na velikost 0603, ale nakonec jsem jej stejně osadil 0805, při ručním osazování to není problém. Druhý kompromis je vynechání kondenzátoru C2. Předností této konstrukce je, že se téměř celá deska vejde do portu. Podobně jako například pojítka pro bezdrátové myši. V praxi je s touto verzí největší legrace. Pro tuto verzi potřebujme po osazení speciální "povrchovou úpravu". Jde hlavně o to, že USB konektor v počítači má "pacičky" zajišťující konektor proti vypadnutí. Aby nedošlo k náhodnému zkratování vývodů procesoru těmito "pacičkami", tak po osazení maskuji vývody procesoru i ostatní menší součástky pomocí tavného lepidla. Lepidlo pak oříznu tak, aby zařízení dostalo tvar požadovaného kvádru.
Jak již zaznělo, software je opravdu jednoduchý. Vychází z V-USB knihoven (pokračujících v práci Igora Češka). Prvotní program vychází z programu Flipa van den Berga klávesnice s jednou klávesou. Zařízení implementuje jen ty nejzákladnější funkce. Pro klávesnici je to jen jedno-stisková klávesnice (modifikátory jako Shift, Ctrl, Alt a GUI jsou samostatné), pro myš je to základní myš se třemi tlačítky a možností pohybu ve dvou osách X a Y (žádné rolovací kolečko). Aplikace vždy využívá Timer 1 pro měření času. Odpočítává kolikrát došlo k jeho přetečení (62,94Hz). Po dosažení potřebného počtu přetečení (pro texty konstanta 15 přetečení, pro Ghost náhodný počet) dojde k vygenerování dalšího stisku klávesy a nebo posunu myši. V případě USB je dobré vědět, že zařízení nikdy není schopné zahájit komunikaci, vždy musí počkat, až jej host (PC) osloví. Obsluha tohoto "oslovení" se provádí ve funkci usbFunctionSetup. V našem případě funkce reaguje jen na minimum podmětů, zařízení není schopné spravovat žádné napájecí profily ani nic podobného. V programu je také část, která se věnuje nastavení interního oscilátoru. Tato část patří spíše do oblasti generického kódu pro tento typ procesoru.
K programu je nutné poznamenat, že pokud se jej pokusíte modifikovat i bez detailní znalosti USB komunikace, určitě se vám podaří brzy dosáhnout očekávaného výsledku. Nezapomeňte, že klávesnice neodesílá přímo znaky, ale "scan codes" jednotlivých kláves. Naše klávesnice je definována jako základní klávesnice se 101 klávesami, takže lze používat scan codes do 101 desítkově, což je 65 hex. Převod kláves na scan codes je uveden například v kapitole 10 (strana 82) dokumentu HID Usage Tables
Pro případ, kdy si budete chtít pohrát s USB a přitom se nechcete pouštět do programování, jsou přiloženy přeložená verze programů ve formě HEX (a pro
Vzkazy také EEP, protože text je uložen v EEPROM). Při programování nezapomeňte správně nastavit "fuses". Program vyžaduje nastaveni:
Lo Fuses: 11000001 Hi Fuses: 11011111 Ext Fuses: 11111111.
Jak již zaznělo, Vkazník má svůj text uložený v paměti EEPROM, lze jej proto měnit bez zásahu do programu. Je důležité si pamatovat, že první bajt EEPROM je vyhrazen pro kalibraci oscilátoru. Ostatní bajty jsou pak dostupné pro vlastní text.
Při hraní s USB platí jedna zásadní nepříjemnost. Aby mohlo USB zařízení správně fungovat, potřebuje se prezentovat pomocí dvou identifikátorů. První je ID výrobce a druhý je ID zařízení. ID výrobce si bohužel musí každý výrobce koupit. Pokud jej nemáte, lze používat ID některých výrobců, kteří je uvolnili pro vývoj, ale většinou jen doma pro vlastní potřebu. Ve zdrojových kódech jsou použitá sdílená ID objective development. Popis je součástí přiložených souborů usbdrv/USBID-License.txt, usbdrv/USB-IDs-for-free.txt a usbdrv/USB-ID-FAQ.txt.
První program byl takzvaný Vzkazník. Program má f paměti EEPROM uložený text, který vypíše. Vzhledem k tomu, že program převádí znak na scan code, odešle scan code, který přečte operační systém a převede na znak (podle lokálního nastavení), není moc jednoduché se spoléhat na znaky, které se v různých lokálních nastaveních zobrazují různě (u nás například klávesa "2" respektive "ě", nebo "Y"/"Z" a podobně).
Když už jsem měl Vzkazník hotový, napadlo mne, že by se princip dal použít ještě na jednu malou kancelářskou lumpárnu. Klávesnice, která si sama stiskne klávesu je celkem užitečná, pokud jí připojíte do počítače kolegovi, který nic netuší. A při správně volbě kláves a vhodně dlouhém čase může udělat opravdu velký zmatek. Proto jsem vytvořil ještě alternativní program, který jsem nazval "duch v klávesnici" (ghost in keyboard). Tento program vychází z programu CapsLocker, jen má trochu širší repertoár kláves, které si volí. Program má tabulku šestnácti kláves, které nepředstavují žádná konkrétní písmena, ale spíš ovládají chování systému. Mimo jiné se jedná o klávesy jako CapsLock, NumLock, Insert, ale také kombinace Alt + Tab (přepnutí na následující program), GUI + L (GUI je označení pro klávesu se znakem "Windows" na PC, nebo znakem jablka na Applu. Kombinace Windows + L zamkne počítač) a podobné klávesy, které zmatou uživatele. Náhodné stisky se generují v náhodné časy v rozmezí 45 sec až téměř 10 minut. Pochopitelně jsem zařízení nenápadně připojil kolegovi v kanceláři a celý týden jsme se bavili na tom, jak "vhodné" okamžiky si zařízení dokáže vybrat.
Později jsem ještě doplnil další verze programu. Ta se přihlásí jako běžná počítačová myš, která se občas náhodně posune. To je mimořádně dobré pro spolupracovníky z grafických studií. Tuto verzi jsem nazval "duch v myši" (Ghost in Mouse). V hospodě mne pak kamarád požádal o modifikaci, která bude myší pohybovat mnohem častěji a bude sloužit jako prevence zamčení (usnutí) počítače. Udělal jsem tedy verzi, která "poskočí" myší v rozmezí několika málo vteřin. Poskakování se mi ale nelíbilo, takže jsem udělal ještě jednu verzi, která pomalu plynule posouvá prakticky neustále. Ta vypadá opravdu zábavně a náramně se hodí pro případy, kdy máte spuštěný nějaký program, který trvá dlouho a chcete zabránit usnutí počítače.
Verze "klávesnice" se po připojení ohlásí tak, že problikne CapsLock, verze myš se ohlásí "namalováním" čtverečku.
D1, D2 - MCL4148 Micro MELF C1 - 1μF / 10V 0805 X7R C2 - 100nF 0805 R1 - 1k5 0805 R2, R3 - 68Ω 0805 IC1 - ATtiny85-20SU
Verze | Zdroj | Přeložený HEX |
---|---|---|
Vzkazník | vzkaznik.zip | vzkaznikHEX.zip |
Vzkazník ukládající scan codes | vzkaznik_sc.zip | vzkaznik_scHEX.zip |
Duch v klávesnici | Ghost_keyb.zip | GhostInKeybHEX.zip |
Duch v myši 1 | GhostInMouse1.zip | GhostInMouse1HEX.zip |
Duch v myši 2 | GhostInMouse2.zip | GhostInMouse2HEX.zip |
Duch v myši 3 | GhostInMouse3.zip | GhostInMouse3HEX.zip |