mercredi 5 août 2020

S'entraîner à lire les notes sur une portée avec Arduino

J'aime bien jouer du clavier, mais j'ai beaucoup de difficulté à jouer à vue, c'est à dire interpréter une partition de piano assez rapidement pour la jouer sans l'avoir préalablement mémorisée. Je me débrouille assez bien en clé de sol, mais en clé de fa, mes performances sont simplement pitoyables.



Dans l'espoir de devenir un meilleur musicien, j'ai mis au point un dispositif qui se branche dans un clavier MIDI. Une note s'affiche sur une portée, et je dois jouer cette note sur le clavier. Si j'appuie sur la bonne touche, je gagne un point, et une nouvelle note s'affiche. 



Si j'appuie sur la mauvaise touche, un petit clavier apparaît à l'écran pour m'indiquer quelle touche il faut appuyer et, bien entendu, je ne récolte aucun point. Je dois quand même appuyer sur la bonne touche afin de passer à la question suivante. De plus, juste après avoir joué "ma" note, le clavier joue la note que j'aurais dû jouer, ce qui me permet de comparer les deux notes de façon auditive.



Ce dispositif est constitué d'une carte Arduino Uno, d'un écran LCD PCD8544 (Nokia 5110) et d'une interface MIDI de fabrication maison qui est essentiellement constituée d'un octocoupleur, d'une diode de quelques résistances et de connecteurs DIN.




Le circuit

Je reproduis ici le schéma de mon interface MIDI, fabriquée en 2012... La partie "MIDI IN" est essentielle pour détecter la note jouée sur le clavier. La partie "MIDI OUT" permet à l'Arduino de faire jouer, par l'entremise du clavier, la note qu'il fallait jouer, ce qui aide l'utilisateur à constater s'il a joué la bonne note ou non.

Vous pouvez également vous procurer un module MIDI prêt à l'emploi (recherchez "MIDI Shield Arduino").

En ce qui concerne l'afficheur LCD, le circuit est assez complexe puisque j'utilise un circuit intégré 4050 afin d'abaisser à 3,3 V les signaux logiques générés par l'Arduino Uno. Voici le schéma, mais vous trouverez beaucoup plus d'information en consultant cet article consacré à l'utilisation d'un écran Nokia 5110 avec un Arduino.



Installation de la bibliothèque MIDI

J'ai utilisé la bibliothèque MIDI afin de simplifier au maximum la gestion de la communication entre l'Arduino et le clavier MIDI.


Installation des bibliothèques pour l'afficheur LCD

Pour l'affichage sur l'écran Nokia 5150, j'ai utilisé la bibliothèque Adafruit-PCD8544-Nokia-5110-LCD ainsi que la bibliothèque Adafruit-GFX.



Le sketch

Une part importante du sketch concerne la gestion de l'écran LCD. Au moyen d'un logiciel de dessin, j'ai créé quatre minuscules fichiers .bmp: la portée avec une clé de sol, la portée avec une clé de fa, le symbole bémol, et le symbole dièse.  J'ai ensuite chargé ces fichiers .bmp dans l'outil en ligne image2ccp afin de les transformer en information utilisable dans un sketch Arduino. Il s'agit des quatre constantes "cleDeSol", "cleDeFa", "bemol" et "diese" énoncées au début du programme.

Pour les autres éléments affichés sur l'écran, j'ai utilisé les outils de base de la bibliothèque GFX (rectangles pour dessiner le clavier, rectangle à coin arrondi pour les notes, etc.)

Comme son nom l'indique, la routine "nouvelleQuestion" est responsable de créer aléatoirement une nouvelle note à placer sur la portée. Cette nouvelle note est décrite au moyen de 3 variables: "clef" détermine si la portée est en clé de sol ou en clé de fa, "altération" détermine si la note est accompagnée d'un bémol ou d'une dièse, et "numéro" indique la position de la note sur la portée.

Lorsque l'utilisateur appuie sur une touche du clavier, il faut vérifier si la note qu'il a généré correspond à celle qui est affichée sur le portée; c'est fait dans la fonction "compareNotes", grâce à deux tableaux qui établissent une relation entre chaque position sur la portée et son numéro de note MIDI (ce sont les variables notes_fa et notes_sol).

-
-

À lire aussi:


Yves Pelletier (TwitterFacebook)

mardi 4 août 2020

10e anniversaire du blog!



Le 4 août 2010, j'inaugurais ce blog en publiant mon point de vue sur le pitoyable oscilloscope USB que je venais de me procurer (sans même juger utile de mentionner que sa bande passante n'était que de quelques kHz...). Pendant les 10 années qui sont suivi, 524 publications se sont ajoutées à cet article inaugural: un article par semaine, en moyenne.



Pendant cette décennie, j'ai appris pas mal de choses, et je me suis beaucoup amusé. J'espère que les 10 prochaines années seront tout aussi fertiles en découvertes.

Voici les 10 publications ayant reçu le plus grand nombre de visites depuis 10 ans:

1. Une horloge pour votre Arduino (Real Time Clock) (66 477 visites depuis le 19 juin 2013)

Utilisation d'une horloge temps réel DS1307 avec une carte Arduino, avec affichage de la date et de l'heure sur un afficheur LCD 16 X 2.


2. Communication par USB entre Raspberry Pi et Arduino (49 725 visites depuis le 5 mai 2014)

Grâce à la bibliothèque PySerial, un programme en python permet d'envoyer des messages à une carte Arduino, et de recevoir des messages en provenance de l'Arduino.



3. Modules RF 433 MHz, VirtualWire et Arduino (41 415 visites depuis le 19 janvier 2014)

Cette fois, un Arduino envoie des informations à un autre Arduino grâce à une paire emetteur/récepteur radio fonctionnant à une fréquence de 433 MHz.


4. Contrôler un moteur DC en python avec le Raspberry Pi (37 529 visites depuis le 7 septembre 2014)

J'en contrôlais même deux, par l'entremise d'un double pont en H L293D.



5. Mesurer une température avec un Arduino (24 432 visites depuis le  29 septembre 2012)

Utilisation d'un capteur numérique DS18B20 et d'un capteur analogique LM35DZ, avec affichage de la température sur mon fidèle afficheur LCD 16 X 2.



6. Clonage d'une télécommande infrarouge avec un Arduino (20 049 visites depuis le 16 janvier 2013)

Contrôler mon téléviseur à distance grâce à une télécommande que j'avais moi-même fabriquée, ça m'avait beaucoup amusé.



7. Contrôler les broches GPIO du Raspberry Pi en python (18 900 visites depuis le 8 mars 2014)

Allumer une LED, détecter l'activation d'un bouton poussoir...


8. Transmettre les données de l'Arduino vers un tableur (18 290 visites depuis le 18 octobre 2014)

Les mesures prises par l'Arduino s'affichent en temps réel sur Excel ou sur Libre Office Calc.



9. Communication RF 433 MHz entre Raspberry Pi et Arduino (18 129 visites depuis le 26 octobre 2014)

Encore un tuto sur la communication entre un Arduino et un Raspberry Pi (programmé en python), mais sans fil, cette fois.




10. Fabrication d'un anémomètre (16 713 visites depuis le 23 juin 2016)

On mesure la vitesse du vent avec un interrupteur reed relié à un Arduino.



Merci à tous ceux qui me lisent!

Yves Pelletier (TwitterFacebook)


mercredi 29 juillet 2020

ESP32-CAM et capteur infrarouge passif (PIR)


Le projet que je vais décrire dans cet article consiste à faire en sorte que l'ESP32-CAM prenne automatiquement des photos (et les enregistre sur une carte microSD) chaque fois qu'un capteur infrarouge passif (PIR) détecte une présence. Ça peut faire partie d'un système d'alarme (prendre les photos d'un intrus dans une pièce) , constituer un dispositif qui photographie des animaux sauvages, etc.



Il y quelques années, j'avais rédigé un article assez détaillé sur les capteurs PIR. Le modèle que j'utilise est muni d'un régulateur de tension: on doit l'alimenter avec 5 V pour qu'il fonctionne correctement, mais son signal de sortie passe de 0 V à 3,3 V lorsque la présence d'un humain ou d'un animal est détectée (N.B.: ce n'est probablement pas le cas pour tous les modules PIR disponibles sur le marché).


Une pénurie de broches

La caméra de l'ESP32-CAM utilise déjà un très grand nombre d'entrées/sorties de l'ESP32, ce qui explique pourquoi un  module ESP32-CAM comporte beaucoup moins de broches qu'on module ESP32 conventionnel. Mais lorsque vous utilisez le lecteur de cartes microSD intégré au module, la situation devient vraiment délicate: à lui-seul, le lecteur de cartes microSD accapare 6 broches (GPIO 2, 4, 12, 13, 14 et 15).  Puisque GPIO 0 , 1 et 3 sont utilisés pour la programmation de la carte, il ne reste que GPIO 16;  mais en plus d'être reliée à une résistance pull up qui la tient par défaut au niveau logique haut, cette broche est liée à la mémoire PSRAM.

La solution que j'ai choisie consiste à utiliser le module de carte SD en mode 1 bit plutôt qu'en mode 4 bits. C'est en principe un peu plus lent, mais ça permet de rendre disponibles les broches GPIO 4, 12 et 13.

J'ai donc branché la sortie du capteur PIR à la broche D13 de l'ESP32-CAM.



Des faux positifs?

Si votre capteur PIR détecte une présence même lorsqu'il n'y a personne, vous pouvez diminuer sa sensibilité en ajustant le potentiomètre "Sensitivity". Dans mon cas, il s'est avéré nécessaire d'alimenter le capteur PIR et l'ESP32-CAM de façon indépendante. Lorsqu'ils partageaient tous les deux la même alimentation de 5 V, ils se perturbaient mutuellement: des photos étaient prises sans raison apparente, et l'ESP32-CAM redémarrait parfois de façon impromptue.

Sketch

(En cas de besoin, vous pouvez consulter cet article pour plus de détails concernant la façon de programmer l'ESP32-CAM avec l'IDE Arduino.)

Voici un premier sketch plutôt simple qui n'exploite pas les capacités WIFI de l'ESP32-CAM. Lorsque la broche D13 de l'ESP32-CAM se trouve au niveau logique "Haut" (parce que le capteur PIR a détecté une présence), des photos sont prises et enregistrées sur la carte microSD. Vous devez ensuite éjecter la carte et l'insérer dans un autre appareil pour voir son contenu.

-
-

Voici un  deuxième exemple, plus élaboré, qui permet de voir le contenu de la carte à distance, grâce à une page web générée par l'ESP32-CAM (voir ce précédent article pour plus d'informations).

-
-