miércoles, 29 de enero de 2014

Pruebas con motores Paso a paso (I)

Todo y que este blog no va encaminado a ser un tutorial de arduino , he considerado , que al hablar de robots panorámicos creados mediante este hardware y ante las varias dudas que se generan, he preferido crear algun post para que la gente que quiera experimentar pueda beneficiarse de mis experiencias.

Para ello, y antes de nada explicar que un motor paso a paso (stepper) viene a ser como un motor de corriente continua pero en vez de con un solo bobinado tiene dos. Estos estan distribuidos alternativamente de tal manera que provoca que se generen varios sub-bobinados o electroimanes con lo que conseguimos un "mini-control" de posicionamiento del mismo , obviamente si no hay un encoder no podemos asegurar realmente la posición del mismo.

En la WikiPedia podeis encontrar muchos artículos sobre el funcionamiento del mismo.

Cuando adquirimos un motor Paso a Paso (de aqui en adelante PAP), hay varias características técnicas  a tener en cuenta, tales como el voltaje de funcionamiento, el numero de pulsos por vuelta (yo utilizo normalmente unos que tienen una resolución de 1.8º por impulso, es decir 200 impulsos cada vuelta entera) y también otra característica es la fuerza del mismo (torque) que será para que nos entendamos la fuerza máxima que nos puede ejercer el motor.

Como que tampoco es cuestión de escribir un máster, yo os comentaré los que utilizo, unos NEMA-17 que funcionan a 5VDC. Dentro del mundo "NEMA" existen varios tamaños 11,14,17,23... y varios voltajes. Hay que tener cuidado a la hora de adquirirlos pues almenos en los que yo tengo en ninguno de ellos viene identificado ninguna de esas tres características.


Al tratarse de pequeñas bobinas que ejercen la función de electroimanes la tensión de alimentación no debería ser critica, y siguiendo la lógica de un electroimán: a más voltaje, más fuerza = más torque, pero eso tampoco quiere decir que le podamos aplicar 25kV a los bobinados por lo que deberemos leer su datasheet, de lo contrario dañariamos el aislamiento del bobinado y acabaría este en la chatarra despues de las señales de humo. Si no lo tenemos es tan fácil como pedirle las características al comprador o buscar desde Google: "datasheet Nema-17" por ejemplo.


En todo motor PAP hay como mínimo 4 cables que corresponden a 2 bobinados, y lo que necesitamos es ir generando una serie de impulsos para accionar el motor.  Los impulsos los generaremos mediante un  hardware tipo Arduino (el ChipKit también funciona) pero este sólo es capaz de generar los impulsos pero no da "potencia" al motor, por lo que necesitaremos un driver.

Llegados a este punto tenemos tres elementos necesarios para mover el motor:
* Generador de pulsos (Arduino)
* Conversor de pulsos a potencia entregada (driver)
* Motor PAP

* Empezamos por el motor:
Hay que determinar los dos bobinados entre los 4 cables: Podemos usar o bién un multimetro (también llamado vulgarmente "téster") en modo resistencia o hacerlo sin él. Si lo hacemos con un tester deberemos elejir un cable y conectar hacia el téster, mientras que con la otra punta del tester buscaremos entre los otros 3 cables cual es el que da algo de resistencia, y sólo puede ser uno. Ya tenemos un bobinado! Ahora nos quedan dos cables sueltos que deberían corresponder al otro bobinado: miraremos si realmente también tenemos la misma resistencia entre ellos. En mi caso un bobinado corresponde a los cables rojo-azul y el otro al negro-verde.

Otra manera de hacerlo es sin el multímetro. Cogemos un cable al azar y lo unimos por la punta conductora con otro cable mientras intentamos girar el motor: Si cuando unimos los cables el motor se frena quiere decir que ambos cables pertenecen al mismo bobeando, sino se frena el motor hay que ir probando con el resto hasta conseguir determinar los dos bobinados.

Hay motores que tienen 6 cables, en este caso es lo mismo que en el de 4 cables pero los dos restantes van conectados a mediobobinado por lo que al menos con los drivers que yo utilizo no sirven de nada. Para determinar cuales cables deberiamos utilizar hay que usar la opción del múltimetro , pero con la diferencia que nos encontraremos con dos conductores que marquen resistencia, uno de ellos será la mitad del otro, es decir si entre un cable y otro marca un ohmio y con otro marca dos, deberemos elejir los cables que marcan dos ohmios y prescindir de los cables de bobinado intermedio.


También hay con 5 cables, que viene a ser como el de 6 pero con la diferencia que tienen los dos cables que vienen del mediobobinado unidos.



Como curiosidad: Si unimos los 4 conductores entre si el motor se quedará aun más frenado. Según me comentó Esteve si cogiéramos una llave dinamométrica e intentáramos hacer mover el eje del motor podríamos encontrar cual es el torque real de nuestro motor.

* El driver:
La función del driver es de convertir los pulsos provenientes en nuestro caso del Arduino a tensiones con más "potencia".
En principio el Arduino genera pulsos de unos 5VDC pero sin intensidad, por lo que si aplicaramos directamente el motor (siempre y cuando funcionara este a 5 voltios!) no se movería.

El driver viene a ser como unos transistores que activan / desactivan la potencia que va hacia los motores. Es como si fueran los interruptores de la luz activados remotamente. Por estos "interruptores" pasa la energia necesaria para hacer mover el motor aunque este funcione a 24voltios.


Cuando arduino genera un impulso, acaba excitando el transistor mediante un voltaje de 5 voltios y este transistor cierra el contacto eléctrico dejando pasar por su contacto el voltaje necesario para mover el motor.

La gracia de todo esto es que en realidad son 4 circuitos y que tiene una alta velocidad de conmutación: para que nos entendamos si un motor es capaz de girar una vuelta por segundo en un motor de 200 iml/vuelta significa que ha conmutado doscientas veces los transistores en un segundo. Obviamente esto es imposible hacerlo mediante interruptores o relés pues el tiempo de accionamiento lo superaría con creces.

Yo hasta el momento he estado utilizando drivers con el semiconductor L298N . Si buscais por eBay encontrareis varios modelos ya a punto de conectar y probar. Obviamente el L298N es el componente principal pero también son de gran importancia los diodos y el resto de componentes.

El tipo de driver que utilizo tiene varias conexiones y jumps , pero no tienen ningún misterio a la hora de conectarlo.

Mirandolo de frente y con el disipador de aluminio en la parte superior encontramos unos borneros dobles en los laterales . A cada uno de estos borneros deberemos conectar los cables de los dos bobinados que encontremos anteriormente. Tanto dá si lo conectamos en el lado derecho como en el izquierdo y tanto da si cruzamos los cables entre si (del mismo par) a la hora de conectarlos a cada uno de los dos borneros, lo único e importante es que cada par de borneros corresponda con cada par de bobinados. El único problema es que más tarde nos gire en un sentido y nosotros queriamos que girara en otro, pero seria tan fácil como cambiarlo desde software (en el programa de arduino), o bien intercambiando los cables que van desde arduino al driver (por ejemplo intercambiando a la entrada del driver o a la salida del arduino -sólo en un sitio- los cables rosa y gris o el otro par)  o bien intercambiando los cables de un bobinado a la salida del driver (es decir, en nuestro caso intercambiando el cable rojo por el azul o el verde por el negro).

Luego tenemos 4 cables que salen de las salidas del Arduino, en este caso a las salidas 8, 9, 10 y 11 que deberemos conectarlas en el mismo orden a IN1, IN2, IN3 e IN4 en el driver. Como siempre, es importante mantener el orden, como mínimo respetar los pares (la salida 8 y 9 puede ir a IN1 e IN2, tanto da el orden o si se cruzan entre ellos. También pueden ir a IN3 e IN4 , pero lo que NO debemos hacer es conectarlo a IN2 e IN3, porque luego es cuando hay que modificar el orden en las instrucciones de arduino y si tenemos algun problema la "lógica" se complica sin ninguna necesidad).

Ahora tenemos 2 jumps encargados de habilitar un bobinado o el otro marcados como ENA y ENB (de enable A y enable B - traducido al español habilitar salidas A, habilitar salidas B-) . Estos jumps deberan quedar siempre conectados haciendo el respectivo puente.

Finalmente nos queda un último triple bornero, al cual viene serigrafiado como VCC, GND y 5V. Aqui  deberemos conectar los 5V a la salida 5V del arduino, y los bornes VCC y GND hacia la fuente de alimentación necesaria para alimentar el motor (en mi caso también es de 5voltios, pero NO se debe cojer del pin del Arduino pues este no tiene energia suficiente para alimentar motores!). En este caso el VCC es el borne positivo mientras que el GND el negativo.

Finalmente uniremos las masas, el GND ground, o el negativo entre el driver y el arduino para mantenerlo todo a la misma diferencia de potencial de referencia.
Ya lo tenemos casi todo conectado! Aprovecho para deciros que NUNCA alimenteis a la vez el Arduino por el jack y por el USB a la vez...yo almenos no me fio ni un pelo...

Ahora nos tocaria cargar el programa en el Arduino. Es muy simple:

#include <Stepper.h>        // incluimos la Stepper library
#define motorStepsX 200     // Pasos motor X 360º/1.8º
Stepper myStepperX(motorStepsX, 8, 9, 10, 11); 
void setup() {
myStepperX.setSpeed(20);  // ajuste velocidad del motor
}
void loop(){
myStepperX.step(motorStepsX*5); 
delay(1500);
myStepperX.step(-motorStepsX*5); 
delay(1500);

Este programa lo unico que hace es dar 5 vueltas en un sentido, se espera 1,5 segundos y da 5 vueltas en sentido contrario. Vuelve a provocar una pausa de 1.5 segundos y asi repetidamente.

Por defecto el numero de impulsos por vuelta está definido con un valor de 200 impulsos vuelta, si teneis un motor de 64 impulsos vuelta deberéis cambiar el valor 200 por 64 en la linea #define motorStepsX 200  

Si quereis utilizar otros pins, debeis cambiar en la linea Stepper myStepperX(motorStepsX, 8, 9, 10, 11);  los números 8, 9, 10 y 11 por los pins que querais usar (preferiblemente en orden!)

Si quereis modificar la velocidad, hay que cambiar el valor 20 por otro en la linea myStepperX.setSpeed(20);

Si quereis modificar el numero de vueltas que gira, hay que cambiar el valor 5 en las lineas myStepperX.step(motorStepsX*5);  y myStepperX.step(-motorStepsX*5);  Si os fijais la unica diferencia entre ambas es el signo negativo que es lo que nos hace invertir el sentido del motor.

Con todo esto ya tendremos el test motor , si funciona: enhorabuena, de lo contrario hay que ir descartando cosas:

* ¿ la tensión de alimentación de los motores es correcta ?
* ¿ están unidas las masas GND entre arduino y el driver ?
* ¿ están bien conectados los motores ? ¿ Corresponden cada par de bobinados a cada una de las salidas del driver?
* ¿ están habilitadas las dos salidas del driver (Enable A y Enable B) ?
* ¿ está el interruptor SW1 del driver en modo funcionamiento ? (este interruptor no está en todos los drivers!)
* ¿ está conectada la señal +5 Voltios entre arduino y driver?
* ¿ Has cargado el programa ? (deberias ver debajo del software un mensaje de Transferencia completa)

Si todas las respuestas es que SI, hay que pasar al plan B: testeo funcionamiento, pero este post lo dejamos para otro día.


sábado, 25 de enero de 2014

Gigapanorámicas 2013

Este año pasado 2013 re-diseñé el robot, haciéndolo más pequeño y manejable pues tenia la intención de fotografiar desde alguna cima de una montaña y me era imposible mover al anterior "monstruo".

Han sido finalmente 5 gigapanorámicas (si no ocupan más de un Gigapixel para mi no es una gigapanorámica aunque los señores de GigaPan nos dejen subir imágenes a partir de 60 MPixels...)

De las 6 imágenes , la última "sólo" ocupa 0,70 Gpx , y está realizada directamente con el trípode y con un objetivo Nikkor 18-200, mientras que el resto usé el Sigma "Bigmos" 150-500 y en varias ocasiones lo acompañé de un teleconversor 1.4x.

El equipo utilizado fué una Nikon D90 (12 MPx) en las dos primeras , mientras que en el resto se encargó de las capturas una Nikon D5200 (24 Mpx).

Poble Vell de Súria http://gigapan.com/gigapans/124801
Fecha 01 Marzo 2013
3.471 capturas (89 horizontales x 39 verticales)
Resolución final = 33.70 GPx
Exposición = 1/800"
Diafragma = f13




08240 Manresa  http://gigapan.com/gigapans/126326
Fecha 25 Marzo 2013
2.480 capturas
Resolución final = 20.86 GPx
Exposición = 1/1250"
Diafragma = f16




Súria 99 GPx  http://gigapan.com/gigapans/129541
Fecha 20 Abril 2013
4.520 capturas (113 horizontales x 40 verticales)
Resolución final = 99.13 GPx
Exposición = 1/1000"
Diafragma = f13




Montserrat  http://gigapan.com/gigapans/131450
Fecha 01 Junio 2013
2.726 capturas
Resolución final = 49.86 GPx
Exposición = 1/1000"
Diafragma = f9





Terrassa  http://gigapan.com/gigapans/133482
Fecha 22 Junio 2013
2.125 capturas  (85 horizontales x 25 verticales)
Resolución final = 35.40 GPx
Exposición = 1/1000"
Diafragma = f11




Súria (vista Norte)  http://gigapan.com/gigapans/147341
Fecha 30 diciembre 2013
90 capturas  (15 horizontales x 6 verticales)
Resolución final = 0.70 GPx



Ahora ya estoy trabajando en otro robot (recopilando material), pero esta vez aun más pequeño , lo justo para mover la Nikon D5200 y el Nikkor 18-200, un equipo que en principio será más ligero y apto para fotografías con resoluciones de unos 5 GPx. Al no ser fotografias tan grandes, tampoco necesitaré tanta autonomía de baterías (las del robot pesa cada una un par o tres de kilos) y también podré dejar el "Bigmos" en casa. En próximos días , y si los demás proyectos en los que estoy colaborando me lo permiten, y si va llegando el material necesario (ya demasiadas cosas o astros a alinear) empezaré con el que espero llevar a cabo un proyecto fotográfico bonito... y hasta aquí puedo hablar. Por cierto ... FELIZ 2014, y recuerda DIY ! (Do-It-Yourself!)