samedi 27 mai 2017

Livre: Arduino Music and Audio Projects par Mike Cook



Arduino Music and Audio Projets
par Mike Cook
481 pages
Éditions Apress, 2015

Mes recommandations concernant Arduino Music and Audio Projets sont simples: si vous ne vous intéressez pas particulièrement au potentiel musical de l'Arduino, cette publication ne sera d'aucun intérêt pour vous.  Par contre, si vous aimeriez fabriquer des instruments de musique à base d'Arduino, ou encore utiliser l'Arduino pour produire ou modifier des sons, alors la lecture de ce livre est essentielle!

Mike Cook, qui est physicien de formation,  est également co-auteur du livre Raspberry Pi pour les Nuls. S'il vous arrive de fréquenter la version anglophone du forum Arduino, vous avez peut-être eu l'occasion de profiter de ses  interventions fort pertinentes rédigées sous le pseudonyme de Grumpy_Mike:  au moment où j'écris ces lignes, il y en a presque 50 000!

Arduino Music and Audio Projets est divisé en trois parties:

Première partie:  MIDI et OSC

Dans cette première partie, qui occupe à elle seule plus de la moitié des pages du livre, l'auteur nous présente les protocoles MIDI et OSC, qui permettent la communications entre instruments de musique électroniques.

Plusieurs projets complets, de niveaux de difficulté variables, nous sont présentés:  même note jouée simultanément sur plusieurs canaux, accord à un doigt, arpégiateur, écho, délais, looper MIDI, Spoon-o-Phone (un clavier MIDI rudimentaire qui se joue au moyen d'une cuillère), thérémine MIDI (à base de télémètres infrarouge SHARP), MIDI air drums (avec Wii Nunchuck), jeu de lumière contrôlé par MIDI, harpe MIDI (comportant une vraie harpe dont chaque corde peut être pincée par un mécanisme à moteur), Dunocaster (un instrument qui rappelle une guitare électrique), monome OSC, pendule MIDI, clavier MIDI géant (actionné en marchant sur les touches), Glockenspiel MIDI (chaque lamelle étant frappée par un solénoïde).

À titre d'exemple, la vidéo ci-dessous montre l'Arduinocaster en action.



Deuxième partie:  synthèse de son

Alors que dans la première partie, l'Arduino servait à produire ou à relayer des messages MIDI ou OSC, on s'attaque ici à la production d'un signal sonore au moyen de l'Arduino, auquel on a branché un haut-parleur:  onde carrée, triangulaire, en dent de scie ou sinusoïdale, polyphonie.  Ces concepts sont mis en pratique dans la fabrication d'un SpoonDuino:  un autre instrument  contrôlé par une cuillère, capable de produire des sons complexes (voir la vidéo ci-dessous).




Troisième partie: traitement de signal sonore

Finalement, cette troisième partie consiste à échantillonner de véritables sons et les modifier avant de les transmettre à un haut-parleur. Par exemple:  enregistrer votre voix et la rejouer un octave plus haut ou plus bas, ajouter de l'écho, des filtres, etc.   Ici, on s'approche des limites (mémoire et rapidité) de l'Arduino Uno, ce qui oblige à faire certains compromis concernant la durée des échantillons, la fréquence d'échantillonnage et la résolution.  Pour certains projets, on doit même utiliser l'Arduino Due, plus puissant que l'Uno.

Tout est clairement expliqué:  Mike Cook ne se contente pas de vous fournir la recette, il vous explique de façon détaillée comment les choses fonctionnent et les raisons pour lesquelles on procède de cette façon (c'est quand même un livre de 500 pages).  Évidemment, tous les sketches sont fournis (et peuvent être récupérés en ligne sur gitHub).

En lisant ce livre, vous aurez l'occasion d'apprendre tout un tas de concepts concernant l'acoustique, l'électronique et la programmation.  Je ne le recommanderais pas à un débutant, toutefois:  pour profiter pleinement du contenu, vous devriez avoir déjà eu l'occasion de réaliser quelques projets simples avec l'Arduino.

Bien sûr, il faut comprendre l'anglais...puisqu'il s'agit d'un livre très spécialisé, je serais surpris qu'il soit un jour traduit en français.

Yves Pelletier   (TwitterFacebook)

mercredi 17 mai 2017

Jouer une mélodie avec le STM32 Nucleo (mbed)


Aujourd'hui, nous allons faire en sorte que notre carte STM32 Nucleo joue une petite mélodie.

Il est possible de faire de la synthèse de son assez sophistiquée grâce au STM32, mais nous nous limiterons à la génération d'un signal PWM dont nous ferons varier la fréquence, afin d'obtenir un résultat similaire à l'utilisation des instructions "tone" et "noTone" sur une carte Arduino.

Le circuit

Tel que discuté dans un précédent article, il est plutôt risqué de brancher un haut-parleur directement à une sortie du Nucleo:  la résistance d'un haut-parleur étant typiquement très faible (inférieure à 10 Ω), il en résulterait un courant trop intense qui risquerait à la longue d'endommager le STM32.  Une méthode beaucoup plus appropriée consiste à insérer un transistor entre la sortie du Nucleo et le haut-parleur.

Voici le schéma du circuit que j'ai utilisé.  Le potentiomètre est facultatif:  il permet de contrôler le volume sonore.

Plutôt qu'un MOSFET, vous pouvez utiliser un transistor NPN avec une résistance de quelques kΩ à sa base (plus de détails ici).

Le script

Voici un script programmé dans mbed.  Après avoir défini la pin D9 comme une sortie PWM au moyen de la fonction PWMOut, on peut régler sa période et son rapport cyclique.  La période est liée à la hauteur de la note jouée, alors que le rapport cyclique permet de contrôler le volume.

La constante "note" est un tableau contenant la fréquence associée aux 11 notes contenues dans un octave.

La mélodie se trouve dans la constante "melodie".  Il s'agit d'un tableau bi-dimensionnel contenant chacune des notes devant être jouée, de façon séquentielle.  Chaque note comporte trois paramètres:  la valeur de la note (0 pour do, 1 pour do#, 2 pour ré, jusqu'à 11 pour si), le numéro de l'octave (1 pour l'octave le plus grave, 2 pour l'octave suivant, etc.), et finalement la durée de la note (1 pour une croche, 2 pour une noire, 4 pour une ronde).

Vous pouvez facilement modifier le contenu de la constante "melodie" afin de faire jouer autre chose par votre carte Nucleo, sans avoir à changer quoi que ce soit au reste du programme.


Vidéo de la carte Nucleo en action



Yves Pelletier   (TwitterFacebook)

dimanche 14 mai 2017

Horloge temps réel DS1307 et MSP430 Launchpad (Energia)

Aujourd'hui, je vous propose un petit guide qui vous guidera dans l'utilisation d'un module RTC (horloge temps réel) DS1307 avec votre carte MSP430 Launchpad.  Ça peut s'avérer particulièrement utile si vous désirez fabriquer une horloge au moyen de votre Launchpad, ou si votre projet nécessite que votre Launchpad connaisse la date et l'heure exacte en tout temps (dans un système de data logging, par exemple).  Pour programmer le Launchpad, nous utiliserons le logiciel Energia.

Mise en garde

J'ai utilisé un module DS1307 parce c'est ce que j'avais sous la main.  Mais  en théorie, le DS1307 nécessite une tension d'alimentation de 5 V, alors que votre Launchpad fonctionne sous 3,3 V. Mon propre module a parfaitement fonctionné sous cette faible tension, mais il serait exagérément optimiste de supposer que tous les modules DS1307 peuvent s'accommoder d'une tension aussi basse. Donc, si vous disposez déjà d'un module DS1307, vous pouvez vérifier s'il accepte de fonctionner sous 3,3 V, tout comme le mien.  Mais si vous vous apprêtez à faire l'acquisition d'un module RTC dans le but de l'utiliser avec un Launchpad, il serait nettement plus approprié de vous procurer un module RTC conçu pour fonctionner sous 3,3 V (le PCF8523, par exemple).

Le module RTC DS1307

C'est la compagnie Maxim qui fabrique le circuit intégré DS1307, mais c'est plus pratique d'utiliser un module déjà prêt à l'emploi, comportant une petite pile qui permettra à votre horloge de conserver la bonne heure même pendant que votre Launchpad n'est pas sous tension.  J'ai utilisé un module chinois qui est très similaire au module commercialisé par Adafruit.

Téléchargement de la bibliothèque

J'ai utilisé d'excellents résultats avec la bibliothèque RTCLib.  Notez que cette bibliothèque n'est pas spécifique au Launchpad: c'est exactement la même version que pour l'Arduino.

Branchements

Ici, les choses peuvent se compliquer un peu.    Je commence par vous présenter le montage le plus simple, qui a très bien fonctionné pour moi.  Ensuite, au cas où ça ne fonctionnerait pas si bien pour vous, nous verrons quelques modifications pouvant être apportées à ce montage.

Le module RTC comporte 7 connecteurs, ce qui peut à première vue sembler un peu intimidant.   Mais pour une utilisation de base, seuls 4 connecteurs nous seront utiles:  deux connecteurs qui servent à l'alimentation du module, et deux connecteurs servant à la communication au moyen du protocole  i2c.


J'ai branché le module RTC de la façon suivante:
  • Pin GND du module RTC --- Pin GND du Launchpad
  • Pin Vcc du module RTC --- Pin VCC du Launchpad
  • Pin Sda du module RTC --- Pin P2.2 du Launchpad
  • Pin Scl du module RTC --- Pin P2.1 du Launchpad
Si vous vous inquiétez de l'absence de résistances pull-up, c'est qu'elles sont déjà présentes à l'intérieur de mon module RTC (3,3 kΩ, d'après ce que j'ai mesuré).  J'ignore si tous les modules RTC à base de DS1307 comportent déjà ces résistances ou non.

Si ce circuit ne fonctionne pas de votre côté, plusieurs raisons sont possibles:

- Peut-être que votre module RTC n'est pas muni de résistances pull-up, et que vous devez les ajouter vous-mêmes (4,7 kΩ devraient faire l'affaire).

- Si vous utilisez une vieille version d'Energia, les connecteurs I2C pourraient se trouver plutôt aux pins P1.6 et P1.7  (assurez-vous alors de retirer le jumper qui permet d'allumer la LED 2 intégrée à la carte).

- Ça pourrait être parce que votre module nécessite 5 V (ce qui est normal:  il s'agit de la tension recommandée par le fabricant).  Il existe une sortie 5 V non-officielle sur votre Launchpad:  il s'agit de souder un connecteur dans le trou "TP1" situé sous le port mini-usb.



Vous pouvez alimenter le module RTC sous 5 V en utilisant cette sortie, mais tout en évitant que les lignes de communication (Sda et Scl) ne dépassent 3,3 V.  Si votre module ne comporte pas déjà de résistances pull up reliant Vcc à Sda et Scl, le circuit ci-dessous serait approprié.


Sketch

Puisque la bibliothèque TRCLib a été conçue en fonction d'une utilisation avec l'Arduino, les exemples qui l'accompagnent utilisent une vitesse de communication de 57600 bauds:  ça semble trop rapide pour le Launchpad, car Energia n'a accepté d'afficher les messages qu'à 9600 bauds.

Voici un sketch fortement inspiré de l'exemple "ds1307".  Il affiche dans le moniteur série l'heure et la date, dans deux formats différents.




Yves Pelletier   (TwitterFacebook)

mercredi 10 mai 2017

Kit: générateur de basses fréquences ICL8038

Je n'avais pas vraiment besoin d'un nouveau générateur de basses fréquences, mais le prix (environ 2 euros) m'a intrigué.  J'ai donc commandé sur eBay ce kit comportant tous les composants nécessaires à la fabrication d'un petit générateur basse fréquence pouvant produire un signal sinusoïdal, carré ou triangulaire dans une gamme de fréquences allant de 50 Hz à 5000 Hz.

Le kit

Il s'agit d'un kit, donc on doit soi-même souder les 24 composants au circuit imprimé.  Mon exemplaire était livré sans la moindre trace de documentation, mais les indications qui sont gravées sur le circuit imprimé permettent malgré tout de placer les composants au bon endroit sans la moindre ambiguïté.


Le kit contient les éléments suivants (les symboles entre parenthèses sont ceux qui figurent sur le circuit imprimé):

A) Circuit imprimé (6 cm X 4 cm)
B) 2 triples borniers à vis pour l'alimentation et les sorties (J1 et J2)
C) Circuit intégré ICL8038, probablement contrefait (U1)
D) Interrupteur pour sélectionner les hautes ou les basses fréquences (S1)
E) Condensateur 1 nF "102" (C3)
F) Condensateur 10 nF "103" (C4)
G) 2 condensateurs 100 nF "104" (C1 et C2)
H) Condensateur électrolytique 220 µF (le circuit imprimé indique 100µF) (C5)
I) Potentiomètre 20K "203" pour le réglage du rapport cyclique (VR3)
J) Potentiomètre 100 K "104" pour atténuer la distorsion du signal (VR4)
K) Potentiomètre 5K pour le réglage de la fréquence (VR1)
L) Potentiomètre 5K pour le réglage fin de la fréquence (VR2)
M) Diode 1N1007 (D1)
N) LED rouge (D2)
O) Bouton du potentiomètre VR1
P) Résistance 200 ohms (R1)
Q) 3 résistances 10 K (R2 R3 R4)
R) 4 résistances 33 K (R5 R6 R7 R8)

Pour les curieux, voici un lien vers la fiche technique du ICL8038, et un schéma du circuit, trouvé sur la page eBay du vendeur (attention, les symboles du schémas ne concordent pas avec ceux qui sont gravés sur le circuit imprimé).


Utilisation du générateur

Le générateur doit être alimenté avec une tension continue de 12 volts (l'ICL8038 pourrait en principe tolérer au moins le double, mais pas le condensateur électrolytique, limité à 16 V!).

Lorsque le commutateur est en position "basse fréquence", le signal peut prendre une fréquence allant de 50 Hz à 500 Hz, alors qu'en position "haute fréquence", la fréquence peut être réglée à une valeur située entre 500 Hz et 5000 Hz.

Il existe une sortie distincte pour chaque forme de signal (sinus, carré ou triangulaire).

L'amplitude ne peut malheureusement pas être modifiée:  elle est d'environ 1 V pour le sinus, 1,5 V pour le signal triangulaire et 4 V pour le signal carré.   Le signal alternatif se superpose à une tension continue d'environ 5 V.

Pour 2 €, il s'agit d'une acquisition intéressante si vous ne disposez pas déjà d'un tel instrument. L'impossibilité de modifier l'amplitude du signal est un inconvénient; il pourrait être intéressant d'ajouter un étage d'amplification à gain variable afin de combler cette lacune.








Yves Pelletier   (TwitterFacebook)



lundi 8 mai 2017

Fabrication d'une flûte à bec MIDI (Arduino)

J'ai fabriqué une flûte à bec MIDI.  J'admets qu'elle n'est pas très esthétique, mais elle fonctionne plutôt bien.



C'est quoi, une flûte MIDI?

C'est un contrôleur MIDI qui fonctionne exactement comme une flûte à bec, sauf que les trous ont été remplacés par des boutons poussoirs:  vous appuyez sur la bonne combinaison de boutons et, lorsque vous soufflez dans l'embouchure, un message MIDI est transmis à un clavier MIDI (ou un logiciel MIDI), qui joue les notes avec une sonorité de flûte...ou celle d'un autre instrument, si c'est ce que vous préférez.

Tout comme pour une vraie flûte à bec, le volume sonore de la note jouée dépend de la force avec laquelle vous soufflez dans l'embouchure (plus vous soufflez fort, plus la note aura un volume élevé). Quant à la hauteur de la note, elle dépend de la combinaison de boutons qui sont enfoncés.

Matériel

Pour fabriquer ma flûte MIDI, j'ai principalement utilisé une carte Arduino Uno, un capteur de pression BMP180, 11 boutons poussoirs, et un bâton de bois ayant à peu près la taille d'une flûte à bec,

L'embouchure

Pour détecter si le flûtiste est en train de souffler de l'air ou non, j'ai choisi d'utiliser un capteur de pression barométrique BMP180 (que j'avais déjà exploré dans un précédent article).

Pour que le souffle du musicien ait un effet perceptible sur la pression, il convient d'enfermer le capteur à l'intérieur d'un récipient semi-hermétique.  J'ai choisi ce que j'avais sous la main: une coquille de Kinder Suprise en plastique. Pour que ce soit plus confortable dans la bouche du flûtiste, j'y ai ajouté un tube provenant d'un stylo à billes.

Ça fonctionne raisonnablement bien, mais soyez conscients que j'ai utilisé ce qui traînait dans mon atelier.  Vous pouvez obtenir d'excellents résultant en utilisant du matériel totalement différent (en particulier:  quelque chose dont la forme ressemblerait un peu plus à l'embouchure d'une véritable flûte à bec...).

Il faut prévoir une ouverture dans le récipient pour faire passer les fils qui relieront le capteur BMP180 à l'Arduino, mais également pour laisser sortir l'air (de façon à ce que le musicien ait vraiment l'impression de souffler dans une flûte).






Tests de l'embouchure

Après avoir fabriqué mon embouchure rudimentaire, j'ai effectué quelques tests pour avoir une idée de la pression mesurée lorsqu'on ne souffle pas dans la flûte, lorsqu'on souffle doucement, ou énergiquement, etc.

Pour ce faire, j'ai utilisé le sketch publié dans mon précédent article sur le capteur BMP180.

Conclusion:  Lorsque je ne souffle pas dans l'embouchure, la pression atmosphérique est de 983,90 hPa, mais elle peut atteindre 1025 hPa lorsque je souffle.




Prenez garde, toutefois, de vous réserver une bonne marge de manoeuvre:  la pression atmosphérique varie d'une journée à l'autre (c'est d'ailleurs une façon d'effectuer des prédictions météorologiques). Suite aux mesures affichées ci-dessus, j'avais conçu un sketch qui considérait qu'une pression supérieure à 985 hPa signifiait qu'on soufflait dans l'embouchure;  le lendemain, ma flûte jouait toute seule...


Les boutons



Une flûte à bec comporte une dizaine de trous:  9 sur le dessus de la flûte, et un en-dessous.  Sur ma flûte, chaque trou est remplacé par un interrupteur (bouton poussoir).  J'ai respecté la taille et l'espacement des trous d'une vraie flûte mais, si c'était à refaire, j'utiliserais probablement des boutons plus gros et un peu plus espacés, pour une meilleure ergonomie.

Les trous situés près de l'extrémité de la flûte (contrôlés par l'annulaire et l'auriculaire de la main droite) sont doubles:  la note jouée ne sera pas la même selon que les deux trous sont couverts, ou qu'un seul trou est couvert, ou que les deux trous sont laissés découverts.

Sur ma flûtes, ces paires de trous sont remplacés par deux boutons placés côte à côte, mais il n'est pas nécessaire d'appuyer sur les deux boutons avec le même doigt:  appuyer sur un des boutons est l'équivalent de couvrir les deux trous, alors qu'appuyer sur l'autre bouton est l'équivalent de couvrir un seul des deux trous.

Il en va de même pour le trou du dessous, contrôlé par le pouce de la main gauche:  pour produire certaines notes, il faut couvrir ce trou à moitié.  J'ai donc placé deux boutons sous ma flûte:  un bouton pour produire la note qu'on obtient lorsque le pouce recouvre la totalité du trou, et un deuxième bouton pour produire la note qu'on obtient lorsque le pouce ne recouvre que la moitié du trou.


L'illustration ci-dessous indique le numéro de chaque bouton (c'est la numérotation que j'ai utilisée dans mon sketch).  Voici la liste des boutons qu'il faut enfoncer pour produire chaque note:

Do 1:  1-3-4-5-6-7-8-10
Do# 1: 0-3-4-5-6-7-8-10
Ré 1: 3-4-5-6-7-8-10
Ré# 1:  2-4-5-6-7-8-10
Mi 1: 4-5-6-7-8-10
Fa 1: 1-3-5-6-7-8-10
Fa# 1: 3-4-6-7-8-10
Sol 1: 6-7-8-10
Sol# 1: 3-4-5-7-8-10
La 1: 7-8-10
La# 1: 6-8-10
Si 1:  8-10
Do 2: 7-10
Do# 2: 7-8
Ré 2: 7
Ré# 2: 2-4-5-6-7-8-9
Mi 2: 4-5-6-7-8-9
Fa 2: 3-5-6-7-8-9
Fa# 2: 4-6-7-8-9
Sol 2: 6-7-8-9
Sol# 2:5-7-8-9
La 2: 7-8-9
La# 2: 3-4-5-7-8-9
Si 2: 4-5-7-8-9
Do 3: 4-5-8-9

Pour les combinaisons qui ne sont pas indiquées sur cette liste, la flûte ne produira aucun son.  Si désiré, on pourrait choisir d'assigner d'autres notes à ces combinaisons manquantes, même si elles ne correspondent pas à ce qu'on obtiendrait sur une flûte réelle.  Si vous n'êtes pas flûtiste, vous pouvez aussi assigner à vos boutons des notes qui sont plus facile à mémoriser.

On remarquera aussi qu'une flûte est un instrument qui ne produit qu'une seule note à la fois:  cette contrainte nous facilitera un peu la vie lors de la conception du circuit et du programme.  Mais ici encore, rien ne vous empêche d'inventer un instrument à vent polyphonique.

Le circuit complet



Lorsque j'ai construit mon clavier MIDI, et même mon pédalier d'orgue MIDI, j'avais eu besoin de registres à décalages et de matrices d'interrupteurs.  Mais puisque ma flûte ne comporte que 11 boutons, j'ai décidé, pour simplifier les choses au maximum, d'assigner chaque bouton à une entrée de l'Arduino. Si vous préférez économiser les entrées de l'Arduino (pour ajouter d'autres contrôles, un afficheur LCD, etc.), libre à vous d'utiliser un ou deux registres à décalage HC165.

De plus, j'ai activé les résistances pull-up internes de l'Arduino, ce qui m'a évité de devoir ajouter une résistance externe à chaque bouton.

Le capteur de pression barométrique BMP180 se branche de la façon suivante:

VIN du BMP180:  3V3 de l'Arduino
GND du BMP180:  GND de l'Arduino
SCL du BMP180:  A5 de l'Arduino
SDA du BMP180:  A4 de l'Arduino

En ce qui concerne la communication MIDI, j'ai utilisé le module MIDI que j'avais jadis fabriqué (plus de détails ici), mais puisqu'il ne s'agit que d'une sortie (on n'a pas besoin d'une entrée MIDI sur notre flûte), la connexion est plutôt simple.

Biblothèque BMP180

Mon sketch nécessite l'installation de la bibliothèque BMP180 conçue par Sparkfun.  La communication MIDI ne requière quant à elle aucune bibliothèque.

Le sketch

Au départ, on définit la liste des configurations de boutons qui produisent une note connue, grâce à la matrice bidimensionnelle "notes" (25 notes constituée de 11 boutons pouvant être enfoncés ou non).

Puisque j'utilise les résistances pull-up internes, le niveau logique est "1" lorsque le bouton n'est pas enfoncé, et "0" lorsqu'il est enfoncé.  Par exemple, lorsqu'on produit la note "sol 1" en appuyant sur les boutons 6-7-8-10 , les éléments de la variable "boutons" prendront les valeurs suivantes "1111100010".  Lorsqu'on appuie sur les boutons 1-3-4-5-6-7-8-10 pour produire la note "do 1", la variable "boutons" devient "10100000010".

Par défaut, une commande "program change" règle le timbre à une sonorité de flûte.  Il serait utile d'ajouter un moyen de modifier cette valeur, afin que le flûtiste puisse jouer un solo de guitare électrique, par exemple.

À l'intérieur de la boucle principale, le sketch vérifie d'abord si le flûtiste est en train de souffler dans l'embouchure.  Si c'est le cas, la pression est convertie en un nombre situé entre 0 et 127, qui sert à envoyer à l'instrument MIDI un message de contrôle de volume (ainsi, le volume de la note jouée dépendra de la force avec laquelle le flûtiste souffle dans l'embouchure).

Si un souffle est détecté, on vérifie l'état de chacun des 11 boutons de la flûte (variable "boutons"), et on compare la configuration actuelle avec chacune des configurations associées à une note (variable "notes").  Si l'état des boutons correspond à une configuration associée à une note, on envoie un message "note on" pour jouer cette note.  Chaque fois qu'on change la configuration des boutons ou qu'on cesse de souffler, il faut envoyer un message "note off", qui est en fait un message "note on" avec une vélocité nulle,



Améliorations possibles


  • Pour une utilisation fréquente, il serait utile de remplacer la communication filaire par une communication sans fil (comme dans ce projet).  L'Arduino Uno pourrait alors être remplacé par un Arduino Nano ou Pro Mini, fixé directement sur la flûte, et alimenté par une pile.
  • Dans sa version actuelle, la flûte ne comporte pas de bouton permettant de changer la sonorité de l'instrument ("program change").  Ce serait relativement facile à ajouter (il reste encore quelques entrées disponibles sur l'Arduino).
  • Le capteur de pression peut détecter si le flûtiste inspire au lieu d'expirer:  on pourrait programmer la flûte pour qu'elle se comporte d'une certaine façon lors d'une inspiration (jouer la note avec une sonorité différente, peut-être).
  • Il devrait être facile de modifier ce projet afin d'imiter un autre instrument à vent: clarinette, saxophone, trompette, etc.

Yves Pelletier   (TwitterFacebook)

vendredi 28 avril 2017

Télémètre à ultrasons HC-SR04 et STM32 Nucleo


Le télémètre à ultrasons HC-SR04 permet de mesurer la distance du plus proche obstacle se trouvant devant lui.  Par exemple, il peut servir de capteur pour un robot qui évite les obstacles, pour un dispositif d'aide au stationnement d'un véhicule, pour un système d'alarme détectant la présence d'un intrus, etc.


Dans ce court article, nous branchons un télémètre HC-SR04 à une carte STM32 Nucleo.

Si vous préférez, d'autres articles expliquent comment utiliser le HC-SR04 avec un Arduino ou avec un Raspberry Pi.


Principe de fonctionnement


Le télémètre HC-SR04 est un sonar:  il émet des ultrasons, et capte leur écho.  Plus l'obstacle est éloigné, plus le délai entre l'émission de l'ultrason et la réception de l'écho sera long.

Lorsque la pin "Trig" du module est brièvement soumise à un signal logique haut, une brève impulsion ultrasonore est émise.

Lorsqu'un écho est capté, la pin "Echo" prend l'état logique haut pendant une durée égale à la durée du trajet aller-retour de l'ultrason.

Le circuit

Le module HC-SR04 fonctionne à 5 V, mais il interprétera correctement le signal numérique de 3,3 V que lui enverra le Nucleo sur la pin "Trig".  Par contre, j'ai préférer utiliser un 4050 pour abaisser à 3,3 V le signal de 5 V émis par la sortie "Echo" (il semble que les entrées du Nucleo sont conçues pour tolérer les tensions de 5 V, cette précaution est peut-être donc superflue).




En résumé, il faut brancher les choses de cette façon:

Pin Vcc du HC-SR04 -------  Pin 5 V du Nucleo
Pin Trig du HC-SR04 ------- Pin D8 du Nucleo
Pin Echo du HC-SR04 ------Pin 3 du CD4050
Pin Gnd du HC-SR04 ------ Pin GND du Nucleo

Pin 1 du CD4050 ------- Pin 3V3 du Nucleo
Pin 2 du CD4050  ------ Pin PWM/D9 du Nucleo
Pin 8 du CD4050 ------- Pin GND du Nucleo

Un petit script à utiliser sur mbed

Voici finalement un script qui affichera dans un moniteur série (celui de l'IDE Arduino, par exemple), la distance d'un obstacle, en centimètres.



(Basé sur un script par T Nara.)



Yves Pelletier   (TwitterFacebook)

mercredi 19 avril 2017

Analyseur logique: installation de sigrok PulseView sous Windows

Il y a quelques semaines, je me suis procuré un analyseur logique sur eBay, un modèle ultra-économique vendu au prix de 7 euros environ.

Dans ce court article, je vous montre comment j'ai installé le logiciel sigrok Pulseview sur Windows afin d'effectuer un premier test rapide confirmant le fonctionnement correct de l'appareil.

Je tiens à préciser que je n'avais jamais eu l'occasion d'utiliser un analyseur logique auparavant.  Il serait donc illusoire d'attendre de ma part une minutieuse comparaison avec d'autres analyseurs logiques disponibles sur le marché, ou encore un cours complet sur l'art d'utiliser efficacement ce genre d'appareil.

Il s'agit donc d'un minuscule dispositif (5 cm X 2,5 cm X 1 cm) qui se branche sur le port USB d'un ordinateur.   C'est un analyseur 8 bits, ce qui signifie qu'on peut observer jusqu'à 8 signaux logiques simultanément, à une fréquence d'acquisition maximale de 24 MHz.



Mon exemplaire était accompagné d'un câble mini-USB et de 10 câbles Dupont femelles (ce qui ne constitue pas le meilleur type de connecteur, dans les circonstances).

Évidemment, à ce prix, nous ne serons pas surpris de constater que le fabricant n'a pas été spécialement pointilleux en matière de propriété intellectuelle.  Bien que ce ne soit pas indiqué sur le boîtier  (ni dans la description sur eBay), la mention "usb Saleae  V1.1"  est clairement visible sur le circuit imprimé:  il s'agit donc d'une copie d'un analyseur conçu par la compagnie américaine Saleae.



Vice de conception assez rigolo: une LED rouge s'allume pour indiquer que l'analyseur est sous tension, mais puisque cette LED est enfermée à l'intérieur d'un boîtier opaque, il est impossible de savoir si elle est allumée ou non...  On peut voir sur le circuit imprimé qu'une deuxième LED a été omise (dans le circuit d'origine, cette LED verte sert à indiquer s'il y a de l'activité sur les canaux numériques).

Côté logiciel, deux choix s'offrent à vous:
  • sigrok:  Un logiciel libre spécialement conçu pour être utilisé avec une vaste gamme d'analyseurs logiques.  C'est la voie que je vous propose ici:  ça nous permettra peut être de nous sentir un peu moins coupables d'avoir encouragé la contrefaçon...
Nous nous dirigeons donc vers la page de téléchargement de sigrok dédiée à Windows (d'autres plate-formes sont bien sûr disponibles:  Mac, Linux, Android, etc.).  Pour ma part, je l'ai installé sous Windows 7.

On nous donne le choix entre Pulseview (interface graphique) ou sigrok-cli (interface en lignes de commandes):  j'ai choisi Pulseview,


Après avoir téléchargé le programme d'installation, bien entendu, on installe le logiciel.

MAIS CE N'EST PAS TERMINÉ...

Si vous branchez l'analyseur logique dans un port USB de l'ordinateur, Windows va tenter sans succès d'installer un pilote de périphérique.  Vous devez vous-même faire l'installation de ce pilote, grâce au logiciel "Zadig", qui a été installé en même temps que Pulseview.

Dans le menu Démarrer de Windows, vous ouvrez donc Zadig, qui se trouve à l'intérieur du répertoire sigrok/PulseView.


Pendant que Zadig est ouvert, vous branchez l'analyseur logique à un port USB de l'ordinateur.  Zadig devrait le détecter ("Unknown Device #1).  Vous cliquez ensuite sur le bouton "Install Driver".


Cette fois, le pilote devrait s'installer correctement.



Nous pouvons maintenant démarrer le logiciel PulseView.  Dans un premier temps, il faut établir la connexion avec l'analyseur logique.

Vous cliquez donc sur le bouton "Connect to Device"...


...et vous choisissez le pilote "fx2lafw (generic driver for FX2 based LAs) (fx2lafw)", l'interface USB, et vous cliquez sur le bouton "Scan for devices using driver above".

La mention "Saleae Logic with 8 channels" devrait apparaître dans la case du bas.  Il ne reste plus qu'à cliquer sur le bouton "OK".


Petit test impliquant les sorties PWM d'une carte Arduino

Comme prétexte pour utiliser mon analyseur logique, j'ai activé 5 sorties PWM de l'Arduino en utilisant plusieurs rapports cycliques différents.


J'ai branché l'analyseur logique de la façon suivante:

  • Canal 0:  Pin 3
  • Canal 1:  Pin 9
  • Canal 2:  Pin 10
  • Canal 3:  Pin 11
  • Canal 4:  Pin 5
  • Canal 5:  Pin 6


Puis j'ai exécuté le sketch suivant:


Voici le résultat, dans la fenêtre principale de PulseView:



On peut remarquer le rapport cyclique de plus en plus élevé sur les canaux 0, 1, et 2.  De plus, les canaux 3 et 4 (qui correspondent aux pins 5 et 6 de l'Arduino) ont une fréquence deux fois plus élevée que les autres.

Yves Pelletier   (TwitterFacebook)

lundi 17 avril 2017

Module RFID RC522 et Raspberry Pi (Python)


Pour la quatrième fois depuis le début du mois, je vous propose de lire le numéro de série d'un tag RFID au moyen d'un module RC522.  Cette fois, c'est un Raspberry Pi qui aura l'honneur de piloter notre module RC522, grâce à un script rédigé en Python (les articles précédents mettaient plutôt en scène un Arduino, un MSP430 Launchpad et un STM32 Nucleo).

Si vous n'êtes pas déjà l'heureux propriétaire d'un module RC522, des commerçants chinois se feront un plaisir de vous en vendre un (accompagné d'un ou deux tags RFID) pour moins de 2 euros.


Activation de SPI sur le Rasbperry Pi

Le module RC522 utilise le protocole de communication SPI.  Vous devez donc vous assurer que le SPI est activé sur votre Raspberry Pi.  Pour ce faire, vous choisissez "Configuration du Raspberry Pi" dans le menu "Préférences"...


...et vous vous assurez que SPI est activé.


(C'est fou comme les choses évoluent rapidement dans le monde du Raspberry Pi:  y a-t-il quelqu'un quelque part qui s'ennuie de raspi-config?)

Installation de la bibliothèque pi-rc522

Nous utiliserons la bibliothèque pi-rc522 par ondryaso.  Pour ce faire, la façon la plus simple (à mon avis), est d'utiliser pip:

sudo pip install pi-rc522

La bibliothèque est alors installée dans le répertoire /usr/local/python2.7/dist-packages.

Circuit (connexions)

Les connexions à effectuer sont:
  • Pin SDA du RC522 --- Pin #24 (GPIO 8) du Raspberry Pi
  • Pin SCK du RC522 --- Pin#23 (GPIO 11) du Raspberry Pi
  • Pin MOSI du RC522 --- Pin #19 (GPIO 10) du Raspberry Pi
  • Pin MISO du RC522 --- Pin #21 (GPIO 9) du Rasbperry Pi
  • Pin IRQ du RC522 --- Pin #18 (GPIO 24) du Raspberry Pi
  • Pin GND du RC522 --- Une des pins GND du Raspberry Pi
  • Pin RST du RC522 --- Pin #22 (GPIO 25) du Raspberry Pi
  • Pin 3V3 du RC522 --- Pin 3V3 du Raspberry Pi
  • LED verte (et résistance) --- Pin #15 (GPIO 22) du Raspberry Pi
  • LED rouge (et résistance) --- Pin #16 (GPIO 23) du Rasbperry Pi



Script pour récupérer l'UID

Voici un premier script en Python qui affiche  dans le terminal l'UID (numéro de série) d'un tag RFID qu'on approche du module RC522.




Sur la capture d'écran ci-dessus, vous pouvez constater que l'UID de la carte que j'ai utilisée est constituée des valeurs 144, 207, 148, 117 et 190.  Ces nombres seront utilisés dans le prochain script.


Script qui accepte ou rejette l'UID

L'idée est d'accomplir une action seulement si l'utilisateur présente un tag RFID dont l'UID est approuvé.  Avec ce script en Python, la LED verte s'allume uniquement lorsqu'on approche un tag RFID portant le bon UID.  Si on approche un tag RFID portant un autre UID, c'est la LED rouge qui s'allume.

Avant d'utiliser le script, n'oubliez pas de remplacer le contenu de la variable "bonUID" par l'UID de votre carte.

Vous pourrez ensuite modifier ce script de base pour en faire quelque chose de plus utile ou plus spectaculaire (actionner une serrure, mettre à jour une base de donnée consignant l'heure d'entrée et sortie des employés, etc.).



Yves Pelletier   (TwitterFacebook)

samedi 15 avril 2017

Module RFID RC522 et STM32 Nucleo (mbed)


Après avoir expérimenté mon module RFID RC522 avec une carte Arduino et avec une carte MSP430 Launchpad, c'est maintenant au tour de ma carte STM32 Nucleo...

Tout comme ce fut le cas avec les deux autre microcontrôleurs, nous verrons comment récupérer l'UID (numéro de série) d'un tag RFID, puis nous élaborerons un dispositif qui allume une LED verte lorsque l'UID est accepté, et une LED rouge lorsque l'UID n'est pas accepté.

Le circuit

Le module RC522 utilise le protocole SPI pour communiquer avec le  microcontrôleur.  Son niveau logique de 3,3 V correspond parfaitement à celui du SMT32 Nucleo.

Les branchements appropriés sont:
  • Pin SDA du RC522 --- Pin PWM/CS/D10 du Nucleo
  • Pin SCK du RC522 --- Pin SCK/D13 du Nucleo
  • Pin MOSI du RC522 --- Pin PWM/MOSI/D11 du Nucleo
  • Pin MISO du RC522 --- Pin MISO/D12 du Nucleo
  • Pin IRQ du RC522 --- Pas branchée
  • Pin GND du RC522 --- Pin GND du Nucleo
  • Pin RST du RC522 --- Pin D8 du Nucleo
  • Pin 3V3 du RC522 --- Pin 3V3 du Nucleo
  • LED verte (et résistance) --- Pin D2 du Nucleo
  • LED rouge (et résistance) --- Pin D3 du Nucleo
Remarquez que, du côté Nucleo, nous utilisons les connecteurs femelles compatibles Arduino.

Importation du programme RC522_LF dans embed

Dans mbed, j'ai importé un programme intitulé "RC522_LF", dont l'auteur est "Team FRA221:A" (bouton "Import").


Ce programme permet de récupérer l'UID d'un tag RFID amené à proximité du module RC522.  De plus, il contient la bibliothèque MFRC522 qui nous sera bien utile pour la réalisation de nos propres programmes.

Récupération de l'UID

Pour connaître l'UID de vos tags RFID, il s'agit de compiler sans modification le programme "RC522_LF", et de le téléverser dans la carte Nucleo.  Vous ouvrez ensuite sur l'ordinateur un terminal permettant la communication série (j'ai utilisé le moniteur série de l'IDE Arduino), réglé à 57600 bauds.  L'UID et le type de cartes s'affichent chaque fois que vous approchez un tag RFID.


Petit inconvénient:  le programme insère inutilement le nombre "02" à la fin de chaque octet constituant l'UID.  Ainsi, pour le premier tag que j'ai approché du module, il m'affiche comme UID "9002 CF02 9402 7502", ce qui signifie que l'UID est, en fait "90 CF 94 75" (en hexadécimal).  Vous pouvez facilement modifier le programme pour corriger le problème, ou simplement ne pas tenir compte des "02" superflus.

Un script qui approuve ou rejette un UID

Pour faire nos propres programmes, il s'agit de faire une copie du projet "RC522_LF" (incluant sa bibliothèque) et de modifier le fichier "main.cpp".  Le script ci-dessous allume la LED verte lorsque l'UID est approuvé, et allume la LED rouge quand il s'agit d'un autre UID.

Évidemment, vous devez d'abord remplacer le contenu de la constante "bonUID" par la valeur récupérée à l'étape précédente.  Remarquez que, puisque les octets sont en hexadécimal, chaque valeur est précédée du symbole "0x".



N.B.: Ce projet a également été réalisé avec Arduino, Raspberry Pi et MSP430 Launchpad.

Yves Pelletier   (TwitterFacebook)

dimanche 9 avril 2017

Module RFID-RC522 et MSP430 Launchpad (Energia)

Il y a quelques jours, je vous ai présenté un petit projet réalisé au moyen d'un module RFID RC522 couplé à une carte Arduino Uno. Aujourd'hui, je vous présente une réalisation identique, mais adaptée à une carte MSP430 Launchpad de Texas Instruments.

Installation de la bibliothèque CardReader RFID RC522

Pour faciliter la programmation au maximum, nous allons utiliser l'IDE Energia, ainsi que la bibliothèque CardReader_RFID_RC522 par fmilburn3.  Assurez-vous d'installer cette bibliothèque avant d'aller plus loin.

Circuit

Un avantage du Launchpad, comparativement à l'Arduino Uno, c'est qu'il fonctionne avec un niveau logique de 3,3 V qui convient parfaitement à notre module RC522.   Puisque nous n'avons pas à nous préoccuper d'abaisser le niveau logique, le circuit s'en trouve grandement simplifié.

Notez que j'ai utilisé le launchpad MSP-EXP430G2 Rev 1.5 comportant un microcontrôleur 2553. Les pins MISO et MOSI, par exemple, sont inversées sur d'autres cartes.



Les connexions sont donc:
  • SDA du RC522:  P2_0 du Launchpad 
  • SCK du RC522 : P1_5 du Launchpad
  • MOSI du RC522:  P1_7 du Launchpad
  • MISO du RC522:  P1_6 du Launchpad
  • IRQ du RC522:  Pas utilisé
  • GND du RC522:  GND du Launchpad
  • RST du RC522:  P2_2 du Launchpad
  • 3.3V du RC522:  VCC du Launchpad
De plus, pour utiliser le sketch que je propose un peu plus loin, vous reliez une LED vers à la pin P1_4, et une LED rouge à la pin P1_2.  (La LED verte intégrée à la carte étant liée à la pin P1_6, déjà utilisée, on ne peut pas l'utiliser pour cette fonction).

Connaître l'UID de votre tag

Chaque tag RFID comporte un numéro unique:  l'UID.  Pour connaître l'UID de votre tag, vous pouvez utiliser l'exemple "CardReader" fourni avec la bibliothèque.


Après avoir téléversé cet exemple dans le Launchpad, ouvrez le moniteur série d'Energia, et placez le tag RFID à proximité du module RC522.  L'UID de la carte devrait s'afficher.


Dans mon cas, les 5 parties de l'UID étaient:  144, 207, 148, 117 et 190.

Sketch

Le sketch ci-dessous allume la LED verte pendant 2 secondes lorsqu'on approche un tag RFID ayant un UID admissible, alors que c'est la LED rouge qui s'allume si on approche un autre tag.

Avant de l'utiliser, vous devez évidemment remplacer l'UID apparaissant au tout début du sketch (variable "bonUID").


Bien entendu, ce sketch peut facilement être modifié pour en faire quelque chose de plus utile (serrure électrique, système d'alarme, etc.).

N.B.: Ce projet a également été réalisé avec ArduinoRaspberry Pi et STM32 Nucleo.

Yves Pelletier   (TwitterFacebook)

Related Posts Plugin for WordPress, Blogger...