Mostrando entradas con la etiqueta driver. Mostrar todas las entradas
Mostrando entradas con la etiqueta driver. Mostrar todas las entradas

lunes, 3 de marzo de 2014

Robot panorámico XS (la lista de la compra)

Muchas veces me da pereza transportar mi robot panorámico hasta según que paraje posiblemente porque junto a el hay que transportar las baterías, la cámara, el objetivo y un sinfín de cosas mas. Tampoco creo necesario contratar un sherpa!

A raíz de aquí me empecé a plantear la construcción de un robot más pequeño y ligero con la finalidad de poder realizar fotografías panorámicas automáticamente utilizando un zoom estandard , en mi caso la intención inicial es usar un Nikkor 18-200mm unido a la Nikon D5200. Como que no tiene nada que ver con el otro objetivo que utilizo para hacer Gigapan's (el Sigma 150-500 + teleconversor 1.4x), acaba produciéndose que el numero de fotos para realizar la toma se reduce considerablemente, el peso del objetivo y finalmente la resolución conseguida será muy inferior pero no debería tener desperdicio frente a una panorámica normal. De aqui viene su etiqueta XS.

Para ello y basándome en mis anteriores experiencias empecé con unos bocetos para ir preparando el tema. Hoy de momento dejo la lista de la compra por si alguien se anima a fabricarse uno. Deciros que no sale "regalao" y si contamos las horas dedicadas más vale que os compréis uno nuevo. Si sois amantes de la electrónica , arduino y un poco manitas os lo podréis hacer con algunas pequeñas dificultades.

Antes de comprar nada , mirad la evolución de todo el proyecto en siguientes posts para ver si estais capacitados para realizarlo sin tener grandes dificultades.  

* Plancha de 1-1.5 mm : Aproximadamente necesitamos dos retales cuya area será de aproximadamente 800 x 200 mm. Lo más complicado es doblarla.

* Caja metálica . Yo he utilizado la Hammond 1590FBK que es la misma de la foto pero pintada de negro . Es de fundición de aluminio por lo que es fácil trabajar con ella. Os dejo un plano muy útil en formato PDF. Creo recordar que en RS-amidata estaba disponible , aunque yo la acabé comprando por eBay a Italia por unos 30 euros.

* Dos motores tipo NEMA-17 con reductor. Cuidadín que me costó mucho dar con ellos! El problema es la altura de la caja que hay que buscar un motor que sea bajito, a mi me sobran pocos milímetros! Yo utilicé unos Kysan 1040222 comprados por eBay . Os dejo el link actual. Otra opción que podéis hacer es buscarlos a través del fabricante en la siguiente web de Kysan. También el plano del motor en PDF. Si soys nuevos comprando este tipo de motores os recomiendo que leais otros posts o otras webs  para que luego no tengais problemas de voltajes...Comprado en eBay por unos 50 euros cada motor.


* Un arduino MEGA, con el UNO nos quedamos justos de salidas y de memoria. El programa actual me ocupa unos 26 kb, y el UNO soporta unos 32 kb. En cuanto a salidas, necesitamos al menos 8 salidas hacia los drivers de motores y como mínimo una para el disparo remoto de la camara. También podemos utilizar un ChipKit , pero luego tendremos que tener en cuenta que las salidas son a 3.3 v en vez de los 5v. proporcionados por el Arduino clásico. Comprado un clon por menos de 15 euros en eBay.


* Una pantalla LCD i2c de 20x4 caracteres que entra justa en la altura de la caja. Cuanto más grande...más información que podremos mostrar. Si no la teneis tipo i2c necesitareis más salidas libres en vuestro Arduino. Unos 11 euros en eBay.



* Dos drivers L298N , en eBay tienen un coste de unos 3 euros la unidad si vienen de Oriente.

* Step down con entrada 12/24v y salida 5v 10A , otros 5 euros en eBay.


* Dos metros de correa tipo GT2 y dos poleas de 36 dientes por menos de 14 euros en RepRap. Son las que usa la gente para hacer sus impresoras tipo Prusa-3D.



* Bolas rodamiento , que aproximadamente salen a 1 euro el rodamiento sobre el cual se deslizará la mesa sin hacer sufrir el motor y evitando de poner unos cojinetes/rodamientos enormes. Como el resto...comprado en eBay, para variar! Otros 10 euros menos en nuestro bolsillo.



Y luego un sinfín de pequeño material como pilaretes, tornillos de M3. un pulsador, un "joystick" sacado de un nunchuck de una wii...

Ya llevamos unos doscientos euros invertidos soló en eBay y un mes de espera en recibir estos componentes fotografiados.

Como herramientas : un taladro, la caladora, juego de brocas (yo utilizo unas piramidales que van muy bién con el aluminio de la caja para hacer agujeros grandes). Con la plancha ya es más peligroso, os lo digo por experiencia.

También necesitariamos un buen lugar para hacer bricolage, yo lo hago como puedo, pero ojalá tuviera un sitio como Dios manda y no como muchas veces agujereando en el suelo de la cocina...jiji.

En siguientes posts lo dedicaré a explicar pequeños detalles de la construcción mecánica y luego la parte de electrónica, pero en ningun caso será un tutorial paso a paso.

Como dijo alguien: "Si tu sueñas que puedes hacerlo, es que tu puedes". 

DIY ! Do-It-Yourselve!


sábado, 1 de febrero de 2014

Pruebas con motores paso a paso (II)

Seguimos batallando con el arduino y los motores paso a paso.

Tal y como vemos en la siguiente imagen aparece una estrella de los vientos junto a 4 bobinas. De todos es sabido y experimentado en nuestra infancia el efecto electroimán : cuando hacemos pasar una corriente por un bobinado (en nuestro caso el estator del motor) se ejerce un campo magnético y este es capaz de hacer mover elementos conductores (en nuestro caso el rotor del motor).

Logicamente si queremos que este movimiento se convierta en circular , necesitaremos como mínimo dos bobinados y eso es lo que realmente tenemos en nuestros motores paso a paso.

En la siguiente imagen nos aparecen 4 bobinados y creo que es una de las maneras fácil de entender un poco como funciona.

En la realidad los bobinados A y C están unidos al igual que B y D. Y también en un motor de 200 pasos deberia haber un total de 200 bobinas unidas en dos grupos de 100 + 100 distribuidas alternativamente .

Tal y como dijimos el Arduino envia una serie de impulsos hacia el driver. Y este driver es el que convierte los impulsos en "potencia".

En principio la libreria Stepper de arduino convierte nuestra instrucción de movimiento del motor en impulsos. Es decir cuando nosotros escribimos myStepper.step(numero_de_impulsos); lo que en realidad le estamos diciendo es que realice el numero_de_impulsos y los distribuye en 4 movimientos o ciclos repetitivos y luego activando las salidas correspondientes.

Imaginemos que decimos myStepper.step(1); al tratarse del primer movimiento se genera un pulso y empieza a contar desde la tabla la primera columna, es decir estamos en el movimiento 1. Se activan las bobinas A (roja) y la Bobina C(verde). Nuestro rotor se debería posicionar entre A y C es decir rumbo Norte.

Si a continuación escribo myStepper.step(2); generaria dos impulsos por lo que se me ejecutaria el movimiento 2 y luego el 3 (nuestro arduino sabe en que posición de movimiento se quedó la última vez) . Primero activariamos las bobinas C y B y a continuación la B y D. (giro hacia el Este y luego hacia el Sur)

Si acto seguido ejecutamos la instrucción myStepper.step(3); quiere decir que queremos dar 3 impulsos más . Ahora aqui el "arduino" sabe en que punto estamos de nuestro orden y ejecutará el movimiento 4 y luego saltará al 1 y al 2, pues se repiten los ordenes ciclícamente. (movimiento hacia el oeste, norte y este)

Si todo esto lo traspasamos a los 200 "bobinados" obtenemos un movimiento bastante controlado.

Si queremos mover en el otro sentido, sólo hay que interponer el signo negativo antes del número de pulsos y lo que hará el arduino invertir el orden de pulsos . Imaginamos que estamos en el movimiento 3, pues saltaria al movimiento 2 y luego al 1. La instrucción seria myStepper.step(-200); para dar una vuelta entera.

Ahora que sabemos un poco más de como se mueven los motores es hora de testear si estos pulsos de nuestro arduino se "pierden" por el camino y no llegan a las bobinas de nuestro motor.

Para ello nos fijaremos en el siguiente esquema:


Una vez tengamos cableado igual nuestro circuito, cargaremos en nuestro arduino el siguiente sketch:

#include <Stepper.h>           // incluimos la Stepper library
#define motorStepsX 200     // Pasos motor  360º/1.8º
Stepper myStepperX(motorStepsX, 8, 9, 10, 11); 
void setup() {
myStepperX.setSpeed(20);  
}
void loop(){
myStepperX.step(1); 
delay(30000);
}

Este sketch va generando impulsos hacia el motor cada 30 segundos , por lo que deberemos ir a la idea, pues continuamente irá cambiando del movimiento 1 , al 2, luego 3, i finalmente el 4. Seguidamente volverá a iniciar el ciclo y asi sucesivamente. Por cierto a mi haciendo todas las pruebas siempre me ha arrancado con el movimiento 2.

Cojeremos nuestro múltimetro y lo pondremos para medir tensión VDC. El borne negativo del tester lo colocaremos al GND del arduino durante todo momento.

Mediante el otro terminal del multimetro podemos probar si se cumple el orden de la tabla anterior (es posible que cuando empecemos con nuestras mediciones ya estemos en el paso 1)

Pondremos la punta del tester en el PIN8 del arduino i verificaremos que hay 5 voltios. Luego  verificaremos que exista también en IN1 del driver (5v),  i finalmente en OUT 1 deberia existir aproximadamente la mitad de voltaje aplicado a VCC (alimentación del motor, imaginemos que lo alimentamos a 12v) al que deberiamos restar la caida de tensión de los diodos (puede ser hasta 0,7v), por lo que deberiamos encontrar como máximo 6V, pero tranquilamente podrian ser 5.3 voltios. Si miramos en OUT2 deberiamos encontrar la misma tensión pero en negativo, es decir entre -6v i -5.3v . Luego la tensión entre OUT1 y OUT2 será VCC menos dos caidas de tensión del diodo.

Si estuvieramos en el movimiento 1 nos pasaria lo mismo en el PIN10 (5v) , IN3(5v) i en OUT3 (6v / 5.3v) , mientras que en OUT4 (-5.3v / -6v) 

El resto de PINs (9 y 11) , IN2 e IN4 deberian marcar 0 v.

Todo esto con suficiente nervio pues en 30 segundos cambia al siguinete movimiento:

En el movimiento 2, que deberiamos tener lo siguiente:
PIN9 y PIN10 = 5v
PIN8 y PIN11 = 0v
IN2 y IN3 = 5v
IN1 y IN4 = 0v
OUT 2 y OUT 3 = Vcc-diodo (5.3-6v)
OUT 1 y OUT 4 = -Vcc+diodo (-5.3 -6v)

En el movimiento 3, que deberiamos tener lo siguiente:
PIN9 y PIN11 = 5v
PIN8 y PIN10 = 0v
IN2 y IN4 = 5v
IN1 y IN3 = 0v
OUT 2 y OUT 4 = Vcc-diodo (5.3-6v)
OUT 1 y OUT 3 = -Vcc+diodo (-5.3 -6v)

En el movimiento 4, que deberiamos tener lo siguiente:
PIN8 y PIN11 = 5v
PIN9 y PIN10 = 0v
IN1 y IN4 = 5v
IN2 y IN3 = 0v
OUT 1 y OUT 4 = Vcc-diodo (5.3-6v)
OUT 2 y OUT 3 = -Vcc+diodo (-5.3 -6v)

Os dejo un video a ver si se entiende mejor...




Si todo la secuencia es correcta, el motor deberia funcionar siempre y cuando la tensión de alimentación VCC  y la posible potencia demandada a nuestra fuente de alimentación sea suficiente.

Si la secuencia no es correcta hay que verificar las señales entre Arduino y el driver que posiblemente esten mal, o bién el driver está en mal estado.

Finalmente me gustaria comentar que modificando ligeramente la libreria Stepper podemos conseguir más resolución en nuestros motores, consiguiendo por ejemplo medios pasos con lo que luego nuestro motor deberia dar 400 pasos para generar una vuelta entera, y seria capaz de parar en sitios intermedios (NE, SE, SO, y NO) pero en su contra perderiamos torque .

Si alguien le interesa la libreria modificada para medios pasos me la puede pedir.

También comentar que hay la opción de hacer 1/4 de paso, 1/8 y hasta 1/16 de paso , estos son llamados micropasos. Si quisieramos utilizar estas resoluciones en este tipo de driver deberiamos usar salidas PWM en nuestro arduino y la libreria se empieza a complicar y por mi experiencia es que con el Arduino le falta "velocidad" de procesador para lograr un  movimiento suave y uniforme. Hay otros drivers que ya vienen preparados y con unos simples puentes  se puede cambiar la resolución. 


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.