lundi 23 avril 2018

Livre: Arduino, S'exercer au prototypage électronique

Arduino
S'exercer au prototypage électronique
(10 projets créatifs à réaliser soi-même)
par Cédric Doutriaux
Éditions ENI (collection La Fabrique), 2017
298 pages

Une première qualité de ce livre, c'est qu'il s'adresse à des gens qui ont déjà une petite expérience de l'Arduino (car, admettons-le, nous n'avons pas vraiment besoin d'un autre livre qui consacrerait des dizaines de pages à l'installation de l'IDE et à la mise à l'essai de l'exemple "blink"!).

Nul besoin d'être un expert, toutefois, pour apprécier les 10 projets présentés dans cet ouvrage, car ils sont tous expliqués clairement, et de façon détaillée.  Ainsi, on vous guidera dans la fabrication d'un synthétiseur thérémine, d'un jeu de mémorisation musicale, d'un petit système d'arrosage automatique, d'un oscilloscope minimaliste, d'un robot suiveur de ligne, d'une lampe multicolore contrôlable via bluetooth, d'une station météo consultable par wi-fi, d'un télémètre à ultrasons, d'un robot hexapode capable d'éviter les obstacles et, finalement, d'un affichage "POV" (persistance rétinienne) monté sur une roue de vélo.

Bien sûr, il est possible de trouver de nombreuses variantes de tous ces projets sur internet.  Mais un aspect qui m'a semblé très intéressant, c'est que l'auteur ne se contente pas de nous présenter le code de la version finale du programme; il nous guide plutôt dans un processus qui consiste à coder une première version du programme et à vérifier son fonctionnement correct avant d'ajouter des fonctionnalités supplémentaires.  Par exemple, dans le jeu de mémorisation musicale, on commence par produire un sketch qui joue une mélodie.  Après avoir vérifié que tout fonctionne convenablement, on ajoute la partie qui enregistre la séquence de boutons actionnés et la compare avec la bonne réponse.  Finalement, on ajoute une fonction qui génère des nouvelles mélodies.
Je pense qu'il s'agit d'une bonne façon de faire acquérir au lecteur une méthode de travail qui lui sera utile lorsqu'il voudra concevoir ses propres projets.

Yves Pelletier   (TwitterFacebook)

vendredi 30 mars 2018

Forums de discussion en français sur l'électronique et les microcontrôleurs


Je ne suis pas un habitué des forums de discussion.  Quand je m'y aventure, c'est généralement parce qu'une recherche par mots clés dans Google m'y a entraîné (et là, je suis bien d'accord: quand on cherche une information, il y a presque toujours quelqu'un qui a posé la question avant nous dans un forum de discussion).  Mais voilà: puisque je parviens généralement à trouver l'information désirée par une recherche dans Google, il m'arrive rarement de poser une question dans un forum.

Les forums de discussion pourraient probablement servir de base à d'intéressantes recherches en sociologie: on y retrouve des gens qui n'ont fait aucun effort pour se documenter, et qui espèrent que quelqu'un fera tout le travail à leur place; il y a ceux qui demandent pourquoi ce qu'ils ont fait n'a pas fonctionné, sans juger utile d'expliquer ce qu'ils ont fait; il y a ceux qui prennent plaisir à répondre de façon condescendante et à humilier ceux qui posent des questions trop naïves, et ceux qui n'y connaissent rien, mais qui répondent quand même...   Heureusement, on y trouve aussi (et surtout) des questions clairement formulées, suivies de réponses pertinentes et instructives.

Avant d'envoyer votre premier message, prenez toujours la peine de lire les règles du forum, effectuez préalablement une recherche pour vous assurer que votre problème n'a pas déjà été résolu dans une discussion précédente, et expliquez clairement ce que vous avez fait et ce qui ne fonctionne pas (en incluant les schémas de circuits, programmes, etc).  Si vous ne vous donnez pas la peine d'être clair, pourquoi des inconnus voudraient-ils avoir envie de vous répondre?

Tentons donc d'établir un petit répertoire des forums de discussion en français, consacrés à l'électronique et aux microcontrôleurs.  Si vous connaissez un bon forum qui n'apparaît pas dans cette liste, n'hésitez pas à nous en faire part dans la section "commentaires", ci-dessous.


Forums sur l'électronique en général

ABC Électronique


Depuis 2005, plus de 50 000 discussions portant sur l'électronique.  Si vous désirez de l'information sur la réparation d'un appareil, visitez plutôt le forum de dépannage.   Avant de publier un premier message, assurez-vous de consulter les règles du forum.


Forum d'électronique de Futura-Sciences


Un gros forum très, très fréquenté, dans lequel on retrouve un nombre incalculable de discussions portant sur l'électronique en général (y compris les microcontrôleurs).  Par contre, tel que spécifié dans les règles du forum,  les questions concernant la réparation d'appareils électroménagers doivent plutôt être dirigées dans le forum dédié à cette fin.  Notez aussi l'existence du forum Projets électroniques, qui sert à...la présentation de projets électroniques.

Forum d'Elektor


Le magazine d'électronique a son forum de discussion: plus de 41 000 messages dans 4000 discussion, incluant une catégorie "Mon circuit marche" et une catégorie "Mon circuit ne marche pas (encore)".  Et je ne parle ici que des forums généraux, car il y a également une partie consacrée aux discussions sur les articles publiés dans la revue!

Mentionnons rapidement quelques forums tout aussi généralistes que les précédents, mais plus modestes: Électro-bidouilleur,  BricotroniqueForum lelectroniqueHardware.fr, Elekronique.

 Forums plus spécialisés

Forum Arduino


La partie francophone du forum hébergé sur le site officiel arduino.cc est très fréquentée: près de 200 000 interventions réparties sur 20 000 discussions depuis janvier 2011.  C'est l'endroit incontournable où aller lorsque vous avez une question pour un projet impliquant une carte Arduino.  Au minimum, votre question sera visionnée par quelques dizaines de personnes, et elle recevra très probablement au moins une réponse.  Pour cette raison, je vois mal pourquoi quelqu'un choisirait de poser à un autre endroit une question concernant l'Arduino.  Évidemment, avant d'y publier quoi que ce soit, prenez le temps de bien lire les règles et apprenez à utiliser les balises de code...

Forum Framboise314


Le forum de discussion sur le Rasbperry Pi associé au site de François Mocq n'existe que depuis 2014, mais 2918 membres y ont malgré tout publié 26215 messages répartis sur 4248 sujets.  Le domaine étant très vaste, les subdivisions sont nombreuses, ce qui permet aux adeptes de domotique de ne pas embêter les fanatiques de retro gaming.   Un incontournable, bien sûr.

Forum Rasbpian France


Un autre bon forum sur le Raspberry Pi, avec moins de catégories différentes que sur le forum de Framboise 314 (ce qui est un peu normal, puisqu'on se limite à un seul système d'exploitation). Il y a des nouveaux messages tous les jours.  Vous pouvez lire les règles ici.


Fantaspic


Je n'ai découvert que très récemment ce forum consacré à la programmation de microcontrôleurs PIC, démarré en juillet 2015.  535 membres inscrits, 8643 messages répartis sur 590 sujets.  Vous y trouverez des tutoriels, une section réservée à chaque langage de programmation (C, assembleur, basic, pascal), etc.  N'oubliez pas de consulter les règles du forum.

Forum Pinguino


Pinguino est un projet inspiré d'Arduino, mais impliquant des cartes munies d'un microcontrôleur PIC.  Le forum hébergé sur le site officiel pinguino.cc comporte un volet en français depuis 2011 (les règles sont en anglais, toutefois).  530 messages, répartis sur 75 discussions.  L'activité y est très faible: au moment où j'écris ces lignes, le message le plus récent date de quelques mois, mais a quand même été visionné 600 fois.  J'ai l'impression que le projet est sur son déclin, malheureusement.

Yves Pelletier   (TwitterFacebook)

samedi 10 mars 2018

Livre: À l'aventure avec Arduino


À l'aventure avec Arduino
par Becky Stewart
Collection Pour les kids
Éditions Eyrolles
340 pages
2015

La particularité de ce livre d'initiation à l'Arduino, c'est qu'il s'adresse à des lecteurs âgés entre 10 et 15 ans.  Je précise donc tout de suite que 35 années me séparent du public cible (mes trois enfants en font partie, par contre).

En quoi un livre sur Arduino destiné aux jeunes adolescents diffère-t-il d'un livre sur Arduino destiné aux adultes?
  • On tutoie le lecteur.
  • Les mises en garde de sécurité sont fréquentes.
  • En plus du codage et de la réalisation d'un circuit électronique, les projets comportent tous une bonne part de bricolage impliquant du carton, de la colle et des ciseaux.
Ce livre est particulièrement efficace, à mon avis, dans sa façon de proposer la fabrication de bidules inhabituels comportant un circuit électronique relativement simple: un panneau d'affichage qui illumine le message de votre choix, un coffre-fort à combinaison dont le couvercle s'ouvre tout seul si vous placez les 3 potentiomètres dans la bonne position, un carillon à vent qui produit des sons synthétiques lorsque ses grelots conducteurs entrent en contact, un labyrinthe à bille, etc.

Pendant la réalisation de ces projets, en plus d'apprendre les principes de base de la programmation, les jeunes auront l'occasion d'utiliser des LEDs, un servomoteur, un élément piézoélectrique, un registre à décalage...  Sans transformer votre enfant en ingénieur diplômé, on dépasse nettement le circuit où une petite lumière s'allume lorsqu'on appuie sur un bouton.

Puisque le livre s'adresse à une génération dont le premier réflexe est de se documenter sur Youtube sous prétexte que 30 images par secondes valent...heu...30 000 mots par seconde, je ne suis pas certain qu'une description de ce genre soit optimale:  "Insère l'un des fils de la résistance dans une rangée courte de la moitié haute de ta plaque, vers le bord gauche. Insère l'autre fil dans la rangée courte en face de la précédente, dans la partie basse de la plaque."  Heureusement, de nombreux schémas Fritzing rendent superflues ces longues descriptions.

Le plupart des sketches du livre sont présentés en deux versions distinctes: une version en français (commentaires et noms de variable en  français) et la version originale en anglais (commentaires et noms de variable en anglais).  J'ai beau chercher, la pertinence de présenter la version en anglais m'échappe totalement.

Et pendant qu'on parle de français et d'anglais, j'aurais quelques commentaires négatifs à formuler... Le traducteur explique son choix de conserver la plupart des recommandations de lecture de l'édition originale, c'est à dire en anglais.  "Malheureusement, les sources d'informations les plus à jour et les plus complètes sont presque toujours dans la langue de Shakespeare..." et "En plus, cela améliorera ton niveau en anglais".

!!!

Je sais que je ne suis pas tout à fait neutre, mais...il existe des tas d'excellentes ressources sur l'Arduino en français sur le web!  Comment peut-on proposer la consultation de DIY Drones (site anglophone n'ayant pas grand chose à voir avec le sujet du livre) et se contenter de citer deux uniques blogs en français (le blog de MC Hobby, qui est effectivement excellent, et le défunt TutoArduino, qui l'était moins)?  Comment peut-on proposer des vidéos en anglais sur Youtube et ne pas remarquer qu'il en existe une énorme quantité sur les mêmes sujets qui sont en français?  Et pourquoi recommander la lecture de Getting Started With Arduino, par Massimo Banzi dans sa version anglaise, alors que sa traduction française "Démarrez avec Arduino" en est à sa 3e édition?  Même dans la description du site officiel arduino.cc, le forum en français n'est mentionné qu'en dernier recours, en cas de "difficultés avec la langue anglaise"!

Malgré cette préoccupante négation d'une communauté francophone de pasionnés de l'Arduino, il me semble que ce livre atteint correctement son but.  Bien sûr, vous pouvez également opter pour la version originale anglaise publiée chez Wiley, puisque "ça améliorera ton niveau en anglais"... 😉

Yves Pelletier   (TwitterFacebook)

lundi 5 mars 2018

digitalRead(): où se situe la frontière entre LOW et HIGH?

Une des premières choses qu'on apprend lorsqu'on s'initie à l'Arduino, c'est que la fonction digitalRead() retourne 0 lorsque l'entrée numérique qui lui est associée est soumise à une tension nulle, et 1 lorsque l'entrée numérique est soumise à une tension de 5 V.  Mais qu'arrive-t-il si la tension de cette entrée numérique se situe quelque part entre 0 et 5 V?  Quelle valeur de tension constitue la frontière entre 0 et 1?

On peut trouver la réponse dans la fiche technique du mircontrôleur Atmega 328, qui est à la base de l'Arduino Uno.  Si vous avez en tête une fiche technique de moins de 10 pages comme celles qui accompagnent les transistors ou les amplificateurs opérationnels, détrompez-vous: les fiches techniques des microcontrôleurs sont beaucoup plus volumineuses (442 pages dans le cas de notre Atmega 328).

À la page 365, dans la section 32.2 intitulée "Common DC Characteristics", on peut voir les informations reproduites ci-dessous:


VIL (pour "voltage input low") représente la plus grande tension d'entrée qui sera, de façon certaine, interprétée comme un signal logique bas.  Pour une tension d'alimentation de 5 V, le tableau indique une valeur correspondant à 0,3*Vcc, c'est à dire 1,5 V.

VIH (pour "voltage input high") représente la plus petite tension d'entrée qui sera, de façon certaine, interprétée comme un signal logique haut. Pour une tension d'alimentation de 5 V, le tableau indique 0,6*Vcc, donc 3 V.

Le fabricant s'engage donc à ce que tous les microcontrôleurs qui sortent de son usine interprètent comme "bas" un signal d'entrée de 1,5 V ou moins, et interprètent comme "haut" un signal d'entrée de 3 V ou plus.

Il s'agit d'une bonne chose si vous devez brancher à l'Arduino un capteur qui utilise un niveau logique de 3,3 V: cette tension de 3,3 V sera correctement interprétée par l'Arduino comme un signal logique haut, même s'il est significativement inférieur à 5 V.

Mais qu'arrive-t-il si le signal d'entrée se situe entre 1,5 V et 3 V?  Vous vous retrouvez alors à l'extérieur de la zone garantie par le fabricant.   Les résultats pourraient donc être différent pour deux cartes Arduino Uno en apparence identiques entre elles.

Par curiosité, j'ai mesuré la tension de seuil pour quelques-unes de mes cartes Arduino.  J'ai utilisé le montage illustré ci-dessous:  une tension pouvant varier de 0 à 5 V grâce à un potentiomètre est acheminée à la fois à l'entrée numérique dont je désire mesurer la tension de seuil, et à une entrée analogique qui nous sert de voltmètre.


Le sketch ci-dessous permet d'afficher dans le moniteur série la tension correspondant à chaque changement d'état de l'entrée numérique (il faut, bien sûr, faire varier la tension en tournant lentement le potentiomètre).




Voici les résultats pour la broche 5 d'une de mes cartes.


On peut remarquer une petite hystérésis: lorsque le niveau initialement bas, il devient haut lorsque la tension atteint 2,55 V.  Par contre, si le niveau est initialement haut, il doit descendre à 2,23 V pour devenir un niveau bas.  En d'autres mots, le niveau logique ne change pas d'état lorsque la tension se situe entre 2,24 V et 2,54 V.

Sans surprise,  ces résultats respectent très facilement les valeurs minimales garanties dans la fiche technique.

J'ai effectué des mesures sur 5 cartes différentes, des clones chinois achetés de vendeurs différents à des moments différents, et je n'ai observé que de très faibles variations d'un carte à l'autre.


On peut voir que pour l'ensemble des 5 cartes testées, la tension nécessaire pour passer de l'état "bas" à l'état "haut" n'est pas très éloignée de 2,55 V, alors que la tension qui permet de passer de l'état "haut" à l'état "bas" se situe quelque part entre 2,20 et 2,25 V.

Je m'attendais à une assez forte dépendance à la température mais, après avoir laissé une carte au congélateur pendant plusieurs minutes (de façon à ce qu'elle devienne très froide), les résultats sont demeurés très similaires.

Yves Pelletier   (TwitterFacebook)

dimanche 25 février 2018

Communication RF 433 MHz entre ATTiny85 et Arduino

Je vous propose aujourd'hui un petit projet consistant à transmettre à une carte Arduino la mesure d'un capteur analogique branché à un ATTiny85, au moyen d'un signal radio de 433 MHz.  Si vous le désirez, vous pouvez utiliser les principes exposés dans ce billet pour mettre en place un réseau constitué de plusieurs capteurs satellites peu coûteux qui communiquent leurs données à un seul Arduino.

Si vous préférez, vous pouvez également utiliser les informations présentées ici pour créer une communication entre deux ATTiny85, ou entre deux cartes Arduino.

Matériel nécessaire pour faire cette activité: une paire émetteur/récepteur 433 MHz, une carte Arduino, un ATTiny85 (avec une alimentation et ce qu'il faut pour le programmer). et un potentiomètre qui tiendra lieu de capteur.



Installation de la bibliothèque Manchester

Le sketch que je vous propose pour l'émetteur et pour le récepteur nécessitent tous deux la bibliothèque Manchester, que vous devrez donc installer dans votre IDE Arduino.

Deux fichiers d'exemple sont fournis avec la bibliothèque: "ManchesterRX_Array-unfixed_length" et "ManchesterTX_Array-unfixed_length".  Ces deux sketches fonctionnent très bien (ils ont d'ailleurs servi de fondation aux sketches que je vous propose ci-dessous), mais pour obtenir de bons résultats, j'ai dû supprimer l'appel à la routine "man.workAround1MhzTinyCore()" dans le sketch de l'émetteur et diminuer la vitesse de la communication (2400 plutôt que 9600).

Sketch de l'émetteur (pour l'ATTiny85)

Voici le sketch destiné à l'ATTiny85.  Au besoin, vous pouvez vous référer à ce précédent billet qui explique comment programmer l'ATTiny avec l'IDE Arduino et une carte Arduino Uno.  Comme d'habitude, j'ai utilisé le noyau de David A. Mellis.

Le sketch est plutôt simple: une fois par seconde, l'ATTiny enverra, par l'entremise de l'émetteur RF, un message constitué de 4 octets: le premier octet contient la taille du message, et le deuxième octet contient le numéro de l'émetteur (qui n'a aucune utilité si votre carte Arduino ne reçoit des messages qu'en provenance d'un seul ATTiny, mais qui pourrait s'avérer essentiel pour distinguer plusieurs ATTiny émetteurs l'un de l'autre).

Les deux autres octets contiennent la lecture analogique que nous désirons transmettre.  Puisque le convertisseur analogique-numérique de l'ATTiny produit des valeurs à 10 bits, la lecture du potentiomètre doit être distribuée sur deux octets distincts, grâce aux fonctions highByte et lowByte (l'Arduino récepteur s'occupera de les fusionner lors de la réception).



Sketch du récepteur (pour la carte Arduino)

Rien de très complexe de ce côté non plus, puisque c'est la bibliothèque Manchester qui effectue le sale boulot: chaque fois qu'un message est reçu, il est affiché sur le moniteur série.



Circuit de l'émetteur (ATTiny85)

Une LED indicatrice est branchée à la pin 0, l'émetteur est branché à la pin 1, et le potentiomètre est branché à la pin 2 de l'ATTiny85, tel qu'indiqué sur le schéma ci-dessous.
La LED n'est pas obligatoire;  elle change d'état chaque fois qu'un message est envoyé, ce qui peut être utile pour savoir si votre ATTiny est actif ou non.



Circuit du récepteur

Le récepteur est connecté à la broche 4 de l'Arduino.  C'est la LED intégrée à la carte qui change d'état pour indiquer la réception d'un message.



Résultats

Toutes les secondes, l'ATTiny mesure la position du potentiomètre et envoie le résultat à l'Arduino. Sur réception d'un message, l'Arduino l'affiche dans le moniteur série.  Lorsque vous tournez le potentiomètre, la valeur transmise est modifiée.


Et ensuite?

Vous trouverez ici d'autres projets impliquant l'ATTiny85.  En ce qui concerne les émetteurs et récepteurs RF 433 MHz, vous serez peut-être intéressé par ce projet impliquant deux cartes Arduino, ou celui qui établit une communication entre Arduino et Raspberry Pi.

Yves Pelletier   (TwitterFacebook)

jeudi 15 février 2018

Jouer une mélodie avec le MPLAB Xpress Evaluation Board

L'activité d'aujourd'hui consiste à faire jouer une mélodie de votre choix à travers un petit haut-parleur branché à une carte MPLAB Xpress Evaluation Board (cette carte utilise un microcontrôleur PIC 16F18855 mais notre méthode pourra s'appliquer à bien d'autres microcontrôleurs de la série PIC).

Pour produire le signal sonore, nous allons utiliser une fonction du microcontrôleur qui se nomme NCO, pour Numerically Controlled Oscillator; il s'agit d'un oscillateur qui produit un signal en créneaux dont la fréquence peut être contrôlée à volonté par notre programme.

Le circuit

Le signal produit par l'oscillateur sera accessible par la sortie RC0 du microcontrôleur.  Il est fortement déconseillé de brancher un haut-parleur de 8 Ω directement sur la sortie d'un microcontrôleur, car les courants générés dépassent largement les limites permises.  Je vous suggère plutôt de piloter indirectement le haut-parleur en utilisant un transistor: le faible courant qui circulera dans la base du transistor contrôlera un courant plus intense qui circulera dans le haut-parleur.

Il existe plusieurs variantes (on peut utiliser un transistor bipolaire ou un transistor à effet de champ), voici le circuit que j'ai utilisé:


Même circuit, en version Fritzing:


Si vous désirez vous simplifier la vie, vous pouvez aussi utiliser un buzzer piézo qui, compte tenu de sa grande impédance, peut sans problème être branché directement à la sortie RC0.  Mais la qualité sonore sera moins bonne.

Configuration du projet avec MCC

Nous allons d'abord créer un nouveau projet dans MPLAB Xpress, et ensuite effectuer quelques réglages au moyen du MPLAB Xpress Code Configurator (MCC).  Si vous n'êtes pas familier avec ces outils, il pourrait s'avérer utile de jeter un oeil sur cet article.

Dans MCC, vous localisez "NCO" dans la liste intitulée "Device Resources".  Vous cliquez deux fois sur "NCO1" afin de l'ajouter à votre projet :


 NCO1 apparaît maintenant dans la liste "Project resources":


Je rappelle que NCO signifie Numerically Controlled Oscillateur: il s'agit d'un oscillateur dont nous pourrons contrôler la fréquence à volonté.

Les paramètres par défaut de NCO1 sont adéquats: vous n'avez pas à modifier quoi que ce soit: "NCO mode" est réglé à "FDC_mode", "Output polarity" est à "active_io" et "Clock Source" est réglé à "FOSC".

Notez qu'avec ces réglages, la fréquence maximale de l'oscillateur sera de 500 000 Hz (cette information sera utile lors de la rédaction de notre programme).


Nous allons associer la broche RC0 à l'oscillateur NCO1, en cliquant le cadenas approprié dans le bas de l'écran (sur la ligne NCO1 - ouput), puisque c'est là que nous avons branché notre haut-parleur:


Ne pas oublier de cliquer sur le bouton "Generate" afin que nos réglages soient exportés vers le projet que nous avons créé dans MPLAB Xpress.

Calcul des fréquences

Chaque note musicale de la gamme est associée à une fréquence bien précise.  Par exemple, une fréquence de 130,81 Hz donne un do.

Pour choisir la fréquence à laquelle vibrera notre oscillateur, nous devons régler la valeur du registre d'incrémentation ("increment register") qui est un nombre à 16 bits réparti sur deux octets: NCO1INCH (haute valeur) et NCO1INCL (basse valeur).  Plus cette valeur est grande, plus la fréquence d'oscillation sera élevée.

Puisque la valeur maximale du timer est de 1 048 575 et que la fréquence maximale de l'oscillateur est de 500 000 Hz, nous calculons la valeur du registre d'incrémentation de la façon suivante:


Par exemple, pour produire une fréquence de 130,81 Hz correspond à un do,  l'équation nous donne une valeur décimale de 549 qui se traduit par le nombre binaire 1000100101.  Il reste à placer les 8 derniers bits (00100101) dans le registre NCO1INCL et les bits excédentaires (10) dans le registre NCO1INCH.  Dans le script présenté ci-dessous, c'est ainsi que j'ai défini la note "C3":

const int NoteC3[2] = {0b00000010, 0b00100101};

Le script

J'ai cherché à faire un programme qui rendrait facile l'écriture d'une mélodie.  J'ai donc défini toutes les notes de la gamme sur 3 octaves (ces constantes portent des noms de la forme "NoteA3", "NoteC2", etc.  Il s'agit de la convention dans laquelle "A" correspond à un LA, "B" correspond à un SI, etc.

Pour chaque note qu'on désire jouer, il s'agit d'utiliser la commande "Playnote" en donnant comme argument le nom de la note (comme par exemple "NoteC2" pour le do le plus grave) et la durée (1 pour une noire, 2 pour une blanche, 4 pour une ronde...).

Vous pouvez modifier la valeur de la variable globale "tempo" pour changer la vitesse à laquelle la mélodie sera jouée.




Voici, pour terminer, une courte vidéo permettant d'entendre le résultat.




D'autres articles du même genre

J'ai déjà publié plusieurs articles impliquant le MPLAB Xpress Evaluation Board:  programmation des entrées/sorties, communication série par USB, utilisation d'une entrée analogique, contrôle d'un moteur à courant continu.

Si vous désirez jouer une mélodie en utilisant autre chose que le MPLAB Xpress Evaluation Board, ces articles pourraient vous intéresser: brancher un haut-parleur à l'Arduino,  jouer une mélodie avec le STM32 Nucleo, jouer une mélodie avec l'ATTiny85Bip bip: 5 circuits qui produisent un son.


Yves Pelletier   (TwitterFacebook)

samedi 10 février 2018

Jouer une mélodie avec l'ATTiny85

Si, tout comme moi, vous programmez l'ATTiny85 avec l'IDE Arduino et le noyau ATtiny par David A. Mellis, vous avez peut-être été frustré par l'absence de support pour la fonction "tone()" qui permet, sur une carte Arduino, de produire un son dont on peut contrôler la fréquence à volonté.


Il existe toutefois un remède, proposé par David Johnson-Davies dans son excellent blog Technoblogy: dans un sketch qu'il a baptisé "TinyTone", il utilise le timer/counter1 de l'ATtiny85 pour produire l'équivalent de ce que fait la fonction tone() sur l'Arduino.

Programmation de l'ATTiny

Au besoin, référez-vous à ce billet pour la façon d'installer le noyau ATtiny de David A. Mellis et programmer l'ATTiny au moyen d'une carte Arduino.

Sketch

Le sketch ci-dessous est celui publié par David Johnson-Davies, dans lequel je me suis contenté de modifier la mélodie (il s'agit d'À la Claire Fontaine) de la fonction playTune().  Le contenu de la fonction TinyTone() peut vous sembler obscur si vous n'êtes pas familier avec la manipulation des registres de l'ATTiny, mais vous n'aurez probablement pas besoin de la modifier.



Circuit

Après avoir programmé l'ATTiny85, il ne reste plus qu'à lui ajouter un haut-parleur sur la broche physique numéro 6 (également nommée broche 1 pour l'IDE Arduino), tel qu'illustré ci-dessous.


Vidéo du résultat


Aller plus loin

Pour générer des sons plus sophistiqués, vous pouvez également jeter un oeil sur le Tiny Synth, également développé par David Johnson-Davies et présenté dans son blog Technoblogy.  De plus, David vient tout juste de publier une version améliorée de sa fonction "TinyTone()".

Yves Pelletier   (TwitterFacebook)

vendredi 12 janvier 2018

Télémètre ultrasonore HC-SR04 et MPLAB Xpress Evaluation Board

Aujourd'hui, je vous explique comment procéder pour mesurer la distance d'un obstacle au moyen d'un télémètre HC-SR04 branché à une carte de développement MPLAB Xpress Evaluation Board de la compagnie Microchip.  La distance mesurée sera transmise à un ordinateur par communication série (via USB).

Même si j'ai utilisé une carte MPLAB Xpress Evaluation Board de première génération (celle qui est munie d'un microcontrôleur PIC 16F18855), je suppose que cet article pourrait vous être utile même si vous utilisez un autre microcontrôleur PIC.

Le module HC-SR04 est un sonar: lorsque sa broche "Trig" est brièvement soumise à un signal logique haut, une brève impulsion ultrasonore est émise.  La broche "Echo" prend ensuite l'état logique haut pendant une durée égale à la durée du trajet aller-retour de l'ultrason.  Si on connaît la vitesse du son (environ 340 m/s), on peut  utiliser cette durée pour calculer la distance qui sépare le module HC-SR04 de l'obstacle qui a réfléchi l'impulsion ultrasonore.  (Dans d'autres articles de ce blog, je vous indique comment utiliser un HC-SR04 avec un Arduino, un Raspberry Pi, un STM32 Nucleo et un ATTiny: ce n'est pas le choix qui manque...).

Connexions

Le module HC-SR04 est branché à la carte de la façon suivante:

Broche Vcc du HC-SR04 : sortie 5V du MPLAB Xpress Evaluation Board
Broche Trig du HC-SR04: broche RC5 du MPLAB Xpress Evaluation Board
Broche Echo du HC-SR04: broche RC6 du MPLAB Xpress Evaluation Board
Broche Gnd du HC-SR04: broche GND du MPLAB Xpress Evaluation Board



À moins que j'aie interprété la fiche technique de travers, les entrées du 16F18855 tolèrent les tensions de 5 V; je n'ai donc pas jugé utile d'abaisser le signal de sortie du HC-SR04 (broche "Echo") avant de l'acheminer à la carte.

Configuration avec MCC

Nous allons maintenant créer un nouveau projet dans l'IDE en ligne MPLAB Xpress, puis effectuer quelques configurations au moyen du MPLAB Xpress Code Configurator (si vous n'êtes pas familiers avec ces deux outils, je vous réfère à cet article).

Tout d'abord, dans le "System Module" de MCC, les valeurs par défaut "HFINTOSC" avec une fréquence d'horloge de 4_MHz sont tout à fait appropriés, mais il faut régler l'option "Clock Divider" à la valeur 1.



Nous aurons besoin de communiquer par UART et de chronométrer la durée de l'impulsion produite par le HC-SR04.  Dans la liste "Device Resources", nous allons donc choisir "EUSART" et "TMR1", qui vont ensuite apparaître dans la zone "Project Resources".

Réglages des paramètres de l'EUSART:  il faut cocher les cases "Enable Transmit" et "Redirect STDIO to USART".  La valeur par défaut des autres paramètres devrait être correcte.


Les changements à effectuer dans les paramètres du timer sont assez nombreux: d'abord, régler "Clock Source" à FOSC. Ensuite, cocher les cases "Enable Gate" et "Enable Gate Single-Pulse Mode", puis régler "Gate Polarity" à high.

Il est bon de régler "Timer Period" à une valeur se situant entre le maximum et le minimum indiqués (en fait, cette valeur ne semble avoir aucun effet sur le fonctionnement de notre programme, mais MCC vous affichera un message d'erreur si vous laisser ce champ à une valeur qui ne se situe pas dans la plage admise).


Dans la grille où on retrouve plusieurs petits cadenas, il faut décocher le cadenas qui lie par défaut RC6 au TX de l'EUSART, puisque nous voulons utiliser cette entrée pour une autre fonction (l'icône devrait devenir un cadenas ouvert).  Nous cliquons RC0 pour le TX de l'EUSART, et RC1 pour le RX de l'EUSART (ces deux broches sont liées à l'USB de la carte MPLAB Xpress Evaluation Board).

Réglez RC5 comme GPIO output, et liez RC6 au timer (TMR1 - T1G input).


Finalement, dans "Pin Module", rebaptisez la broche RC5 "Trig_pin" et décochez la case "Analog" qui lui a été attribuée par défaut.


Maintenant que la configuration est terminée, il ne faut pas oublier de cliquer sur le bouton "Generate" afin que les fichiers soient crées dans notre projet MPLAB Xpress.

Script

Voici le code à placer dans le fichier "main.c" de votre projet.




Il s'agit de démarrer sur votre ordinateur un logiciel de communication série (j'ai utilisé le moniteur série de l'IDE Arduino), et de déplacer un obstacle devant le module HC-SR04 pour voir la distance en centimètres s'afficher à l'écran.



Yves Pelletier   (TwitterFacebook)


vendredi 5 janvier 2018

Distinguer un signal analogique d'un signal numérique

Voilà un concept qui peut être nébuleux pour les néophytes: quelle est la différence entre un signal analogique et un signal numérique?

Signal numérique

Un signal numérique (certains disent "digital", mais c'est en anglais) est une tension qui ne peut prendre que deux valeurs: une valeur haute et une valeur basse.

Le schéma ci-contre illustre un circuit numérique simple: selon l'état de l'interrupteur (ouvert ou fermé), la tension du point A peut prendre deux valeurs possibles:  0 V ou 6 V.  C'est tout.  La tension n'est jamais de 4 V ou de 2,657 V; il n'y a que deux états possibles: 0 V ou 6 V.


Les sorties d'une carte Arduino sont des sorties numériques: votre programme peut régler une sortie pour qu'elle soit à 0 V (niveau logique bas) ou à 5 V (niveau logique haut), mais il ne peut pas régler la sortie à 4 V, ou à 2,657 V.   Il n'existe que deux possibilités: 0 V ou 5 V.  C'est le même principe pour le Raspberry Pi: ses sorties peuvent être à 0 V ou à 3,3 V, et rien d'autre.

Ces deux états logiques peuvent être désignés de différentes façons:   haut / bas, vrai / faux, oui / non, 0 / 1...


Signal analogique

Contrairement au signal numérique, un signal analogique est une tension qui peut prendre une infinité de valeurs possibles.  Dans le schéma ci-contre, en tournant le bouton du potentiomètre, vous pouvez faire en sorte que la tension au point A prenne n'importe quelle valeur entre 0 V et 6 V: elle peut être de 1,579 V, ou encore 3,03947 V, etc.  De plus, lorsque vous tournez le bouton du potentiomètre, la tension varie de façon continue et non par bonds.  Pour aller de 0 V à 6 V, vous devrez nécessairement passer par toutes les valeurs situées entre 0 V et 6 V.  Un signal analogique varie de façon continue.



Combiner plusieurs signaux numériques

Un signal numérique ne peut donc prendre que deux valeurs (on parle de valeur binaire)...mais peut-on malgré tout exprimer un plus grand nombre de valeurs différentes de façon numérique?  Oui: en combinant plusieurs valeurs binaires.

Le schéma ci-contre illustre un circuit numérique à 2 bits.  Même si les points A et B ne peuvent prendre que deux états possibles (0 V ou 6 V), l'ensemble du circuit peut prendre 4 états possibles:
  • A à 0 V et B à 0 V
  • A à 0 V et B à 6 V
  • A à 6 V et B à 0 V
  • A à 6 V et B à 6 V
Mathématiquement, on peut exprimer ces 4 états par les nombres binaires 00, 01, 10, et 11.

En ajoutant un troisième interrupteur, on obtient un circuit numérique à 3 bits.  Il s'agit bien d'un circuit numérique: partout dans le circuit, la tension ne peut être que de 0 V ou 6 V.

Ce circuit à 3 bits peut prendre 8 états possibles:

  • A à 0 V, B à 0 V, C à 0 V  (nombre binaire 000)
  • A à 0 V, B à 0 V, C à 6 V (nombre binaire 001)
  • A à 0 V, B à 6 V, C à 0 V (nombre binaire 010)
  • A à 0 V, B à 6 V, C à 6 V (nombre binaire 011)
  • A à 6 V, B à 0 V, C à 0 V (nombre binaire 100)
  • A à 6 V, B à 0 V, C à 6 V (nombre binaire 101)
  • A à 6 V, B à 6 V, C à 0 V (nombre binaire 110)
  • A à 6 V, B à 6 V, C à 6 V (nombre binaire 111)
Le nombre d'états possibles peut être calculé de cette façon:
  • circuit à 1 bit: 21 = 2 états possibles
  • circuit à 2 bits: 22 = 4 états possibles
  • circuit à 3 bits: 23 = 8 états possibles
  • circuit à 4 bits: 24 = 16 états possibles
  • circuit à n bits: 2n états possibles


Transmission parallèle / transmission série


Le circuit numérique à 3 bits représenté plus haut comporte 3 sorties (une pour chaque bit) et nécessitera donc 3 conducteurs distincts pour transmettre l'information.  C'est un exemple de transmission parallèle.

Si vous avez déjà eu l'occasion d'interfacer un afficheur LCD de type Hitachi HD44780 à une carte Arduino, vous avez appliqué ce principe:  l'afficheur comporte 8 connecteurs permettant de transmettre des données à 8 bits de façon parallèle.  En général, on préfère toutefois le mode 4 bits, qui accapare moins de sorties sur notre Arduino.  Sur l'illustration ci-dessous, les sorties 2, 3, 4 et 5 de l'Arduino transmettent à l'afficheur un signal à 4 bit en mode parallèle.




Revenons à notre circuit à 3 bits constitué de 3 interrupteurs. Plutôt que contrôler 3 bits avec 3 interrupteurs contrôlant 3 sorties différentes, je peux choisir d'utiliser un seul interrupteur et lire la tension au point A à plusieurs moments différents.  Par exemple, si vous appuyez sur l'interrupteur pendant 10 secondes, puis vous le relâchez pendant 10 secondes, et vous l'appuyez à nouveau pendant 10 secondes, vous obtiendrez au point A, en mesurant le signal toutes les 10 secondes: 6 V, 0 V, 6 V, ce qui pourrait correspondre au nombre binaire à 3 bits "101".  (Nous pourrions alors dire que la fréquence d'horloge était de 1/10 de Hz.)

Cette façon de procéder, qui rappelle le bon vieux télégraphe de Samuel Morse, est une transmission série.  Lorsque vous utilisez les broches RX et TX de l'Arduino pour transmettre ou recevoir de l'information, c'est une transmission série.  De nombreux capteurs qu'on branche à l'Arduino transmettent l'information en utilisant les protocole I2C ou SPI: il s'agit également d'une transmission série.


Conversion d'un signal analogique en signal numérique

Le graphique ci-contre représente une tension qui varie de façon sinusoïdale.  Nous voyons qu'il s'agit d'un signal analogique, puisque le signal prend tour à tour toutes les valeurs situées entre 10 V et - 10 V.

Il est possible de numériser ce signal analogique, c'est à dire d'exprimer l'information qu'il contient sous une forme numérique, au moyen d'un convertisseur analogique/numérique.  La résolution de la conversion dépendra du nombre de bits.

Par exemple, si on ne dispose que d'un seul bit, on ne peut utiliser que deux valeurs possibles: on pourrait, par exemple, assigner la valeur 1 à toutes les tensions analogiques positives, et la valeur 0 à toutes les tensions analogiques négatives.  Il en résulterait une résolution de 10 V.  Avec cette faible résolution, la copie numérique ressemble bien peu peu à l'original analogique...


 Avec deux bits, nous disposons de 4 valeurs possibles.  Par exemple: "00" pour les valeurs situées entre - 10 V et - 5 V, "01" pour les valeurs situées entre -5 V et 0 V, "10" pour les valeurs situées entre 0 V et +5 V, et "11" pour les valeurs situées entre 5 V et 10 V.  Il s'agit d'une résolution de 5 V.  C'est déjà un peu plus ressemblant:

Avec trois bits, nous disposons maintenant d'une gamme de 8 valeurs possibles, avec une résolution de 2,5 V.

On constate que plus le nombre de bits est élevé, meilleure est la résolution, et il en résulte une copie numérisée plus fidèle au signal analogique d'origine.

Le convertisseur analogique/numérique de l'Arduino Uno est à 10 bits, ce qui permet de séparer le signal analogique reçu en 210 = 1024 valeurs possibles.  Sur un signal analogique qui peut varier entre 0 et 5 V, il s'agit d'une excellente résolution d'environ 0,005 V!

Mais disposer d'une bonne résolution n'est pas le seul critère à respecter: encore faut-il mesurer le signal analogique suffisamment souvent.  On appelle "fréquence d'échantillonnage" le rythme auquel on convertit les valeurs analogiques en valeur numérique.

Par exemple, pour le signal périodique illustré ci-dessous, vous perdrez beaucoup d'information si vous vous contentez de mesurer la tension au rythme indiqué par les "x" bleus:  à chaque lecture, vous obtiendrez une tension nulle, mais bien des choses se passent à votre insu entre deux lectures consécutives!


Bref, la numérisation d'un signal analogique implique nécessairement une certaine perte d'information, mais cette perte peut être sans conséquences si la résolution et la fréquence d'échantillonnage sont suffisantes.

Tolérance au bruit

Lorsque vous acheminez un signal électrique dans un câble conducteur (peu importe que ce signal soit numérique ou analogique), le câble agit comme une antenne: il capte les ondes électromagnétiques qui sont émises, par exemple, par des stations de radio, par les fils qui constituent l'installation électrique de votre résidence, etc.  Ces ondes électromagnétiques modifient de façon indésirable la tension du fil: c'est ce qu'on appelle du bruit, ou des parasites.  En général, les signaux analogiques sont plus affectés par le bruit que les signaux numériques.

Par exemple:  supposons que votre câble transporte un signal analogique pouvant varier entre 0 et 5 V et que le bruit ajoute ou soustrait une valeur aléatoire pouvant atteindre 0,5 V.  Lorsque la valeur d'entrée est de 2,5 V, vous pouvez donc recevoir à l'autre extrémité du câble de transmission n'importe quelle valeur située entre 2,0 V et 3,0 V!

Supposons maintenant que le même câble de transmission achemine un signal numérique qui se manifeste par une tension d'entrée qui est parfois de 0 V, et parfois de 5 V.  À cause du bruit, le signal qui aurait dû être de 0 V sera peut-être reçu à -0,5 V ou +0,5 V mais, dans les deux cas, il sera interprété comme un niveau logique bas correspondant à 0 V.  De la même façon, le signal de 5 V qui devient, à cause du bruit, 4,5 V ou 5,5 V, sera malgré tout interprété comme un niveau logique haut correspondant à une valeur de 5 V.

Capteurs numériques / capteurs analogiques

Pour que votre Arduino puisse réagir à son environnement, vous devez le munir de capteurs.  Ces capteurs peuvent être analogiques ou numériques.

Par exemple, pour permettre à l'Arduino de savoir s'il fait chaud ou froid, vous pourriez utiliser une thermistance: il s'agit d'un composant dont la résistance dépend fortement de la température ambiante.

La thermistance est un capteur analogique, car elle produit une tension qui varie de façon continue avec la température.  Pour cette raison, on la branche à une entrée analogique de l'Arduino, car le convertisseur analogique/numérique de l'Arduino devra transformer ce signal analogique en une information numérique.

Le capteur de température LM35 est un autre exemple de capteur analogique, car il produit une tension proportionnelle à la température.

Par contre, le capteur de température DS18B20 est un capteur numérique qui utilise le protocole "1-Wire" pour transmettre des signaux série de 9 à 12 bits.    Le MCP9808 est un autre capteur de température numérique, mais il utilise le protocole I2C.

Circuits intégrés analogiques ou numériques

Les circuits intégrés sont souvent classés selon le type analogique ou numérique.

Par exemple, les amplificateurs opérationnels sont des circuits intégrés analogiques car leur tension de sortie peut varier de façon continue en prenant une infinité de valeurs différentes.

Un CD4001, par contre, comporte 4 portes "NON-OU": il s'agit d'un circuit intégré numérique dont les sorties ne peuvent prendre que deux états possibles, en fonction de l'état logique des entrées.

Instruments de mesure analogiques ou numériques


Un multimètre analogique comporte une aiguille dont la position dépend du courant qui circule dans l'appareil.  Si la tension mesurée varie progressivement de 0 à 5 V, l'aiguille passera nécessairement de façon continue par toutes les positions situées entre 0 et 5 V.  La difficulté, toutefois, est dans l'interprétation de sa position par la personne qui prend la mesure.

Le multimètre numérique est beaucoup plus facile à lire, mais il affiche des valeurs discontinues qui dépendent de sa résolution.  On peut améliorer la résolution du multimètre en modifiant son échelle de lecture.  Sur l'échelle "200 V", le multimètre peut mesurer n'importe quelle tension située entre -200 V et +200 V, mais sa résolution sera beaucoup moins bonne que sur l'échelle "2 V", qui le restreint à une plage de valeurs située entre -2V et +2V.

Quiz

Pour terminer, un petit quiz pour vérifier si vous avez bien suivi...

1. On peut régler l'état de la sortie numéro 7 de l'Arduino au moyen de deux commandes:  "digitalWrite(7, HIGH);" qui règle la tension à 5 V, et "digitalWrite(7, LOW);" qui règle la tension à 0 V.  On peut en déduire qu'il s'agit d'une sortie...

 a) ...analogique
 b) ...numérique


2. Lorsque vous lisez la valeur d'une entrée analogique de l'Arduino avec la fonction analogRead, vous obtenez un nombre entier situé entre 0 et 1023 inclusivement.  On peut donc en conclure que le convertisseur analogique-numérique de l'Arduino est à...

 a) 8 bits
 b) 10 bits
 c) 12 bits
 d) 16 bits
 e) 32 bits


3.  Ce graphique de la tension en fonction du temps représente un signal...


 a) ...analogique
 b) ...numérique

4.  Ce graphique de la tension en fonction du temps représente un signal..;



 a) ...analogique
 b) ...numérique


5. Un capteur numérique produit une tension qui varie proportionnellement avec le paramètre qu'on désire mesurer.

 a) Vrai
 b) Faux


6. Lorsqu'on veut mesurer une tension analogique, on utilise un voltmètre analogique.  Si on veut mesurer un signal numérique, il faut alors utiliser un voltmètre numérique.

 a) Vrai
 b) Faux




(Cliquez sur le bouton "Valider" pour vérifier vos réponses)

Yves Pelletier   (TwitterFacebook)
Related Posts Plugin for WordPress, Blogger...