Tuto pas à pas Python : Le servomoteur SG90

Avant-dernier tutoriel en python dédié au pack d’accessoires.
Aujoud’hui on va réaliser un petit programme pour le servomoteur sg90 fourni dans le pack. Ce programme sera assez simple mais libre à vous de l’enrichir bien entendu.
servo_9gr_sg90

Avant tout : Installation des outils

Ce tuto est réalisé sur l’IDE Mu pour Circuit Python.
Si vous n’avez pas encore installé l’un et l’autre veuillez vous référer au guide d’installation Mu et CircuitPython disponible sur le site.

les branchements

En parallèle de notre code il faut brancher le servo à la console, si possible avec le backpack.
On branche l’ alimentation (VCC, câble ROUGE) sur le pin VBAT, la masse (GND, câble BRUN) sur une masse et l’entrée de commande (câble ORANGE) sur une pin analogique, ici la pin A2.

Servo Backpack Couleur Description
PWM A2 ORANGE Commande du servo
VCC VBAT ROUGE Alimentation
GND GND BRUN Masse


Etape 1 : La base du programme

Commencez par ouvrir Mu et créer un nouveau fichier.

Copiez-y le code suivant :

from gamebuino_meta import begin, waitForUpdate, display, buttons, color
import board
import pulseio

while True:
    waitForUpdate()
    display.clear()

Cela va importer les libraires Gamebuino nécessaires au fonctionnement de notre programme, ainsi qu’une libraire “digitalio” dont on aura besoin pour travailler avec notre capteur.

La partie commencant par “while True:” constitue la boucle principale de notre programme, sans elle il ne se passerait rien.

Etape 2 : Configurer le servomoteur

Pour pouvoir piloter le servomoteur à notre convenance il faut d’abord le configurer, c’est à dire en faire un objet contextuel de notre programme. Pour cela on va utiliser la librairie pulseio intégrée à notre programme.
La première étape consiste à créer l’objet servomoteur qui sera utilisé ensuite. On le déclare de la manière suivante juste en-dessous de nos inclusions de librairies :

servo = pulseio.PWMOut(board.A2, frequency=50, duty_cycle=0)

On attache ainsi l’entrée de commande de notre servo à la pin A2, en mode sortie, avec une fréquence de 50 et un cycle de 0.

La commande proprement dite se fera en venant modifier le paramètre duty_cycle de notre objet servo.
Pour simplifier cette commande nous allons justement déclarer une fonction qui rend la chose un peu plus directe en évitant une flopée de petits calculs à chaque changement de position.

Attention les yeux cette fonction ressemble à ceci :

def servo_duty_cycle(pulse_ms, frequency=50):
    period_ms = 1.0 / frequency * 1000.0
    duty_cycle = int(pulse_ms / (period_ms / 65535.0))
    return duty_cycle

On vient “simplement” définir une valeur pour duty_cycle calibrée sur notre fréquence de 50 hertz. Cette valeur est exprimée en millisecondes et rapportée sur 65535 soit la limite d’un entier de 16bits.

On peut à présent définir quelques paramètres de base qui seront ceux de l’état initial de notre programme :

x = 0.4
angle = 0
servo.duty_cycle = servo_duty_cycle(x)

Ici x est la position de notre servomoteur, 0.4 correspondant à un angle de 0°, la variable angle est tout simplement la valeur d’angle du servomoteur et enfin le ser.duty_cycle est là pour remettre le servo en position 0 au lancement du programme.

Etape 3 : Piloter le servomoteur

Ici nous allons venir enrichir notre boucle principale afin de pouvoir commander notre servomoteur à l’aide du D-pad de la console.

Commençons simplement par le bouton droit, lequel viendra incrémenter la position de notre servo en changeant l’angle de +9° :

while True:
    waitForUpdate()
    display.clear()

    if buttons.pressed(buttons.RIGHT) and (x <= 2.5):
        x += 0.1
        servo.duty_cycle = servo_duty_cycle(x)
        angle += 9

On enchaîne avec le bouton gauche qui vient lui décrémenter la position de -9° :

x = 0.4
angle = 0
servo.duty_cycle = servo_duty_cycle(x)  # 7536

while True:
    waitForUpdate()
    display.clear()

#  mouvement du bouton droit

    if buttons.pressed(buttons.LEFT) and (x >= 0.4):
        x -= 0.1
        servo.duty_cycle = servo_duty_cycle(x)
        angle -= 9

Ensuite les boutons haut et bas vont servir à passer directement à position 0 pour le bouton HAUT et à 180 pour le bouton BAS :

while True:
    waitForUpdate()
    display.clear()

#  mouvement du bouton droit

#  mouvement du bouton gauche

    if buttons.pressed(buttons.UP):
        x = 0.4
        servo.duty_cycle = servo_duty_cycle(x)  # 1638
        angle = 0

    if buttons.pressed(buttons.DOWN):
        x = 2.5
        servo.duty_cycle = servo_duty_cycle(x)  # 7536
        angle = 180

On finit enfin par un petit affichage très simple à l’écran qui nous donnera l’angle actuel du servomoteur :

while True:
    waitForUpdate()
    display.clear()

#  mouvement des boutons

    display.setFontSize(2)
    display.print(angle)
    display.setFontSize(1)
    display.print("o")

Et voilà, un tuto simple et rapide pour piloter votre servomoteur en python. A vous de jouer maintenant !

1 Like