Cómo conectar un Motor DC a Raspberry Pi

En este pequeño tutorial veremos cómo conectar un motor de corriente directa a una tarjeta Raspberry Pi, también encontrarás un código de programación para tus primeras pruebas.

Los motores de corriente directa son dispositivos que transforman energía eléctrica en energía mecánica en forma de movimiento angular de su eje. Como su nombre lo indica se alimentan con corriente directa, el motor que utilizaremos en este ejemplo se puede alimentar desde 3V hasta 5V. De ésta manera para que el eje del motor comience a girar solo es necesario aplicar alimentación(diferencia de potencial entre sus terminales), y si las terminales de la fuente de alimentación se invierten, el motor gira en sentido contrario.

Para controlar un motor de corriente directa es muy común utilizar un puente H, es decir, un circuito que recibe 3 señales digitales de control y según los valores de dichas señales entrega energía necesaria al motor, por medio de sus pines de salida, para que el motor gire en un sentido, en el otro o no gire. Las 3 señales digitales de control de un puente H son:

  • Input1: Señal 1 de control de giro
  • Input2: Señal 2 de control de giro
  • Enable: Señal para habilitar el puente H

Para que el motor gire, las señales digitales de control INPUT1 e INPUT2 deben tener valores contrarios y la Señal ENABLE debe estar en valor lógico Alto. El puente H que seleccionamos para este ejemplo es el circuito integrado L293D, cuenta con 2 puentes H y nosotros haremos uso solo de uno, en específico, utilizaremos las señales de control INPUT1, INPUT2 y ENANLE1 y conectaremos el motor a OUTPUT1 y OUTPUT2.

Puente H L293D

Componentes Necesarios

  • Motor CD 3V- 5V
  • Puente H L293D
  • Raspberry Pi
  • Protoboard chica
  • Cables de conexión M-M y H-M
  • Jack de 2.1mm Terminal de Barril a Terminal de Tornillo
  • Eliminador 5V, mínimo 1A – Terminal de Barril 2.1mm

Diagrama de Conexiones

Raspberry Pï – Protoboard – Puente H L293D – Motor CD

Código de Python3 – Giro a máxima velocidad

Copiamos el siguiente código a un script de Python y lo ejecutamos con Python3 para observar como el motor gira en un sentido por 5 segundos y posteriormente gira 5 segundos en el sentido contrario.


import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

MotorIN1 = 15
MotorIN2 = 14
MotorE1 = 18

GPIO.setup(MotorIN1,GPIO.OUT)
GPIO.setup(MotorIN2,GPIO.OUT)
GPIO.setup(MotorE1,GPIO.OUT)

print("Hacemos girar el motor en un sentido por 5 segundos")
GPIO.output(MotorIN1,GPIO.HIGH) # Establecemos el sentido de giro con los pines IN1 e IN2  
GPIO.output(MotorIN2,GPIO.LOW)  # Establecemos el sentido de giro con los pines IN1 e IN2
GPIO.output(MotorE1,GPIO.HIGH)  # Habilitamos las salidas OUT1 y OUT2 del puente H

sleep(5)

print ("Detenemos el motor")
GPIO.output(MotorE1,GPIO.LOW)

sleep(1)

print("Hacemos girar el motor en el sentido contrario por 5 segundos")
GPIO.output(MotorIN1,GPIO.LOW)   # Establecemos el sentido de giro con los pines IN1 e IN2   
GPIO.output(MotorIN2,GPIO.HIGH)  # Establecemos el sentido de giro con los pines IN1 e IN2 
GPIO.output(MotorE1,GPIO.HIGH)   # Habilitamos las salidas OUT1 y OUT2 del puente H

sleep(5)

print ("Detenemos el motor")
GPIO.output(MotorE1,GPIO.LOW)

sleep(1)

GPIO.cleanup()

Código de Python3 – Giro a velocidad variable

Copiamos el siguiente código a un script de Python y lo ejecutamos con Python3 para observar como el motor gira en un sentido por 10 segundos y posteriormente gira 10 segundos en el sentido contrario, ambos con velocidad variable.


import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

MotorIN1 = 15
MotorIN2 = 14
MotorE1 = 18

GPIO.setup(MotorIN1,GPIO.OUT)
GPIO.setup(MotorIN2,GPIO.OUT)
GPIO.setup(MotorE1,GPIO.OUT)

p = GPIO.PWM(MotorE1, 50)  # Creamos la instancia PWM con el GPIO a utilizar y la frecuencia de la señal PWM
p.start(0)  #Inicializamos el objeto PWM

print("Hacemos girar el motor en un sentido por 10 segundos mientras aumentamos  y disminuimos la velocidad")
GPIO.output(MotorIN1,GPIO.HIGH) # Establecemos el sentido de giro con los pines IN1 e IN2  
GPIO.output(MotorIN2,GPIO.LOW)  # Establecemos el sentido de giro con los pines IN1 e IN2

for dc in range(0, 101, 1):
    p.ChangeDutyCycle(dc)
    time.sleep(0.05)

for dc in range(100, -1, -1):
    p.ChangeDutyCycle(dc)
    time.sleep(0.05)

print("Hacemos girar el motor en el sentido contrario por 10 segundos mientras aumentamos  y disminuimos la velocidad")
GPIO.output(MotorIN1,GPIO.LOW) # Establecemos el sentido de giro con los pines IN1 e IN2  
GPIO.output(MotorIN2,GPIO.HIGH)  # Establecemos el sentido de giro con los pines IN1 e IN2

for dc in range(0, 101, 1):
    p.ChangeDutyCycle(dc)
    time.sleep(0.05)

for dc in range(100, -1, -1):
    p.ChangeDutyCycle(dc)
    time.sleep(0.05)

print ("Detenemos el motor")
p.ChangeDutyCycle(0)
sleep(1)

GPIO.cleanup()

¡Sigue explorando!