Joy-PI Leçon #13 : Les servomoteurs

Un servomoteur est un système motorisé capable d’atteindre des positions prédéterminées, puis de les maintenir. La position est une valeur angulaire dans le cas d’un moteur rotatif. Ces moteurs, comme celui utilisé ici et illustré ci-contre, sont fréquemment utilisé en modélisme.

Sur le Joy-PI, il existe 2 deux connecteurs pour des servomoteurs, en bas à droite, le connecteur de droite (SERVO2) est équipé de détrompeurs, il ne faut en aucun cas essayer de forcer pour introduire celui-ci.

Commutateurs :

Les servomoteurs utilisent 2 GPIO, pour pouvoir les utiliser, les interrupteurs du bloc de droite 7 et 8 doivent en position ON, les autres sont sur OFF.

Le logiciel

Cet exemple utilise une classe développée par WindVoiceVox. Cette classe permet, une fois un moteur instancié, de déplacer le servomoteur.

Le pseudo-code :

  • Importation des librairies
  • Classe sg90
  • Faire quelques mouvements

En python :

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Author : Original author WindVoiceVox
# Original Author Github: https://github.com/WindVoiceVox/Raspi_SG90
import RPi.GPIO as GPIO
import time
import sys

class sg90:
  def __init__( self, pin, direction ): 
    GPIO.setmode( GPIO.BOARD )
    GPIO.setup( pin, GPIO.OUT )
    self.pin = int( pin )
    self.direction = int( direction )
    self.servo = GPIO.PWM( self.pin, 50 )
    self.servo.start(0.0)
    
  # Arrêt et libération des ressources
  def cleanup( self ): 
    self.servo.ChangeDutyCycle(self._henkan(0))
    time.sleep(0.3)
    self.servo.stop()
    GPIO.cleanup()

  # Direction actuelle
  def currentdirection( self ): 
    return self.direction

  def _henkan( self, value ):
    return 0.05 * value + 7.0

  # Deplace le servo
  def setdirection( self, direction, speed ): 
    for d in range( self.direction, direction, int(speed) ):
      self.servo.ChangeDutyCycle( self._henkan( d ) )
      self.direction = d
      time.sleep(0.1)
    self.servo.ChangeDutyCycle( self._henkan( direction ) )
    self.direction = direction

def main():
    servo_pin = 22
    s = sg90(servo_pin,0) # Instancie avec la broche
    try:
        while True:
            print ("Turn left ...")
            s.setdirection( 100, 10 )   # Tourne à gauche
            time.sleep(0.5)             # 0,5 seconde des pause
            print ("Turn right ...")
            s.setdirection( -100, -10 ) # Tourne à droite
            time.sleep(0.5)             # 0,5 seconde des pause
    except KeyboardInterrupt:
        s.cleanup()

if __name__ == "__main__":
    main()

Laisser un commentaire