mercredi 1 février 2017

Une interface graphique pour contrôler les sorties du Raspberry Pi (Python / Tkinter)

Cet article a été mis à jour le 1er novembre 2020 afin d'être pleinement compatible avec Python 3.

Il y a quelques années, j'avais partagé quelques scripts en Python permettant d'interagir avec les pins GPIO du Raspberry Pi.  Dans cette nouvelle version, j'utilise la bibliothèque Tkinter afin de réaliser en Python un programme comportant une interface graphique.


Lors de l'exécution du programme, une fenêtre comportant 3 cases à cocher s'affiche à l'écran.  Il s'agit de cocher une case pour que la pin GPIO correspondante se mette à l'état logique "haut", et de décocher la case pour que la pin GPIO correspondante se mette à l'état logique "bas".


Le circuit

Afin de pouvoir visualiser facilement l'état logique des pins GPIO, une LED associée à une résistance de protection est branchée à chacune des broches suivantes:  GPIO 2, GPIO 3 et GPIO 4 (notation BCM).

Évidemment, il est facile de modifier le programme afin d'utiliser d'autre sorties.


Le script

Deux bibliothèques sont essentielles au bon fonctionnement de notre programme, et elles sont toutes deux incluses par défaut avec Python dans la distribution de base de Raspbian:  il s'agit de RPi.GPIO et de Tkinter.

Avec la commande "fenetre.geometry("250x150+300+300")", nous créons un objet fenêtre, que nous nommons "fenetre", dont les dimensions initiales sont 250 pixels de large et 150 pixels de hauteur, et positionnée à 300 pixels à droite du côté gauche de la fenêtre, et 300 pixels plus bas que le haut de la fenêtre.

Chaque case à cocher est associée à une variable ainsi qu'à une procédure ("command"):

"bouton = Checkbutton(fenetre, text="GPIO 2", variable=gpio2, command=miseAjour)".

La variable "gpio2" prend automatiquement la valeur "1" lorsque la case est cochée, et "0" lorsque la case n'est pas cochée (c'est géré automatiquement par la bibliothèque).

La routine "miseAjour" se met en branle chaque fois qu'une des cases à cocher est cliquée (que ce soit pour la cocher, pour pour la décocher).  Cette routine règle le niveau logique des broches GPIO 2, 3 et 4 à la valeur de la variable qui leur est associée (gpio2, gpio3 et gpio4).



Yves Pelletier   (TwitterFacebook)

vendredi 27 janvier 2017

Fabrication d'un petit traqueur solaire


Je vous propose aujourd'hui la construction d'un petit traqueur solaire, c'est à dire un dispositif qui tourne sur lui-même afin de toujours faire face à la direction d'où provient la lumière.

Le montage est constitué de composants classiques (aucun microcontrôleur): 
  • Un moteur à courant continu.  Il m'a semblé préférable d'utiliser un modèle dont la vitesse de rotation est réduite par un système d'engrenages, du genre qu'on utilise pour entraîner les roues d'une base robotique.
  • Une paire de photorésistances
  • Deux amplificateurs opérationnels sur le même circuit intégré.  J'ai utilisé un modèle CA1458 (identique à LM1458).
  • Deux transistors NPN et deux transistors PNP.  J'ai choisi les modèles 2N4401 et 2N4403, qui m'avaient donné de bons résultats dans une expérience similaire.
  • Quelques diodes, résistances et potentiomètres.

Circuit et principe de fonctionnement

Il s'agit d'un circuit classique, j'ai utilisé la version publié sur le site de CdS Electronics, qui vendent un kit pour le réaliser, si par hasard vous ne disposez pas du matériel nécessaire.  J'ai indiqué sur ce schéma une tension d'alimentation de 12 V, dans les faits j'ai utilisé une pile de 9 V car c'était plus pratique (pour éviter les fils qui s'emmêlent, il est pratique que tout le circuit, incluant l'alimentation, soit superposé au moteur de façon à ce que tout tourne ensemble).


Voyons voir comment ça fonctionne...  Du côté gauche du schéma, les deux photorésistances sont branchées en série.  Si les deux photorésistances sont éclairées exactement de la même façon, la tension au point A sera de 6 V.  Mais si la photorésistance 1 reçoit plus de lumière que la photorésistance 2, la tension au point A deviendra supérieure à 6 V.  Si la photorésistance 2 reçoit plus de lumière que la photorésistance 1, c'est le contraire:  la tension au point A devient inférieure à 6 V.  Notez que le point A est branché à la fois à l'entrée non-inverseuse de l'amplificateur A, et à l'entrée inverseuse de l'amplificateur B.

Jetons maintenant un oeil un peu plus à droite:  4 résistances sont également branchées en série:  un potentiomètre de 100 kΩ, une résistance fixe de 15 kΩ, un potentiomètre de 20 kΩ et une résistance fixe de 47 kΩ.

Le potentiomètre de 100 kΩ sert à assurer la symétrie de votre circuit:  vous ajustez sa valeur pour que le circuit demeure immobile lorsque la lumière se trouve droit devant lui.  Le potentiomètre de 20 kΩ sert à ajuster la sensibilité du circuit:  plus sa valeur est faible, plus le circuit sera "nerveux" et impatient de changer d'orientation.  Plus la résistance de ce potentiomètre est grande, plus votre circuit exigera une grande différence de luminosité avant de se donner la peine de tourner.

Une fois les deux potentiomètres réglés à leur valeur optimale, la tension au point B et la tension au point C conserveront une valeur constante, qui ne dépendra pas de l'éclairement.   De plus, si vous observez ce groupe de 4 résistances, vous devriez convenir que la tension du point B est toujours plus élevée que la tension du point C.

Nous disposons maintenant de suffisamment d'informations pour analyser le comportement des deux amplificateurs opérationnels.  L'absence de rétroaction nous permet de conclure qu'ils agissent tous les deux en comparateurs de tension (j'ai déjà écrit un article sur les comparateurs de tension, si vous voulez en savoir un peu plus sur le sujet).

La sortie de l'amplificateur A sera d'une dizaine de volts si la tension du point A devient plus élevée que celle du point B, et nulle si c'est le contraire.

La sortie de l'amplificateur B sera d'une dizaine de volts si la tension du point A devient moins élevée que celle du point C, et nulle si c'est le contraire.

Il ne reste plus qu'à parler de la partie droite du circuit, qui est constituée du moteur, de 4 transistors et de 4 diodes:  il s'agit d'un pont en H, un circuit spécialement conçu pour permettre à un moteur électrique de tourner dans deux directions différentes.  Je n'analyserai pas en détail cette partie du circuit, je vous réfère plutôt à cet article sur le pont en H.

Nous pouvons constater que 3 situations sont possibles:
  • Si l'éclairement est similaire pour les deux photorésistances, la tension du point A aura une valeur plus petite que la tension du point B, et plus grande que la tension du point C.  La sortie de l'amplificateur A (point D) sera nulle, et la sortie de l'amplificateur B (point E) sera nulle aussi.  Par conséquent, le moteur ne tourne pas.
  • Si la photorésistance 1 est plus éclairée que la photorésistance 2, la tension du point A devient plus grande que la tension du point B.  La sortie de l'amplificateur A (point D) devient environ 10 V, alors que la sortie de l'amplificateur B (point E) est nulle.  Le moteur tourne dans une direction.
  • Si la photorésistance 2 est plus éclairée que la photorésistance 1, la tension du point A devient plus petite que la tension du point C.  La sortie de l'amplificateur A (point D) est nulle, alors que la sortie de l'amplificateur B (point E) prend une valeur d'environ 10 V.  Le moteur tourne dans l'autre sens.



Voici une vidéo du traqueur solaire pendant qu'on déplace une lampe autour de lui:


  

Yves Pelletier   (TwitterFacebook)



mardi 24 janvier 2017

Tracer la courbe caractéristique d'une diode grâce à Arduino

Je vous explique aujourd'hui comment j'ai utilisé une carte Arduino Uno pour tracer la courbe caractéristique du courant en fonction de la tension (I = f(U)) pour plusieurs types de diodes en polarisation directe.

Tout d'abord, un tout petit peu de théorie

Comme vous le savez probablement, une diode est un composant qui laisse circuler le courant dans une direction, mais le bloque dans l'autre direction.

Mais en polarisation directe, une tension minimale est nécessaire pour que la diode conduise le courant:  c'est la tension de seuil.  Aussi longtemps que la tension de la diode est inférieure à la tension de seuil, le courant demeure négligeable.

La courbe caractéristique d'une diode montre comment se comporte le courant traversant la diode pour différentes tensions.

La méthode traditionnelle pour obtenir cette courbe consisterait à construire un circuit constitué d'une source de tension variable, d'une diode et d'une résistance.  Au moyen d'un multimètre, on mesure le courant dans le circuit et la tension aux bornes de la diode à mesure qu'on augmente la tension de la source.

J'ai choisi d'automatiser le processus en utilisant une carte Arduino qui sert à la fois de source de tension variable et d'appareil de mesure.

Le circuit utilisé

La partie la plus compliquée consiste à produire au moyen de l'Arduino une tension continue pouvant prendre différentes valeurs entre 0 et 5 V.  Heureusement, nous avions déjà traité ce sujet par le passé, et deux fois plutôt qu'une:  sortie PWM associée à un filtre passe-bas et un réseau R2R.

J'ai opté pour une sortie PWM associée à un filtre passe-bas, puisque ça nécessite moins de composants qu'un réseau R2R de 16 résistances.

La sortie 11 de l'Arduino est donc reliée à un filtre passe-bas constitué d'une résistance de 15 kΩ et d'un condensateur de 1 µF.  Sans trop de surprise, un amplificateur opérationnel branché en suiveur de tension s'est révélé nécessaire pour isoler la source de tension du reste du circuit (j'ai opté pour un lm358 alimenté par une source de tension externe de 10 V).


La sortie 11 de l'Arduino peut ainsi fournir une tension continue pouvant prendre n'importe quelle valeur entre 0 et 5 V.

Cette tension servait ensuite à alimenter un circuit constitué d'une diode (dont on cherchait à mesurer les caractéristiques) en série avec une résistance (dont la valeur était choisie de façon à ne pas trop s'approcher du courant maximal de 40 mA pouvant être supporté par une entrée/sortie de l'Arduino).

Il ne reste plus qu'à mesurer la tension à deux endroits dans le circuit:  à la sortie de l'amplificateur opérationnel et entre la résistance et la diode.

Si vous préférez la version Fritzing:



Le sketch

Le sketch est plutôt simple:  il produit une tension modulée en largeur d'impulsion (PWM) à la sortie numéro 11, avec un rapport cyclique de plus en plus élevé à chaque passage dans la boucle principale. Grâce à notre filtre, cette tension deviendra une tension continue qui augmente progressivement à chaque passage dans la boucle principale.

La tension aux bornes de la diode et la tension aux bornes de la résistance sont ensuite affichées dans le moniteur série (pour la résistance, on soustrait les deux tensions mesurées de part et d'autre).

Ces données demeurent sous forme brute (c'est à dire une valeur entière située entre 0 et 1023). J'avais d'abord fait un sketch qui faisait la conversion en volts et en ampères, mais les valeurs comportant un point décimal n'étaient pas compatibles avec ma version française d'Excel.


La saisie de données commence automatiquement, et s'interrompt lorsque la tension fournie par la pin 11 est de 5 V.  Il s'agit d'appuyer sur le bouton "reset" ou d'afficher la fenêtre du moniteur série pour reprendre une nouvelle série de mesures.


Traitement des données dans Excel

Puisque les deux tensions sont séparées par une tabulation, il s'agit de copier le contenu entier du moniteur série et de le coller dans Excel pour qu'elles se répartissent automatiquement sur deux colonnes.

Il ne reste plus qu'à convertir en volts la tension de la diode, et à appliquer la loi d'Ohm à la résistance pour connaître le courant en milliampères.

Tension de la diode en volts = (valeur de la colonne 1) * 5 / 1024

Courant à travers la diode = (valeur de la colonne 2) * 5 *  1000/ (1024 * 270 Ω)

Les résultats

D'abord, la courbe d'une diode au silicium 1N4003.  Un faible courant devient perceptible à partir d'une tension d'environ 0,5 V,  et la tension plafonne ensuite aux abords de 0,7 V peu importe la valeur du courant.   La tension de seuil est d'environ 0,7 V, tel que prévu



Maintenant, une diode Schottky 1N5817:  la tension de seuil est beaucoup plus faible que pour la diode au silicium:  environ 0,3 V.


Essayons maintenant quelques diodes électroluminescentes.  Plus la longueur d'onde émise est faible, plus la tension de seuil est grande.

Donc une LED infrarouge a une tension de seuil bien inférieure à 1,5 V:



... alors que la tension de seuil d'une LED rouge se situe entre 1,5 V et 2,0 V.

Pour une LED jaune, ça tourne autour de 2,0 V:


On dépasse un peu 2 V pour une LED verte:



Et puisque chaque photon de couleur bleue doit transporter beaucoup d'énergie, la tension de seuil dépasse nettement 3 V pour une LED bleue.


Terminons par un résultat qui m'a surpris:  une diode au germanium 1N34A commence à conduire à une tension beaucoup plus faible qu'une diode au silicium, mais ensuite la courbe est beaucoup moins abrupte que pour tous les autres types de diode.  Le graphique n'est pas très éloigné de la droite qu'on obtiendrait pour une résistance!:

Yves Pelletier   (TwitterFacebook)