vendredi 19 avril 2019

Synthèse sonore avec Mozzi et Arduino (3)

Pour cette troisième exploration des possibilités de la bibliothèque Mozzi, nous allons faire jouer par l'Arduino un échantillon ("sample") sonore que nous aurons nous-mêmes produit. Cet échantillon peut être n'importe quel son de courte durée: une note jouée par un instrument de musique, un cri d'animal, un mot que vous aurez vous-même prononcé... Ce son, toutefois, devra être très court (1 seconde ou 2), à cause du peu de mémoire disponible dans l'Arduino Uno.

Trouver un son

Vous pouvez enregistrer le son vous-même, ou encore trouver un son dans une des nombreuses banques d'effets sonores libres de droits disponibles sur internet comme La Sonothèque, par exemple. Puisque je suis enrhumé aujourd'hui, j'ai choisi un son d'éternuement.

Préparation d'un fichier .raw avec Audacity

Le fichier audio de type .wav doit d'abord être épuré au moyen de l'indispensable logiciel (gratuit) Audacity.  Après avoir ouvert votre fichier .wav dans Audacity et, au besoin, effacé toute partie que vous ne désirez pas conserver, réglez la valeur du "Taux du projet (Hz)", dans le coin inférieur gauche de la fenêtre, à 16384.


On choisit ensuite le menu Exporter / Exporter l'audio...


Il faut ensuite modifier les options d'enregistrement: "Autres formats non-compressés", entête "RAW (header-less)" et encodage "Signed 8-bit PCM".



Transformation du fichier .raw en fichier d'entête pour Mozzi avec char2mozzi.py

Le fichier de type ".raw" que nous venons tout juste de produire au moyen d'Audacity doit ensuite être analysé par le script "char2mozzi.py", qui est fourni avec Mozzi dans le répertoire libraries/Mozzi/extra/python.

Vous placez le fichier sonore ".raw" dans le même répertoire que le script "char2mozzi.py". Avec le terminal, vous naviguez jusqu'à ce répertoire, et vous écrivez la commande suivante:

python char2mozzi.py "atchoum.raw" "atchoum.h" "echantillon" "16384"

Dans mon cas, "atchoum.raw" était le nom de mon fichier source, "atchoum.h" est le nom que je désirais donner à mon fichier texte utilisable par mozzi, "echantillon" est le nom que je désirais donner à la variable contenant les données (à l'intérieur du fichier atchoum.h), et 16384 est la fréquence d'échantillonnage.


Tel que prévu, le fichier "atchoum.h" est créé dans le même répertoire que "char2mozzi.py".


Voici le contenu du fichier "atchoum.h":


Sketch qui fait jouer notre échantillon

Finalement, voici un sketch qui fera jouer notre échantillon (il s'agit, à peu de choses près, de l'exemple "Sample" fourni avec Mozzi). Pour que ça fonctionne, le fichier "atchoum.h" doit se situer dans le même répertoire que le sketch.

Yves Pelletier   (TwitterFacebook)

dimanche 14 avril 2019

Synthèse sonore avec Mozzi et Arduino (2)

Dans le billet précédent, nous avons vu comment produire un son avec Mozzi. Cette fois, nous allons  écrire un sketch qui joue une mélodie. Ensuite, nous améliorerons progressivement ce sketch en y ajoutant de la polyphonie, puis une enveloppe ADSR.

Jouer une mélodie: la classe EventDelay

Nous voulons donc, dans un premier temps, écrire un sketch qui jouera automatiquement une mélodie. L'algorithme sera donc : jouer la première note, attendre un peu, jouer la deuxième note, attendre un peu, etc.

Mais attention: la bonne vieille fonction "delay()" est désactivée dans Mozzi. Il faut plutôt utiliser la classe EventDelay, ce qui implique de démarrer le chronométrage ("start()"), puis de vérifier périodiquement si le délai est écoulé ou non ("ready()").

Vous en avez une illustration dans le sketch ci-dessous, qui joue de façon répétitive une suite de 12 notes au rythme de 4 notes par seconde.

Pour utiliser des délais dans le sketch, il faut d'abord inclure le fichier "EventDelay.h". C'est fait à la ligne 8 du sketch.

On doit ensuite définir un objet de type "EventDelay": c'est ce que j'ai fait à la ligne 14, je l'ai baptisé "attente".

À la ligne 26, je démarre un temps d'attente de 250 millisecondes grâce à la commande "attente.start(duree);".

Ensuite, à l'intérieur d'updateControl(), je vérifie si le délai est écoulé; ça commence à la ligne 31 du sketch ("if (attente.ready())"). Cette condition deviendra vraie 250 millisecondes après le démarrage du délai.

Lorsque les 250 millisecondes sont écoulées, les lignes 32 à 38 sont exécutées: elles consistent à modifier la valeur de la fréquence de l'oscillateur (ligne 32), à incrémenter la variable "compteur" qui indique le rang de la note à jouer (ligne 33), et à redémarrer le chronomètre pour un nouveau délai de 250 millisecondes (ligne 38).


Jouer des accords (polyphonie)

Rien ne nous oblige à nous limiter à jouer une note à la fois. Le sketch ci-dessous est très similaire au précédent, sauf que nous utilisons 3 oscillateurs afin de jouer trois notes simultanément.




Enveloppe ADSR

Nos deux programmes précédents donnent un résultat qui manque un peu d'expression, puisque chaque note (ou accord) est joué avec un volume sonore égal du début à la fin.  Pour améliorer les choses, nous allons maintenant définir une enveloppe ADSR qui nous permettra de modifier le volume pendant l'exécution de la note.

"ADSR" est l'acronyme pour Attack, Decay, Sustain et Release, quatre phases qui se succèdent pendant l'exécution d'une note.

  • L'attaque (attack) est la première phase; il s'agit du temps pendant lequel le volume de la note augmente progressivement d'une valeur nulle jusqu'à la valeur maximale. Pour un son percussif, on utilise une attaque courte (le son atteint instantanément son volume maximal), alors qu'une attaque longue donnera un résultat beaucoup plus doux (le volume augmente lentement au début de la note).
  • La chute (decay) est le temps pendant lequel le volume de la note diminue afin de passer de la valeur maximale (atteinte à la fin de l'attaque) jusqu'à une valeur un peu plus faible.
  • L'entretien (sustain) est le temps pendant lequel le volume de la note demeure constant.
  • L'extinction (release) est l'étape finale, pendant laquelle le volume de la note diminue progressivement jusqu'à devenir nul.

Le sketch ci-dessous joue 5 fois la même note en utilisant chaque fois une enveloppe dont les paramètres sont différents.

Cette fois, il est important d'inclure le fichier ADSR.h; c'est fait à la ligne numéro 10.

À la ligne 31, j'ai créé un objet de type ADSR que j'ai baptisé "enveloppe".

Les caractéristiques de l'enveloppe sont réglées aux lignes 44 et 47.

"setADLevels(niveau_attaque, niveau_chute)" (ligne 44) permet de régler le volume sonore atteint à la fin de l'attaque et le volume qui sera maintenu constant pendant la phase d'entretien. Les deux paramètres peuvent prendre n'importe quelle valeur entre 0 et 255.

À la ligne 47, "setTimes(durée_attaque, durée_chute, durée_entretien, durée_extinction)" permet de définir, en millisecondes, la durée de chacune des 4 phases de l'enveloppe. Il semble nécessaire d'éviter les durées inférieures à 20 ms, qui génèrent parfois des résultats indésirables.

À la ligne 60, "update()" met l'enveloppe à jour.

Finalement, la ligne 66 retourne la multiplication de notre enveloppe et de la note jouée par l'oscillateur principal. Il faut diviser par 256 (">> 8") pour que le résultat demeure à l'intérieur des limites requises.

Vous devriez entendre 5 notes qui ne diffèrent que par les paramètres de leur enveloppe.



Résultat final

Pour terminer, voici un autre sketch qui joue une suite d'accords mais, cette fois, je leur applique une enveloppe ADSL (définie dans setUp()). Sans l'enveloppe, ça sonnait un peu comme un orgue. Maintenant, c'est plus proche d'un accordéon...



Yves Pelletier   (TwitterFacebook)

dimanche 7 avril 2019

Synthèse sonore avec Mozzi et Arduino (1)


Aujourd'hui, je vous propose de jouer un peu avec Mozzi, une bibliothèque dédiée à la synthèse sonore sur Arduino.

Bien sûr, nous avons eu de multiples occasions de faire chanter notre Arduino au moyen de la fonction Tone(), mais cette méthode simple nous contraint à utiliser un signal carré d'amplitude constante, n'ayant le contrôle que sur la hauteur et la durée des notes (pour un résultat qui rappelle inévitablement la musique des jeux vidéos du début des années 1980).

Avec Mozzi, vous transformez votre Arduino en véritable synthétiseur, en contrôlant non seulement la fréquence du son généré, mais aussi son timbre et son enveloppe, pour des résultats beaucoup plus variés.

Matériel

Pour cette première exploration, j'ai utilisé un modeste Arduino Uno. Mozzi fonctionne également sur des cartes plus rapides comme la Blue Pill (STM32Duino) ou l'ESP8266, ce qui pourrait se révéler particulièrement approprié pour des projets plus élaborés.

Par défaut, le signal sonore est généré sur la broche 9 de l'Arduino. J'y a branché une paire d'enceintes multimédias (le signal généré est beaucoup plus faible que celui produit avec la fonction Tone(), et il est nécessaire de l'amplifier pour bien l'entendre). La pointe de la prise jack est relié à la broche 9 de l'Arduino, alors que le manchon est relié à la masse (GND).



Installation de la bibliothèque

Vous trouverez sur cette page la version la plus récente de Mozzi (cliquez sur le bouton vert "Get the most recent release"). 

Après l'installation de la bibliothèque dans l'IDE Arduino, je vous encourage à faire l'essai de quelques-uns des exemples qui l'accompagnent, question de vous assurer que tout est bien fonctionnel, en plus de constater la diversité des sons possibles.

Sketch minimal

Commençons par analyser l'exemple "Sinewave" (chemin d'accès: Exemples / Mozzi / 01.Basics / Sinewave ) qui constitue le strict minimum: la production d'un son sinusoïdal de 440 Hz (pas particulièrement agréable à l'oreille, je dois l'admettre).




Les premières lignes du sketch font référence à quelques fichiers indispensables: "MozziGuts.h" est la bibliothèque elle-même, et vous devez donc toujours l'inclure dans votre sketch. "Oscil.h" est une description d'oscillateur, alors que "sin2048_int8.h" est un tableau comportant 2048 entiers décrivant une oscillation complète d'un sinus (puisque la rapidité est primordiale lorsqu'on synthétise du son, l'Arduino utilisera les valeurs pré-calculées de ce tableau plutôt que de les calculer lui-même au gré de ses besoins).

C'est intéressant d'aller jeter un oeil sur le dossier "/libraries/Mozzi/tables": on y trouve une soixantaine de tableaux décrivant des ondes sinusoïdales, carrées, triangulaires, en dent de scie, du bruit blanc, etc.  


À la ligne 22, nous définissons un oscillateur nommé "aSin" qui, grâce aux données incluses dans le fichier "sin2048_int8.h", oscillera de façon sinusoïdale. "SIN2048_NUM_CELLS" est défini dans le fichier "sin2048_int8.h": il s'agit du nombre de valeurs comprises dans le tableau (on aurait pu écrire tout simplement 2048; il s'agit toujours d'une puissance de 2). AUDIO_RATE est le rythme auquel l'onde sonore sera générée, "aSin" est le nom qui a été donné à cet oscillateur dans ce sketch, et "SIN2048_DATA" est le nom du tableau de données dans le fichier "sin2048_int8.h".

La ligne 25 définit le "CONTROL_RATE", c'est à dire à quel rythme l'Arduino vérifiera si un changement doit être effectué dans les paramètres du son (si la position d'un potentiomètre a changé, par exemple). Il est de 64 Hz par défaut, et doit être une puissance de 2.


L'instruction "startMozzi(CONTROL_RATE)" doit obligatoirement se trouver à l'intérieur du setup(). Ici, on règle aussi la fréquence de l'oscillateur à 440 Hz (ligne 30).


Deux parties qu'on ne retrouve pas dans un sketch Arduino classique sont nécessaires dans un sketch pour Mozzi: updateControl() comporte les instructions permettant de modifier les paramètres du son (par exemple: suite à l'enfoncement d'un bouton ou la rotation d'un potentiomètre). Il est exécuté 64 fois par seconde.  updateAudio() permet la génération du son lui-même, et est exécuté plus de 16000 fois par seconde. Dans ce sketch, on se contente d'émettre la prochaine valeur de notre oscillateur sinusoïdal, mais on pourrait aussi lui faire subir des transformations, l'additionner au signal d'un autre oscillateur, etc.

On retrouve finalement le loop(), qui doit obligatoirement contenir l'instruction audioHook(). Dans un souci d'optimiser la rapidité d'exécution, on doit éviter d'ajouter d'autres instructions dans cette partie.

Combinaison de deux oscillateurs

Amusons-nous maintenant à modifier cet exemple, afin d'explorer progressivement les possibilités de Mozzi.

Le sketch ci-dessous est une version légèrement modifiée de l'exemple Sinewave: il produit un effet de trémolo en multipliant le signal sonore sinusoïdal de 440 Hz par un deuxième signal sinusoïdal dont la fréquence est beaucoup plus lente (16 Hz). Remarquez le décalage à droite (>>8) à l'intérieur d'updateAudio(): le signal de chacun des deux oscillateurs peut prendre une valeur maximale de 255, ce qui implique que la multiplication des deux signaux peut atteindre une valeur de 2552, qu'il faut diviser par 255 afin de ne pas dépasser le maximum imposé. Le décalage de 8 positions vers la droite constitue une division par 255, mais elle s'effectue plus rapidement.  (Au besoin, vous pouvez consulter cet article sur les opérations bit à bit)




Modification de la fréquence du son généré, avec un potentiomètre

Pour rendre les choses un tout petit peu plus interactives, je branche un potentiomètre à l'entrée A0 de l'Arduino.


Le sketch ci-dessous génère une onde en dent de scie dont la fréquence est contrôlée par le potentiomètre.  Puisque la fréquence doit être modifiée en cours d'exécution, elle est donc réglée à l'intérieur de updateControl() plutôt que dans setup(). Remarquez l'utilisation de l'instruction "mozziAnalogRead()" qui doit être préférée à notre classique "analogRead()" (car plus rapide). J'ai ajouté 50 à la valeur retournée par "mozziAnalogRead()" car une fréquence de 0 Hz ne serait pas d'un grand intérêt.




Modification du volume sonore, avec un potentiomètre

Le volume sonore est un autre paramètre susceptible d'être contrôlé au moyen d'un potentiomètre, particulièrement lorsque vous désirez moduler le signal principal au moyen d'un deuxième oscillateur.  Le sketch ci-dessous génère une onde triangulaire dont l'amplitude est contrôlée par un potentiomètre.

C'est encore à l'intérieur de updateControl() qu'on vérifie l'état du potentiomètre. Puisque le volume peut prendre une valeur maximale de 255 alors que mozziAnalogRead() retourne une valeur située entre 0 et 1023, on effectue une division par 4. Pour plus de rapidité, toutefois, cette division par 4 est effectuée au moyen d'un décalage à droite (>> 2).

À l'intérieur de updateAudio(), la valeur de l'oscillateur triangulaire est multipliée par la valeur qui dépend du potentiomètre, puis divisée par 256 au moyen d'un autre décalage à droite (>> 8). Par exemple, si la variable "volume" prend la valeur 100, l'opération "(leSon.next() * volume) >> 8" revient à multiplier par 100/256 les valeurs provenant du tableau de données.



Il reste encore beaucoup de choses à raconter concernant Mozzi...un deuxième billet est en préparation.

Yves Pelletier   (TwitterFacebook)

mercredi 3 avril 2019

Programmer un Raspberry Pi avec Arduino Create: suite...et fin!

La semaine dernière, je vous ai présenté un premier article sur l'utilisation d'Arduino Create pour la programmation d'un Raspberry Pi. En peu de temps, et sans difficulté majeure, j'avais fait clignoter une LED branchée au Raspberry Pi en utilisant le célèbre sketch "Blink".  Ça s'annonçait plutôt bien.

Aujourd'hui, je vous présente le résultat de quelques autres tentatives de programmation d'un Raspberry Pi au moyen d'Arduino Create...avec des résultats beaucoup moins réjouissants.

Où est la documentation?

Massimo Banzi a annoncé officiellement la possibilité de programmer un Raspberry Pi au moyen d'Arduino Create en mars 2018. Un an plus tard, je ne trouve aucun tutoriel, wiki ou autre forme de documentation sur la façon de procéder: c'est comme si l'équipe d'Arduino Create avait oublié l'existence de l'outil qu'elle a créé!

Pas de problème concernant l'étape consistant à lier votre Raspberry Pi à Arduino Create, décrite dans mon article précédent: il s'agit de suivre les instructions à l'écran, et celles-ci sont claires. Mais ensuite, on se retrouve dans l'éditeur en ligne, avec un sketch vide. Quelles sont les bibliothèques supportées? Quels changements doit-on effectuer dans un sketch initialement conçu pour l'Arduino? Allez savoir...

La page github d'Arduino Connector comporte certaines informations, mais rien de tout ça ne semble vraiment utile lors de la rédaction d'un sketch.

analogRead()

Puisque le Raspberry Pi ne comporte pas de convertisseur analogique/numérique (ADC), il me semble évident qu'un appel à analogRead(A0) n'a pas la moindre chance de fonctionner correctement. Par curiosité, j'ai tout de même compilé, téléversé et exécuté l'exemple "AnalogReadSerial" dans mon Rasberry Pi. Aucun message d'erreur ne m'indique que ce que je demande n'a pas de sens.



Serial.println()

J'étais aussi curieux de savoir si la commande Serial.println() allait permettre d'afficher quelque chose dans le "moniteur série" d'Arduino Create, malgré le fait que le Raspberry Pi n'est pas branché par USB.

Le moniteur est disponible, et réglé à mon Raspberry Pi ("Cloud Device: RaspberryPi2"). Il n'y a pas de menu permettant de régler la vitesse de communication (baud rate), toutefois.

Rien ne s'y affiche pendant l'exécution de mon sketch.


Lorsque mon Raspberry Pi est éteint, Arduino Create se donne la peine d'annoncer que le port série n'est plus disponible (donc il aurait dû fonctionner avant, non?).


Puisqu'il semble impossible de recevoir ces messages dans le moniteur série d'Arduino Create, j'ai tenté de les capter au moyen d'un convertisseur USB/série branché à la broche GPIO14 du Raspberry Pi: je n'ai rien capté.


Pourtant, la communication UART est activée dans les réglages de mon Raspberry Pi, et je suis capable d'émettre des messages UART sur la broche GPIO14 grâce à un script en Python.

Conclusion: ou bien j'ai fait quelque chose de travers, ou bien Serial.println() ne fonctionne pas.

(Ici, mon enthousiasme vient d'en prendre un coup: programmer un sketch Arduino sans pouvoir récupérer d'informations par communication série, de mon point de vue, c'est un peu comme jouer au tennis avec les yeux bandés.)

Un afficheur?

Pendant que j'y suis, dans l'espoir de faire fonctionner quelque chose  aujourd'hui, j'ai aussi tenté d'afficher un bout de texte sur un écran LCD 16 X 2 branché au Raspberry Pi. La bibliothèque LiquidCrystal est disponible par défaut dans Arduino Create, ça aurait donc dû être facile...

Résultat: rien du tout­. L'afficheur fonctionne pourtant correctement lorsque je le contrôle au moyen d'un script en langage python.



Conclusion: non merci!

Programmer un Rasperry Pi avec Arduino Create, oublions ça! Tout ce que j'ai réussi à faire, c'est faire clignoter une LED.  Toutes mes autres tentatives ont été vaines.

Si vous avez plus de succès, n'hésitez pas à nous le faire savoir en laissant un commentaire ci-dessous...

Yves Pelletier   (TwitterFacebook)

mercredi 27 mars 2019

Programmer un Raspberry Pi avec Arduino Create

Depuis quelques mois, il est possible de contrôler les broches GPIO d'un Raspberry Pi grâce à un sketch Arduino réalisé sur l'éditeur en ligne "Arduino Create". Malgré les quelques réserves que j'entretiens à l'égard cet IDE en ligne, j'étais curieux de savoir comment ça fonctionne, et j'ai donc décidé d'en faire l'essai.

Nous supposerons que vous disposez déjà d'un compte sur Arduino Create. Si ce n'est pas le cas, vous trouverez quelques directives dans ce vieil article (qui date de l'époque où le service était encore en version beta: je suppose que la procédure d'inscription est plus simple maintenant).

Une fois dans mon compte Arduino Create, je clique sur le bouton "Device Manager":


La page "Device Manager" comporte une partie intitulée "My Linux Devices", réservée aux cartes fonctionnant sous Linux. J'ai cliqué sur le bouton bleu  "Add New Device".


On me présente alors une liste des cartes supportées. Évidemment, je clique sur "Set up a Raspberry Pi".

La page suivante m'explique qu'on va installer le plugin "Arduino Create" sur mon ordinateur (dans mon cas, c'est déjà fait), ainsi que le logiciel "Arduino Connector" sur mon Raspberry Pi.  J'ai cliqué sur le bouton "Next", au bas de la page.


On me demande ensuite de m'assurer que le Raspberry Pi est connecté sur le même réseau local que l'ordinateur que j'utilise actuellement.


On m'offre ensuite deux options pour identifier mon Raspberry Pi. J'ai choisi celle qui consiste à entrer son adresse ip.


Il faut ensuite entrer le nom d'utilisateur et le mot de passe qui permet d'ouvrir une session sur le Raspberry Pi.



Arduino Create établit une connexion avec mon Raspberry Pi, et y installe "Arduino Connector".


Je choisis ensuite un nom pour identifier mon Raspberry Pi (ce sera particulièrement utile si mon réseau en comporte plusieurs).



Mon Raspberry Pi est maintenant visible dans le "Device Manager".
En cliquant sur le bouton associé à mon Raspberry Pi, quelque chose a mal tourné. On m'a avisé que le package "NetworkManager" est absent de mon système (ma version de Raspbian n'a pourtant rien d'exotique, et elle est raisonnablement à jour). J'ai cliqué à quelques reprises sur le bouton "INSTALL", ce qui ne semble pas avoir eu le moindre effet. J'ai fini par me résigner et cliquer sur le bouton "NEVER MIND". Comme nous le verrons par la suite, ça ne semble pas avoir entraîné d'inconvénient majeur.



Je me suis ensuite dirigé vers l'Arduino Web Editor, car c'est là que les choses deviennent intéressantes: mon Raspberry Pi est figure maintenant dans la liste des cartes que je peux programmer.


Ce n'est pas le moment d'être original: je branche une LED à la broche GPIO18 du Raspberry Pi, dans l'espoir de la faire clignoter.


Il ne me reste qu'à écrire le classique sketch qui fait clignoter une LED. Une chose qu'il est important de savoir, c'est qu'on utilise le mode de numérotation "BOARD" plutôt que "BCM": la broche GPIO18 porte donc le numéro 12.


Le téléversement du sketch est un succès...


Et bien entendu, la LED se met à clignoter!

Dans la page Device Manager, lorsque je clique sur le dessin de mon Rasbperry Pi, j'accède à une console qui affiche la liste des sketches que j'y ai téléversés. Un bouton me permet de démarrer ou d'interrompre chaque sketch de la liste. Plusieurs sketches peuvent être exécutés simultanément.



On peut donc constater que je suis parvenu à contrôler une broche GPIO du Raspberry Pi grâce à un sketch Arduino tout ce qu'il y a de plus classique, en utilisant les fonctions digitalWrite() et delay(). Tout ce processus s'est déroulé à l'intérieur d'Arduino Create, sans que j'aie à ouvrir moi même une session sur le Raspberry Pi.

Cette façon de programmer le Raspberry ne conviendra pas à tout le monde, mais on peut facilement imaginer que tout ceci puisse plaire à quelqu'un qui est déjà familier avec la programmation d'un Arduino, et qui ne connaît rien à Linux.

Ça demeure un peu étrange que je sois obligé d'aller sur internet pour contrôler un Raspberry Pi qui se trouve devant moi. Une fois le sketch Arduino téléversé dans le Raspberry Pi, ce serait chouette de pouvoir l'exécuter par une commande tapée dans le terminal, sans être obligé de recourir à Arduino Create. Est-ce faisable? Pour l'instant, je n'ai malheureusement pas la réponse à cette question.

Il me reste aussi à vérifier si les principales bibliothèques de l'univers Arduino sont supportées. S'il est possible de transposer au Raspberry Pi, sans trop de modifications, un sketch Arduino relativement complexe impliquant quelques capteurs SPI ou I2C , un afficheur, etc., ça pourrait devenir vraiment intéressant.

Je prévois donc continuer à expérimenter ça encore un peu...

Lire la suite

Yves Pelletier   (TwitterFacebook)


dimanche 24 mars 2019

Livre: Réparez vous-même vos appareils électroniques (2e édition)

Réparez vous-même vos appareils électroniques
(2e Édition)
Par Jean Boyer
Publié en 2019 chez Eyrolles (Collection Serial Makers)
408 pages

Je signale la parution de la deuxième édition de cet intéressant guide de réparation, qui semble être le seul de sa catégorie actuellement disponible sur le marché.

C'est étrange, quand on y pense: dans l'esprit de la plupart des gens, quelqu'un "qui se débrouille en électronique" sera forcément en mesure de réparer un téléviseur, une chaîne hi-fi ou une console de jeux vidéo. On trouve en librairie une grande quantité de livres qui expliquent comment réaliser ses propres montages électroniques, ainsi qu'un grand nombre de manuels théoriques de niveau universitaire qui permettent de comprendre pourquoi un transistor à effet de champ se comporte comme il le fait. Cependant, quelqu'un peut maîtriser tous ces sujets et, malgré tout, être totalement désemparé face à un téléviseur qui ne fonctionne plus correctement...d'où la nécessité de ce genre de livre.

Sans surprise, cet ouvrage devrait vous convenir si vous avez souvent l'occasion de réparer un appareil défectueux: on y expose des conseils et des méthodes de diagnostic qui aident à déceler les problèmes les plus fréquents pour diverses catégories d'appareils, mais ça demeure forcément assez général. Si, une seule fois dans votre vie, vous faites face à un problème très spécifique concernant un appareil en particulier, une recherche sur internet sera probablement plus fructueuse que la lecture de ce bouquin. Dans le même ordre d'idée, quelqu'un qui désire tenter de réparer sa cafetière en panne n'éprouvera probablement pas le besoin de mettre en place un atelier de réparation bien équipé, comportant un miroir fixé au mur, tel que décrit dans les premiers chapitres.

En comparant cette deuxième édition à celle qui l'a précédée, on constate que l'ordre de présentation des chapitres a été remaniée: les 4 derniers chapitres de l'édition originale, qui portaient sur les composants électroniques (caractéristiques, contrôle, remplacement, codification et marquage) ont été fusionnés pour devenir le chapitre 3. Ça me semble une bonne idée, puisque ces connaissances préalables sont nécessaires pour espérer s'attaquer à la réparation d'un appareil complexe. Cette partie du livre a également été condensée, passant de 78 à 47 pages: je crois qu'on a laissé tomber certains éléments plus théoriques, qui n'étaient pas strictement nécessaires dans le contexte de la réparation d'un appareil défectueux.

Je remarque également l'ajout du chapitre 6, qui concerne la réparation des électroménagers, de l'outillage électroportatif, et des éclairages à LED.

Tout comme c'était le cas dans la 1ère édition, le téléviseur demeure l'appareil vedette du livre, puisque 30% des pages lui sont spécifiquement consacrées.

Chapitre 1: Sécurité et prévention (car ça peut parfois être très dangereux)
Chapitre 2: L'espace de travail du réparateur (les outils et instruments nécessaires)
Chapitre 3: Identifier, contrôler et substituer les composants
Chapitre 4: Les opérations de base (souder/dessouder, isoler un signal)
Chapitre 5: Réparer les petits appareils électroniques (télécommandes, horloges à quartz, batteries rechargeables)
Chapitre 6: Réparer l'électroménager, l'outillage électroportatif et les éclairage à LED
Chapitre 7: Réparer le matériel informatique (souris, écran, ordinateur de bureau, ordinateur portable, tablette)
Chapitre 8: Réparer les appareils multimédias (consoles de jeu, appareils photo, caméscopes, radio portatives, chaînes hi-fi. magnétoscope, vidéoprojecteurs, smartphones...)
Chapitre 9: Réparer les téléviseurs à écran LCD/LED
Chapitre 10: Réparer les téléviseurs à écran plasma
Chapitre 11: Réparer les circuits d'alimentation

Si vous désirez plus de détail, les Éditions Eyrolles mettent à votre disposition ces quelques pages du livre.

Voilà, je suis prêt! Il ne me reste plus qu'à attendre que ce fichu téléviseur tombe en panne...

Yves Pelletier   (TwitterFacebook)

samedi 16 mars 2019

Mesure de la pression dans un liquide avec BMP180 et Arduino

J'ai déjà eu l'occasion de vous présenter le capteur de pression et de température BMP180 pour la mesure de la pression atmosphérique; je l'avais également utilisé lors de la fabrication d'une flûte à bec MIDI. Cette-fois, j'utilise le même capteur pour mesurer la pression dans un liquide, à différentes profondeurs.

Principe de fonctionnement

Évidemment, il n'est aucunement question de plonger un circuit électronique dans l'eau. C'est plutôt une extrémité d'un tube de plastique qui est plongée dans l'eau. L'autre extrémité du tube est reliée à une coquille de plastique hermétiquement fermée (sans fuite d'air) dans laquelle se trouve le capteur BMP180.

Au départ, lorsque le tube est hors de l'eau, la pression dans la coquille est égale à la pression atmosphérique ambiante. Si on plonge l'extrémité du tube dans l'eau, un peu d'eau monte dans le tube, poussée par la pression du liquide qui est plus grande que la pression atmosphérique. Cette montée de liquide dans le tube a pour effet de comprimer l'air enfermé dans la coquille, et d'augmenter sa pression, jusqu'à ce qu'un équilibre s'installe: la pression atmosphérique dans la coquille (mesurée par le BMP180) est alors égale à la pression dans le liquide (à la position de la surface du liquide dans le tube).



Circuit

Un module BMP180 comporte quatre connecteurs: deux pour son alimentation électrique, et deux pour la communication I2C avec le microcontrôleur.


  • Broche VIN du BMP180: 3,3 V de l'Arduino
  • Broche GND du BMP180: GND de l'Arduino
  • Broche SCL du BMP180: broche A5 de l'Arduino
  • Broche SDA du BMP180: broche A4 de l'Arduino


(ces connexions supposent l'utilisation d'un Arduino Uno; les broches I2C sont différentes pour certains modèles d'Arduino).




Fabrication de la sonde

Le capteur de pression BMP180 est inséré dans une coquille rigide. J'ai utilisé une coquille en plastique de Kinder Surprise qui était inutilement grosse (ce qui a pour inconvénient de faire monter le liquide très haut dans le tube: il est donc impossible de mesurer la pression jusqu'au fond du récipient qui contient le liquide). Autant que possible, essayez de trouver un récipient rigide tout juste assez grand pour contenir le capteur.


Des trous permettent le passage du tube (à plonger dans le liquide) et des fils (pour la connexion à l'Arduino).


Il faut ensuite rendre la coquille parfaitement hermétique, pour éviter toute fuite d'air. Pour ce faire, j'ai utilisé une généreuse quantité de ruban gommé. Si le niveau de liquide dans le tube monte jusqu'au niveau de liquide dans le récipient, c'est qu'il y a une fuite d'air et il faut trouver une façon de l'éliminer­.


Sketch

Après avoir installé la bibliothèque SFE_BMP180 proposée par Sparkfun, j'ai modifié un des exemples fournis afin de n'afficher que la pression (en Pascal) dans le moniteur série.




Expérimentation et résultats

J'ai cherché à vérifier expérimentalement cette relation entre la pression dans un liquide et la profondeur:

        p = ρgh

où p est la pression relative (par rapport à la surface du liquide) en Pascal (Pa)
     ρ est la masse volumique du liquide en kg/m3 (1000 kg/m3 pour l'eau)
     g est l'accélération gravitationnelle à la surface de la terre (9,8 m/s2)
     h est la profondeur, mesurée par rapport à la surface du liquide (en mètres)

Compte tenu de notre façon de mesurer la pression, la profondeur "h" est la distance verticale entre la surface du liquide dans le récipient et la surface du liquide à l'intérieur du tube de la sonde.

Il faut également noter que le BMP180 mesure la pression absolue: la valeur mesurée est déjà d'environ 100 000 Pa à la surface du liquide (pression atmosphérique), alors que l'équation suppose une pression relative (nulle à la surface).

J'ai donc démarré le sketch présenté plus haut afin d'afficher dans le moniteur série la pression mesurée, et j'ai noté cette pression pour plusieurs profondeurs différentes, par bonds de 5 mm.

Après transcription des mesures dans un tableur (Excel ou LibreOffice Calc) et transformation de la pression absolue en pression relative (en soustrayant de chaque pression mesurée la pression atmosphérique normale), j'ai produit un graphique de la pression (en Pa) en fonction de la profondeur (en mètre).




J'ai obtenu une droite dont la pente est de 9690 Pa/m.  En divisant la pente par 9,8 m/s2, on trouve une masse volumique expérimentale de 989 kg/m3 , ce qui n'est pas très loin des 1000 kg/m3 prévus.

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