vendredi 31 juillet 2015

Firmata et Arduino 5: lecture d'une entrée analogique (python)

Récapitulons:  pour une raison ou pour une autre, vous souhaitez contrôler un Arduino grâce à un programme en python exécuté par l'ordinateur auquel est branché l'Arduino.

Dans les articles précédents, nous avons constaté que le protocole Firmata est particulièrement approprié pour cette situation; nous avons vu comment contrôler les sorties de l'Arduino (incluant la création d'un signal PWM) et comment lire ses entrées numériques.

Aujourd'hui, nous lisons les entrées analogiques de l'Arduino en utilisant pyFirmata.

Circuit

Pour tester le principe, le plus simple est de brancher un potentiomètre à l'entrée A0 de l'Arduino.  Bien sûr, ce potentiomètre peut être remplacé par n'importe quel capteur analogique (photorésistance, thermistance, etc.).



Sketch StandardFirmata et bibliothèque PyFirmata

Pour que tout fonctionne correctement, il est essentiel que le sketch "StandardFirmata" ait été téléversé dans votre Arduino, et que la bibliothèque "pyFirmata" soit installée sur l'ordinateur hôte (si ce n'est pas le cas, référez-vous au deuxième article de cette série pour plus de détails sur la façon de procéder).

Codage

Avec pyFirmata, la lecture d'une pin analogique est presque identique à la lecture d'une pin numérique.  La principale différence réside dans la définition de la pin:

        pinA0 = board.get_pin('a:0:i')

...nous utiliserions "i" à la place de "a" s'il s'agissait d'un signal numérique.

Ensuite, on utilise la fonction "read()" pour lire la valeur.  Attention:  "read()" retourne une valeur décimale entre 0 et 1 (alors qu'en langage Arduino, "analogRead()" retourne un entier entre 0 et 1023).

       pinA0.read()

Il faut également utiliser un itérateur afin d'éviter d'engorger la communication série entre l'Arduino et l'ordinateur hôte:

       it = pyfirmata.util.Iterator(board)
       it.start()


Script classique (mode texte)

Ce programme plutôt minimaliste se contente de lire la valeur de l'entrée A0 une fois par seconde et de l'afficher à l'écran.



Script utilisant Tkinter (interface graphique)

Et voici un autre script en python qui, cette fois, utilise la bibliothèque Tkinter afin de présenter le résultat dans une fenêtre; en plus de la valeur numérique, une jauge offre une indication visuelle de l'état de l'entrée A0 de l'Arduino (l'illustration ci-dessous montre le résultat dans Linux Mint).




Yves Pelletier   (TwitterFacebook)

mardi 28 juillet 2015

Brancher un haut-parleur à l'Arduino

Vous désirez produire un son ou de la musique au moyen de votre Arduino?  Ce n'est pas très compliqué, puisque la commande "tone()" permet de faire osciller n'importe quelle sortie de l'Arduino à la fréquence désirée.

Il reste à brancher à cette sortie un transducteur qui transformera cette oscillation électrique en onde sonore.  Si vous optez pour un buzzer piézo de forte impédance, pas de problème majeur: vous branchez une de ses connexions à la masse (GND) et l'autre à la sortie de l'Arduino que vous faites osciller.

Cependant, les choses se compliquent un peu si vous utilisez un haut-parleur électrodynamique, puisque la plupart d'entre eux ont une faible impédance de 8 Ω...

Supposons que vous branchez un haut-parleur de 8 Ω directement à l'une des sorties de l'Arduino, tel qu'illustré ci-dessous.  Cette sortie oscille entre une tension nulle et une tension de 5 volts.  Une application rapide de la loi d'Ohm nous permet d'estimer qu'une charge de 8 Ω soumise à une différence de potentiel de 5 volts sera traversée par un courant de 5 / 8 = 0,625 A ou 625 mA.  Le hic, c'est qu'il n'est pas conseillé de faire circuler par une sortie de l'Arduino un courant supérieur à... 20 mA.  Le branchement illustré risque donc de griller votre microcontrôleur!



Une solution possible est d'ajouter une résistance en série avec le haut-parleur de façon à ce que le courant soit de 20 mA.  Nouvelle application de la loi d'Ohm:  résistance totale = 5/0,20 = 250 Ω. Vous pouvez essayer, mais il y a fort à parier que votre haut-parleur émettra un son de très faible intensité.

Que faire alors?   Commander le haut-parleur par l'entremise d'un transistor, tout simplement.  Dans le montage illustré ci-dessous, le faible courant qui circule dans la sortie numéro 5 de l'Arduino et dans la base du transistor contrôle le courant qui circule dans le haut-parleur et à travers le trajet collecteur-émetteur du transistor.


Le courant maximal pouvant circuler dans la sortie 5 volts de l'Arduino est indépendante du microcontrôleur, elle dépend plutôt des normes USB (en supposant que votre Arduino est alimenté par son port USB) et par le fusible réarmable (polyfuse) installé sur la carte:  ce courant peut atteindre près de 500 mA sans problème (mais pas uniquement pour votre haut-parleur:  pour la totalité de la carte).

Notre calcul plus haut a montré qu'un haut-parleur  de 8 Ω soumis à une tension de 5 volts sera traversé par un courant de 625 mA, ce qui semble un peu trop élevé.  Bien sûr le transistor absorbera une petite fraction de ces 5 volts, mais  il est  quand même plus sage d'ajouter une résistance d'au moins 10 Ω en série avec le haut-parleur (j'ai personnellement utilisé 100 Ω). Cette résistance peut être un potentiomètre si vous désirez contrôler le volume du son émis.




N'importe quel transistor NPN devrait faire l'affaire, il faut simplement s'assurer qu'il peut tolérer un courant d'environ 500 mA à travers le trajet collecteur-émetteur.  Avec son courant maximal de 200 mA, le 2N3904 ne semble pas un très bon choix.  Pour la rédaction de cet article, j'ai utilisé un PN2222 (courant maximal de 500 mA).

Pour vérifier que votre circuit fonctionne convenablement, vous pouvez utiliser l'exemple "toneMelody" fourni avec l'IDE Arduino (Exemples - 02.Digital - toneMelody).  La mélodie s'exécute à l'intérieur du setup, vous pouvez donc appuyer sur le bouton "reset" si vous désirez qu'elle joue une autre fois.



Ajout (17 mai 2017):

Vous pouvez remplacer le transistor bipolaire par un MOSFET.  Le schéma ci-dessous montre un circuit utilisant un MOSFET, dans lequel on a ajouté un potentiomètre pour contrôler le volume sonore (source:  forum Arduino).



Yves Pelletier   (TwitterFacebook)

dimanche 12 juillet 2015

Mise en marche du Raspberry Pi (premier démarrage)

N.B.: Cet article, dont la première version avait été publiée le 12 juillet 2015, a été mis à jour le 21 octobre 2015 suite à la sortie de la version Jessie de Raspbian.

L'acquisition d'un Raspberry Pi 2 tout neuf me donne l'occasion de rédiger ce petit aide-mémoire concernant les réglages à effectuer lors de la première utilisation.

Ces réglages varieront nécessairement d'une  personne à l'autre, puisque nous n'utilisons pas tous le Raspberry Pi de la même façon, ni pour les mêmes raisons.  De plus, puisque les choses évoluent très rapidement dans le monde du Raspberry Pi, une bonne partie de ces informations sera peut-être désuète dans quelques mois.  Tant pis, je le fais quand même...

Est-ce qu'on a bien tout ce qu'il nous faut?

Une carte Raspberry Pi, une alimentation micro USB appropriée, une carte micro SD (ou SD si votre Raspberry Pi est un vieux modèle),  un moniteur HDMI (un téléviseur fait parfaitement l'affaire), un clavier et une souris USB, un câble ethernet ou un dongle WiFi.

Une carte de 8 Go de classe 4 est recommandée. Ça ne devrait constituer aucun problème, à moins que vous utilisiez une vieille carte:  les cartes les moins chères offertes au Walmart le plus près de chez moi sont des 8 Go de classe 10 (ce qui est plus rapide que classe 4).

Télécharger NOOBS et l'installer sur la carte micro SD

Au moyen d'un ordinateur (peu importe son système d'exploitation), on se rend d'abord sur le site web officiel de Raspberry Pi  afin de télécharger le système d'exploitation.  NOOBs rend l'installation ridiculement facile.  Il s'agit d'un fichier de près de 750 Mo, mais le transfert n'est pas d'une grande rapidité (une trentaine de minutes dans mon cas).



On extrait le contenu du fichier zip, et on copie dans la carte micro SD le contenu du dossier décompressé.


Premier démarrage du Raspberry Pi

La carte micro SD est maintenant prête à être insérée dans le Raspberry Pi, qui est déjà branché à un écran HDMI, un clavier USB, une souris USB et à un routeur  (au  moyen d'un câble ethernet ou d'un dongle WiFi).  Le Raspberry Pi  démarrera automatiquement lorsque vous brancherez son alimentation.

Lors de ce premier démarrage, Noobs se chargera d'installer et de configurer le système d'exploitation approprié sur la carte micro SD.  Si vous voyez une framboise apparaître à l'écran, tout va bien...



Un dialogue vous permet de choisir l'installation de Raspbian.  Dans le bas de l'écran, vous pouvez immédiatement sélectionner la langue et le type de clavier (ça peut être fait plus tard si vous oubliez d de le faire, ou si vous vous trompez d'option).



Ensuite il faut patienter un bonne vingtaine de minutes, pendant que le système d'exploitation s'installe...



Quand c'est terminé ("OS installed successfully"), un clic sur le bouton "OK" provoque un redémarrage du Raspberry Pi.  Cette fois, vous accédez au bureau.



Réglage du WiFi

La version Jessie de Raspbian présente une icône de réseau située en haut à droite de l'écran.  Si votre Raspberry Pi est doté d'un dongle WiFi, un clic sur cette icône vous présentera une liste des points d'accès disponibles.



Sans trop de surprise, il s'agit de cliquer sur le nom du point d'accès désiré pour que Raspbian vous demande d'entrer votre mot de passe.



Une fois branché au réseau, vous pouvez placer le pointeur de la souris au-dessus de cette icône pour connaître votre adresse ip.



Logiciel de configuration

Un logiciel intitulé "Raspberry Pi Configuration" remplace maintenant l'antique "Raspi-config". Vous y accédez à partir du menu de Raspbian, dans la catégorie "Préférences".



L'onglet "Localisation" est particulièrement important:  vous pouvez y réglez votre fuseau horaire, langage, clavier, etc.


L'onglet "Interfaces" vous permet d'activer les protocoles SPI et I2C, ce qui pourrait être utile si vous désirez brancher des capteurs à vos pins GPIO.



Mise à jour

Assurons-nous que notre système d'exploitation et nos applications sont bien à jour.  Pour ce faire, nous démarrons le terminal en cliquant sur un bouton qui se trouve en haut de l'écran.




Une fois dans le terminal, vous écrivez:

             sudo apt-get update

... et vous appuyez sur la touche enter.

Lorsque le terminal affiche à nouveau "pi@raspberrypi $", vous écrivez:

            sudo apt-get upgrade

Cette mise à jour peut prendre plusieurs minutes, ou même plusieurs dizaines de minutes.

Installation d'un serveur VNC?

Si vous désirez utiliser votre Raspberry Pi à partir d'un autre ordinateur (ce qui n'est certainement pas le cas de tout le monde), il faut que le SSH soit activé (nous l'avons fait dans raspi-config).  Mais c'est encore mieux si vous pouvez voir et contrôler l'interface graphique du Raspberry Pi sur un autre ordinateur branché à votre réseau domestique.  Si ce genre de truc vous intéresse, il faut installer un serveur VNC sur le Raspberry Pi.

Pour ma part, j'utilise "tightvncserver".  Pour l'installer, on écrit ceci dans le terminal:

          sudo apt-get install tightvncserver

Lorsqu'on veut démarrer le logiciel (ce qui est nécessaire lorsqu'on veut établir une connexion à partir d'un autre ordinateur), on écrit:

          tightvncserver

Il faudra aussi installer un client VNC sur l'autre ordinateur.

(Je me rend compte qu'il y a beaucoup à dire concernant l'accès au Raspberry Pi à partir d'un ordinateur distant:  je tâcherai d'écrire un article là-dessus).


Pas de son?

J'ai rapidement constaté qu'aucun son n'était émis par mon téléviseur, malgré le fait que j'avais choisi "son par HDMI" dans raspi-config.  Le remède à ce problème consistait à éditer le fichier de configuration:

          sudo nano /boot/config.txt

...et à décommenter la ligne "hdmi_drive=2"

(il faut ensuite faire contrôle-x pour enregistrer les modifications, et redémarrer le Raspberry Pi pour que les changements au fichier deviennent effectifs).

Yves Pelletier   (TwitterFacebook)

samedi 11 juillet 2015

Firmata et Arduino 4: Lecture de l'état d'une entrée numérique (Python)

Dans les premiers articles de cette série concernant la communication entre un ordinateur et un Arduino au moyen de pyFirmata, nous avons eu l'occasion d'apprendre comment contrôler l'état d'une sortie numérique de l'Arduino, incluant l'émission d'un signal PWM.  Aujourd'hui, nous allons explorer la lecture de l'état d'une entrée numérique de l'Arduino.

Le circuit

Construisons un circuit simple qui nous permettra de modifier l'état de la pin numéro 5 de l'Arduino.  Je vous propose ce bouton poussoir associé à une résistance de tirage.  La pin sera à l'état logique haut (5 V) lorsque le bouton sera enfoncé, et à l'état logique bas (0 v) lorsque le bouton sera relâché.


Si vous êtes vraiment très pressé, vous pouvez laisser tomber le bouton poussoir et vous contenter de relier directement la pin 5 à la pin 5 V (lorsque vous désirez la mettre à l'état logique haut), ou à la pin GND (lorsque vous désirez la mettre à l'état logique bas). 

Bibliothèque PyFirmata, etc.

Nous supposons que le sketch "StandardFirmata" a été téléversé dans votre Arduino, et que la bibliothèque pyFirmata a déjà été installée sur l'ordinateur hôte (si ce n'est pas le cas, référez-vous au deuxième article de cette série pour plus de détails sur la façon de procéder).

Rédaction d'un script en python

Commençons par un simple script qui affichera à l'écran l'état de la pin numéro 5 de l'Arduino chaque fois quelle sera modifiée.

Lorsqu'on appuie sur le bouton, le message "Le bouton est enfoncé" s'affiche à l'écran.  Lorsqu'on relâche le bouton, le message "Le bouton est relâché" s'affiche à l'écran.


Il faut configurer la pin numéro 5 en entrée numérique au moyen de cette commande:

      pin5 = board.get_pin('d:5:i')

La syntaxe est "d" pour digital, "5" est le numéro de la pin, et "i" pour input.

Ensuite on pourra lire l'état de la pin au moyen de cette commande:

      valeur = pin5.read()

... qui retourne "1" lorsque l'entrée est à 5 V, et "0" lorsqu'elle est à 0 V.

Il faut aussi utiliser un itérateur prévu dans pyFirmata pour éviter qu'un trop grand nombre de mesures n'encombrent la communication série entre l'Arduino et l'ordinateur:

       it = pyfirmata.util.Iterator(board)
       it.start()


Deuxième script en python:  interface graphique

Ce deuxième programme est similaire mais, grâce à Tkinter, il affiche l'état de la pin numéro 5 dans une fenêtre.  En guise d'effet visuel supplémentaire, j'ai ajouté un carré qui est vert quand le bouton est enfoncé, et rouge quand le bouton est relâché. 





L'utilisation de la commande "after" permet de mettre à jour cette valeur de façon répétitive, sans que l'utilisateur soit obliger de cliquer sur un bouton.


Yves Pelletier   (TwitterFacebook)

lundi 6 juillet 2015

Fabrication d'une antenne de télé

(D'abord une petite mise en garde:  j'habite en Amérique du Nord et je n'ai fait aucune recherche pour vérifier si mon antenne serait d'une quelconque  utilité dans d'autres coins du monde comme, par exemple, en Europe ou en Afrique).

Je ne passe pas beaucoup de temps devant mon téléviseur.  Pour cette raison, je ne vois pas beaucoup d'intérêt à débourser plusieurs dizaines de dollars par mois pour avoir accès à plusieurs dizaines de canaux spécialisés que je ne regarderai probablement pas (et je ne suis visiblement pas le seul). 

Je me contente donc de capter les chaînes gratuites, d'autant plus que, depuis le passage du signal analogique au signal numérique (qui a eu lieu en 2011 au Canada), l'image obtenue est de très grande qualité.

Depuis de nombreuses années (ça date de l'époque analogique), j'utilisais une petite antenne intérieure conventionnelle, qui combine  des "oreilles de lapin" pour les chaînes VHF, et un anneau de forme elliptique pour les chaînes UHF.  Je captais 9 chaînes différentes, mais pour certaines d'entre elles je perdais temporairement le signal lorsque quelqu'un marchait à l'étage du dessus (!).  Certaines chaînes fonctionnaient à la condition de tourner le bouton d'amplification au maximum, alors que la plupart des autres fonctionnaient à la condition que l'amplification soit inactive...

 Alors quand j'ai vu les instructions pour fabriquer sa propre antenne au moyen de 6 cintres de métal, je me suis dit:  essayons, ça semble amusant...

Effectivement, la fabrication de l'antenne s'est révélée d'une extrême simplicité:  on coupe quelques cintres (n'importe quel gros fil coducteur ferait l'affaire), on leur fait prendre la forme d'un "V", et on les visse sur une base en bois.  Mon seul investissement a été le petit transformateur VHF/UHF  75 Ω/300 Ω (je croyais pourtant en avoir un quelque part dans mes tiroirs, mais je ne l'ai pas trouvé).



Verdict:  ça fonctionne un peu mieux que mon antenne initiale.  Je capte 4 chaînes supplémentaires, pour un total de 13 chaînes gratuites, et la réception semble moins hasardeuse qu'avant. 

Voilà, je ne me donne pas la peine de rédiger des instructions détaillées, puisque j'ai simplement suivi celles-ci.


Yves Pelletier   (TwitterFacebook)