GPIO cez USB.

Niekedy sa hodí mať GPIO porty na počítači. Ty čo majú to šťastie a ich PC/NTB obsahuje LPT port môžu využiť jeho služby. Pre nás ostatných je len jedna možnosť USB zariadenia. Existuje viac komerčných a náležite drahých riešení ale ja sa zameriam na riešenia ktoré sa dajú postaviť získať relatívne lacno.

USBtinyISP.

Je to zaujímavé ale všetky verzie USBtinyISP sa dajú použiť ako GPIO.

Na USBtinyISP na ATtiny45 sa da nainštalovat firmware z Little Wire (aktuálna verzia sa do attiny45 vmesti i keď bez bootloadera). Ale treba ju prekompilovať. Keďže sú prehodené piny pre D+ a D-.

Autor LittleWire vo svojich zdrojových kódoch dodáva aj jednoduché knižnice. Tie sú pre C, C++, Processing () a Beta verzia pre C#. Nevýhoda týchto knižníc je že podporujú len LittleWire rozšírenia.

Ale aj bez rozšírenia LittleWire sa dajú programátori využívať. Bohužiaľ funkčnosť príkazov na zápis a čítanie bajtu nieje vo všetkých FW rovnaký.

Vo firmware ich najdete ako USBTINY_READ/USBTINY_WRITE/USBTINY_CLR/USBTINY_SET. Verzie postavene nad ATtiny2313 majú ešte USBTINY_DDWRITE. A tu je problém. Príkazy sa inak správajú. Vo FW pre ATtiny2313 a LittleWire čítajú a zapisujú nad portom B. V ostatných FW pracujú nad adresou internej ram ktorá je určená ďalšími bajtami príkazu.

Pokiaľ sa vám ide o jednoduché ovládanie cez CLI je možné použiť usbtool z knižnice vusb. Tento tool dovoľuje komunikovať z USB. Par príkladov použitia:

Výpis všetkých zariadení (Príkaz má prepínače ktoré dovolujú istú filtráciu výsledkov):

./usbtool list
VID=0x1781 PID=0x0c9f vendor="" product="USBtinySPI" serial="ZZ_indigo"
VID=0x1d6b PID=0x0001 vendor="Linux 2.6.32-5-amd64 uhci_hcd" product="UHCI Host Controller" serial="0000:00:1d.2"
...

Prečítanie interného teplomera cez ADC na FW LittleWire:

./usbtool -v 0x1781 -p 0x0c9f control in class device 15 2 0
0x14 0x01

Podobne sa dá pracovať aj z IO portami. Formát príkazu je veľmy jednoduchý:

./usbtool -v 0x1781 -p 0x0c9f control in class device čislo_prikazu parameter_prikazu 0

číslo príkazu:

  • READ = 1
    • parameter = 0
    • návratová hodnota = obsah PINB
  • WRITE = 2
    • parameter =  hodnota zapísana na do PORTB
    • návratová hodnota žiadna.
  • CLR = 3
    • parameter = číslo bitu na porte
    • návratová hodnota žiadna.
  • SET = 4
    • parameter = číslo bitu na porte
    • návratová hodnota žiadna.
  • DDR_WRITE = 13
    • parameter = číslo bitu na porte
    • návratová hodnota žiadna.

A blbinka na koniec 😉 Blikanie na LED na PB2

./usbtool -v 0x1781 -p 0x0c9f control in class device 13 0xff 0
while true
  do ./usbtool -v 0x1781 -p 0x0c9f control in class device 4 2 0
  sleep 1
  ./usbtool -v 0x1781 -p 0x0c9f control in class device 5 2 0
  sleep 1
done