Pour piloter un moteur, qu’il soit pas-à-pas ou à courant continu, avec un Raspberry Pi, il est nécessaire de rajouter un circuit intégré comme un pont en H. Pour simplifier les montages, il existe des shields comme pour Arduino, appelé HAT (chapeau) chez Raspberry. Nous allons voir comment communiquer avec le MotorHAT.
Prérequis: Programmez avec Raspberry Pi
Matériel
- Écran
- HDMI câble
- Clavier
- Raspberry PI 3 (avec OS sur micro SD)
- Souris
- Chargeur micro USB B
- Adafruit MotorHat
- Moteur CC
Présentation du MotorHat
Le MotorHat utilise des mosfet TB6612 pour piloter le courant dans les moteurs. Il utilise la communication I2C pour s’interfacer avec le Raspberry PI et ainsi économiser des E/S. Il est compatible avec toutes les cartes Raspberry Pi.
- Digital pin SCL/BCM3: Communication I2C Serial Clock Line
- Digital pin SDA/BCM2: Communication I2C Serial Data Line
Le MotorHat dispose de jumper pour sélectionner l’adresse I2C et sont empilable. Ce qui permet de piloter jusqu’à 32 shields (soit 64 steppers ou 128 moteurs CC) avec une seule carte Arduino.
Schéma de câblage
Compatible avec les cartes Raspberry Pi, le HAT se place directement sur les broches de la Raspberry. L’alimentation se branche au bornier Power. Les moteurs sont branchés sur les borniers M1 à M4. Vous pourrez être amené à brancher trois types de moteur:
- moteur à courant continu
- moteur pas-à-pas unipolaire
- moteur pas-à-pas bipolaire
Les branchements de ces moteurs sont détaillés dans les schémas suivants.
Configuration du Raspberry Pi
Pour pouvoir communiquer avec le MotorHAT, il faut autoriser le Raspberry Pi à utiliser la communication I2C. Sur le bureau, dans le menu Préférences, ouvrez le menu Configuration du Raspberry Pi. Sous l’onglet Interfaces, sélectionnez Activé pour I2C, puis Valider.
Ou dans un terminal, tapez « sudo raspi-config », dans « 5 Interfacing Options », sélectionnez « P5 I2C », puis valider.
Code de base pour le contrôle d’un moteur CC
Pour communiquer avec le MotorHat, nous allons utiliser la librairie Adafruit_MotorHAT
#!/usr/bin/python #i2c 0x60 0x70 from Adafruit_MotorHAT import Adafruit_MotorHAT,Adafruit_DCMotor import time import atexit mh=Adafruit_MotorHAT(addr=0x60) MAX_SPEED=150 def turnOffMotors(): mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE) mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE) mh.getMotor(3).run(Adafruit_MotorHAT.RELEASE) mh.getMotor(4).run(Adafruit_MotorHAT.RELEASE) atexit.register(turnOffMotors) motor=mh.getMotor(1) while True: print("Forward \n") motor.run(Adafruit_MotorHAT.FORWARD) print("Speed up \n") for i in range(MAX_SPEED): motor.setSpeed(i) time.sleep(0.01) print("Speed down \n") for i in reversed(range(MAX_SPEED)): motor.setSpeed(i) time.sleep(0.01) print("Backward\n") motor.run(Adafruit_MotorHAT.BACKWARD) print "Speed up \n" for i in range(MAX_SPEED): motor.setSpeed(i) time.sleep(0.01) print("Speed down \n") for i in reversed(range(MAX_SPEED)): motor.setSpeed(i) time.sleep(0.01) print("STOP \n") motor.run(Adafruit_MotorHAT.RELEASE) time.sleep(2)
Dans cet exemple, une fonction d’arrêt est définie avec l’objet atexit. Ceci permet de s’assurer que les moteurs sont coupés lorsqu’on quitte le script Python.
Code de base pour le contrôle d’un moteur pas-à-pas
Pour utiliser un moteur PP, il faut récupérer l’objet Stepper défini dans Adafruit_MotorHAT.
#!/usr/bin/python #import Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_Stepper from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_StepperMotor import time import atexit # create a default object, no changes to I2C address or frequency mh = Adafruit_MotorHAT() # recommended for auto-disabling motors on shutdown! def turnOffMotors(): mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE) mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE) mh.getMotor(3).run(Adafruit_MotorHAT.RELEASE) mh.getMotor(4).run(Adafruit_MotorHAT.RELEASE) atexit.register(turnOffMotors) myStepper = mh.getStepper(200, 1) # 200 steps/rev, motor port #1 myStepper.setSpeed(30) # 30 RPM while (True): print("Single coil steps") myStepper.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.SINGLE) myStepper.step(100, Adafruit_MotorHAT.BACKWARD, Adafruit_MotorHAT.SINGLE) print("Double coil steps") myStepper.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.DOUBLE) myStepper.step(100, Adafruit_MotorHAT.BACKWARD, Adafruit_MotorHAT.DOUBLE) print("Interleaved coil steps") myStepper.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.INTERLEAVE) myStepper.step(100, Adafruit_MotorHAT.BACKWARD, Adafruit_MotorHAT.INTERLEAVE) print("Microsteps") myStepper.step(100, Adafruit_MotorHAT.FORWARD, Adafruit_MotorHAT.MICROSTEP) myStepper.step(100, Adafruit_MotorHAT.BACKWARD, Adafruit_MotorHAT.MICROSTEP
N.B.: Faites attention aux indentations lorsque vous écrivez ou recopiez un code. Vous risqueriez d’avoir des erreurs de compilation.
Vous pouvez vous inspirer de ces exemples pour piloter votre système composé de moteurs à courant continu ou de moteurs pas-à-pas avec Raspberry Pi. N’hésitez pas à nous laisser un commentaire ou un message si vous rencontrez des difficultés pour piloter vos moteurs avec Raspberry Pi.
Applications
Piloter un robot avec plusieurs moteurs à courant continu ou pas-à-pas
Sources
- La THE référence https://www.raspberrypi.org/help/
- Programmez avec Raspberry Pi
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie