Apprenez à contrôler la luminosité d'une LED connectée à un Raspberry Pi à l'aide de PWM.
Le PWM est quelque chose que nous utilisons tous quotidiennement, même si nous ne le savons pas. C'est une technique simple et incroyablement utile dans une gamme d'applications. Mieux encore, c'est quelque chose que votre Raspberry Pi peut faire sans transpirer. Comment? Nous allons jeter un coup d'oeil.
Qu’est-ce que le PWM?
Comme le dit la terminologie, « Modulation de largeur d'impulsion » semble plutôt sophistiquée. Mais tout ce dont nous parlons ici, c'est d'éteindre et de rallumer un signal électrique, extrêmement rapidement. Pourquoi pourrions-nous vouloir faire cela? Tout simplement parce que c'est un moyen très simple de simuler un signal analogique variable, sans recourir à Chapeaux Raspberry Pi, modules complémentaires, ou des circuits supplémentaires. Pour certaines applications, comme chauffer un poêle, piloter un moteur ou atténuer une LED, un signal PWM est littéralement impossible à distinguer d'une « vraie » tension analogique.
Cycles de service
Nous avons donc une série d'impulsions introduites dans une charge (la chose que nous conduisons). Cela seul n'est pas très utile, jusqu'à ce que nous commencions à changer (ou à moduler) la largeur de ces impulsions. La phase « marche » d'une période marche-arrêt donnée peut occuper entre 0 et 100 % du cycle total. Nous appelons ce pourcentage le cycle de service.
Par exemple, supposons que nous ayons un signal PWM 3 V avec un rapport cyclique de 50 %. La quantité moyenne d'énergie traversant la LED équivaudrait à un signal toujours actif de 1,5 V. Augmentez le cycle de service et la LED devient plus lumineuse; diminuez-le et la LED s'atténue. Nous pouvons générer de l'audio en utilisant la même méthode. C'est pourquoi la sortie audio de votre Raspberry Pi peut cesser de fonctionner si vous utilisez PWM pour d'autres choses.
PWM sur le Raspberry Pi
Vous pouvez utiliser le logiciel PWM sur chaque broche GPIO du Raspberry Pi. Mais le PWM matériel n'est disponible que sur GPIO12, GPIO13, GPIO18, et GPIO19.
Quelle est la différence? Eh bien, si vous utilisez un logiciel pour générer le signal, vous consommerez des cycles CPU. Cependant, votre processeur a peut-être mieux à faire que de dire à une LED de s'éteindre et de s'allumer plusieurs centaines de fois par seconde. En fait, il pourrait être distrait et enlisé par d'autres tâches, ce qui pourrait sérieusement perturber vos timings PWM.
Par conséquent, il est souvent préférable de déléguer la tâche à des circuits spécialisés. Dans le cas du Raspberry Pi, ce circuit réside à l'intérieur le système sur puce qui abrite le processeur. Le PWM matériel est souvent beaucoup plus précis et pratique, et constitue donc l'option préférée dans la plupart des cas. Si vous voulez une idée de ce qui se passe sous le capot de la puce Broadcom BCM2711 du Raspberry Pi 4, vous pouvez consulter la documentation du BCM2711. Le chapitre 8 couvre les trucs PWM !
Gradation d'une LED
Pour que notre LED fonctionne avec notre Raspberry Pi, nous devrons faire une maquette. Cela signifie deux composants: la LED elle-même et une résistance de limitation de courant, que nous connecterons en série avec elle. Sans la résistance, votre LED risque de mourir dans un souffle de fumée nauséabond si trop de courant la traverse.
Calculer la valeur de la résistance
Peu importe à quelle extrémité de la LED vous connectez la résistance. Ce qui compte c'est la valeur de la résistance. Le Raspberry Pi 4 peut fournir environ 16 milliampères par broche. Afin que nous puissions utiliser la loi d'Ohm pour déterminer la valeur de la résistance nécessaire.
Cette loi stipule que la résistance doit être égale à la tension par rapport au courant. Nous connaissons la tension sortant de la broche GPIO du Pi (3,3 V) et nous savons quel devrait être le courant (16 milliampères ou 0,016 ampères). Si nous divisons le premier par le second, nous obtenons 206,25. Maintenant, puisque vous aurez du mal à trouver des résistances de cette valeur, optons plutôt pour du 220 ohms.
Connectez l'anode de la LED (jambe longue) à GPIO18 (qui est la broche physique 12 du Raspberry Pi). Connectez la cathode (jambe courte) à l'une des broches de terre du Pi. N'oubliez pas la résistance, quelque part sur le chemin. Vous êtes maintenant prêt à partir !
Implémentation de PWM sur Raspberry Pi
Pour faire fonctionner le PWM matériel sur Raspberry Pi, nous utiliserons le bibliothèque rpi-hardware-pwm de Cameron Davidson-Pilon, adapté de code de Jeremy Impson. Ceci a été utilisé dans le Pioréacteur (un bioréacteur basé sur Pi) – mais c'est assez simple pour nos besoins.
Tout d'abord, commençons modifier le config.txtfichier, trouvé dans le /boot annuaire. Il suffit d'ajouter une ligne: dtoverlay=pwm-2chan. Si nous voulions utiliser des broches GPIO autres que 18 et 19, nous pourrions ajouter ici quelques arguments supplémentaires. Pour l’instant, gardons les choses simples.
Redémarrez votre Pi et exécutez :
lsmod | grep pwm
Cette commande répertorie tous les modules chargés sur la partie centrale de l'OS, appelée noyau. Ici, nous les filtrons pour trouver uniquement les éléments PWM, en utilisant le grep (c'est la commande "impression d'expression régulière globale").
Si pwm_bcm2835 apparaît parmi les modules répertoriés, alors nous sommes sur la bonne voie. Nous avons presque fini de préparer! Il ne reste plus qu'à installer la bibliothèque proprement dite. Depuis le terminal, exécutez :
sudo pip3 install rpi-hardware-pwm
Nous sommes maintenant prêts à commencer.
Codage du circuit LED PWM
Il est temps de se salir les mains avec un peu de codage en Python. Lancez Thonny et copiez le code suivant. Puis frappe Courir.
from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()
Tout va bien, vous verrez la LED devenir progressivement plus lumineuse jusqu'à ce que le je la variable du compteur atteint 100. Ensuite, il s'éteindra. Que se passe t-il ici? Passons en revue.
Nous importons le morceau pertinent de la bibliothèque matérielle PWM (avec le temps module) et déclarer une nouvelle variable. Nous pouvons définir le pwm_channel à 0 ou 1, qui correspondent respectivement aux broches GPIO 18 et 19 du Pi.
Le Hz valeur que nous pouvons définir à la fréquence que nous souhaitons (même si nous sommes finalement limités par la vitesse d’horloge du Pi). À 60 Hz, nous ne devrions voir aucun scintillement PWM. Mais cela pourrait être une bonne idée de commencer avec une valeur très faible (comme 10) et de faire évoluer progressivement les choses. Faites cela et vous pourrez réellement voir les impulsions se produire. Ne vous contentez pas de nous croire sur parole !
Nous travaillons notre cycle de service (je) jusqu'à 0 à 100 en utilisant une boucle Python for. Il convient de noter que nous pouvons définir le le sommeil de temps argument aussi longtemps que nous le souhaitons - puisque le PWM est géré matériellement, il fonctionnera en coulisses, aussi longtemps que nous disons au programme d'attendre.
Il y a plus à apprendre avec PWM
Toutes nos félicitations! Vous avez écrit votre premier programme PWM. Mais, comme c'est souvent le cas avec le Raspberry Pi, vous pouvez faire beaucoup de choses avec ce genre de choses, surtout si vous augmentez votre Raspberry Pi avec le bon HAT PWM. Alors ne vous contentez pas d’une seule petite LED. Vous pouvez utiliser ce nouveau pouvoir pour contrôler des moteurs, coder des messages et générer des tonalités de synthétiseur. Un monde de modulation vous attend !