lundi 28 juillet 2014

Deux VCOs: le SN74LS629 et le XR2207

Récemment j'ai fait quelques expérimentations avec deux circuit intégrés que j'avais acquis lors de l'achat d'un lot de composants en vrac: le SN74LS629 et le XR2207.

Il s'agit, dans les deux cas, d'oscillateurs contrôlés en tension, ou VCO (pour Voltage Controlled Oscillator). Comme leur nom l'indique, ces deux circuits intégrés génèrent une tension alternative dont la fréquence est contrôlée par une tension d'entrée.

Ultimement, j'aimerais bien les utiliser à l'intérieur de projets de synthèse de son, mais puisque je n'en suis pas là, je me contenterai aujourd'hui de montrer un circuit de base permettant d'observer l'oscillation de chacun des deux CIs.

Le XR2207 

Je crois que le XR2207 n'est plus fabriqué depuis plusieurs années, mais puisque j'en possède plusieurs, j'aimerais bien leur trouver une utilité... Le circuit ci-dessous (issu de la fiche technique) m'a permis de générer un signal carré et un signal triangulaire dont la fréquence varie entre quelques dizaines de Hertz et environ 6 kHz.




Voici une photographie de l'écran de l'oscilloscope pour chacun des deux signaux obtenus:




En circuit ouvert, l'amplitude est d'environ 0,6 V pour le signal carré et de 0,3 V pour le signal triangulaire.  Toutefois, l'amplitude du signal carré diminue à mesure qu'on diminue la résistance de charge.  L'amplitude du signal triangulaire demeure indépendant de la résistance de charge, mais disparaît soudainement si la résistance de charge est plus faible que 700 Ω environ.

Le SN74LS629N

Ce circuit intégré comporte deux oscillateurs.  Avec le circuit illustré ci-dessous (qui n'utilise qu'un des deux oscillateurs), j'ai obtenu un signal carré de 0,2 V d'amplitude dont la fréquence varie entre 700 Hz et 15 kHz environ:



On peut évidemment construire un circuit similaire pour obtenir un deuxième oscillateur:


Et voici ce que ça donne à l'oscilloscope:



Yves Pelletier (Twitter: @ElectroAmateur)

vendredi 18 juillet 2014

Arduino et persistance rétinienne (POV Display)


Voilà un projet que je voulais essayer depuis longtemps:  un afficheur rotatif à persistance rétinienne.

Ce dispositif permet de tracer des mots lumineux (qui semblent s'afficher dans le vide) au moyen de quelques LEDs en rotation rapide.

Matériel nécessaire:  8 LEDs, Arduino, ventilateur de PC, LED infrarouge et phototransistor.


Principe de fonctionnement

Vous disposez d'une barrette de 8 LEDs disposées le façon à former une droite verticale  (à gauche), et vous désirez former la lettre A (à droite).

Une solution possible:  déplacer la barrette de LEDs horizontalement vers la droite, tout en allumant à chaque position les LEDs qui sont utiles pour former la lettre désirée (et en éteignant celles qui ne le sont pas).

Au début, quand la barette de LED se trouve à la position A, on allume toutes les LEDs sauf celle du haut (numéro 1).  Une fraction de seconde plus tard, au moment où la barrette se trouve à  la position B, on allume uniquement les LEDs 1 et 5. Il en est de même quand la barrette de LEDs passe par les positions C et D, puis finalement on allume à nouveau toutes les LEDs sauf le numéro 1 lorsque la barrette passe par la position E.

Bref, la lettre a été tracée au moyen de 5 colonnes lumineuses qui ont été allumées l'une après l'autre, mais si le phénomène est suffisamment rapide, nous avons l'illusion que les 5 colonnes étaient allumées simultanément.

Pour que les lettres demeurent visibles de façon stable pendant une longue période de temps, la barette de LEDs doit repasser par les mêmes positions de façon périodique afin de retracer les lettres avant qu'elles ne disparaissent...  On y arrive en plaçant les LEDs à l'extrémité d'une tige rotative:  le mouvement devient périodique et le texte est réécrit à chaque tour de la tige.


Comme vous pouvez le constater sur la photo ci-dessus, la tige rotative supporte également l'Arduino (responsable d'allumer et éteindre les LEDs au bons moments) et une pile de 9 V qui alimente à la fois les LEDs et l'Arduino.  Puisqu'ils sont tous reliés ensemble, il faut qu'on les fasse tourner en même temps que les LEDs, sinon les fils vont s'emmêler!   (puisque l'Arduino et la pile sont relativement lourds, il faut les fixer solidement pas trop loin de l'axe de rotation de la tige, sinon ils risquent de se transformer en dangereux projectiles...).

Et voici le résultat pendant que la tige est en rotation et que les LEDs s'allument et s'éteignent au bon moment (le cercle bleu est causé par une LED de l'Arduino qui est lui-même en rotation rapide)



Choix du moteur

Pour faire tourner la tige à haute vitesse, on peut utiliser n'importe quel moteur à courant continu.  J'ai opté pour un ventilateur de PC car son rotor présente une assez large surface plane sur laquelle il est facile de coller une mince lamelle de bois (qui provient d'un vieux store en bois de chez IKEA).   De plus, son stator comporte 4 trous de montage qui permettent de le visser solidement sur une lourde base en bois (cette base est essentielle pour éviter que votre montage se transforme en aéroglisseur!).

Léger inconvénient, toutefois, mon ventilateur n'accepte de tourner que dans le sens antihoraire, ce qui m'oblige à écrire les texte en commençant par la fin, de la droite vers la gauche (bien sûr que j'ai essayé d'inverser la polarité de son alimentation, mais ça n'a pas fonctionné).

La barrette de LEDs


Les LEDs sont disposées de façon rectiligne. Chacune est soudée à une résistance de protection de 220 Ω.  Toutes les cathodes sont reliées ensemble (et au GND de l'Arduino) alors que chaque anode est reliée à une sortie de l'Arduino.



Barrette de LEDs:  schéma du circuit


Phototransistor et LED infrarouge

Pour que le résultat soit stable, l'Arduino doit amorcer l'écriture des mots exactement au même endroit à chaque tour.  Pour ce faire, un phototransistor fixé sous la tige rotative envoie un signal à l'Arduino chaque fois qu'il passe au-dessus d'une LED infrarouge immobile, fixée sur la base du dispositif.

Sur réception de ce signal en provenance du phototransistor (une fois par tour, toujours exactement au même endroit), l'Arduino amorce l'écriture du mot.

Le phototransistor a été entouré de ruban gommé opaque afin de limiter l'influence de l'éclairage ambiant (seule son extrémité, qui fait face à la LED IR,  peut recevoir de la lumière).

Puisque la LED infrarouge est immobile, elle est alimentée par la même source de tension de 12 V qui alimente le moteur (il faut prévoir la valeur de la résistance protectrice en conséquence).


Le pĥototransistor est relié à l'Arduino de la façon suivante:



D'autres solutions sont possibles:  LED et photorésistance, aimant et capteur à effet Hall, etc.

Sketch

Je n'ai pas écrit le sketch moi-même: je l'ai trouvé telefab.fr.  Toutefois, j'ai dû faire quelques modifications:  d'une part, le sketch était conçu en fonction d'un moteur tournant dans le sens horaire alors que, comme je l'ai déjà mentionné, mon moteur ne tournait que dans le sens antihoraire. J'ai donc modifié quelques détails pour que les mots s'écrivent à partir de la fin.  De plus, le sketch d'origine faisait lentement défiler les mots de droite à gauche, ce qui est bien pratique quand on veut écrire une phrase trop longue pour être affichée au complet, mais qui est irritant quand on se contente d'afficher des mots individuels:  j'ai enlevé ce défilement.  De plus, j'ai soudé ma barrette de LEDs en cathode commune alors que le sketch supposait l'inverse.

Attention:  ce sketch nécessite l'utilisation des fichiers de définition des polices de caractères (patterns.c et patterns.h), disponibles ici.


Calibration

Les moteurs ne tournent pas tous à la même vitesse, et rien ne vous oblige à utiliser une tige rotative de même longueur que celle que j'ai utilisée (je ne vous ai d'ailleurs pas indiqué sa longueur).  Il est donc possible que les mots soient trop comprimés, ou trop dilatés.  L'ajustement de la variable 'largeur"  vous permettra d'obtenir un résultat correspondant à vos préférences:  plus la valeur de "largeur" est grande, plus les mots seront étalés.  Vous pourriez également vouloir modifier la valeur de la variable "dureeMot", qui détermine le temps pendant lequel un mot est affiché avant d'être remplacé par un autre.

Vidéo

Finalement, voici une petite vidéo qui montre le dispositif en fonctionnement (c'est plus joli dans la réalité: un effet stroboscopique dégrade un peu le résultat sur vidéo)).





Voir aussi:

Une autre expérience (plus simple) impliquant la persistance rétinienne (réflexion d'un laser sur plusieurs miroirs en rotation).

Yves Pelletier (Twitter: @ElectroAmateur)

mardi 15 juillet 2014

Étude de CI: Multiplexeur/Démultiplexeur CD4051

Aujourd'hui, je vous propose d'étudier le fonctionnement du circuit intégré CD4051  (ou de son équivalent 74HC4051), qui est un multiplexeur/démultiplexeur à 8 voies.

Un multiplexeur achemine le signal de l'une de ses multiples entrées à une sortie unique, alors qu'un démultiplexeur achemine l'état de son unique entrée à une de ses multiples sorties.  Le 4051 peut être utilisé, au choix, comme multiplexeur ou comme démultiplexeur.

À vos breadboards!

Comme toujours, la meilleure façon de s'assurer qu'on a bien compris, c'est de faire des tests!   Si vous disposez d'un CD4051, insérez-le dans un breadboard et voyons ce que ça donne.

Commençons par alimenter le CI.  La version CD4051 acceptera n'importe quelle tension d'alimentation continue située entre 3 V et 16 V (2 V à10 V pour le 74HC4051 et 4.5 V à 5.5 V pour le 74HCT4051).  Je vais faire mon expérience avec une alimentation de 5 V qui sera donc reproductible sur toutes les saveurs de 4051.


Donc la pin 16 "Vcc" sera reliée à la borne positive de la source de 5 V et la pin 8 "GND" sera reliée à la masse.  La pin 7 "Vee" est l'alimentation négative que nous relierons également a la masse (ça nous oblige à nous limiter à des signaux d'entrée variant entre 0 et 5 V).

La pin E "Enable" est "active low":  il faut donc la relier à la masse pour que le CI soit fonctionnel (on la relie à 5 V si on désire désactiver le CI).



Exploration du mode multiplexeur

En mode multiplexeur, le 4051 comporte 8 entrées analogiques (numérotées Y0 à Y7 sur l'illustration ci-haut) et une seule sortie analogique (la pin numéro 3, symbolisée par un Z sur le schéma).  Nous pouvons décider quelle entrée verra son signal acheminé à la sortie en contrôlant l'état des pins numérique S0, S1 et S2 (pins 11-10-9).

Nous allons donc soumettre chacune des 8 entrées Y0, Y1 etc. à une tension analogique variant entre 0 et 5 V.  Un potentiomètre constitue une façon simple d'y arriver.

 
... Bon, c'est vrai que 8 potentiomètres, ça fait un peu lourd si tout ce qu'on veut est tester le fonctionnement du CI, alors n'hésitez pas à relier certaines entrées directement à 0 V ou 5 V pour limiter un peu le nombre de potentiomètres...

On utilisera un voltmètre (non illustré) pour mesurer la tension à la sortie Z (pin 3).

Il nous reste un dernier détail:  indiquer laquelle de nos 8 entrées aura l'honneur de voir son signal être acheminé vers la sortie.  Ce sont les pins S2, S1 et S0 (9-10-11) qui nous permettrons d'effectuer ce contrôle.

Supposons que nous voulons que la sortie soit à la même tension que l'entrée Y0:  nous reproduisons le nombre 0 en binaire:   S2 = 0, S1 = 0 et S0 = 0 (donc vous reliez les pins 9, 10 et 11 à la masse). Vous devriez alors constater au moyen du voltmètre que la sortie est au même potentiel que l'entrée Y0 (si vous tournez le potentiomètre qui est reliée à Y0, ça fait varier la tension de sortie).


Supposons maintenant c'est l'entrée Y3 que vous désirez acheminer vers la sortie.  En binaire, le nombre 3 s'écrit 011.   Il s'agit de reproduire ce nombre binaire au moyen des entrées S0 à S2:    S2 = 0, S1 = 1, S0 = 1 (donc vous reliez S0 et S1 à 5 V et laissez S2 relié à la masse).  Vous devriez maintenant constater au moyen du voltmètre que c'est maintenant le potentiomètre relié à Y3 qui contrôle le signal de sortie.



Voici, en résumé, la table de vérité du multiplexeur:

Si S2 = 0, S1 = 0 et S0 = 0, alors Z = Y0
Si S2 = 0, S1= 0 et S0 = 1, alors Z = Y1
Si S2 = 0, S1 = 1 et S0 = 0, alors Z = Y2
Si S2 = 0, S1 = 1 et S0 = 1, alors Z = Y3
Si S2 = 1, S1 = 0 et S0 = 0, alors Z = Y4
Si S2 = 1, S1 = 0 et S0 = 1, alors Z = Y5
Si S2 = 1, S1 = 1 et S0 = 0, alors Z = Y6
Si S2 = 1, S1 = 1 et S0 = 1 alors Z = Y7

Application:  augmenter le nombre d'entrées analogiques de l'Arduino

Une utilisation intéressante du CD4051, c'est qu'il permet de brancher 8 capteurs analogiques différents sur une seule entrée analogique de l'Arduino, ce qui peut s'avérer intéressant dans certaines applications pour lesquelles les 6 entrées analogiques de l'Arduino sont insuffisantes.

Il s'agit de remplacer le voltmètre du circuit ci-dessus par une entrée analogique de l'Arduino (A0, par exemple), et de contrôler les pins S0, S1 et S2 du CD4051 par des sorties numériques de l'Arduino (par exemple les pins 5,6 et 7).  L'arduino peut aussi servir d'alimentation (à moins que vos capteurs utilisent une trop grande intensité de courant, auquel cas vous conservez votre alimentation externe de 5 V en reliant sa borne négative au GND de l'Arduino).


Si vous avez bien compris le principe de fonctionnement du CD4051, le sketch ci-dessous ne devrait comporter aucun mystère pour vous:

Exploration du mode démultiplexeur

En mode démultiplexeur, il n'y a qu'une seule entrée (la pin 3, symbolisée par Z, qui était la sortie en mode multiplexeur), et le signal analogique de cette entrée unique sera transmis à une des 8 sorties (Y0, Y1, etc.) selon l'état des des pins numérique S0, S1 et S2 (pins 11-10-9).

Dans l'illustration ci-dessous, un potentiomètre contrôle la tension de l'entrée Z (pin 3) et puisque S2 = 1, S1 = 0 et S0= 0 (nombre binaire 100 = 4), c'est la sortie Y4 (donc la pin 1) qui prendra une tension de même valeur que celle de l'entrée Z (à ce moment, toutes les autres sorties sont à 0V).


Notez que le CD4051 n'est doté d'aucune mémoire:  aussitôt que vous modifiez l'état des pins S0-S1-S2 pour changer la sortie active, la sortie Y4 reprend une tension nulle.

Yves Pelletier (Twitter: @ElectroAmateur)

dimanche 13 juillet 2014

Magnétomètre/boussole HMC5883L et Arduino

Le circuit intégré HMC5883L fabriqué par Honeywell permet de mesurer les 3 composantes (x, y et z) du champ magnétique dans lequel il est plongé. On peut donc s'en servir comme appareil scientifique permettant de mesurer un champ magnétique avec précision, ou encore comme une boussole qui aidera notre robot à se repérer dans l'espace.

(Il y a quelques années, je vous avais parlé d'une autre méthode pour mesurer un champ magnétique (particulièrement intéressante si vous préférez éviter l'utilisation d'un microcontrôleur):  la sonde à effet Hall Allegro A1302.)

Le circuit intégré lui-même est un minuscule CMS (composant monté en surface) comportant 16 pins réparties autour d'un carré dont les côtés ne mesurent que 3 mm:  hors de question pour moi de souder ça!  Heureusement, il est facile de se procurer un breakout déjà tout fait, comportant déjà les résistances et condensateurs nécessaires  au bon fonctionnement du CI, qu'on pourra facilement brancher à l'Arduino en l'insérant dans un breadboard ou autre.

Sparkfun et Adafruit ont chacun leur version de breakout HMC5883L, mais comme d'habitude ce sont les vendeurs chinois qui offrent les meilleurs prix sur eBay (le mien n'a coûté que $1,50, frais de ports inclus...).

Branchements à l'Arduino

Puisque le magnétomètre utilise le protocole I2C, nous utiliserons les pins de l'Arduino dédiées à ce protocole:
  • La pin VCC du breakout se branche à la pin 5 V de l'Arduino
  • La pin GND du breakout se branche à la pin GND de l'Arduino
  • La pin SCL (serial clock) se branche à la pin A5 de l'Arduino
  • La pin SDA (serial data) se branche à la pin A4 de l'Arduino
  • Nous n'utiliserons pas la pin DRDY (data ready).

Programmation de l'Arduino

En ce qui concerne la programmation de l'Arduino, le plus simple est d'utiliser l'excellente bibliothèque mise au point par Adafruit, qui offre entre autre l'avantage d'afficher l'intensité du champ magnétique en microgauss plutôt qu'une valeur numérique arbitraire située entre 0 et 1023).

Vous pouvez télécharger ici la bibliothèque Adafruit HMC5883, mais vous aurez également besoin de la bibliothèque Adafruit_sensor

Après avoir installé les deux bibliothèques dans le répertoire "libraries" de votre carnet de croquis, vous aurez accès à l'exemple "magsensor" qui montre comment récupérer les 3 composantes du champ magnétique (en microgauss), ainsi que l'orientation du champ magnétique terrestre (le nord étant à 0° par rapport à l'axe X indiqué sur le breakout).


Voici ce que ça donne dans le moniteur série:


Yves Pelletier (Twitter:  @ElectroAmateur)

vendredi 11 juillet 2014

Programmation d'un ATTiny85 avec Arduino



Ce billet a été entièrement réécrit le 14 septembre 2017 afin d'être compatible avec les versions plus récentes de l'IDE Arduino.

Aujourd'hui, on s'intéresse à la programmation d'un ATtiny85 au moyen d'une carte Arduino Uno et de l'IDE Arduino.


L'ATtiny85 est un tout petit microcontrôleur fabriqué par Atmel (la même compagnie qui fabrique les microcontrôleurs Atmega utilisés dans l'Arduino).  Il est cependant beaucoup plus limité que son grand frère Atmega 328, puisque sa mémoire est plus restreinte et il ne comporte que 6 pins pouvant être utilisées comme entrées/sorties.

Alors pourquoi nous compliquerions-nous la vie en utilisant un microcontrôleur dont les performances sont inférieures à celles de notre bien-aimé Arduino Uno?  Il n'y a qu'une seule raison:  son prix.   On peut acheter trois ATTiny85 pour le même prix qu'un seul Atmega 328, et on peut en obtenir une bonne douzaine pour le même prix qu'une seule carte Arduino.   Il s'agit donc d'une option intéressante si vous désirez produire à faible prix un montage permanent pas trop complexe.

Par exemple, si vous voulez fabriquer vous-mêmes une carte d'anniversaire qui joue une mélodie tout en faisant clignoter quelques LEDs, l'ATtiny est une option tout à fait envisageable car c'est petit et ça ne coûte pas cher (tiens, j'ai soudainement une idée pour l'anniversaire de mon beau-frère!).

Alors, on fait comment?

1) Configuration de l'IDE Arduino

Au départ, le logiciel (IDE) Arduino n'est pas conçu pour programmer des microcontrôleurs ATTiny.  Nous devons donc installer des fichiers qui ajouteront de nouvelles fonctionnalités à l'IDE. Heureusement, les dernières versions de l'IDE comportent un gestionnaire de cartes, grâce auquel cette installation est automatique.

Il existe principalement deux options:  l'ATtinyCore Universal de Spence Konde (qui semble être basé sur l'antique Arduino-Tiny), et ATtiny par David A. Mellis.    Chacun de ces deux "cores" a ses avantages et ses inconvénients; certains sketches qui fonctionnent avec un des cores ne fonctionnent pas avec l'autre.  Lors de mes essais, j'ai développé des sketches en apparence anodins qui refusaient obstinément de fonctionner correctement sous ATTinyCore Universal; pour cette raison, je vais plutôt insister sur l'installation de la version de David A. Mellis.  Si vous préférez installer l'autre version, pas de soucis, les étapes sont à toute fin pratique identiques.

Dans un premier temps, on ouvre la boîte de dialogue qui sert à régler les préférences (menu "Fichier/ Préférences").


On localise le champ "URL de gestionnaire de cartes supplémentaires" et on y copie cette adresse:

https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json


(Si vous préférez installer l'ATTinyCore Universal, vous utilisez plutôt l'adresse http://drazzy.com/package_drazzy.com_index.json )

Si le champ contient déjà d'autres adresses, vous pouvez séparer les adresses l'une de l'autre au moyen d'une virgule.

Vous cliquez sur "OK" pour fermer la boîte de dialogue.

Il faut ensuite ouvrir le gestionnaire de carte:  menu "Outils / Type de carte / Gestionnaire de carte".




Dans la liste, vous localisez "attiny by David A. Mellis".  Vous cliquez dans le rectangle, puis sur le bouton "Installer".


Une fois l'installation complétée, la mention "INSTALLED" s'affiche à droite des mots "attiny by David A. Mellis".




2) Transformation de l'Arduino en programmateur ISP

Nous allons maintenant transformer notre carte Arduino Uno en programmateur pour ATTiny (notez qu'il existe d'autres options; par exemple, il est possible de se procurer de petites cartes de développement ATTiny pouvant être directement branchées dans le port USB de l'ordinateur).

Dans le logiciel Arduino, ouvrez le fichier "ArduinoISP" en utilisant le menu "Fichier / Exemples / ArduinoISP".  Téléversez ce sketch dans l'Arduino.


3)  Branchements de l'ATTiny à l'Arduino

Maintenant que votre Arduino a été transformé en programmateur, nous y branchons l'ATTiny de la façon illustrée ci-dessous.
  • Pin 1 de l'ATtny:  pin 10 de l'Arduino
  • Pin 2 de l'ATtiny:  pas branchée
  • Pin 3 de l'ATtiny:  pas branchée
  • Pin 4 de l'ATtiny:  GND de l'Arduino
  • Pin 5 de l'ATtiny:  pin 11 de l'Arduino
  • Pin 6 de l'ATtiny:  pin 12 de l'Arduino
  • Pin 7 de l'ATtiny:  pin 13 de l'Arduino
  • Pin 8 de l'ATtiny:  5 V de l'Arduino
  • Condensateur de 10 µF:  broche + sur le "reset" de l'Arduino, broche "-" sur le GND de l'Arduino. 



4)  Programmation de l'ATtiny

Pour programmer l'ATTiny, nous devons choisir le bon type de carte:  menu "Outils / Type de carte / ATtiny 25/45/85" (ces options sont disponibles depuis que nous avons utilisé le gestionnaire de cartes à l'étape 1).



Ensuite, dans les options qui apparaissent dans le menu "Outil", assurez-vous que "Processeur" est bien réglé à "ATtiny85".



Je préfère laisser "Clock" à "Internal 1 MHz", car les durées sont incorrectes lorsque je le règle à 8 MHz.

Vous devez également régler "Programmateur" à "Arduino as ISP.  



Comme le veut la tradition, faisons clignoter une LED branchée à l'ATtiny.   Le plus simple est d'ouvrir  l'exemple "Blink" (Menu "Fichier / Exemples / 01.Basics / Blink") mais avant de le téléverser, dans l'ATTiny, il est nécessaire de remplacer le numéro de la pin, car l'ATTiny ne comporte pas de pin numéro 13.  Utilisez plutôt les numéros 0, 1, 2, 3 ou 4 (l'illustration ci-contre montre à quoi correspondent ces numéros sur le circuit intégré).





Vous pouvez maintenant cliquer sur le bouton "Téléverser".

Si vous branchez une LED (avec sa résistance de protection de 150 Ω ou plus) à la pin appropriée du ATTiny, elle devrait clignoter.

Voilà, il ne reste plus qu'à créer d'époustouflants montages qui ne vous coûteront presque rien.



Yves Pelletier (Twitter:  @ElectroAmateur)
Related Posts Plugin for WordPress, Blogger...