Programmation du HAT-MDD10

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

python.org

Wikipédia – Le langage Python

www.learnpython.org – Learning Python

W3school – Python tutorial

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.