Programmation des ATtiny Digispark

Une autre famille d’Arduino

. Par : Dominique, msport. URL : https://www.locoduino.org/spip.php?article285

La série d’articles sur les ATtiny Le microcontrôleur ATtiny45 (10) a un succès certain, notamment sur le forum pour des applications diverses de l’éclairage dans le décor aux décodeurs de locomotives et d’accessoires.
Mais programmer ces composants peut rebuter certains modélistes car ils n’ont pas de prise USB pour les programmer comme les autres cartes Arduino (y compris Tensy, ESP32, ESP8266, ..).
Nous allons nous pencher sur une famille d’ATtiny dénommée Digispark qui a fait l’objet de financement participatif sur KickStarter [1] [2], qui dispose d’une prise micro-usb et que l’on trouve facilement à un prix raisonnable comme les clones Arduino.

Mais attention...

Modification du 14 Juin 2024 !
 
Les cartes Digispark à base d’ATtiny 85 et 167 utilisées dans cet article sont devenues obsolètes dans les conditions décrites ci-après, bien qu’on trouve encore des clones en vente.
A cause du support du matériel Digistump dans l’IDE Arduino 2.0 qui n’a plus été mis à jour depuis des années et l’expiration d’un certificat qui entraine le refus d’installation dans l’IDE.
 
Nous vous recommandons de réaliser ce projet d’une autre manière, si vous le souhaitez. Soit en utilisant un Arduino Pro-Mini de manière conventionnelle (ce que j’ai fait chez moi), soit en utilisant directement une puce ATtiny en vous reportant à l’article Le microcontrôleur ATtiny45 (2). Le programme à la fin de l’article est toujours valable à condition d’adapter les broches de l’Arduino.
 
Mais, si vous y tenez et en bidouillant avec un minimum de connaissance dans votre système d’exploitation, vous trouverez quelques pistes à la fin du forum sous cet article.

Ma première expérience a été la réalisation de l’animation lumineuse à l’intérieur d’une gare Un BV animé par ATtiny 85 où on trouvera tous les détails sur la construction mécanique de cette gare et l’intégration de leds dans les plafonds et le code pour l’ATtiny85 installé à l’intérieur.

J’ai bien d’autres bâtiments à animer dans le décor de mon réseau et je pense utiliser un autre modèle : l’ATtiny167 qui est plus riche en ports d’entrée-sortie.

Mais il faut commencer par présenter ces petites cartes Digispark qui se programment sur le port USB.

Une recherche sur le site KickStarter ne mentionne que 2 petites cartes équipées d’une prise micro USB que l’on voit côte à cote sur cette photo :

Figure 1 : Les cartes Digispark ATTiny85 et ATTiny167
Figure 1 : Les cartes Digispark ATTiny85 et ATTiny167
DigisparkNb de PinsFlashRam
ATtiny85 8 8KB 512B
ATtiny167 20 16KB 512B

D’après la fiche technique de Microchip, le microcontrôleur ATtiny85 [3] une architecture AVR RISC de 8 bits haute performance et faible consommation. Il combine une mémoire flash ISP de 8 Ko, une EEPROM de 512 octets, une SRAM de 512 octets, 6 lignes d’E/S à usage général, 32 registres de travail à usage général, une minuterie de 8 bits, un compteur avec modes de comparaison, une minuterie/compteur haute vitesse 8 bits, USI, interruptions internes et externes, convertisseur A/N 4 canaux 10 bits, minuterie de surveillance programmable avec oscillateur interne, trois modes d’économie d’énergie sélectionnables par logiciel et debugWIRE pour le débogage sur puce. Il atteint un débit de 20 MIPS à 20 MHz et fonctionne entre 2,7 et 5,5 volts.
Ses dimensions sont : 18 x 25 mm.

Figure 2 : Affectation et fonctions des broches de la carte ATTiny85.
Figure 2 : Affectation et fonctions des broches de la carte ATTiny85.

Note : Le modèle pro est équipé d’une prise microUSB à la place de la languette à gauche.

Le microcontrôleur ATtiny167 [4] 8 bits AVR RISC haute performance et faible consommation combine une mémoire flash ISP de 16 Ko, une EEPROM de 512 octets, une SRAM de 512 octets, 16 lignes d’E/S à usage général, 32 registres de travail à usage général, une minuterie de 8 bits/compteur avec modes de comparaison, minuterie/compteur haute vitesse 8 bits, interface série universelle (USI), un contrôleur LIN, interruptions internes et externes, un convertisseur A/N 11 canaux 10 bits, minuterie de surveillance programmable avec oscillateur interne, et trois modes d’économie d’énergie sélectionnables par logiciel. L’appareil fonctionne entre 1,8 et 5,5 volts. Il atteint des performances proches de 1 MIPS par MHz, équilibrant la consommation d’énergie et la vitesse de traitement.
Ses dimensions sont : 18 x 27 mm.

Figure 3 : Affectations et fonctions des broches de l'ATTiny137.
Figure 3 : Affectations et fonctions des broches de l’ATTiny137.

Installation dans l’IDE Arduino

La première étape consiste à déclarer dans les préférences les ressources de ces microcontrôleurs afin de les voir apparaitre dans le gestionnaire de cartes :

Ouvrir les préférences :

Figure 4 : Préférences de l'IDE Arduino
Figure 4 : Préférences de l’IDE Arduino

Editez le champ "URL de gestionnaire de cartes supplémentaires".
Ajoutez l’URL suivante : "http://digistump.com/package_digist..."
Et ajouter aussi cette URL : "http://drazzy.com/package_drazzy.co..."

Figure 5 : ajouter les URL des ressources pour les cartes Digispark.
Figure 5 : ajouter les URL des ressources pour les cartes Digispark.

Cliquez sur OK sur cette fenêtre et sur OK pour enregistrer les préférences.

Maintenant allez dans le gestionnaire de cartes et sélectionnez "Digistump AVR Boards" qui correspond à la première URL ci-dessus.

Figure 6 : installation des cartes "Digistump".
Figure 6 : installation des cartes "Digistump".

Puis cliquez sur "Installer"

Pendant que vous y êtes, toujours dans le gestionnaire de cartes, sélectionnez "ATTinyCore" qui correspond à la 2ème URL ci-dessus et installez.

Figure 7 : Installation des cartes "ATTinyCore".
Figure 7 : Installation des cartes "ATTinyCore".

Pourquoi ces deux environnements ? Parce qu’ils diffèrent sur plusieurs points : Le premier (Digistump) offre plus d’exemples et de bibliothèques que le second (ATTinyCore).

Figure 8 : liste d'exemples Digistump et ATTinyCore
Figure 8 : liste d’exemples Digistump et ATTinyCore

Par exemple, DigiStump permet d’exploiter le mode de communication HID (Human Interface Device) présent sur le port USB : il n’est pas possible, avec ces cartes, de communiquer avec un Serial.print, mais avec un DigiKeyboard.print. C’est une manière étrange de "sortir" des textes dans une fenêtre texte (NodePad ou Textedit) [5] pendant l’exécution du programme, au lieu de la fenêtre "moniteur" de l’IDE.

A l’opposé, ATTinyCore ne se limite pas aux cartes Digispark et permet de programmer toutes sortes de composants ATtiny en utilisant les méthodes décrites dans les articles Le microcontrôleur ATtiny45 (10).

Attention, cet article ne décrit rien d’autre que la prise en main des ces cartes ATtiny dans l’IDE Arduino. A vous d’en explorer les possibilités par vous-même.

Maintenant toutes les ressources nécessaires pour programmer vos ATtiny Digispark Pro sont installées dans votre IDE... Sauf pour le système Windows dans lequel il faut aussi installer un pilote (ou "driver") pour la communication par le port USB pendant le téléversement, qui est très spécial à ces cartes Digispark ! Pour les utilisateurs de MacOS (et peut-être Linux), il n’y a rien à installer de plus.

Voici comment faire pour Windows :

Installation du pilote Windows

IL faut d’abord récupérer le programme d’installation de ce driver :
On télécharge : DigistumpArduino-master.zip

On extrait micronucleus-2.0a4-win.zip de tools dans le répertoire enregistré sur le disque dur.
C :\Users\xxx\Downloads\DigistumpArduino-master.zip\DigistumpArduino-master\tools\micronucleus-2.0a4-win.zip\

Figure 9 : à la recherche du pilote Windows !
Figure 9 : à la recherche du pilote Windows !

Dans lequel on trouve DPinst64.exe pour les systèmes X64, DPinst.exe pour les systèmes X32. Il faut lancer cet utilitaire directement (et non via le .bat) ce qui permet d’installer le pilote émulateur de port COM pour l’opération de téléversement seulement (sans lui, le téléversement échoue !).

Pour Windows 10, le pilote n’apparait que dans les périphériques cachés du gestionnaire de périphériques en tant que "libusb-win32 devices". On ne voit pas le port de l’ATtiny dans le sous-menu "port" de l’IDE, ni dans n’importe quel émulateur de terminal. Ceci est normal et cela condamne définitivement l’utilisation des instructions Serial.print dans les sketchs (ce qui est précisé plus haut), mais une communication entre la carte Digispark et un moniteur est toutefois possible en utilisant la bibliothèque SoftSerial et un adaptateur externe USB-série, ou le bus I2C avec un Arduino connecté et programmé pour cela, mais n’est pas le sujet de cet article.

Nous allons utiliser maintenant ces ressources pour programmer notre ATtiny avec la connexion USB de notre ordinateur. Il y a deux cas possibles :

Programmation avec Digistump

Pour programmer un Digispark Pro ATtiny 85, sélectionnez "Digispark (Default - 16,5Mhz)" dans le menu "type de carte"

Figure 10 : choix de la carte Digispark (Default - 16,5MHz)
Figure 10 : choix de la carte Digispark (Default - 16,5MHz)

Entrez votre premier programme de test dans le menu Exemple :

Figure 11 : ouverture de l'exemple "Start"
Figure 11 : ouverture de l’exemple "Start"

ou copiez-coller le sketch suivant :

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(0, OUTPUT); //LED on Model B
  pinMode(1, OUTPUT); //LED on Model A  or Pro
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(0, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(1, HIGH);
  delay(250);               // wait for a second
  digitalWrite(0, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(1, LOW); 
  delay(250);               // wait for a second
}

A ce stade vous pouvez vérifier que la compilation du programme se passe bien sans erreur, mais ne branchez pas la carte Digispark pour le moment.

Maintenant cliquez sur le bouton "Téléverser" et observez que le texte suivant s’affiche en bas de l’écran, sous le texte du programme à la fin de la compilation :

Le croquis utilise 718 octets (11%) de l'espace de stockage de programmes. Le maximum est de 6012 octets.
Les variables globales utilisent 9 octets de mémoire dynamique.
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)

Maintenant branchez le câble USB relié au Digispark à votre ordinateur et observez l’affichage du texte suivant sous le précédent :

> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94  page size: 64
> Erase function sleep duration: 752ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!

Vous devez voir clignoter la led ’BUILTIN" de la carte.

Programmation avec ATTinyCore

Cette fois-ci sélectionnons l’ATtiny85 dans la liste des microcontrôleurs de l’ATTinyCore :

Figure 12 : choix de l'ATTiny85 Pro dans l'ATTinyCore
Figure 12 : choix de l’ATTiny85 Pro dans l’ATTinyCore

Puis nous pouvons vérifier et téléverser le programme "Start" précédent de la même manière. Mais cette fois il n’est pas nécessaire de brancher la carte après le lancement du téléversement. Si la carte est déjà branchée, ce dernier s’effectue automatiquement, sauf sous Windows qui refuse la connexion USB du Digispark : on a une alternance détection / erreur toutes les secondes environ : il faut brancher la carte quand l’invitation est affichée :
> Please plug in the device ...

Le croquis utilise 692 octets (10%) de l'espace de stockage de programmes. Le maximum est de 6586 octets.
Les variables globales utilisent 9 octets (1%) de mémoire dynamique, ce qui laisse 503 octets pour les variables locales. Le maximum est de 512 octets.
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
> Please plug in the device ... 
> Press CTRL+C to terminate the program.
> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94  page size: 64
> Erase function sl : eep duration: 752ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
Quelles différences entre les 2 types de ressources Digistump et ATTinyCore ?

D’abord, on remarque que la taille du code est plus petite (692 octets au lieu de 718) qu’avec Digistump.

Avec les ressources "Digistump" le type de carte est peu renseigné et il est nécessaire de choisir le carte Digispark (Default- à 16,5 MHz car la ligne "Pro" à 16Mhz ne marche pas.

Figure 13 : type de carte Digispark/Digistump
Figure 13 : type de carte Digispark/Digistump

Avec les ressources "ATTinyCore", le type de carte est beaucoup mieux renseigné et il n’y a plus d’ambigüité sur le type Défault, Pro ou non :

Figure14 : type de carte ATTinyCore
Figure14 : type de carte ATTinyCore

De plus, ces ressources couvrent toutes sortes de modèles ATtiny et de méthodes de programmation. Nous allons donc conserver cet ATTinyCore dans la suite de cet article, en particulier pour le Digispark ATtiny167 qui apparait bien dans la liste.
N’oublions pas les spécificités de l’environnement Digistump décrites plus haut qui peuvent permettre des projets spécifiques (à découvrir par vous-même).

Dans les deux cas, on remarque l’absence du nom de Port et ceci est important à savoir : la communication par le port USB n’est pas un Serial Port comme dans le cas des autres Arduino, mais un port spécial simulé par le micronucleus embarqué dans la puce pour les besoins du bootloader. Cela signifie qu’on ne peut pas faire communiquer les cartes Digispark avec le moniteur de l’IDE. Mais il existe d’autres moyens de communication qui sont consultables dans les documentations Digispark

Rappel : si on veut programmer des puces ATtiny sans ce support Digispark, on se rendra directement sur la série d’articles sur les ATtiny Le microcontrôleur ATtiny45 (10).
Une très belle réalisation d’une carte de programmation est également décrit sur le forum, ici :
Réalisation de carte pour compléter le shield ATtiny

Un exemple d’animation lumineuse d’une gare

Ce programme est extrêmement simple et peut être modifié à loisir pour toutes sortes d’animations lumineuses dans les maisons et bâtiments du décor.

Le commentaire au début précise l’affectation des pins et les actions associées.
Pour l’ATTiny167, on pourra utiliser les pins 6 à 12 en supplément.

Ces actions consistent à allumer et (parfois) éteindre une led (ou un groupe de leds en parallèle) avec des constantes de temps (tempo1 et tempo2) qui sont très longues.

Pour plus de vraisemblance, on utilise un générateur pseudo aléatoire classique basé sur la lecture de la pin 5 restée en l’air.

/*
 * animation lumineuse de la gare de La Roche
 * basée sur un ATtiny85
 * 5 pins utilisées : 0 à 4
 * pin 0 = entrée clients, toujours allumée
 * pin 1 = bureau de vente, avec employé
 * pin 2 = salle d'attente, parfois éteinte
 * pin 3 = bureau, parfois allumé
 * pin 4 = etage, parfois allumé
 * pin 5 = entrée analogique pour faire de l'aléatoire
 * une temporisation de 10 secondes change l'état des leds
 * 
 * Version 1.01 du 15 juin 2017 Dominique (Locoduino)
 */

 // constantes
 const int tempo1 = 5000;
 const int tempo2 = 10000;

 // variables
 byte leds = 0B00011111; // état des leds - - - 4 3 2 1 0
 unsigned long temps;
 byte randBit, randByte;
 int tempo;
 
 
 void setup() {
  pinMode(0,OUTPUT); // entrée clients
  pinMode(1,OUTPUT); // bureau de vente
  pinMode(2,OUTPUT); // salle d'attente
  pinMode(3,OUTPUT); // bureau
  pinMode(4,OUTPUT); // etage
  temps = millis();
  tempo = tempo1;
  randomSeed(analogRead(5));
}
 
 
 void loop() {
  for (int i=0; i<5; i++) {
    digitalWrite(i, bitRead(leds, i));
  }

  if (millis() > temps+tempo) {
    temps = millis();
    if (tempo == tempo1) {
      tempo = tempo2;
    } else {
      tempo = tempo1;
    }
    randBit = random(2,5); // donc 2 ou 3 ou 4
    randByte = 0;
    randByte = bitSet(randByte,randBit);
    leds = leds ^ randByte;
  }
}
 

Pour mieux juger des effets lumineux, vous pouvez consulter la vidéo au début de cet article.

[5Si vous essayez cette méthode de communication, sachez que les cartes "parlent" en mode "clavier US" et que vous risquez de polluer une fenêtre en premier plan, comme celle de votre programme en cours de mise au point par des insertions de caractères indésirables