![HATMDD10_programmation_img1](https://framboiserobot.ca/wp-content/uploads/2019/08/HATMDD10_programmation_img1-678x325.png)
Le langage Python
Le langage de programmation le plus utilisé sur le Raspberry Pi est Python. Cet exemple proposé par Cytron résume assez bien la procédure à suivre pour programmer avec le Raspberry Pi. Pour aider le lecteur à mieux comprendre, j’ai inclus quelques programmes supplémentaires.
Références Python
www.learnpython.org – Learning Python
GitHub – HAT-MDD10 python code
Librairie GPIO pour python3
L’installation de la librairie python spécifique à la gestion l’interface GPIO du Raspbery Pi est requise. Exécutez la commande suivante pour y arriver.
sudo apt-get install python3-rpi.gpio
Concepts de base
Le contrôle des moteurs avec le HAT-MDD10 repose essentiellement sur les valeurs que prendront 4 entrées-sorties spécifiques du Raspberry Pi. Les fiches 12 et 13 seront réservés au signal de puissance alors que 24 et 26 définiront le sens de rotation.
Voici un résumé de l’attribution des entrées sorties.
Moteur 1 12 pour la puissance. Les valeurs possibles sont de 0 à 100. 26 pour le sens de rotation. Les valeurs possibles sont GPIO.HIGH et GPIO.LOW Moteur 2 13 pour la puissance. Les valeurs possibles sont de 0 à 100. 24 pour le sens de rotation. Les valeurs possibles sont GPIO.HIGH et GPIO.LOW
Le flot logique de votre programme devra faire varier ces valeurs en fonction des indications de l’utilisateur.
1 – Démonstration du mode analogue (PWM)
Ce programme va accélérer et décélérer progressivement vers l’avant et ensuite vers l’arrière. Il fait la démonstration de la capacité à simuler une modulation analogique des moteurs.
#!/usr/bin/python3 import RPi.GPIO as GPIO from time import sleep import os,sys # # GPIO settings # GPIO.setmode(GPIO.BCM) # GPIO numbering GPIO.setwarnings(False) # enable warning from GPIO AN1 = 12 # set analog pin for left side DIG1 = 26 # set digital pin for left side AN2 = 13 # set analog pin for right side DIG2 = 24 # set digital pin for right side GPIO.setup(AN2, GPIO.OUT) # set pin AN1 as output GPIO.setup(AN1, GPIO.OUT) # set pin AN2 as output GPIO.setup(DIG2, GPIO.OUT) # set pin DIG1 as output GPIO.setup(DIG1, GPIO.OUT) # set pin DIG2 as output p1 = GPIO.PWM(AN1, 100) # set initial pwm value for AN1 p2 = GPIO.PWM(AN2, 100) # set initil pwm value for AN2 MOTOR_VALUE_MIN = 0 MOTOR_VALUE_MAX = 100 # # Main # if __name__ == '__main__': os.system('clear') try: # set forward direction GPIO.output(DIG1, GPIO.LOW) GPIO.output(DIG2, GPIO.LOW) print("[MSG]> forward") # from minimum to maximum speed for speed in range(int(MOTOR_VALUE_MIN),int(MOTOR_VALUE_MAX),1): p1.start(speed) p2.start(speed) print("[MSG]> speed: {}".format(speed)) sleep(0.05) # from maximum to minimum speed for speed in range(int(MOTOR_VALUE_MAX),int(MOTOR_VALUE_MIN),-1): p1.start(speed) p2.start(speed) print("[MSG]> speed: {}".format(speed)) sleep(0.05) # set reverse direction GPIO.output(DIG1, GPIO.HIGH) GPIO.output(DIG2, GPIO.HIGH) print("[MSG]> reverse") # from minimum to maximum speed for speed in range(int(MOTOR_VALUE_MIN),int(MOTOR_VALUE_MAX),1): p1.start(speed) p2.start(speed) print("[MSG]> speed: {}".format(speed)) sleep(0.05) # from maximum to minimum speed for speed in range(int(MOTOR_VALUE_MAX),int(MOTOR_VALUE_MIN),-1): p1.start(speed) p2.start(speed) print("[MSG]> speed: {}".format(speed)) sleep(0.05) # stop p1.start(MOTOR_VALUE_MIN) p2.start(MOTOR_VALUE_MIN) finally: GPIO.cleanup()
2 – Simulateur de bouton test
Ce programme va simuler les quatre boutons de test qui sont présents sur la carte HAT-MDD10. L’utilisateur se verra présenter un menu et pourra choisir le moteur à utiliser et le sens de la rotation.
#!/usr/bin/python3 import RPi.GPIO as GPIO from time import sleep import os,sys # # GPIO settings # GPIO.setmode(GPIO.BCM) # GPIO numbering GPIO.setwarnings(False) # enable warning from GPIO AN1 = 12 # set analog pin for left side DIG1 = 26 # set digital pin for left side AN2 = 13 # set analog pin for right side DIG2 = 24 # set digital pin for right side GPIO.setup(AN2, GPIO.OUT) # set pin AN1 as output GPIO.setup(AN1, GPIO.OUT) # set pin AN2 as output GPIO.setup(DIG2, GPIO.OUT) # set pin DIG1 as output GPIO.setup(DIG1, GPIO.OUT) # set pin DIG2 as output p1 = GPIO.PWM(AN1, 100) # set initial pwm value for AN1 p2 = GPIO.PWM(AN2, 100) # set initil pwm value for AN2 MOTOR_VALUE_MIN = 0 MOTOR_VALUE_MAX = 100 # # Global variables # delay = 1 run = True # # Functions # def button_M1A(): print("[M1A] right wheel - forward") # set right motor to maximum speed p1.start(MOTOR_VALUE_MAX) # set right motor rotation clockwise GPIO.output(DIG1, GPIO.LOW) # let motor run for a second sleep(delay) print("[M1A] right wheel - stop") # stop right motor p1.start(MOTOR_VALUE_MIN) def button_M1B(): print("[M1B] right wheel - reverse") # set right motor to maximum speed p1.start(MOTOR_VALUE_MAX) # set right motor rotation counter-clockwise GPIO.output(DIG1, GPIO.HIGH) # let motor run for a second sleep(delay) print("[M1B] right wheel - stop") # stop right motor p1.start(MOTOR_VALUE_MIN) def button_M2A(): print("[M2A] left wheel - forward") # set left motor to maximum speed p2.start(MOTOR_VALUE_MAX) # set left motor rotation clockwise GPIO.output(DIG2, GPIO.LOW) # let motor run for a second sleep(delay) print("[M2A] left wheel - stop") # stop right motor p2.start(MOTOR_VALUE_MIN) def button_M2B(): print("[M2B] left wheel - reverse") # set left motor to maximum speed p2.start(MOTOR_VALUE_MAX) # set left motor rotation clockwise GPIO.output(DIG2, GPIO.HIGH) # let motor run for a second sleep(delay) print("[M2B] left wheel - stop") # stop right motor p2.start(MOTOR_VALUE_MIN) def sys_exit(): global run print("[*] Exit") run = False sys.exit() # # Main # if __name__ == '__main__': global run os.system('clear') try: while run: print('[*] Cytron HAT-MDD10 button simulator') print("[1] M1A") print("[2] M1B") print("[3] M2A") print("[4] M2B") print("[5] Exit") button = input("[*] Select button: ") print("") if(button=='1'): button_M1A() elif(button=='2'): button_M1B() elif(button=='3'): button_M2A() elif(button=='4'): button_M2B() elif(button=='5'): sys_exit() print("") finally: GPIO.cleanup()
3 – Fonctions de contrôle moteur
Ce programme propose quatre fonctions qui pourront être intégrées dans un système de contrôle à distance. L’utilisateur se verra proposer un menu ou il pourra tester l’exécution de chacune des fonctions.
#!/usr/bin/python3 import RPi.GPIO as GPIO from time import sleep import os, sys # # Global variables # MOTOR_VALUE_MIN = 0 MOTOR_VALUE_MAX = 100 # # GPIO settings # GPIO.setmode(GPIO.BCM) # GPIO numbering GPIO.setwarnings(False) # enable warning from GPIO AN1 = 12 # set power pin for left motor DIG1 = 26 # set direction pin for left motor AN2 = 13 # set power pin for right motor DIG2 = 24 # set direction pin for right motor GPIO.setup(AN1, GPIO.OUT) # set power pin AN2 as output GPIO.setup(AN2, GPIO.OUT) # set power pin AN1 as output GPIO.setup(DIG1, GPIO.OUT) # set direction pin DIG2 as output GPIO.setup(DIG2, GPIO.OUT) # set direction pin DIG1 as output p1 = GPIO.PWM(AN1, MOTOR_VALUE_MAX) # init power pin p1 p2 = GPIO.PWM(AN2, MOTOR_VALUE_MAX) # init power pin p2 # # Motor control functions # def go_forward(speed): p1.start(speed) GPIO.output(DIG1, GPIO.LOW) p2.start(speed) GPIO.output(DIG2, GPIO.LOW) def go_reverse(speed): p1.start(speed) GPIO.output(DIG1, GPIO.HIGH) p2.start(speed) GPIO.output(DIG2, GPIO.HIGH) def pivot_right(speed): p1.start(speed) GPIO.output(DIG1, GPIO.HIGH) p2.start(speed) GPIO.output(DIG2, GPIO.LOW) def pivot_left(speed): p1.start(speed) GPIO.output(DIG1, GPIO.LOW) p2.start(speed) GPIO.output(DIG2, GPIO.HIGH) def stop(): p1.start(MOTOR_VALUE_MIN) p2.start(MOTOR_VALUE_MIN) # # Main # if __name__ == '__main__': os.system('clear') try: while True: print('[*] Cytron HAT-MDD10 button simulator') print("[1] Forward") print("[2] Reverse") print("[3] Pivot right") print("[4] Pivot left") print("[5] Exit") button = input("[*] Select button: ") print("") if(button == '1'): print("[MSG]> forward") go_forward(MOTOR_VALUE_MAX) sleep(1) print("[MSG]> stop") stop() elif(button == '2'): print("[MSG]> reverse") go_reverse(MOTOR_VALUE_MAX) sleep(1) print("[MSG]> stop") stop() elif(button == '3'): print("[MSG]> pivot right") pivot_right(MOTOR_VALUE_MAX) sleep(1) print("[MSG]> stop") stop() elif(button == '4'): print("[MSG]> pivot left") pivot_left(MOTOR_VALUE_MAX) sleep(1) print("[MSG]> stop") stop() elif(button == '5'): print("Exit") sys.exit() print("") finally: GPIO.cleanup()
Conclusion
Vous avez avec ces exemples l’essentiel des connaissances requises pour maitriser le fonctionnement des moteurs d’un véhicule robotique. Le défi est maintenant d’intégrer ces fonctions dans un système de contrôle à distance.