- 1. Le matériel utilisé
- 2. Principe de fonctionnement du servomoteur 360°
- 3. La librairie servo360
- 4. Premier projet
- 5. Deuxième projet
1. Le matériel utilisé
Nous utiliserons les composant suivants :
- une carte Shield Grove pour Pi Pico,
- un Pi Pico avec son câble USB-MicroUSB,
- un potentiomètre du système Grove,
- un servomoteur 360° Geekservo,
- un câble avec pin femelle du système Grove,
- quelques jumpers mâle-mâle.
Nous utiliserons le micrologiciel Micropython.
2. Principe de fonctionnement du servomoteur 360°
Je ne vais pas vous faire un cours théorique sur le PWM (modulation de largeur d'impulsion), d'autres le font mieux que moi. Je vais être plus pratico pratique. Je vais me servir de la librairie python pour le servomoteur de l'article Le Shield Grove pour le Pi Pico et la modifier pour le servomoteur 360°.
N'ayant pas les spécifications précises de ce servomoteur, j'ai utilisé une méthode un peu empirique pour trouver les bonnes valeurs de modulation. Voici le résultat.
Pour déterminer les valeurs de duty_u16, j'ai utilisé ce petit bout de programme.
import machine
pwm_pin = PWM(Pin(20))
pwm_pin.freq(50)
# max rotation à droite 1350
# max rotation à gauche 8800
# point milieu pour arrêt 5075
pwm_pin.duty_u16(5075)
Et un code qui va nous permettre de réaliser la librairie.
import machine
pwm_pin = PWM(Pin(20))
pwm_pin.freq(50)
max_rotationD = 1350
max_rotationG = 8800
point_mort = ((max_rotationG - max_rotationD) / 2 ) + max_rotationD
print ("point mort " , point_mort)
def move(pourcentage):
duty_u16 = point_mort - ((pourcentage / 100) * ((max_rotationG - max_rotationD) / 2 ))
print ("rotation :", duty_u16)
pwm_pin.duty_u16(int(duty_u16))
# 100 rotation max à droite
# 14-99 valeurs validées
# 0 arrêt du servo
# -5-99 valeurs validées
# -100 rotation max à gauche
move(0)
3. La librairie servo360
Nous aurions pu utiliser la librairie servo utilisé dans l'article Le Shield Grove pour le Pi Pico. Mais j'ai préféré créer ma propre librairie pour améliorer la compréhension de ce servomoteur. Le paramètre représentera le pourcentage de la vitesse de rotation dans un sens ou un autre. Exemple :
- la valeur zéro indique l'arrêt de la rotation du servomoteur,
- la valeur 100 indique la vitesse maximale de rotation à droite,
- la valeur -100 indique la vitesse maximale de rotation à gauche,
- les valeurs intermédiaires indiqueront une vitesse proportionnelle aux valeurs.
Et c'est aussi une manière de tester la programmation orienté objet. Voici le code de la librairie qu'il faudra enregistrer dans le PI Pico avec comme nom servo360.py.
class Servo360:
__servo_pwm_freq = 50
__min_u16_duty = 1350 #valeur à modifier en fonction du servomoteur
__max_u16_duty = 8800 #valeur à modifier en fonction du servomoteur
def __init__(self, pin):
self.__initialise(pin)
def update_settings(self, servo_pwm_freq, min_u16_duty,
max_u16_duty, pin):
self.__servo_pwm_freq = servo_pwm_freq
self.__min_u16_duty = min_u16_duty
self.__max_u16_duty = max_u16_duty
self.__initialise(pin)
def move(self, pourcentage):
point_mort = ((self.__max_u16_duty - self.__min_u16_duty) / 2 ) + self.__min_u16_duty
duty_u16 = point_mort - ((pourcentage / 100) * ((self.__max_u16_duty - self.__min_u16_duty) / 2 ))
self.__motor.duty_u16(int(duty_u16))
def __initialise(self, pin):
self.__motor = PWM(Pin(pin))
self.__motor.freq(self.__servo_pwm_freq)
4. Premier projet
Maintenant que nous avons créé notre librairie, nous réalisons notre premier projet. Nous piloterons notre servomoteur avec un potentiomètre. Voici le code :
from machine import Pin, PWM, ADC
from time import sleep
from servo360 import Servo360
my_servo_continous = Servo360(pin=20)
adc = ADC(0)
pourcentage = 0
while True:
val = adc.read_u16()
print(val)
pourcentage = int((32767 - val) / 327.67)
print("pourcentage " , pourcentage)
my_servo_continous.move(pourcentage)
sleep(0.5)
Avec le potentiomètre, vous activez la rotation de gauche à droite en passant par l'arrêt du servomoteur
5. Deuxième projet
Le deuxième projet se rapproche de la motorisation d'un petit robot. C'est l'utilisation prédestiné de ce servomoteur. Le bouton activera ou non la marche avant du robot. Le potentiomètre définira le sens de rotation du robot en coupant la rotation d'un des servomoteurs.
from machine import Pin, PWM, ADC
from time import sleep
from servo360 import Servo360
moteurG = Servo360(pin=20)
moteurD = Servo360(pin=18)
adc = ADC(0) # ADC input (knob potentiometer) connected to A0
pourcentage = 0
button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)
moteurG.move(0)
moteurD.move(0)
marche=0
moteurG.move(0)
moteurD.move(0)
while True:
if button.value() == 1:
if marche==0 :
marche=1
else:
marche=0
moteurG.move(0)
moteurD.move(0)
if marche==1:
val = adc.read_u16() # Read A0 port ADC value (65535~0)
print(val)
if val>32000 and val< 38000:
#le robot va tout droit
moteurG.move(50)
moteurD.move(50)
elif val< 32000:
# le robot tourne à droite
moteurG.move(50)
moteurD.move(0)
else:
# le robot tourne à gauche
moteurG.move(0)
moteurD.move(50)
sleep(0.2)
La prochaine fois, nous étudierons la fonctionnalité wifi pour piloter le servomoteur à partir d'une page Web.
5.1. Démo