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.
- Original USBtinyISP. 8xGPIO ports
- ladyada v1.0 4xGPIO ports (HW aj FW vie 8GPIO ale niesu pristupne)
- USBtinyISP na ATtiny45
- LittleWire
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