|
Digispark ATtiny85
Pagina is nog in aanmaak...
Een mini-Arduino... De Digispark is een USB-dongle van
Digistump, met een AVR/Microchip ATtiny85 processor. Functioneel vergelijkbaar met de Adafruit
Trinket. Net krachtig genoeg om low-speed USB
te volgen en toch een paar output pinnen over te hebben.
Mijn project: ik gebruik op het werk nogal eens Skype for Business, en dan wil ik tijdens een
gesprek makkelijk de microfoon aan en uit kunnen zetten ('mute'). Dit kan via de muis, of
met Windows-key en F4. Maar, ik wil gewoon een losse knop met LED, voor op het midden van de
vergadertafel. Dat kan met de Digispark: die kan een HID (Human Interface device) nadoen: bijvoorbeeld een
keyboard. En kan dus ook een Windows-F4 verzenden!
OK, in wat meer detail, wat is het? Een kleine computer met (low speed)
USB-aansluiting, waarmee je de computer kunt programmeren vanuit de Arduino-omgeving. En die
USB-aansluiting kan je vervolgens in je toepassing gebruiken, of je kunt de pinnen voor andere I/O
gebruiken.
Van Sinterklaas gekregen via
Tinytronics, maar is ook (goedkoper, maar duurt langer) in China te bestellen.
Hardware
Zie links: een klein printje met klassieke USB-aansluiting, om direct in een computer te
prikken. Aan de andere kant een 6-tal I/O aansluitingen; plus aan een zijkant ground en voeding. Op
de print de ATtiny85 processor
(8-pin chipje,
datasheet), een voedingsstabilisator, en wat losse componenten voor bijvoorbeeld de USB-pinnen.
Ook zitten er twee rode LEDs op, één direct aan de voeding, en een onder softwarebesturing (in mijn
geval op pin 1, op revisie-0 bordjes kan dit ook op pin 0 zijn). Hier het
schema van de Digispark.

De Digispark in de laptop, met de gemaakte Skype Mute knop en LED.
Nu nog een mooie grote rode knop, in plaats van deze...
- Een low-power 8-bits processor van voormalig Atmel (nu Microchip).
- 8 kByte programmageheugen (Flash, herprogrammeerbaar); 512 bytes RAM werkgeheugen, 512 bytes
EEPROM voor permanente data opslag.
- Van de 8 pinnen zijn er twee voor voeding en ground, en de andere 6 zijn als I/O te gebruiken.
Hierbij worden er twee (3+4) gedeeld met de USB, en een (5) kan ook reset zijn, afhankelijk van de
firmware/fuses.
-
- Pin 0 - Digitaal I/O, I2C SDA, PWM
- Pin 1 - Digitaal I/O, PWM, on-board LED
- Pin 2 - Digitaal I/O, I2C SCK, Analog In
- Pin 3 - Digitaal I/O, Analog In (maar gebruikt voor USB+, 1.5 kOhm pull-up)
- Pin 4 - Digitaal I/O, PWM, Analog In (maar gebruikt voor USB-)
- Pin 5 - Normaal reset, maar kan ook Digitaal I/O, Analog In
- I/O: 4-kanaals 10-bit ADC,
2x 8-bit timers met PWM, etc.
- Draait hier op een 16.5 MHz interne oscillator (zijn geen pinnen over om een kristal aan te
sluiten).
- De ATtiny85 heeft géén hardware USB block, alles wordt in software gedaan. Hierdoor kan
het alleen low speed USB aan. Voor 'echte' USB applicaties misschien een processor met
USB-controller gebruiken.

Als ontwikkelomgeving: in mijn geval Arduino met extra pakket voor de ATtiny85. Ook kunnen er
aparte drivers nodig zijn bij gebruik van Arduino:
- Windows heeft een driver
nodig (geen ervaring mee, ik gebruik Linux)
- Linux/Ubuntu heeft een extra udev rule nodig
Dit is omdat de processor standaard is voorzien van een 'bootloader', een programma dat de
communicatie met Arduino verzorgt zodat het programma via USB in het programmageheugen kan worden
geflasht. Hierdoor gedraagt het zich dus tijdelijk als speciaal USB device, en moet er op de
PC/laptop een bijhorende device driver geladen, zeker in Windows. Deze bootloader, genaamd Micronucleus, staat dus altijd in deze ATtiny85
en verzorgt ook het opstarten van je programma. Daar had ik ergens een mooie uitleg over gelezen,
maar waar...
Aansluiten: zie de tutorial
van Digistump. In het kort (voor Arduino support voor de ATtiny85 moet er wel eenmalig een
extra board manager worden geladen):
- voeg in de preferences de volgende toe (eventueel scheiden met een komma met de al aanwezige
systemen): File --> Preferences --> Additional Boards Managers URLs, daar
http://digistump.com/package_digistump_index.json
- Dan via Board --> Board manager --> search voor digispark -->
installeer digistump
- Selecteer in Tools --> Board menu --> Digispark (Default - 16.5mhz)
; Tools -> Programmer --> Micronucleus
- Start nu bijvoorbeeld met het blink-programma'tje, File --> Examples -->
Digispark_Examples --> Start
- Sketch --> Upload. Er zal nu na compilatie worden gevraagd de Digispark in te steken,
en bij herkenning wordt het bordje geprogrammeerd, en gaat de LED knipperen (als in haast alle
Arduino blink-voorbeelden)
Helaas, werkt op mijn Ubuntu-systeem niet helemaal betrouwbaar, nu en dan gaat het mis na het
wissen van het programmageheugen... Krijg de melding: >> Flash erase error -32 has
occured ... >> Please unplug the device and restart the program. Digispark er uit
halen, opnieuw Sketch --> Upload, en weer inprikken; tot het goed gaat. Update: je hoeft
hem er niet eens uit te halen, gewoon weer upload totday hij het pakt.
Software
Arduino
De ATtiny is een kleine processor, met minder mogelijkheden als de normale Atmel/Microchip
processoren gebruikt in Arduino-systemen. Dus, hoewel het zich wel als redelijk een Arduino
gedraagt, mist er wel een aantal mogelijkheden, of zijn deze beperkt. Zo is er geen volwaardige
seriële poort (voor debug), heb je een aangepaste I2C library nodig (I2C-Tiny-USBof
de TinyWireM library), etc.
V-USB library
Standaard wordt ook de V-USB library meegeleverd,
plus ook simpel te gebruiken code om hiermee een USB HID toetsenbord 'te zijn'
(kijk bij de voorbeelden). De ATtiny85 heeft geen hardware USB block, alles wordt in software
gedaan. Hierdoor kan het alleen low speed USB aan; voor een toetsenbord en zo geen probleem. Er
zijn routines aanwezig om scancodes en modifiers (als shift, control alt) door te geven.
Bijvoorbeeld, doorsturen van een hoofdletter 'A' is simpel:
DigiKeyboard.sendKeyStroke(KEY_A, MOD_SHIFT_LEFT);
Let op: de V-USB library als HID wordt
keurig herkend door bijvoorbeeld Windows; maar doordat eerst de bootloader zich meldt, kan het toch
zijn dat je even een melding krijgt van Windows dat de driver niet gevonden kan worden. Nadat de
bootloader klaar is (enkele seconden) start de gebruikerssoftware en daarmee V-USB (en verdwijnt de
driver melding), en wordt pas de Digispark netjes geënumereerd als een toetsenbord.
Meer uitleg? Zie deze V-USB voorbeelden.
Mijn toepassing
Skype4Business Mute knop
Mijn project: ik gebruik op het werk nogal eens Skype for Business, en dan wil ik tijdens een
gesprek makkelijk de microfoon aan en uit kunnen zetten (mute). Dit kan via de muis, of met
Win-F4. Maar, ik wil gewoon een losse knop met LED, voor op het midden van de vergadertafel. Dat
kan met de Digispark: die kan een HID (Human Interface device) nadoen: bijvoorbeeld een keyboard.
En kan dus ook een Win-F4 verzenden.
Moet hier de uitleg nog verder uit werken, maar zo veel is het niet: drukknop tussen pin 2 en
aarde, bij indrukken en weer loslaten wordt Win-F4 verzonden die de Mute functie toggelt, en ook de
LED wisselt mee. De code is simpel, de kern (uit het Arduino 'main' program):
static bool switchPrevious =
true; // Niet ingedrukt == true
bool switchState = digitalRead(SWITCH); // Toestand drukknop nu
if(switchState != switchPrevious) // Toestand
veranderd?
{
if(switchState)
// Weer losgelaten?
{
ledState =
!ledState; // Dan de
Mute LED toggelen,
digitalWrite(LED, ledState); //
en Win-F4 combi naar de USB-poort sturen
DigiKeyboard.sendKeyStroke(KEY_F4,
MOD_GUI_LEFT); // == Win-F4
}
switchPrevious = switchState;
}
DigiKeyboard.delay(100);
// En dat elke 100 miliseconden
Let op: de LED wisselt niet als je direct op de computer de Mute aan of uit zet (met muis of
echt toetsenbord); er is geen terugmelding van de computer naar de Digispark over de werkelijke
toestand van de Mute. Dus niet de knop en de functie op de computer door elkaar heen gebruiken.
Te doen
- Nog eens kijken of ik de bootloader er uit gooi (om de startup-conflicten met Windows te
vermijden en direct als USB HID geënumereerd te worden). Kan, omdat de reset-functie op pin 5 nog
werkt; de fuse om van deze pin ook een I/O te maken is niet gebrand. Heb ik dan toch een Chinese
kloon (ook vanwege 'revisie 3')?
-
- Als pin 5 geen reset meer is maar een I/O-pin: Misschien de bijgewerkte micronucleus
boot loader versie 1.11 '
micronucleus-1.11-entry_jumper_pb0.hex' installeren met
mogelijkheid om via een jumper op PB5 al dan niet de boot loader te starten?
- En nog een mooie 3D-printed knop/behuizing maken. Doorschijnende ronde knop (vanwege LED) in
klein kastje
|