dimanche 14 décembre 2014

Arduino + pro trinket

Cet article est une présentation du projet open source Arduino ainsi que de la carte d'expérimentation pro trinket d'Adrafuit.

Arduino1 est une série de carte microcontrôleurs pour le prototypage rapide et simplifié. Le projet a démarré en 2005 à l'institue de design Ivrea en Italie. Il avait pour but de fournir aux étudiants un remplacement aux BASIC stamp vendu par Parallax jugés trop coûteux. Le projet a rapidement gagné en popularité et est aujourd'hui le plus populaire auprès des amateurs et artistes dans le monde entier. Aujourd'hui il existe de nombreuses cartes clones tel que les trinkets d'Adafruit. Sur la première carte le processeur utilisé était un atMega8, mais maintenant il y a différent modèles avec des processeurs plus puissants dont le Due avec un processeur Atmel SAM3X8E ARM Cortex-M3.

Pour les démos de cet article j'utilise un pro trinket d'Adafruit comme mentionné ci-haut. Les cartes Arduino viennent avec un firmware pré-installé dans le MCU qui sert à télécharger les applications écrites dans l'IDE. L'intérêt ce ces cartes pour les amateurs est qu'il n'est pas nécessaire de potasser les spécifications du MCU car les périphériques sont pré-configurés et qu'il existe un API de programmation simplifié. C'est d'ailleurs ce qui a fait la popularité de ce projet.

Environnement de développement

Adruino possède son propre IDE disponible gratuitement en téléchargement. Pour l'utilisation des trinkets il est préférable de télécharger la version fournie par Adafruit qui est adaptée aux cartes vendues par cette compagnie. L'IDE comme les cartes est simplifié, il est donc facile à prendre en main, d'autant plus qu'il est multilingues. Les menus s'affichent dans la langue du système d'exploitation.

La première chose à faire une fois le logiciel installé est de sélectionner le type de carte utilisé en allant dans le menu outils - type de carte.

Ensuite on peut se débrouiller avec les 5 boutons de gauche sur la barre d'outils qui apparaît sous le menu. Le crochet sert à compiler le programme. s'il y a des erreurs elles sont affichées dans une fenêtre en bas de l'IDE.

Lorsqu'un programme compile correctement on peut le téléversé sur la carte en cliquant sur le 2ième bouton flèche vers la droite. En ce qui concerne le pro trinket il faut peser d'abord sur le bouton reset pour que le bootloader s'active. Le bootloader attend 10 secondes avant de retourner au programme utilisateur.

Le 3ième bouton feuille avec coin plié sert à créer un nouveau projet. Chaque projet apparaît dans une fenêtre séparée.

Le quatrième bouton flèche vers le haut sert à ouvrir un projet existant.

le cinquième bouton flèche vers la bas sert à sauvegarder le projet sur le disque dur.

Le langage de programmation utilise la même syntaxe que C/C++ au point ou nombreux sont ceux qui pensent que c'en est. Il s'agit en fait du langage Wiring, une version simplifié de C++. Il n'y a pas de fonction main() à la place il y a 2 fonctions obligatoires. void setup() qui est exécutée automatiquement au démarrage du processeur et sert à l'initialisation. void loop() qui une boucle dans laquelle le programme principal s'exécute indéfiniment jusqu'à la réinitialisation du MCU.

Donc lorsque vous avez créé un nouveau projet vous devriez inscrire le squelette de ces fonctions avant toute chose. La référence du langage est disponible ici. Si vous connaissez le C/C++ la prise en main sera simple et rapide. Cependant la fonction loop m'a réservée une petite surprise, j'en reparle plus bas.

cartes trinkets

Adafruit vends 4 cartes trinkets. En fait il y a 2 modèles mais une version 5 volt et 3 volt pour chaque modèle. Le trinket (6,95US$) utilise un MCU atTiny84 et a peut de I/O. Le pro trinket (9,95US$) utilise un MCU atMega328P et a plus de I/O. Les cartes on une largeur de 600mil avec espacement entre les broches de 100mil ce qui permet de les brancher sur une carte de prototypage sans soudure. Ces cartes peuvent-être commandées directement via le site d'Adafruit mais aussi chez Digikey.

Premier démo

Écrire un programme qui fait varier en intensité une LED de manière cyclique en utilisant une sortie PWM est si simple avec Arduino qu'on va sauter le traditionnel blinky pour y passer directement. Le montage est simple, il suffit de brancher une LED en série avec une résistance sur une sortie PWM. Sur les cartes trinket ces sorties sont identifiées avec une barre au dessus du numéro. J'ai choisi la sortie 3. Simple n'est-ce pas? Notez que la fonction setup() doit-être présente même si elle est vide. La fonction analogWrite détermine la valeur du rapport cyclique sur les sortie PWM. Cette valeur varie de 0 à 255.

Surprise

mise à jour 2015-08-04
Embarrassant, après avoir lu cet article sur Hackaday, je réalise mon erreur et je me demande comment j'ai pu faire cette erreur. Il n'est en effet pas nécessaire de définir i et delta comme variables globales. j'aurais pu le faire comme ceci:


void loop(){
static byte i=0;
static char delta=1;
 
  i += delta;
  analogWrite(pwmPin,i);
  delay(5);
  if (i==255 || i==0) 
    delta=-delta;  
}
Je connais parfaitement l'usage de de la classe static en C/C++ alors pourquoi n'ai-je pas procédé ainsi? La seule réponse qui me viens à l'esprit est: préjugé. Je me suis laissé influencé par la simplicité du IDE de Arduino et en ai conclu hativement que ce n'est pas du C/C++ alors qu'en réalité ce l'est. Sauf qu'il y a un environnement préfabriqué pour simplifier la vie des non programmeurs. Ainsi les sketchs Arduino son pré-processés pour y ajoutés des #include et des prototypes de fonctions et la fonction main() obligatoire à tout programme en C/C++ est dans un autre fichier. Ainsi la fonction loop() n'est qu'une fonction appellée à répétition à partir de la bouche d'application qui se trouve dans la fonction main() qui est cachée aux utilisateurs d'Arduino IDE. En conclusion toutes les formes du C/C++ peuvent-être utilisées dans un sketch Arduino. Afin c'est presque du C/C++ mais a strictement parlé ce n'en est pas puisqu'il faut un pré-traitement du fichier .ino avant de le compiler avec gcc. Entre autre C/C++ requiert que les fonctions qui sont référencées avant leur définitions soient prototypées, c'est à dire que l'interface de la fonction doit-être déclarée avant d'y faire référence. Habituellement les prototypes sont mis dans un fichier d'entête *.h ou déclarés en début de fichiers. Le pré-traitement des fichiers *.ino a entre autre pour fonctions d'ajouter ces prototypes.

La surprise dont je parlais plus haut concerne les variables i et delta. Normalement ces variables devraient-être locales à la fonction loop. Donc dans ma première version je les avaient définies et initialisées au début de loop().


void loop(){
  byte i=0;
  char delta=1;

Ça ne fonctionnais pas et je me grattais la tête à me demander pourquoi? En C/C++ ça aurait fonctionner car les variables locales ne sont initialisées que lors de l'entrée dans la fonction. Mais ici elles le sont à chaque bouclage!!! Même si la syntaxe est à s'y méprendre ce n'est pas C/C++ c'est Wiring. J'ai donc du définir ces 2 variables au niveau global.

Clap switch

J'ai vu ça dans un commercial à la télé cette semaine, un gadget qui allume ou éteint un lampe en claquant dans les mains. J'ai décidé d'essayer ça en utilisant le trinket. Mon démo utilise la LED rouge qui est sur le trinket et branchée sur la sortie digitale 13. J'ai aussi conservé la LED sur la sortie barre-3 comme indicateur d'intensité sonore. Voici le circuit.

Le signal d'un microphone de type electret est amplifié par le transistor Q1 puis redressé et filtré pour ne garder que l'enveloppe du signal. Si on observe à l'oscilloscope le signal au bornes de C3-R4 on obtient ceci lors d'un claquement de mains.
Le niveau sonore monte rapidement pour diminuer lentement pour une durée totale d'environ 135 millisecondes.

J'ai testé 2 versions différentes du logiciel et elle se valent, en sensibilité et en taux de détection.

La première version utilise un seuil de déclenchement et celle-ci utilise un taux de changement entre 2 lectures. Il doit y avoir 2 claquements de main avec un intervalle maximum de 500 millisecondes entre chaque. La switch répond aussi aux sifflements.


1) Article plus complet sur le wikipedia anglophone.

Aucun commentaire:

Publier un commentaire