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!

Plaatje van de DigisparkOK, 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 Skype mute toets
De Digispark in de laptop, met de gemaakte Skype Mute knop en LED.
Nu nog een mooie grote rode knop, in plaats van deze...

De ATtiny85 in het kort

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

De ontwikkelomgeving

Schema

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