Para conseguir que el telescopio se mueva es necesario poder moverlo y para ello voy a utilizar motores paso a paso de tipo NEMA 17 controlados utilizando controladores 8825.
Esta configuración es muy típica en las impresoras 3d, por lo que es fácil encontrar información de su uso con Arduino, pero lo difícil está en encontrar información de control basado en Raspberry Pi, por lo que este artículo puede ser base de muchos otros proyectos DIY.
Cada motor que queramos utilizar será controlado por un driver o controlador 8825, yo he usado este aunque hay otros tipos y modelos, cualquiera de ellos podemos utilizarlo si tenemos el esquema de conexión, en concreto tenemos este:
A continuación os explico un poco que son los pines de contacto de este controlador:
- VMOT: Es el voltaje de entrada que será pasado a los motores, entre 8.2V y 45V (yo usé 12V).
- GND: Es la tierra, 0V ó el nivel de referencia. Para que esa referencia sea más exacta se suelen unificar las tierras (la tierra de los motores se une a la tierra de la Raspberry Pi).
- RESET y SLEEP: Son dos patillas con las que activaremos el chip, nos pueden servir para inhabilitar el chip y evitar que consuma potencia. La línea superior indica que está negado y, por tanto, se activa en un 0 lógico (0V).
- STEP: Indica hacia que lado va a girar: 0 lógico sentido horario y 1 lógico sentido antihorario.
- DIR: Cada pulso en altoindicará un movimiento del motor.
- A1, A2, B1 y B2: Son los cables que irán a las bobinas del motor, es importante que los A* vayan a la misma bobina y los B* a la otra bobina.
Inicialmente, yo los he calibrado utilizando un Arduino igual que calibré los controladores A4988 de la impresora 3d, si alguien se lo pregunta... no hay diferencia a la hora de calibrarlo con un microcontrolador u otro. Una vez calibrados, lo siguiente es conectarlo a la Raspberry Pî y traducir el código.
La conexión de un controlador, un motor y la Raspberry Pi será la siguiente:
No he utilizado el condesador de 100 µF porque he utilizado una fuente de alimentación ATX de un antiguo PC. Ese condensador está puesto ahí para mantener constante el voltaje de entrada al controlador y evitar las fluctuaciones que podría venir de baterías, pilas u otro voltaje de entrada.
Os pongo una foto de cuando lo llevé a la práctica:
La conexión la he hecho con los siguientes pines:
Color del cable | Destino | PIN |
Naranja | GPIO 13 | 33 |
Marrón | GPIO 19 | 35 |
Amarillo | GPIO 26 | 37 |
Negro | GND | 39 |
El código utilizado para mover el motor os lo pongo en un proyecto de mi cuenta de github, el archivo se llama rpi_8825_1nema.py.
Para lanzarlo utilizamos el comando: python rpi_8825_1nema.py
A la hora de conectar 2 motores, lógicamente se necesitan 2 controladores, pero también podemos aprovechar para unificar algún cable (por ejemplo el de dirección), pero eso haría que no puedan utilizarse ambos motores simultáneamente con giros diferentes.
Ahora complicaremos el sistema añadiendo otro controlador, aquí os muestro el esquema:
Con su foto correspondiente:
Y la tabla de conexión:
Con su foto correspondiente:
Y la tabla de conexión:
Color del cable | Destino | PIN |
Azul | GPIO 5 | 29 |
Verde | GPIO 6 | 31 |
Naranja | GPIO 13 | 33 |
Marrón | GPIO 19 | 35 |
Amarillo | GPIO 26 | 37 |
Negro | GND | 39 |
El código también está en el mismo proyecto que hablaba más arriba, pero el archivo es este otro: rpi_8825_2nema.py.
Para lanzarlo utilizamos el comando: python rpi_8825_2nema.py
Aquí os dejo un vídeo de su ejecución:
Antes de hablaros del control del motor utilizando Java, a través de la librería Pi4J (la instalé en este post y la usé en este otro) tenemos que hablar de un problema detectado en esta librería. Para plantear el problema lo haré con imágenes:
Nombrado de los pines que he usado en python
Nombrado de los pines que he usado en java
Como os habréis fijado (también lo pone en una nota en el pie de la segunda imagen), los mismos pines se llaman distintos utilizando la misma nomenclatura... a partir de aquí, sin comentarios... los programadores de java tenemos mucho que agradecer al proyecto Pi4J, así que no es justo realizar ningún comentario negativo (pero a buen entendedor pocas palabras bastan).
Os pongo el código utilizado en Java con Pi4J en el archivo rpi_8825_2nema.java.
Y finalizo poniendo 2 comandos: el primero para compilarlo:
javac -cp .:classes:/opt/pi4j/lib/'*' Rpi8825Nema.java
Y el segundo para ejecutarlo:
sudo java -cp .:classes:/opt/pi4j/lib/'*' Rpi8825Nema
Lo más destacable de ambos comandos es que le decimos el classpath, o sea, donde están las librerías a usar y que debemos ejecutar las aplicaciones de Pi4J en modo superusuario.
Hola Alfredo, la PI 1 tiene un pineado distinto a la PI 2/3, por ese motivo Pi4J utiliza otra forma de nombrar a los pines (la misma que WiringPi) que te abstrae del hardware. De esta forma el mismo programa funciona en una PI1 o una PI2/3 o las que vengan en un futuro.
ResponderEliminarDe todas formas si te sientes más cómodo usando el nombrado de pines que usas en python puedes hacerlo usando las constantes de la clase RCMPin en vez de RaspiPin.
Dicho esto gracias por el artículo, me ha servido de gran ayuda.
Sí, lo vi en otros blogs después de escribir el artículo.
EliminarGracias a ti