Contrôler un servo avec Raspberry Pi Pico W et PWM
Un servo est l'un des moyens les plus fondamentaux pour apprendre à utiliser la modulation de largeur d'impulsion (PWM) avec le Raspberry Pi. Dans cet article, je vais vous montrer comment le faire avec un Raspberry Pi Pico W.
Objectifs du tutoriel PWM
- Apprenez à utiliser le PWM pour contrôler l'angle du servo.
- Configurer un serveur avec le Pico W
- Le serveur fournit une page web avec un curseur pour contrôler le servo.
Pièces nécessaires
- Raspberry Pi Pico W avec en-têtes
- Fil de liaison
- Servo (nous utilisons le micro servo Tower Pro SG90)
Qu'est-ce que la modulation de largeur d'impulsion ?
Les enfants trouvent amusant d'allumer et d'éteindre les lumières à plusieurs reprises.
Pour eux, c'est tellement amusant de voir les lumières s'allumer et s'éteindre lorsqu'ils actionnent l'interrupteur. Les parents ne trouvent peut-être pas cela amusant, mais c'est un moment d'apprentissage pour nous tous.
Si vous ou vos enfants avez fait cela, alors vous avez fait l'expérience d'une forme primitive de modulation de largeur d'impulsion.
Avec un Raspberry Pi, vous pouvez facilement faire cela de manière automatisée. En gros, vous indiquez au Raspberry Pi combien de fois vous voulez que les choses soient allumées pendant une période donnée.
Cela vous permet de faire varier l'intensité des LED :
De plus, cela vous permet de contrôler l'angle du bras du servo.
Un concept important du PWM : le rapport cyclique
Le cycle d'utilisation est essentiellement le temps pendant lequel le circuit reste "haut", ce qui signifie qu'il est allumé.
Donc, supposons que votre circuit est allumé la moitié du temps. Nous pouvons donc dire que le rapport cyclique est de 50%.
S'il est allumé en permanence, son cycle d'utilisation sera de 100%, et inversement, s'il est éteint en permanence, il aura un cycle de 0 %.
Pour revenir à l'exemple d'un enfant qui allume et éteint les lumières à un rythme régulier, la raison pour laquelle les lumières ne s'allument pas complètement ou ne s'éteignent pas complètement est que nous ne délivrons une tension de sortie que pendant une partie spécifique du temps.
Pour une DEL, cela signifie que la DEL est allumée pendant un certain temps, puis que l'alimentation est tirée, puis que l'alimentation est à nouveau fournie, et ainsi de suite.
Ainsi, la LED ne s'allume jamais assez pour atteindre sa pleine luminosité, et n'a pas non plus le temps de s'éteindre complètement.
Servocommande SG90 avec PWM
Il faut être prudent ici car tous les servos ne fonctionnent pas de la même façon. Ce tutoriel est spécifique au micro servo Tower Pro SG90.
Le SG90 a une rotation de 180 degrés, mais certains servos sont des servos de 120 degrés. Les servos de radiocommande de loisir sont le plus souvent des servos de 120 degrés, donc assurez-vous de vérifier la fiche technique du servo que vous voulez manipuler car il est possible d'endommager les servos si vous leur donnez un signal hors de portée.
Voici la fiche technique du SG90, de Luxor Parts :
La fiche technique vous indique deux choses importantes : quelle couleur correspond au positif, à la masse et au signal et la fréquence d'impulsion/le rapport cyclique.
- Marron = négatif
- Rouge = positif
- Orange = signal
Et pour la fréquence d'impulsion/le rapport cyclique
- Vous devrez avoir un rapport cyclique de 20 ms ou 50 Hz.
- Un signal de 1ms = zéro degré
- Un signal de 2ms = 180 degrés de rotation
Cela signifie que toutes les ms, le servo va chercher une mise à jour. Si vous continuez à lui envoyer un signal de 2 ms, il restera en rotation complète (180 degrés). Si vous passez à 1,5 ms, il fera une rotation de 90 degrés, et à 1 ms, il fera une rotation de zéro degré.
Connexion du servo au Pico W
Afin d'utiliser notre code, vous devez brancher le fil de signal vers GPIO 0. Le fil de signal est le fil orange sur le SG90.
Ensuite, connectez le fil rouge à VBUS (ce qui vous donne 5V). Comme vous pouvez le voir sur la fiche technique, la tension de fonctionnement du SG50 est de 4,8V à 6V, donc la broche 3,3V du Pico W ne fonctionnera pas.
Codage de la servocommande du Pico W
Vous pouvez trouver le code ici sur notre GitHub.
Passons en revue le code.
Sur main.pyqui est une convention de dénomination pour le fichier que nous voulons exécuter au démarrage, nous créons une classe pour le servo et l'instancions :
class Servo:
def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
self.pwm = machine.PWM(machine.Pin(pin))
self.pwm.freq(freq)
self.MIN_DUTY = MIN_DUTY
self.MAX_DUTY = MAX_DUTY
def rotateDeg(self, deg):
if deg < 0:
deg = 0
elif deg > 180:
deg = 180
duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
self.pwm.duty_ns(duty_ns)
servo = Servo()
La classe Servo utilise la classe machine.PWM disponible dans MicroPython. Voir la documentation ici.
Dans cet exemple, nous utilisons le Pico W comme point d'accès. Voici le code pour y parvenir :
ssid = 'Servo-Control'
password = 'PicoW-Servo'
ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)
while ap.active() == False:
pass
print('Connection successful')
print(ap.ifconfig())
Comme vous pouvez le voir dans les deux premières lignes, le SSID que vous recherchez est le suivant Servo-Contrôle et le mot de passe est PicoW-Servo.
Une fois que vous vous êtes connecté au réseau WiFi, vous pouvez accéder à l'adresse IP du Pico W, qui est par défaut 192.168.4.1. Vous pouvez également consulter le journal de Thonny pour connaître l'adresse IP de votre Pico.
Comment la page web communique-t-elle avec le servo ?
Lorsque vous vous connectez à l'adresse IP du Pico W, vous recevez le fichier index.html, qui se trouve sur le dépôt Github.
Le fichier index.html contient ces lignes importantes :
<form id="form">
<input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
<output></output>
</form>
Comme vous pouvez le voir, il y a un objet qui est le curseur.
Il existe également une qui affiche le degré de rotation.
La partie JavaScript met à jour le ainsi que l'URL afin que le Pico W puisse capturer les données et faire tourner le servo.
Les éléments et ont un parent .
Voici le script sur le front-end,