Vamos a esperimentar con tu Rasberry PI y para eso, empezaremos montando un controlador para motores DC con programación python.
¿Que te parece?
Esto le permitirá a tu Raspberry Pi interactuar con el mundo real, haciendo posible la construcción de un robot, el encendido de un ventilador un día caluroso, o incluso expender una golosina para tu perro o gato mientras tú no estás en casa.
Introducción al controlador motores DC con python
Nuestro plan es conectar de manera segura uno o dos motores al Raspberry Pi, con la menor cantidad de componentes posible. Una vez que los componentes electrónicos estén colocados correctamente en la placa de pruebas, te mostraré cómo controlarlos fácilmente usando Python, primero haremos que el motor gire, y luego agregar controles para cambiar la dirección del motor, para que pueda ir hacia atrás.
Esta guía requiere un ojo cauteloso para distinguir errores, y un poco de coraje, especialmente si eres nuevo en el mundo de los conectores GPIO.
Me gustaría destacar que no me hago responsable de ningún daño causado a tu Raspberry Pi y/o componentes.
IMPORTANTE: No conectar ningún motor, no importa cuán pequeño sea, directamente al Raspberry Pi, ya que dañará tu Raspberry Pi.
El procesador principal sólo puede proveer potencia suficiente para encender un LED, aproximadamente 20mA. Un motor necesita al menos 400mA de corriente para empezar a funcionar.
Requisitos
Para hacer funcionar este proyecto necesitarás:
- Un Raspberry Pi con una tarjeta SD preinstalada con Raspbian
- Una placa de pruebas para conectar todo sobre ella
- Un chip controlador de motor L293 ó SN755410 (en este tutorial me referiré a ambos como L293)
- Cables de puente para conectar todo (macho a macho y hembra a macho)
- Uno o dos motores DC de 6v
- 4 Baterías AA y portapilas
Pins GPIO
Si no has visto de cerca tu Raspberry Pi antes, ahora es el mejor momento para echarle un buen vistazo.
Hay 26 pins agrupados en dos filas de 13, y estos en su conjunto son llamados la cabecera de Entrada/Salida de Propósito General o GPIO. Son una mezcla de cuatro pins de alimentación, cinco pins de tierra, y 17 pins de datos.
Algunos de estos pins de datos tienen funciones extra, como un bus i2c, bus SPI, y conectores serie UART, los cuales pueden conectarse a otro hardware para permitirle al Raspberry Pi comunicarse con ítems como un Arduino, un Conversor Analógico/Digital (ADC) o placas adicionales como PiGlow o PiFace.
Atención: Al trabajar con los pins GPIO, hazlo siempre mientras el Pi esté desconectado, ya que cualquier accidente por conectar (o poner en cortocircuito) dos pins puede causar daño al Raspberry Pi.
Ensamblando el Circuito
a) Agregando alimentación y tomas a tierra
Es importante que hagas esto mientras que la alimentación al Raspberry Pi esté apagada o desconectada, ya que queremos evitar poner conectores en cortocircuito por error.
Lo primero que necesitas hacer es conectar los cables de alimentación y toma a tierra. Como con la mayor parte de los proyectos electrónicos, todo lo que se conecta junto requerirá una toma a tierra común. Esto se indica con los cables negros.
La toma a tierra en el Raspberry Pi es el pin físico 6. Refiriéndonos a la Figura 1, este se identifica comenzando por el pin superior izquierdo, 3V3, contando de izquierda a derecha, por lo cual 5V es el pin 2, GPIO 2 (etiquetado 2) es el pin 3, y así sucesivamente.
La lectura de los números de pin en un Circuito Integrado (IC) se realiza fácilmente posicionando la muesca o punto hacia la izquierda, luego, al comenzar a contar desde la parte inferior izquierda, obtenemos el pin 1.
b) Agregando los cables de datos
Ahora, vamos a conectar los tres cables de datos que van desde los pins del GPIO al L293D.
Conectaremos el primer cable que va desde el pin 22 (GPIO 25) al pin 1 del L293D, el segundo cable lo vamos a conertar desde el pin 18 (GPIO 24) al pin 2 del L293D y por ultimo el tercer cable se conectara desde el pin 16 (GPIO 23) al pin 7 del L293D.
c) Conectar el motor
Seguidamente vamos a conectar los cables del motor.
Conectaremos el cable 1 del motor(1) al pin 3 del L293D y seguidamente conectaremos el cable 2 del motor(2) al pin numero 6 del L293D.
Es extremadamente importante que vuelvas a comprobar cada conexión otra vez antes de conectar las baterías. Sólo cuando estés seguro de que todo está en su lugar, conecta los cables de la batería a los rieles de alimentación de la placa.
d) Conectar un segundo motor (Opcional)
Una de las grandes características del L293D es que puede manejar dos motores independientemente y cada motor puede funcionar a distintas velocidades o direcciones. El uso de este IC hace posible la creación de un robot de dos ruedas, capaz de girar, moverse hacia adelante y hacia atrás con facilidad.
Conectar un segundo motor sólo involucra tres cables mas adicionales de datos y otro dos para el motor.
La conexión de datos seria la siguiente:
El primer cable a conectar seria desde el pin 23 (GPIO 11) al pin 9 del L293D, el segundo cable conectariamos le pin 21 (GPIO 9) al pin 10 del L293D y por ultimo se conectará el pin 19 (GPIO 10) al pin 15 del L293D.
Y las conexiones del segundo motor:
Conectaremos el cable 1 del motor(2) al pin 11 del L293D y seguidamente conectaremos el cable 2 del motor(2) al pin numero 14 del L293D.
Emcendido
Es importante chequear y doble chequear todo el cableado antes de conectarle cualquier fuente de alimentación a tu proyecto. Como el cableado puede ser un poco complicado, es fácil olvidarse de realizar alguna conexión y enviar 5V al 3.3V del Raspberry Pi.
Una vez colocada la nueva tarjeta SD Raspbian creada, conecta el Raspberry Pi como siempre, y enciéndelo.
Conecta las baterías, asegurándote de prestar atención a los rieles correctos (las franjas largas a lo largo de las partes superior e inferior, si tienes alguna), ya que queremos que solamente el cable negro se conecte a la toma a tierra, y solamente el cable rojo al positivo o alimentación del chip.
El próximo trabajo es decirle al Raspberry Pi que un motor, o dos, han sido conectados. Para esto, usaré un lenguaje llamado Python. Viene instalado en Raspbian, lo cual es un bonus. Si estás usando otro Sistema Operativo como Arch o PiDora, chequea que RPi.GPIO esté disponible.
Pruebas
Para que los motores puedan funcionar, haz doble click en LXTerminal en tu escritorio, para abrir una ventana de comandos. Aquí es donde escribirás código Python usando un programa llamado Nano. Nano es un editor de texto, similar a Notepad o TextEdit pero para la línea de comandos; te enseñaré algunos comandos sobre la marcha si es algo nuevo para tí.
Para encender el motor durante dos segundos, utiliza el siguiente código:
importRPi.GPIO as GPIO
from
time import
sleep
GPIO.setmode(GPIO.BOARD)
Motor1A =
16
Motor1B =
18
Motor1E =
22
GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
"Turning motor on"
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
sleep(2)
"Stopping motor"
GPIO.output(Motor1E,GPIO.LOW)
GPIO.cleanup()
Las primeras dos líneas le indican a Python qué necesitamos en el programa.
La primera línea quiere acceder un módulo llamado RPi.GPIO. Este módulo maneja todo el trabajo duro que involucra encender y apagar los pins GPIO del Raspberry Pi.
La segunda línea obtiene sleep del módulo time, para hacer posible la pausa del script dándole tiempo de ejecutar cierta acción, en este caso, dejar un motor encendido durante pocos segundos.
La función setmode le dice a RPi.GPIO que use la numeración de placa del Raspberry Pi. Usaremos los números 16, 18 y 22 para decirle a Python que son los pins asociados con los motores.
Al utilizar el L293D puedes darle una dirección; una dirección es representada por el llamado pin A, y la contraria es el pin B. Para encender el motor usamos un pin llamado Enable, etiquetado como E en el script de prueba – este es el pin 22. Me explayaré sobre este tema más adelante.
Finalmente, se le comunica al Raspberry Pi que todas estas son salidas, lo que se hace con GPIO.OUT.
Una vez configurado el script, el Raspberry Pi está listo para encender los motores. Encenderá algunos pins, esperará dos segundos, y luego los apagará, lo que puede leerse en el resto del script.
Guarda y sal del programa presionando CTRL-X. En la parte inferior de la consola, aparecerá un mensaje preguntando si quieres confirmar los cambios. Presiona Y y Enter para confirmar. Ahora, estás de regreso en la consola para correr el script y ver cómo el motor se pone en marcha.
sudo python motor.py
Si el motor no se encendió, revisa el cableado o las baterías. Debuggear y encontrar por qué algo no funciona puede ser irritante, ¡pero es un paso muy útil en el aprendizaje de algo nuevo!
Ahora gira hacia atrás
Es brillante tener un motor girando, pero es aún mejor hacerlo girar al revés, así que te enseñaré cómo hacerlo.
No necesitamos hacerle nada al cableado, esto es tarea puramente de Python. Esto se logra creando un nuevo script, al que llamaremos motorback.py. Para crear el script en Nano, ingresa el comando:
nano motorback.py
Escribe el siguiente código:
importRPi.GPIO as GPIO
from
time import
sleep
GPIO.setmode(GPIO.BOARD)
Motor1A =
16
Motor1B =
18
Motor1E =
22
GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
"Going forwards"
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
sleep(2)
"Going backwards"
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.HIGH)
sleep(2)
"Now stop"
GPIO.output(Motor1E,GPIO.LOW)
GPIO.cleanup()
CTRL-X, luego Y seguido de Enter para guardar.
Este script es muy similar al anterior, pero por si no lo has notado, le asignamos low al Motor 1A y high al Motor 1B.
High y low son nombres en programación para encendido y apagado.
Para detener el motor, debes asignarle low a Motor1E.
Enable es el interruptor para encender y apagar el motor, sin importar qué estén haciendo A y B.
Si esto te parece confuso, échale un vistazo a esta Tabla de Verdad para ver qué está pasando.
Hay sólo dos estados que le permiten girar al motor, cuando Enable está encendido o high, y A ó B están high, pero no ambos a la vez.
Para el caso de dos motores, mira el siguiente script. Lo único diferente es un par de líneas más para configurar el segundo motor.
import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BOARD) Motor1A = 16 Motor1B = 18 Motor1E = 22 Motor2A = 19 Motor2B = 21 Motor2E = 23 GPIO.setup(Motor1A,GPIO.OUT) GPIO.setup(Motor1B,GPIO.OUT) GPIO.setup(Motor1E,GPIO.OUT) GPIO.setup(Motor2A,GPIO.OUT) GPIO.setup(Motor2B,GPIO.OUT) GPIO.setup(Motor2E,GPIO.OUT) print "Going forwards" GPIO.output(Motor1A,GPIO.HIGH) GPIO.output(Motor1B,GPIO.LOW) GPIO.output(Motor1E,GPIO.HIGH) GPIO.output(Motor2A,GPIO.HIGH) GPIO.output(Motor2B,GPIO.LOW) GPIO.output(Motor2E,GPIO.HIGH) sleep(2) print "Going backwards" GPIO.output(Motor1A,GPIO.LOW) GPIO.output(Motor1B,GPIO.HIGH) GPIO.output(Motor1E,GPIO.HIGH) GPIO.output(Motor2A,GPIO.LOW) GPIO.output(Motor2B,GPIO.HIGH) GPIO.output(Motor2E,GPIO.HIGH) sleep(2) print "Now stop" GPIO.output(Motor1E,GPIO.LOW) GPIO.output(Motor2E,GPIO.LOW) GPIO.cleanup()