Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

J'ai eu récemment l'occasion d'assister aux Ateliers Arduino du pays de Lorient présentés par Xavier Hinault (http://www.mon-club-elec.fr). Le public y était étonnamment varié – et allait du retraité dynamique à la fillette de moins de 10 ans! Munis d'un ordinateur portable, d'une carte Arduino et d'un kit de composant, chacun était enthousiaste à l'idée de faire clignoter une LED ou buzzer un buzzeur. Bien entendu, tout le monde n'arrive pas avec la même facilité à mettre en œuvre les manipulations proposées, mais tous les participants arrivent à faire quelque-chose et le plaisir est au rendez-vous!

Les clés du succès?

En observant la manière de faire des autres participants, je me dis que le succès de l'Arduino est la conséquence de plusieurs choix judicieux:

  1. L'utilisation (sur les Arduino modernes) du port USB à la fois pour télécharger les programmes, pour alimenter la carte (et le montage), ainsi qu'éventuellement pour faire communiquer la carte avec le PC;
  2. Très lié au point précédent, la présence d'un bootloader qui permet de télécharger un nouveau firmware sur la carte sans avoir à faire la moindre manipulation physique: pas de câble à brancher/débrancher, même pas un bouton à presser!
  3. La présence d'un IDE (Integrated Development Environment - Environnement de développement intégré (EDI)
    Un logiciel regroupant l'ensemble des outils nécessaires au développement: éditeur, compilateur, debugger, etc.)
    simple qui permet de programmer, compiler et télécharger un programme à partir d'une seule fenêtre, et qui ne met littéralement qu'un clic de distance entre le code source et le programme qui tourne sur la carte.
  4. Enfin, les bibliothèques Arduino sont à la fois simples et expressives, ce qui permet d'effectuer des tâches relativement complexes en un minimum de ligne – tout en gardant le code lisible et accessible, même au néophyte.

C'est justement ce dernier point qui m'intéresse ici. En effet, il faut avouer qu'il est plaisant et efficace de programmer sur Arduino. Et cela donne vraiment envie de mettre des Arduinii partout où l'on veut faire de l'automatisation…

L'idée est peut-être séduisante, mais, même si la carte est simple, ce n'est pas économiquement viable – surtout quand on compare le prix d'une carte et celle du simple micro-contrôleur AVR qu'elle embarque. Bien sur, le prix reste justifié puisque la carte intègre régulateur, fusible auto-réamorçable, circuit d'interface USB-UART, etc.

Ceci dit, pour un vrai petit développement embarqué, de l'Arduino, seul le micro-contrôleur nous intéresse. Toute cette longue introduction pour en arriver finalement à cette idée: utiliser les bibliothèques et l'IDE Arduino, mais sans carte Arduino – juste pour programmer une cible AVR, voire un micro-contrôleur seul.

Cette idée n'est pas nouvelle; elle est même explicitement supportée par les dernières versions de l'IDE, comme nous allons le voir maintenant.

La cible

Désignation Qté Prix approximatif (HT)
Cible Microcontrôleur ATmega328P en boitier DIP
disponible chez digikey.com
1 $3.16
Programmateur USB ISP Programmer
disponible sur e-bay
1 $3.88

La cible que je vais utiliser ici est un ATmega328P. Pourquoi? Parce que c'est un des micro-contrôleurs utilisés sur la carte Arduino. Ce qui m'assure de la compatibilité des bibliothèques avec ma cible. Pour les mêmes raisons, j'aurais pu prendre un ATmega168P, un ATmega8P ou d'autres encore. Il suffit qu'il y ait une carte Arduino supportée basée sur le même micro-contrôleur.

En plus de la cible, il vous faudra un programmateur. En effet, sur une carte Arduino, le bootloader et l'interface USB permettent la programmation directe. Mais sur un micro-contrôleur AVR nu ça ne sera pas le cas. Tout comme pour le micro-contrôleur, l'investissement financier sera très réduit puisqu'on peut trouver sur Internet des programmateurs AVR très bon marché.

Connecter la machine de développement et la cible AVR

Une fois que vous disposerez du matériel, vous devrez raccorder le PC de développement à votre cible en suivant les instructions spécifiques à votre programmateur. Pour les petits programmateurs bon marché, cela signifiera certainement relier le programmateur au PC par un câble USB, et le programmateur à la cible via l'interface SPI. Je vous renvoie sur l'article Programmer son AVR pour les détails.

Configurer l'IDE Arduino

Voici maintenant le cœur de ce qui nous intéresse ici. Si vous avez téléchargé une version récente de l'IDE Arduino et que vous le lancez, vous trouverez dans le menu Tools > Programmer le moyen de sélectionner le programmateur que vous souhaitez utiliser. Vraisemblablement, pour les moins chers du marché il s'agira pour vous comme dans mon cas d'un programmateur compatible USBasp.

Arduino sur USBasp.png

Choix du programmeur pour une cible AVR dans l'IDE Arduino


Vous devrez également sélectionner une carte utilisant le même micro-contrôleur que celui que vous possédez. Dans mon cas, j'ai choisi Arduino Nano w/ATmega328.

Arduino Nano ATmega328.png

Choix de la carte cible dans l'IDE Arduino



Charger le programme de test

Comme d'habitude ♫, le programme de test qui va me servir sera l'exemple blink fournit avec la distribution standard d'Arduino (File > Examples > Basics > Blink). Du point de vue électronique, vous devrez connecter une DEL en série avec une résistance de quelques centaines d'ohms entre la masse et la broche 19 de l'ATmega328 (correspondant à la broche numérique Arduino 13 – digital pin 13). Avec un autre micro-contrôleur, vérifiez le numéro de la broche!

ATmega328P vs Arduino pin mapping.png

Correspondance entre les broches de l'ATmega328 et celles de l'Arduino.


Si tout est convenablement raccordé, vous allez pouvoir procéder à la compilation et au téléchargement du firmware sur votre cible. Ici, contrairement à ce que l'on ferait avec une vraie carte Arduino, vous n'allez pas cliquer sur le bouton upload de l'IDE Arduino. Il va falloir passer par le menu File > Upload Using Programmer. À par ça, la séquence des opérations sera identique du point de vue de l'utilisateur: compilation et téléchargement s'il n'y a pas d'erreur.

Arduino IDE Upload Using Programmer.png

Télécharger un programme Arduino sur une cible en utilisant un programmeur



Pour savoir si le téléchargement a été un succès, observez les messages dans la partie inférieure de l'IDE. Si l'IDE reporte qu'avrdude a rencontré des erreurs, c'est mauvais signe. Les avertissements (warning) peuvent la plupart du temps être ignorés – en particulier si votre programmateur est un clone bon marché: la compatibilité avec l'original étant souvent approximative.

Arduino Upload Using Programmer warnings.png

Malgré les apparences, le téléchargement est un succès — Avrdude reporte des avertissements (warnings) causés par une compatibilité partielle de mon programmeur avec l'USBasp original. Néanmoins, il n'y a pas d'erreur (error). Le téléchargement est un succès.



Si vous avez connecté la DEL et sa résistance en série entre le port D13 et la masse, vous aurez peut-être la surprise de constater que la DEL clignote, mais trèèèès lentement. En fait, avec un ATmega328P neuf, elle devrait faire un cycle toutes les 32s et non toutes les 2s comme sur une carte Arduino. C'est parce que les ATmega328P (comme d'autres AVR) sont configurés d'usine pour utiliser comme horloge leur oscillateur interne (8MHz) divisé par 8 – soit une fréquence d'horloge de 1MHz seulement. Contre 16MHz pour une carte Arduino Uno/Nano/etc. Bref, cela explique que la DEL clignote 16 fois moins vite que prévu…

Ajuster l'IDE et le microcontrôleur…

…en modifiant la fréquence d'horloge du microcontrôleur

Si, dans le cas de blink, c'est juste décevant de voir clignoter la LED aussi lentement, cette histoire d'horloge peut aussi causer de réels problèmes lorsque le micro-contrôleur doit respecter certains timings. Comme par exemple lors de la communication avec un système distant.

Une solution va consister à compléter votre montage avec une horloge externe. Celle-ci peut être une horloge reprise sur un autre composant de votre montage et connectée à la broche XTAL1 du micro-contrôleur. Ou il peut s'agir d'un oscillateur céramique ou quartz connecté entre les broches XTAL1 et XTAL2. Je vous renvoie sur la documentation d'Atmel pour les détails et sur les plans (schematics) des cartes Arduino pour un exemple.

Le pré-diviseur d'horloge

Pour désactiver le diviseur par 8 de l'horloge de l'ATmega328, il faut déprogrammer le fusible correspondant (i.e.: mettre CKDIV8 à 1).
lfuse – ATmega328/328P
1 1 1 0 0 0 1 0 = 0xE2
CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0

Connecter le bon oscillateur ne suffit pas nécessairement pour adapter la fréquence d'horloge du micro-contrôleur à celle de la carte Arduino qui vous sert de modèle.

En effet, les micro-contrôleurs AVR possèdent un pré-diviseur d'horloge qui s'intercale entre la base de temps (externe ou interne) et l'horloge interne. À titre d'illustration, en standard, l'oscillateur interne de l'ATmega328P est cadencé à 8MHz, mais le pré-diviseur est réglé sur ÷8. Soit une fréquence d'horloge effective de 1MHz seulement.

Si vous souhaitez modifier la fréquence d'horloge de votre micro-contrôleur, ce sera un réglage à prendre en compte. Celui-ci peut être ajusté en intervenant sur le fusible (fuse) CKDIV8. À nouveau, je vous renvoies sur la documentation officielle d'Atmel pour les détails techniques.

…en ajoutant une nouvelle définition de carte à l'IDE

Une autre solution est d'ajouter une nouvelle définition de carte à l'environnement de développement Arduino. Celle-ci, sera pour l'essentiel une copie de celle d'une carte Arduino basée sur le même micro-contrôleur, mais précisera la fréquence d'horloge de la cible (dans mon cas, le réglage d'usine 1MHz) et le programmateur à utiliser (dans mon cas un clone USBasp). Pour cela, vous devrez modifier le fichier /path/to/arduino/hardware/arduino/boards.txt pour y ajouter la nouvelle configuration. :

# ATmega328p "nu" - Configuration d'usine - Programmeur USBasp (ou clone)
atmega328p.name=ATmega328p/Factory defaults - USBasp
atmega328p.upload.protocol=usbasp
atmega328p.upload.maximum_size=28672
atmega328p.upload.speed=9600
atmega328p.upload.disable_flushing=false
atmega328p.upload.dont_erase=false
atmega328p.build.mcu=atmega328p
atmega328p.build.f_cpu=1000000L
atmega328p.build.core=arduino
atmega328p.build.variant=standard

Piège:

Les modifications du fichier boards.txt ne seront prises en compte qu'au prochain démarrage de l'IDE Arduino.

Arduino ATmega328P naked board.png

Une pseudo-carte pour un ATmega328P nu — Après avoir modifié le fichier boards.txt pour y ajouter les caractéristiques d'un ATmega328P dans sa configuration d'usine, cette nouvelle option sera disponible dans le menu boards à chaque lancement de l'IDE Arduino.

En la choisissant, vous pourrez dorénavant développer pour votre AVR exactement comme s'il s'agissait d'une carte Arduino. La fréquence d'horloge d'usine (1MHz) de la cible sera prise en compte par les bibliothèques. Et le programmeur désigné sera utilisé pour télécharger lorsque vous cliquerez sur le bouton upload.



…en combinant les deux solutions

S'il est pratique de pouvoir programmer un micro-contrôleur possédant encore ses réglages d'usine, il faut avouer que la fréquence d'horloge de 1MHz est un peu courte – surtout que les micro-contrôleurs AVR peuvent faire nettement mieux. Dans la pratique, la meilleur solution sera sans doute de combiner ces deux techniques: tout d'abord en configurant votre cible avec la fréquence adaptée à votre application, puis en ajoutant la définition correspondante à l'IDE Arduino. Mais je pense que vous devriez être capable de vous en tirer seuls maintenant…

Le non-P problème

Je dois avouer que l'écriture de cet article m'a pris plus de temps que je ne le pensais. En effet, au moment de faire les manipulations pour récupérer les copies d'écran, j'ai découvert que je n'avais plus à ma disposition que des ATmega328 et pas des ATmega328P. Ce sont deux versions différentes du même micro-contrôleur. Le P étant là pour pico-power, référence à la faible consommation de l'ATmega328P. D'après la note technique AVR512 d'Atmel, il n'y a que peu de différences entre ces deux versions.

Or, je me suis retrouvé dans l'impossibilité d'utiliser directement l'ATmega328 avec l'IDE Arduino. Tout d'abord, parce qu'il n'était pas supporté par la version d'avrdude fournie avec. J'ai donc dû modifier mon fichier .avrduderc pour y rajouter une entrée pour ce micro-contrôleur, copie de celle pour l'ATmega328P, mais avec la signature de la version non-P (0x1e 0x95 0x14). À ce sujet, je vous renvoie sur l'article Avrdude et ATMega328 non-P qui détaille cette technique.

Malgré cela, j'ai constaté que le téléchargement direct avec le bouton upload ne fonctionnait pas, car l'IDE Arduino ajoute systématiquement l'option -D lors de l'appel à avrddude. Cette option inhibe l'effacement intégral de l'EEPROM avant chaque programmation – profitant de la fonctionnalité d'effacement page par page du micro-contrôleur. Visiblement, cela ne fonctionne pas en l'état avec l'ATmega328. La seule solution élégante que j'ai trouvée ici a été de patcher le fichier AverdudeUploader.java des sources Arduino. Bref, c'est un problème un peu en suspend et je vous conseille si vous tentez les manipulations décrites ici de bien vérifier que vous avez un ATmega328P. Ce sera plus simple!