Ligne 265 : |
Ligne 265 : |
| [[Fichier:Deparasitage moteur.png]] | | [[Fichier:Deparasitage moteur.png]] |
| | | |
− | == Exemple avec PyBoard == | + | == Montage PyBoard == |
− | | |
− | {{traduction}}
| |
| | | |
| === Une seule source d'alimentation === | | === Une seule source d'alimentation === |
Ligne 274 : |
Ligne 272 : |
| Nous avons également ajouté un petit switch qui permet d'alimenter directement votre PyBoard (via Vin) avec le bloc-pile lorsque celui-ci n'est pas branché sur votre ordinateur (via la port USB). | | Nous avons également ajouté un petit switch qui permet d'alimenter directement votre PyBoard (via Vin) avec le bloc-pile lorsque celui-ci n'est pas branché sur votre ordinateur (via la port USB). |
| | | |
| + | <small>Erratum: L'image ci-dessous mentionne une capacité de 47µF, il s'agit en fait d'une capacité de 0.47µF<br /></small> |
| [[Fichier:Hacl-L293D_montage.jpg|1024px]] | | [[Fichier:Hacl-L293D_montage.jpg|1024px]] |
| | | |
| {{ambox-stop|text=Le circuit-intégré L293D dispose d'un détrompeur en forme demi-lune (sur la gauche du circuit-intégré sur l'image), cet ergot sert de détrompeur.}} | | {{ambox-stop|text=Le circuit-intégré L293D dispose d'un détrompeur en forme demi-lune (sur la gauche du circuit-intégré sur l'image), cet ergot sert de détrompeur.}} |
| | | |
− | Le montage utiliser plusieurs capacités de 200nF pour le découplage (et 47µF pour stabiliser l'alimentation). | + | Le montage utiliser plusieurs capacités de 200nF pour le découplage (et 0.47µF pour le découplage de l'alimentation). |
| + | |
| + | Le moteur de '''droite''' est commandé comme suit: |
| + | * Input 1 = X6 |
| + | * Input 2 = x5 |
| + | * Enable 1 = X3 (pour signal PWM) |
| + | |
| + | Le moteur de '''gauche''' est commandé comme suit: |
| + | * Input 3 = X7 |
| + | * Input 4 = x8 |
| + | * Enable 2 = X4 (pour signal PWM) |
| + | |
| + | <small>Erratum: L'image ci-dessous mentionne une capacité de 47µF, il s'agit en fait d'une capacité de 0.47µF<br /></small> |
| + | [[Fichier:Hacl-L293D_montage-closeup.jpg|800px]] |
| + | |
| + | == Classe HBridge == |
| + | Voici le contenu de la classe {{fname|HBridge}} qui permet de commander l'un des deux pont-H du L293D avec... en prime... le contrôle de la vitesse en PWM. |
| + | |
| + | Relativement simple, vous pourrez efficacement commander vos deux moteurs (voyez les différent exemples proposés) |
| + | |
| + | <nowiki># Commande d'un pont-H L293D à l'aide de MicroPython PyBoard |
| + | # http://shop.mchobby.be/product.php?id_product=155 |
| + | # Voir Tutoriel |
| + | # http://wiki.mchobby.be/index.php?title=Hack-micropython-L293D |
| + | # |
| + | from pyb import delay, Timer |
| + | |
| + | class HBridge: |
| + | """ Control à H-Bridge. Also support PWM to control the speed (between 0 to 100%) """ |
| + | PWM_FREQ = 100 # Frequency 100 Hz |
| + | (UNDEFINED,HALT,FORWARD,BACKWARD) = (-1, 0,1,2) |
| + | |
| + | def __init__( self, input_pins, pwm = None ): |
| + | """:param input_pins: tuple with input1 and input 2 pins |
| + | :param pwm: dic with pin, timer and channel """ |
| + | self.speed = 0 |
| + | self.state = HBridge.UNDEFINED |
| + | |
| + | # Init HBridge control pins |
| + | self.p_input1 = pyb.Pin( input_pins[0], pyb.Pin.OUT_PP ) |
| + | self.p_input2 = pyb.Pin( input_pins[1], pyb.Pin.OUT_PP ) |
| + | |
| + | # Init PWM Control for speed control (without PWM, the L293D's |
| + | # Enable pin must be place to HIGH level) |
| + | self.has_pwm = (pwm != None) |
| + | if self.has_pwm: |
| + | self._timer = pyb.Timer( pwm['timer'], freq=self.PWM_FREQ ) |
| + | self._channel = self._timer.channel( pwm['channel'], Timer.PWM, pin=pwm['pin'], pulse_width_percent=100 ) |
| | | |
− | [[Fichier:Hacl-L293D_montage-closeup.jpg]]
| + | self.halt() |
| | | |
− | === Code Arduino === | + | def set_speed( self, speed ): |
− | <nowiki>
| + | if not(0 <= speed <= 100): |
− | int motor1Pin1 = 3; // pin 2 (Input 1) du L293D
| + | raise ValueError( 'invalid speed' ) |
− | int motor1Pin2 = 4; // pin 7 (Input 2) du L293D
| + | # Use PWM speed ? |
− | int enablePin = 9; // pin 1 (Enable 1) du L293D
| + | if self.has_pwm: |
| + | self._channel.pulse_width_percent( speed ) |
| + | self.speed = speed |
| + | else: |
| + | # Non PWM |
| + | self.speed = 0 if speed == 0 else 100 |
| + | if self.speed == 0 and self.state != HBridge.HALT: |
| + | self.halt() # force motor to stop by manipulating input1 & input2 |
| + | |
| + | |
| + | def halt( self ): |
| + | self.p_input1.low() |
| + | self.p_input2.low() |
| + | self.state = HBridge.HALT # Do not invert ... |
| + | self.set_speed( 0 ) # thoses 2 lines |
| | | |
− | void setup() {
| + | def forward(self, speed = 100 ): |
− | // set all the other pins you're using as outputs:
| + | # reconfigure HBridge |
− | pinMode(motor1Pin1, OUTPUT);
| + | if self.state != HBridge.FORWARD : |
− | pinMode(motor1Pin2, OUTPUT);
| + | self.halt() |
− | pinMode(enablePin, OUTPUT);
| + | self.p_input1.low() |
| + | self.p_input2.high() |
| + | self.state = HBridge.FORWARD |
| + | # Set speed |
| + | self.set_speed( speed ) |
| + | |
| + | def backward(self, speed = 100 ): |
| + | # reconfigure HBridge |
| + | if self.state != HBridge.BACKWARD: |
| + | self.halt() |
| + | self.p_input1.high() |
| + | self.p_input2.low() |
| + | self.state = HBridge.BACKWARD |
| + | # Set speed |
| + | self.set_speed( speed ) |
| + | |
| | | |
− | // Mettre la broche Enable a high comme ca le moteur tourne
| + | # Pont-H broches de commande Input 1 et Input 2 |
− | digitalWrite(enablePin, HIGH);
| + | MOT1_PINS = ( pyb.Pin.board.X6, pyb.Pin.board.X5 ) |
− | } | + | # Commande PWM pont-H |
| + | MOT1_PWM = {'pin' : pyb.Pin.board.X3, 'timer' : 2, 'channel' : 3 } |
| | | |
− | void loop() {
| + | # Pont-H broches de commande Input 3 et Input 4 |
− | // Le moteur tourne dans un sens
| + | MOT2_PINS = ( pyb.Pin.board.X7, pyb.Pin.board.X8 ) |
− | digitalWrite(motor1Pin1, LOW); // mettre pin 2 a 293D low
| + | # Commande PWM pont-H |
− | digitalWrite(motor1Pin2, HIGH); // mettre pin 7 a L293D high
| + | MOT2_PWM = {'pin' : pyb.Pin.board.X4, 'timer' : 5, 'channel' : 4 } |
− |
| |
− | delay( 3000 ); // Attendre 3 secondes
| |
| | | |
− | // Le moteur tourne dans l'autre sens
| + | def test_bridge1_simple(): |
− | digitalWrite(motor1Pin1, HIGH); // Mettre pin 2 a L293D high
| + | """ Simply test the HBridge without speed control """ |
− | digitalWrite(motor1Pin2, LOW); // Mettre pin 7 a L293D low
| + | h1 = HBridge( MOT1_PINS ) |
− |
| + | print( "Forward" ) |
− | delay( 3000 ); // Attendre 3 secondes
| + | h1.forward() |
− | }
| + | delay( 3000 ) |
− | </nowiki>
| + | print( "Halt" ) |
| + | h1.halt() |
| + | delay( 3000 ) |
| + | print( "Backward" ) |
| + | h1.backward() |
| + | delay( 3000 ) |
| + | print( "Halt" ) |
| + | h1.halt() |
| + | print( "end." ) |
| | | |
− | === Deux sources d'alimentation === | + | def test_bridge1_speed(): |
− | Il est possible d'alimenter le moteur avec sa propre source de tension.
| + | """ Test the HBridge WITH speed control """ |
| + | h1 = HBridge( MOT1_PINS, MOT1_PWM ) |
| + | print( "Forward full speed" ) |
| + | h1.forward() |
| + | delay( 3000 ) |
| + | print( "Forward half speed 50%" ) |
| + | h1.forward( 50 ) |
| + | delay( 3000 ) |
| + | print( "Forward 30% speed" ) |
| + | h1.forward( 30 ) |
| + | delay( 3000 ) |
| + | for the_speed in range( 10, 70, 10 ): |
| + | print( "Backward at speed %i" % (100-the_speed) ) |
| + | h1.backward( 100-the_speed ) |
| + | delay( 1500 ) |
| + | h1.halt() |
| + | |
| + | def test_two_bridges(): |
| + | """ Test the two H-Bridges of the L293D """ |
| + | h1 = HBridge( MOT1_PINS, MOT1_PWM ) |
| + | h2 = HBridge( MOT2_PINS, MOT2_PWM ) |
| + | # move the 2 motors forwards |
| + | h1.forward( 70 ) |
| + | h2.forward( 70 ) |
| + | delay( 3000 ) |
| + | # Stop the 2 motors |
| + | h1.halt() |
| + | h2.halt() |
| + | |
| + | def test_bridge2_simple(): |
| + | """ Test the two H-Bridges of the L293D """ |
| + | h2 = HBridge( MOT2_PINS )#, MOT2_PWM ) |
| + | print( "Forward full speed" ) |
| + | h2.forward() |
| + | delay( 3000 ) |
| + | print( "Halt" ) |
| + | h2.halt() |
| | | |
− | C'est le cas, par exemple, des moteurs en 9 ou 12 Volts.
| |
| | | |
− | Comme l'alimentation de la logique de commande reste en 5 Volts, nous sommes face à un cas de double source d'alimentation.
| + | test_bridge1_simple() |
| + | # test_bridge2_simple() |
| + | # test_bridge1_speed() |
| + | # test_two_bridges()</nowiki> |
| | | |
− | Règles de raccordement:
| + | === Deux sources d'alimentation === |
− | * Les masses (GND) des sources d'alimentation doivent être raccordées ensembles.
| + | Il est possible d'alimenter le moteur avec sa propre source de tension séparée de la source d'alimentation de la logique de contrôle (PyBoard et logique de contrôle du L293D). |
− | * La tension moteur (9v) est raccordée sur la broche '''VS''' (broche 8).
| |
− | * La tension de la logique (5v) est raccordée sur la broche '''VSS''' (broche 16).
| |
| | | |
− | Notes:
| + | <small>...''nous augmenterons cette partie du tutoriel dès que possible'''...</small> |
− | * Faire bien attention de ne pas intervertir les broches VS et VSS par erreur.
| |
− | * Le programme Arduino présenté ci-dessus ne change pas.
| |
− |
| |
− | [[Fichier:L293D Montage_12v(LowRes,closer).jpg]]
| |
| | | |
| == Ou Acheter == | | == Ou Acheter == |
| Les produits suivants sont disponibles chez MC Hobby. | | Les produits suivants sont disponibles chez MC Hobby. |
| * Le {{pl|155|L293D}} | | * Le {{pl|155|L293D}} |
− | * Le {{pl|115|Moteur DC Hobbyiste}} | + | * La {{pl|741|plateforme robotique 2 roues}} |
− | * Le {{pl|11|Kit ARDX}} | + | * Une {{cl|56|carte PyBoard}} |
| | | |
| | | |
| {{MCH-Accord}} | | {{MCH-Accord}} |