dimanche 25 mai 2014

Film en accéléré (time lapse) avec un vieil appareil photo, un transistor et un Arduino

J'ai toujours un peu de difficulté à accepter qu'un appareil électronique désuet prenne la poussière au fond d'un tiroir.  C'était le cas de mon appareil photo numérique Kodak EasyShare CD40:  il était encore fonctionnel, mais il n'avait pas servi depuis de nombreuses années.

Mon point de départ pour cet article n'a donc pas été "J'aimerais réaliser des films en accéléré, quelle est la meilleure façon d'y arriver?" mais plutôt "Qu'est-ce que je pourrais bien faire d'amusant avec ce vieil appareil?".

Ma réponse:  trafiquons l'appareil photo pour qu'il puisse être contrôlé par un Arduino!  Pour ce faire, j'ai remplacé le bouton déclencheur par un transistor (j'ai utilisé un 2N3904 car c'est ce que j'avais sous la main).

L'illustration ci-contre permet de distinguer la base, l'émetteur et le collecteur du 2N3904 (vous devrez probablement consulter la fiche technique de votre transistor si vous utilisez un autre modèle.).  

Notre transistor sera l'équivalent d'un interrupteur commandé de façon électrique:


  • si aucun courant ne circule dans la base, la résistance entre l'émetteur et le collecteur est très grande (donc aucun courant n'y circule)
  • si un courant circule dans la base, la résistance entre l'émetteur et le collecteur devient beaucoup plus faible (donc un courant y circule facilement).

J'ai donc ouvert le boîtier de l'appareil photo, et j'ai localisé les deux contacts électriques qui sont reliés entre eux lorsqu'on appuie sur le bouton déclencheur (pour vous assurer que vous avez correctement identifié les deux contacts:  assurez-vous que votre appareil prend une photo chaque fois que vous les reliez temporairement au moyen d'un fil conducteur).

Au moyen d'un multimètre, déterminez lequel des deux contacts se trouve au potentiel le plus élevé:  c'est sur ce contact que nous brancherons le collecteur du transistor, alors que l'émetteur sera soudé sur l'autre contact (celui qui est au potentiel le plus bas).

L'émetteur sera également relié à la masse (GND) de l'Arduino, alors que la base sera reliée à une résistance de quelques kiloohms (j'ai utilisé 4,7 kΩ), elle-même reliée à une des sorties de l'Arduino (j'ai utilisé la pin numéro 13).



Pour faire un film en accéléré, il s'agit d'écrire un sketch qui mettra momentanément la pin 13 à 5 volts, toutes les 10 secondes (par exemple) et pointer la caméra vers quelque chose qui bouge lentement (des nuages, par exemple), et réunir les images obtenues pour en faire une vidéo (j'ai utilisé Windows Movie Maker).

Le film ci-dessous a été filmé en quelques heures:  il a été tourné au rythme d'une image toutes les 10 secondes, mais il est visionné à une fréquence de 20 images par seconde (les nuages se déplacent donc 200 fois plus rapidement que dans la réalité).




Voici le sketch (probablement le sketch le plus simple depuis la fondation de ce blog!):


Notez que dans ce cas la tâche de l'Arduino est ridiculement simple:  il est tout à fait possible de le remplacer par un cricuit à base de 555.

Et ensuite?

Maintenant que je dispose d'un appareil photo qui répond aux ordres de l'Arduino, on peut penser à d'autres applications.  Par exemple, l'appareil pourrait être déclenché par un détecteur de mouvement pour en faire une espèce de caméra de surveillance ou encore  pour photographier automatiquement des animaux dans leur habitat naturel.   On pourrait aussi suspendre l'appareil à un ballon gonflé à l'helium pour prendre des photographies aériennes.

Yves Pelletier (Twitter:  @ElectroAmateur)

Sources:  Je me suis inspiré de ce projet publié sur le site Instructables, qui utilisait un relai plutôt qu'un transistor.


mardi 20 mai 2014

Fabrication d'un métronome

J'avais besoin d'un nouveau métronome, car mes enfants ont égaré le contrepoids qui permet de régler le tempo de mon antique métronome mécanique.  Plutôt qu'en acheter un, je me suis dit qu'il serait amusant d'en construire un.

Vous ne serez probablement pas surpris d'apprendre que la pièce maîtresse du circuit est un multivibrateur 555, utilisé en mode astable.  Pour le reste:  quelques résistances et condensateurs, deux LEDs (qui clignotent en alternance, ajoutant une représentation visuelle du tempo), un petit haut-parleur qui fait "tic-tic-tic" et un potentiomètre permettant de régler le tempo (j'ai opté pour un modèle à glissière, mais un modèle rotatif conventionnel aurait fait l'affaire, bien entendu).  Donc seulement du matériel pas cher et facile à trouver.

Après avoir fouiné un peu sur internet, j'ai jeté mon dévolu sur le circuit proposé par Daniel Andrade.  Je n'ai fait que deux petites modifications:



- Avec le potentiomètre de 250K proposé dans le modèle initial, la majeure partie de la gamme de tempos disponibles me semblait inutilisable car beaucoup trop lente ou beaucoup trop rapide.  Après une courte exploration sur breadboard, j'en suis venu à la conclusion que je n'avais aucunement besoin d'une résistance plus faible que 5 K, ni d'une résistance plus grande que 50 K, d'où l'utilisation dans mon circuit d'une résistance fixe de 4,7K en série avec un potentiomètre de 50K.

- J'ai aussi ajouté un interrupteur qui permet de désactiver le haut-parleur pour ne conserver que le clignotement des LEDs, ce qui pourrait s'avérer utile si vous désirez utiliser le métronome tout en enregistrant la musique d'un instrument acoustique.

En fait, mon idée de départ était d'ajouter un contrôle de volume, mais j'ai constaté que le volume était déjà plutôt faible.  Pour une version améliorée de ce prototype, il serait probablement utile d'ajouter un étage d'amplification munie d'un contrôle de volume.

Si vous voulez afficher le tempo sur un LCD, il sera probablement pertinent d'utiliser un microcontrôleur, mais ça risque de vous coûter sensiblement plus cher qu'acheter métronome de poche sur eBay...  Pour le présent modèle, même si vous ajoutez une graduation au potentiomètre, le réglage de tempo ne sera qu'approximatif.


Yves Pelletier (Twitter: @ElectroAmateur)

dimanche 18 mai 2014

Identifieur d'accords MIDI (Arduino)

Voici comment construire soi-même, au moyen d'un Arduino, un dispositif qui, lorsqu'il est branché dans un clavier MIDI, affiche le nom de l'accord qui est joué au clavier:  C, Bmaj7, Esus2, etc.  Ça pourrait être utile, par exemple, pour un musicien qui désirerait transcrire les arrangements d'une pièce qu'il joue à l'oreille.  Un étudiant pourrait également s'entraîner à jouer des accords et utiliser l'appareil pour vérifier qu'il a joué la bonne chose.

Matériel nécessaire:

- Arduino
- Afficheur LCD 16 X 2
- Shield MIDI tout fait, ou optocoupleur pour faire le lien entre entre l'Arduino et le clavier MIDI.

Connexions MIDI

J'ai déjà expliqué dans ce précédent article comment procéder pour relier l'Arduino à un clavier MIDI par l'entremise d'un optocoupleur (schéma ci-dessous).   Une autre option consiste à utiliser un shield MIDI commercial.  Dans ce cas, vous n'avez besoin que de la réception du message (par la pin 0 "Rx" de l'Arduino);  l'Arduino n'enverra aucun message MIDI en direction du clavier.



Connexions de l'afficheur LCD

Ce sont les mêmes branchement que dans ce tutoriel du site officiel Arduino.   Dans le schéma ci-dessous, le rétroéclairage n'est pas branchés (pins 15 et 16 de l'afficheur).


Sketch

Pour simplifier les choses, j'ai utilisé la bibliothèque MIDI.  Lorsqu'on lâche une touche, mon clavier Yamaha n'envoie pas de messages "note off" mais plutôt des messages "note on" de vélocité 0.  Vous pourriez avoir à modifier légèrement le sketch si votre clavier utilise des messages "note off".

En gros, l'Arduino tient un registre des notes du clavier qui sont enfoncées.  Puisque l'octave n'a pas d'influence sur le nom de l'accord, ces notes sont ensuite normalisée (on soustrait 12 au numéro MIDI de chaque note, jusqu'à ce que le numéro se situe entre 0 (do) et 11 (si).  Ces notes normalisées sont triées, et on supprime celles qui se répètent (par exemple, le musicien pourrait avoir enfoncés deux touches "do" situées sur deux octaves différents).

Il reste ensuite à identifier les accords en fonction des intervalles entre les notes.  Par exemple, un accord majeur est formé de sa fondamentale, de la tierce (située 4 demi-tons plus haut que la fondamentale) et de la quinte (située 7 demi-tons plus haut que la fondamentale).  Pour do majeur, ce sera do-mi-sol, donc 0 - 4 - 7.  Toutefois les choses se compliquent un peu car la note la plus basse n'est pas nécessairement la note fondamentale.  Par exemple, un sol majeur est formé par les notes sol-si-ré, mais mes notes normalisées apparaîtront plutôt dans l'ordre ré-sol-si (donc 2 - 7 - 11).  La plus grande partie du sketch tente donc de donner un nom à l'accord en fonction des intervalles entre les notes jouées (d'une façon qui pourrait probablement être plus élégante, je l'admet!).


mercredi 14 mai 2014

Afficheur LCD 16 X 2 et Raspberry Pi

Cet article a été mis à jour le 20 décembre 2020 afin d'être compatible avec Python 3 et la version la plus récente de la bibliothèque RPLCD.

Voici un petit tutoriel sur la façon de brancher un afficheur LCD 16 X 2 (compatible avec le pilote Hitachi HD4470) à un Raspberry Pi afin d'y afficher des informations au moyen du langage Python.

Branchements

La plupart des afficheurs LCD de ce genre sont conçus pour fonctionner sous une tension de 5 V, mais en général, ils reconnaîtront les signaux de 3,3 V envoyés par votre Raspberry Pi.  Il existe également des modèles spécialement conçus pour une tension de 3,3 V (ce qui peut constituer un choix intéressant si vous achetez un LCD spécialement pour votre Raspberry Pi).

Voici les branchements que j'ai utilisés:



Broche du LCD Broche du Raspberry Pi
Notation "Board" Notation "BCM"
1 6 GND
2 2 5 V
4 15 GPIO 22
5 18 GPIO 24
6 16 GPIO 23
7, 8, 9, 10 Pas branchées
11 21 GPIO 9
12 22 GPIO 25
13 23 GPIO 11
14 24 GPIO 8

Comme on le voit sur l'illustration, la broche 3 de l'afficheur LCD, qui sert à régler le contraste de l'afficheur, est reliée au curseur d'un potentiomètre (j'ai utilisé 10K) pour que sa tension puisse varier entre 0 et 5 V.  Je n'ai pas utilisé le rétroéclairage, mais si je l'avais fait, j'aurais relié la broche 15 de l'afficheur à 5 V et la broche 16 au GND (certains afficheurs LCD, par exemple ceux qui affichent en blanc sur fond bleu, sont illisibles sans le rétroéclairage).

Et voici un petit rappel de la désignation des broches du Raspberry Pi, selon la notation "Board" et la notation "BCM":



Installation de la bibliothèque RPLCD

Pour simplifier la conception de nos scripts en Python, installons la bibliothèque RPLCD, en tapant la ligne de commande suivante:

sudo pip3 install RPLCD

Si vous avez un message du genre "sudo: pip: command not found", alors il faut d'abord installer pip (ce qui prendra un certain temps):

Vous pouvez ensuite exécuter ce script en Python, qui affiche en alternance les messages "Bravo!" et  "Je fonctionne parfaitement".    Si rien ne s'affiche, ou si vous ne voyez que des carrés noirs, ou des caractères étranges, essayez d'ajuster le contraste en tournant le potentiomètre, et vérifier vos connexions.

- -

À lire également

Si vous préférez les écrans qui permettent aussi d'afficher des images, vous pouvez jeter un oeil sur l'écran couleur SPI ST7735, l'écran OLED SH1106 ou l'écran Nokia 5110.

Les afficheurs LCD 16 X 2 peuvent aussi être contrôlés par un Arduino, un ESP32/ESP8266,  un STM32,  un microcontrôleur PIC...

Yves Pelletier (Twitter:  @ElectroAmateur)

lundi 5 mai 2014

Communication par USB entre Raspberry Pi et Arduino

Cet article a été mis à jour le 29 décembre 2020. Tous les scripts sont maintenant compatibles avec Python 3.

Il existe plusieurs options possibles pour établir une communication entre un Raspberry Pi et un Arduino: communication série (UART), I2C, Ethernet, communication sans fil...

Dans cet article, nous abordons l'option qui s'avère probablement la plus simple: la communication série par l'entremise d'un câble USB. Nous allons simplement brancher l'Arduino à un des ports USB du Raspberry Pi, de la même façon que nous le faisons lorsque nous désirons programmer l'Arduino avec un ordinateur conventionnel. 

Arduino et son alimentation
La bibliothèque pyserial

De nos jours, la bibliothèque pyserial est présente par défaut dans la distribution de base du Raspberry Pi OS, mais à tout hasard, si elle n'y est pas, vous pouvez l'installer avec une ou l'autre de ces deux commandes:

pip3 install pyserial

...ou encore...
      
sudo apt-get install python3-serial

Envoi d'un message de l'Arduino vers le Raspberry Pi

Commençons par une communication unidirectionnelle de l'Arduino vers le Raspberry Pi.  Du côté Arduino, l'envoi de messages se fait par la commande "Serial.println".  Par exemple, le sketch ci-dessous envoie un message toutes les 3 secondes.  J'ai ajouté un compteur pour que le message ne soit pas rigoureusement identique d'une fois à l'autre.  Nous pourrons donc vérifier que tous les messages envoyés par l'Arduino sont bel et bien captés par le Raspberry Pi.


Comme vous pouvez le constater, c'est exactement comme si vous vouliez afficher un message sur le moniteur série de l'environnement de programmation Arduino; vous pouvez d'ailleurs utiliser le moniteur série pour vérifier dès maintenant que le sketch fonctionne de la façon prévue.

Du côté Raspberry Pi, la fonction "serial.Serial" nous permet de lire les messages reçus .  Le premier paramètre de cette fonction est le nom du port usb occupé par l'Arduino:   dans mon cas, c'était ttyUSB0;  ce sera peut-être la même chose pour vous aussi, mais ce n'est pas certain.  Pour en avoir le coeur net, vous pouvez écrire cette instruction dans le terminal:

         ls /dev/tty*

La liste qui s'affiche devrait être légèrement différente selon que l'Arduino est connecté ou non au Raspberry Pi. Le nom correct devrait être celui qui apparaît dans la liste pendant que l'Arduino est branché, mais qui n'y apparaît pas quand l'Arduino est débranché du port USB du Raspberry Pi.

Voici donc un sketch en Python qui permettra au Raspberry Pi d'écouter ce que lui dit l'Arduino, et d'afficher le résultat. 


Envoi d'un message du Raspberry Pi vers l'Arduino

Essayons maintenant l'autre direction:  branchons quelques LEDs à l'Arduino, et c'est le Raspberry Pi qui indiquera à l'Arduino quelles LEDs il doit éteindre ou allumer.

Donc, une LED (accompagnée de sa résistance protectrice) est branchée à chacune des broches suivantes de l'Arduino:  2, 3 et 4 .



Commençons par le sketch Arduino.  Grâce à la fonction Serial.read, le sketch ci-dessous allume ou éteint les LEDs en fonction du message reçu:  il allume la LED 1 (broche 2) s'il reçoit le message "1", il éteint la LED 2 (broche 3) s'il reçoit le message "5", etc.



Pourquoi soustraire le caractère '0'?  C'est parce qu'au départ, lorsque l'Arduino reçoit le message "1", il s'agit d'un caractère dont le code ASCII est 49.  En soustrayant le caractère '0' (dont le code ASCII est 48), le caractère '1' qui a été reçu devient le nombre entier 1.

Si vous le désirez, vous pouvez vérifier que ce sketch fonctionne correctement à l'intérieur de l'environnement de programmation Arduino, avant même de brancher l'Arduino au Raspberry:  dans le moniteur Série, tapez des nombres entre 1 et 6 et voyez que les LEDs s'allument ou s'éteignent en fonction des nombres que vous envoyez.

Et voici le script en Python qui sera exécuté par le Raspberry Pi:  c'est maintenant lui qui envoie des informations à l'Arduino:


Communication bidirectionnelle entre le Raspberry Pi et l'Arduino

Finalement, voici un exemple où le Raspberry Pi demande une information à l'Arduino (l'état d'un potentiomètre dont le curseur est branché à A0 ), et affiche la réponse que lui a retournée l'Arduino.



Le sketch Arduino:


Le script en python du Raspberry Pi:

Sources:

Mon point de départ a été la lecture de cet article dans le blog d'Oscar Liang.

Yves Pelletier (Twitter:  @ElectroAmateur)

samedi 3 mai 2014

Construction d'un petit robot chercheur de lumière

J'ai construit ce petit robot qui cherche toujours à se diriger vers l'endroit où l'intensité lumineuse est la plus grande.  Pour ce faire, je me suis basé sur le chapitre 9 du livre JunkBots, Bugbots, and Bots on Wheels par Dave Hrynkiw et Mark W. Tilden, qui se sont eux-même servi du circuit mis au point par Randy Sargent (en fait, les auteurs proposent une version améliorée, alors que j'ai utilisé le circuit original conçu par Sargent).

Oubliez le coûteux matériel de robotique: ce qui fait le charme de ce genre de petits robots, c'est la facilité de les construire à partir de matériel recyclé. À moins que vous soyez du genre à jeter aux poubelles les précieuses sources de composants que sont les appareils électroniques défectueux ou désuets, le composant le plus coûteux de ce robot risque d'être la pile de 9 V.  Les moteurs électriques ont été récupérés dans de vieux lecteurs de CD-ROMs (ou autres appareils désuets), la base est un simple bout de tôle que vous pouvez scier ou découper au dimensions désirées sans avoir besoin d'outillage sophistiqué. Les auteurs préconisent même l'utilisation d'un LM386 récupéré dans un vieux répondeur téléphonique, mais il me semble qu'ils ne sont pas si fréquents que ça...même le radin que je suis en a utilisé des neufs.

Hé oui, vous avez bien lu: le circuit intégré qui constitue la pièce maîtresse du cerveau de notre robot est un amplificateur audio LM386, utilisé ici pour une tâche bien différente de son rôle habituel. Le LM386 sert ici de comparateur, ajustant l'alimentation des moteurs en fonction du signal reçu en provenance des deux photorésistances.

Le circuit, illustré ci-dessous, n'a rien de bien compliqué.

  • Une première photorésistance est reliée à la borne négative de la pile et à la pin 2 du LM386.
  • Une deuxième photorésistance est reliée à la borne négative de la pile et à la pin 3 du LM386.
  • Une résistance de 47k est reliée à la borne positive de la pile et à la pin 2 du LM386.
  • Un potentiomètre de 100k est relié à la borne positive de la pine et à la pin 3 du LM386.
  • La pin 1 est reliée à la pin 8.
  • La pin 6 est reliée à la borne positive de la pile, alors que la pin 4 est reliée à la borne négative.
  • Un des moteurs est branché à la pin 5 et à la borne négative de la pile.
  • L'autre moteur est branché à la pin 5 et à la borne positive de la pile.
  • La pin 7 n'est pas utilisée.




La tension de sortie de l'amplificateur (pin 5) variera en fonction de l'éclairement des photorésistance.  Si la tension de sortie est faible, ça fera tourner le moteur relié à la borne positive de la pile, et c'est le contraire si la tension de sortie de l'amplificateur est élevée.  Vous ajustez la symétrie du mouvement du robot en ajustant le potentiomètre (ou la position des deux photorésistance, à l'avant du robot).

L'arrière du robot
Bien entendu, côté mécanique, ce n'est pas la perfection: l'absence de moto-réducteur fait en sorte que les moteurs tournent beaucoup plus rapidement qu'on le voudrait: votre robot sera donc du genre nerveux. Cette rotation rapide nous empêche d'utiliser de véritables roues (avec un trop grand diamètre, elles déraperaient inévitablement): le robot roule donc directement sur l'arbre du moteur (les moteurs étant placés en diagonale, à un angle d'environ 45° par rapport à
l'horizontale). Pour augmenter la force de frottement, on ajoute deux couches de tube thermorétractable sur l'axe du moteur, en guise de pneus.

À l'avant, un condensateur sert de patin
L'avant du robot s'appuie sur un patin offrant une faible friction.  Les auteurs du livres suggéraient l'utilisation d'une LED, j'ai opté pour un condensateur dont la surface est particulièrement lisse.

Ensuite, libre à vous de lui ajouter une enveloppe corporelle plus esthétique, ou de le laisser tel quel, affichant insolemment la simplicité de sa conception!

On se retrouve avec un petit robot qui se dirigera systématiquement vers l'endroit le mieux éclairé de la pièce (une grande fenêtre, par exemple, s'il fait jour).  Vous pouvez aussi vous amuser à le diriger en pointant une lampe de poche sur le sol devant lui:  suivra le cercle lumineux que vous déplacez devant lui.