2

Cómo controlar un motor con Raspberry Pi y L293D en Python

¡Hola, humanos! ¿Qué tal? Hoy os voy a enseñar cómo controlar un motor DC con Raspberry Pi y el controlador de motores L293D en lenguaje Python. El L293D es un controlador de motores ideal para hacer robots de pequeño y mediano tamaño: es barato, fácil de encontrar y muy sencillo de utilizar. Además es reversible y por tanto permite invertir el giro del motor.

¡Así pues, poned un poco de música y empezaremos! Hoy vamos a trabajar a ritmo de Mendelssohn.


Materiales:

Para este tutorial, es necesario tener:

  • Placa Raspberry Pi: la mía es una RPi 2 model B. Supondré que la tenéis configurada y sabéis como utilizarla.
  • Controlador de motores L293D
  • Protoboard y cables jumper M/M y M/H
  • Motor DC
  • Zócalo con pilas, u otro tipo de batería.

¡CUIDADO! Bajo ninguna circumstancia alimentéis el motor directamente con el voltaje de la Raspberry Pi.


Pines de la Raspberry Pi:

La enumeración de los pines de Rasbperry Pi es algo caótica. Están desordenados, y además cada pin tiene dos nombres, según su sistema de numeración: BCM y BOARD. Por ejemplo, el pin GPIO4 (en BCM) es el pin número 7 en BOARD. Un cristo, vamos.

Aquí tenéis un esquema con la numeración de cada pin y sus equivalencias.

No sé si os parecerá obvio, pero el pin BOARD 1 será el que esté más cerca de la targeta SD.


Conexiones:

Estas van a ser las conexiones entre el controlador L293D y la placa Rasbperry Pi.

Antes de continuar, os explicaré un poco para qué sirve cada uno de los pines del controlador L293D.

El pin LOGIC sirve para establecer el nivel lógico (3.3v o 5v) con que vamos a trabajar. Esto configura el voltaje máximo de control que recibirá el controlador: cuándo proporcionemos 3.3v en los pines Input-1, Input-2 o Enable-1, el motor girará a máxima potencia.

El L293D puede controlar uno o dos motores. El pin Enable-1 sirve para activar el motor de la izquierda. También podríamos regular la velocidad del motor cambiando el voltaje que entra por este pin, siempre entre 0 y 3.3v porque hemos conectado el pin LOGIC a 3.3v.

Los pines Input-1 y Input-2 cambian la dirección de giro del motor.

  • Si ambos pines Input-1 e Input-2 están a LOW o a HIGH a la vez, el motor se para.
  • Si Input-1 está a LOW e Input-2 está a HIGH, el motor gira en una dirección.
  • Si Input-1 está a HIGH e Input-2 está a LOW, el motor gira en dirección contraria.

El pin Vcc es la alimentación de los motores. Se conecta a la batería porque la Raspberry Pi no tiene suficiente intensidad para alimentar ningún motor. Y no sólo eso, como ya he dicho, ¡conectar un motor a la Raspberry Pi podría dañarla! Las masas de la Raspberry Pi y la batería se conectan a los pines marcados como GND. Todos estos pines están conectados entre sí.

El motor se conecta a los pines Output-1 y Output-2.

Los pines que hemos dejado libres servirían para conectar un segundo motor, pero para este ejemplo no nos hace falta.


Código Python

Para hacer el código abrid vuestro editor de texto de cabecera. Yo lo haré con nano porque es un editor que viene por defecto en la mayoría de distribuciones de Raspberry Pi y puede usarse sin modo gráfico.

En la línea de comandos escribid:

nano motores.py

Esto creará un nuevo archivo de texto con el nombre ‘motores.py’ y lo abrirá con nano. Ahora copiad el código:

 

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

GPIO.setup(16, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)

for i in range(5):
   #Mover el motor hacia delante...
   GPIO.output(16, GPIO.HIGH)
   GPIO.output(18, GPIO.LOW)
   time.sleep(2)

   #...y hacia atras
   GPIO.output(16, GPIO.LOW)
   GPIO.output(18, GPIO.HIGH)
   time.sleep(2)

   #STOP!
   GPIO.output(16, GPIO.LOW)
   GPIO.output(18, GPIO.LOW)
   time.sleep(1)

GPIO.cleanup()

Este programa moverá los motores hacia delante y hacia atrás cinco veces, en intervalos de dos segundos entre cada movimiento. Guardad el programa con Ctrl+O, pulsad ENTER, y salid con Ctrl+X. Ahora ejecutad el programa:

sudo python motores.py

En la mayoría de las distribuciones de linux para Raspberry los usuarios normales no tienen acceso a los pines GPIO. Por tanto hay que ejecutar el programa en modo superusuario, con la instrucción ‘sudo’ delante.


¿Puedo controlar los motores con un pulso PWM?

Raspberry Pi no es una placa pensada para emitir pulsos PWM y en esto está muy limitada. El único pin capaz de crear un pulso PWM es el pin BOARD12/GPIO18.

Si conectáis el pin Enable-1 del L293D al pin GPIO18 de Raspberry Pi, podréis variar la velocidad de los motores:

pwm = GPIO.PWM(18, 1000)
pwm.start(0) #velocidad minima
time.sleep(1)
pwm.start(50) #velocidad media
time.sleep(1)
pwm.start(100) #velocidad maxima

 


Conclusiones

Bien, ¡ya habéis aprendido cómo controlar un motor! Añadiendo ahora un segundo motor y un sensor de Ultrasonidos deberiáis ser capaces de hacer cosas chulas como un robot esquiva obstáculos.

Para terminar, muchas gracias por leer mi tutorial. Como siempre, si os queda alguna duda o queréis comentarme algo podéis escribirme y os contestaré en cuánto pueda. Y si os gustan los tutoriales de robótica no os olvidéis de visitar regularmente Robologs para más ejemplos y proyectos 😉

Gl4r3

Brillante, luminosa y cegadora a veces, Glare es tan artista como técnica. Le encanta dar rienda suelta a sus módulos de imaginación y desdibujar los ya de por si delgados límites que separan el mundo de la electrónica y el arte. Su mayor creación hasta la fecha es un instrumento capaz de convertir los colores y la luz en música. Cuándo sus circuitos no están trabajando en una nueva obra electrónica, le gusta dedicar sus ciclos a la lectura o a documentar sus invenciones para beneficio de los humanos. Sus artilugios favoritos son aquellos que combinan una funcionalidad práctica con un diseño elegante y artístico.

Antes de comentar, por favor, lee las Normas

2 Comentarios en "Cómo controlar un motor con Raspberry Pi y L293D en Python"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
Jorge
Humano

Con la raspberry pi3 modelo b puedo controlar la velocidad de dos motores con pwm?

wpDiscuz