Follow Focus para DSLR inalambrico

Hola a todos

Soy cineasta y me apasiona la robótica, así que he pensado en hacer un artilugio que usamos en la grabación de los cortos, que sirve para actuar sobre la rueda de enfoque de los objetivos de las cámaras.

Necesito ayuda de los expertos porque estoy buscando por internet pero me está costando mucho enlazar las pocas cosas que encuentro.

Os cuento mi idea:

Los componentes son 2 equipos independientes, por un lado el receptor inalambrico con un motor paso a paso, el receptor y el motor pueden y deberían estar en cajas separadas, porque la parte del motor y engranajes, debería ser lo más pequeño posible. El aparetaje de recepción inalambrica, el puente en H, antena, baterías, etc..., podría ir en una caja aparte y comunicada con el motor por cable (no hay problema).

Por otro lado está el emisor. El emisor constaría de transmisor, batería, antenea, el arduino o chip sustituto y lo más importante, un encoder de estos que parece un motor paso a paso pequeñito, os dejo el enlace más abajo.

La funcionalidad sería:
En el lado emisor, el operario maneja el encoder con un mando de esos tipo dial (grande de diámetro) y el motor PAP responde moviéndose y replicando el sentido de giro, la posición alcanzada en el mando y la velocidad con que este se ha desplazado del punto A al punto B. No necesito confirmación de la posición del motor, pero necesito que reaccione a la velocidad imprimida en el giro del encoder, que en unos casos será muy lenta y en otros algo más rápida (sin pasarse).

He querido usar encoder porque no me importa en que posición se inicie todo, pero si la distancia exacta entre el punto A y el B.

Se operaría de la siguiente forma. Se encienden amboas partes (emisor y receptor), mecánicamente se ha hecho la aproximación del engranaje al objetivo y las posiciones importan poco o nada.
Con la vista puesta en un monitor que nada tiene que ver con el invento, se busca el punto A de enfoque y se realiza una marca con rotulador tipo Veleda en dicho punto para poder volver a él. Ese punto en el mando (encoder), corresponderá a una posición determinada en el motor paso a paso. Ahora se mueve el mando (encoder) hasta la posición en que visualmente, consiga enfocar el punto B, el motor evidentemente se ha movido al punto B y en el encoder, marco con rotulador dicho punto.

Ahora, llega el momento de la verdad (estamos rodando!!!) el operador lleva el encoder al punto A y el motor PAP se mueve hasta ese punto en que enfoca nitido el objeto del punto A y el operador cuando lo considere mueve el encoder a la marca B y lo hace a una determinada velocidad ( la que le apetezca en ese momento) y el motor PAP deberá ir al punto B y replicando la velocidad que el operario ha dado al encoder.

Siento haberme extendido tanto pero creo que si lo explicaba con detalle, sería más sencillo para aquel que se anime a ayudarme.

Tengo un NEMA 17 (que no será el que usaré, porque demanda demasiado voltaje y está sobredimensionado), pero para las pruebas, me vale de momento. Tengo el arduino UNO y un puente en H, el L298N. He conseguido mover el motor PAP, una vuelta hacia un lado y una hacia el otro. Para saber que todo funciona. Ahora me falta todo lo demás.

Si podéis echarme una mano, os lo agradecería un montón. Por ejemplo cómo capturar los datos del encoder para pasarselos como órdenes al movimiento del motor PAP.

Os dejo los links a lo que tengo.

De verdad, mil gracias a todo el que se quiera implicar y os garantizo un puesto en los créditos de mi próximo corto...

Encoder: Encoder 400 ppr

Puente en H: Puente en H

Arduino UNO: No es necesario ponerlo, todos lo conecéis

Motor PAP que quiero usar como definitivo: NEMA 8

Método de comunicación: de momento por cable todo pero en una segunda fase habría que hacerlo inalambrico por 2,4Gh o por wifi.

Gracias a todos por leer hasta aquí y a ver si alguno se anima. Un saludo

Se me olvidaba.

Como no quiero que esto me sobrepase y quiero acabarlo. Quiero ir paso a paso, objetivo por objetivo.

Digamos que como primer objetivo sería conseguir que al mover el encoder, se mueva el motor PAP. Tanto en recorrido como en velocidad de traslado.

No tiene porque moverse en relación 1:1, no importa que 4 pasos del encoder suponga un paso del motor. Esto solo afectaría a reducir la velocidad en el motor porque desmultiplicaría por 4 y a que el recorrido del encoder (movimiento de la mano fuese mayor que su réplica en el objetivo (movimiento del motor PAP).
De todoas formas creo que eso se podría modificar por software, creo.

Gracias de nuevo

Dejaremos para el final el tema de la comunicación inalambrica, a menos que alguien me recomiende otra cosa.

Hola intergus.
Como tu mismo has pedido, tema enconder:

Reading Rotary enconders Contents

Me extraña que leas tantos guiones y no hayas leído la guía básica de este foro, Las normas del mismo.
Ahi te dice que simplemente poniendo en GOOGLE: Arduino enconder salen cosas como la de arriba.
Idem con Arduino PAP, o lo que desees.

Cuando tienes un enconder de pocos pasos por vuelta se pueden usar programas como los del link.
Cuando son enconders mas precisos como el tuyo de 400 pasos por vuelta es mas recomendable usar una librería que ya usa interrupciones, o sea pines del arduino dedicados a leer eventos externos como los que un enconder genera que son dos ondas cuadradas defasadas pero cuyo defasaje te dice el sentido de giro del mismo.
Luego solo es un contador de pulsos y su traducción a desplazamiento.

Ensaya esto con tu enconder y mientras pensamos en algo para el motor.

Bueno Surbyte, ya sabes. Algunos nacemos con vocación de transmitir de uno u otro modo y caemos en el error de pensar que a todo el mundo le pasa lo mismo.

Si, leo guiones y los entiendo más que algunos manuales técnicos, y cuando llega este caso, pregunto. Se que está en Google y que tarde o temprano, en uno u otro idioma, algo aparece. Pero siempre caes en esa tentación de preguntar a los que más saben, por acelerar las cosas y por centrar el tiro.

Reconozco que a veces en mi trabajo cuando me preguntan... "oye, ¿sabes el telefono de fulanito?, a veces siento ganas de decirle.... coge la guía y busca", pero luego caigo en que...."si me lo se de memoria, se lo voy a decir y eso que le ahorro, y además comunico, y transmito y ..... " uffff que me enrrollo.
Admito la crítica, buscaré más por Google. Hice una busqueda, no minuciosa y solo encontraba encoders tipo potenciometros y con mi desconocimiento de este mundillo, dudaba de si los ejemplos valdrían para mi encoder.

Ensayaré como dices y ya si encuentro algún problema que no exista solución en internet, ya si eso te pregunto.

Bueno, y te agradezco que en tu respuesta incluyeses algo de información, porque hay por ahí moderadores que la mitad de sus post son del estilo de.... "Busca en google y en las FAQ", claro, luego tienen 15000 posts.

Saludos.

Jajajaja

Reconozco que a veces en mi trabajo cuando me preguntan... "oye, ¿sabes el telefono de fulanito?, a veces siento ganas de decirle.... coge la guía y busca", pero luego caigo en que...."si me lo se de memoria, se lo voy a decir y eso que le ahorro, y además comunico, y transmito y ..... " uffff que me enrrollo.

que suerte tienes de recordar todos los teléfonos, yo ya no recuerdo mas que los de la familia.
Por otro lado. Aunque responda de todos los temas, no significa que haya hecho todo, y muchas veces debo ir a buscar las cosas y por eso mi sugerencia de ir a google.

Me he dado cuenta que mi modo de expresarme (soy argentino) por esta vía no siempre es comprendido y como no pretendo tener razón, intentaré continuar con lo que tu requieres.

Vayamos a lo que te necesitas:

Esta página de enconders y librerías me gusta mucho porque es muy pedagógica. Tiene un video de youtube y salvo que está en inglés cosa que descarto que no será problema para ti, verás que te permitirá resolver el tema 1.

Dime que no comprendes y lo charlamos.
Basicamente la conexión es de tres cables que vienen del Enconder.

según tu enlace
cable Negro o GND al GND del UNO
cable Blanco o VCC al 5V del UNO

ROJO es Canal A que ira al Pin2 del Arduino UNO
VERDE es Canal B que ira al Pin3 del Arduino UNO

Dice que es colector abierto lo que significa que requiere que uses una resistencia.
Pero muchos de los sketch básicos usan la configuración interna del Arduino para suplir esa situación.

Si vas al IDE y buscas enconder como en el video de Youtube de la página que cité, verás lo fácil que es probarlo.

Vamos con esta parte y luego probamos otra.

Bueno, ya estoy por aquí.

Madre mia, casi un año después.......

Podría empezar un nuevo topic, pero me gustaría arrastrar desde que la cosa empezó y mis charlas con "El argentino". ;D

Sigo con el proyecto, soy bastante cabezón

Ya he conseguido muchas cositas...

El encoder funciona, lo empecé usando 2 interrupciones pero era demasiada precisión 1600 pulsos por vuelta y además gastaba las dos interrupciones. Así que lo pase a una interrupción y una entrada digital. Ahora tengo 800 pulsos por vuelta.

Le puse un LCD 16x2 para ver los pasos y comprobar que todo funciona. Para esto uso 2 pines analógicos puesto que la pantalla la uso mediante I2C.

Tengo 4 pulsadores puestos que uso para grabar la posición del encoder y poder volver a esa posición cuando quiera. Graba con una pulsación larga y va al punto grabado con una pulsación corta

Uso 4 leds, uno por cada pulsador. Hago un flash rápido para indicarle que ya he grabado la posición y que puede soltar. Uso led fijo cuando pulsa el boton para ir a una posición y así sabe en cual de las 4 posiciones se encuentra, evidentemente cuando pulsa otro boton le indico la otra posición, apago el led anterior y enciendo el del boton recien pulsado.

Cuando muevo el encoder, se apagan todos los leds y el encoder manda desde la posición que indicó la última memoria pulsada.

También tengo indicador del nivel de batería, que lo he hecho con un divisor de tensión y mapeando el valor de la A0 (entrada analógica que uso para saber el porcentaje de batería que queda).

También he conseguido meter un encoder KY040 de 32 ppv creo que es, para usarlo como gestor de un menú. De momento solo funciona modificando la intensidad de uno de los 4 leds mencionados que estaba en el pin 11 (PWM), solo para comprobar que funcionaba. Este encoder se lo he metido a la otra interrupción que liberé.

Y ahí estoy de momento. Todo esto por separado es facilito (bueno, me ha costado mucho google como me indicó SURBYTE, pero combinarlo todo juntito en cuanto a hardware y software, me está costando lo suyo.

Y ahora viene lo que me queda y de lo que necesitaré ayuda.

  1. meter 2 pantallas oled de 128x64, ya he visto cómo hacerlo estoy a la espera de los chinos.

  2. meter un potenciometro para regular la velocidad de paso entre las 4 memorias, pues la velocidad en modo manual, será la que la mano de al girar el encoder. Esto parece facil.

  3. Meter la comunicación entre el emisor, que es todo lo mencionado hasta ahora y el receptor, quiero hacerlo con nRF24L01+PA.

  4. El receptor, que tendrá el modulo de comunicaciones, un arduino nano o similar, todo el tema de la alimentación, el puente en H.

  5. El motor, que aún no he decidido cual meter. Tiene que ser lo más pequeño posible pero con torque suficiente para mover la rueda dentada de un objetivo.

Mi primer problema:

Necesidad de pines extras porque ahora mismo los tengo saturados y ya habéis visto lo que me faltaba por incorporar al proyecto.

He pensado en poner un CD74HC4067E para multiplexar, pero me surgen las dudas. No sé si eso solucionará mis problemas de falta de puertos.

Tengo la duda de si puedo usarlo a la vez como entrada y como salida, es decir, meter los 4 pulsaores y los 4 leds en el mismo chip, aunque tenga que usar directamente la llamada PORT, etc.

No se si poner uno para salidas y otro chip para entradas. Si hago esto último, probablemente el de salidas me bastaría con un 4051 porque no preveo muchas más.

Bueno, para empezar, me gustaría saber si alguien ha necesitado cosas parecidas y cómo lo ha resuelto. Y si me sugeris alguna mejora en todo este lío.

Hola intergus, no recuerdo si me preguntaste por privado pero has hecho bien, ya que es tu propio hilo. Me refiero a darle continuidad al mismo.

Tengo una pregunta pero creo que la respuesta es simple, estas con un UNO on NANO?

La falta de pines indica que no usas ni un MEGA o DUE, asi que tomaré que estas con un UNO.

Aunque tu descripción es muy detallada a veces un resumen sirve.
Decir por ejemplo que tienen conectado a cada pin del Arduino.
COmenzando con el 2 al 13 y luego los A0...A5.

Bueno, hasta ahora tenía esto:

Ahora estoy reformando los pines porque estoy metiendo un 595 para los leds y algún otro que pueda aparecer (probablemente estado de batería)
Y otro 4051 para ampliar las entradas (4 pulsadores, encoder mecanico (excepto el pin que va a interrupción 1), nrf24l01, pin digital del encoder optico, porque el otro pin de este encoder va a interrupción 0

Tengo tarea, pero contarme que mejoraríais o cambiaríais y decirme si es posible con un 4067 tener en el mismo entradas y salidas (mismo chip), creo que no es posible pero me han entrado dudas al respecto

Gracias a todo el que quiera colaborar con sus ideas, sugerencia y experiencia.

Bueno veo mucho trabajo para expandir algo que harías facilmente con un MEGA. Considera dejar el UNO y usar un MEGA o un DUE.

Tienes que ser así por problemas de espacio. El proyecto va en cajitas y serán nanos o pro minis al final. Así que tengo que hacerlo con UNO ahora para poder pasarlo luego al NANO

Ya he conseguido (creo) meter el 595 para los leds y el 4051 con entrada analogica para los pulsadores y el potenciometro. El potenciometro lo lee bien pero los pulsadores dan pena. Lee valores raros y cuando los pulsas, uno de ellos no va y el resto no es que lleguen a 1023 precisamente, no se si es un tema cableados que fallan o es software.

Veamos, el código está cogido con pinzas para el 4051 (botones, potenciometros y lo que venga

// 4051 entradas extras analogica y digital
int S0 = 7;
int S1 = 8;
int S2 = 9;
int R0 = 0;
int R1 = 0;
int R2 = 0;
//int cuenta = 0;
int puerto[] = {4, 6, 7, 5, 2};
//  puerto   =  A4,A6,A7,A5,A2  // patillas del 4051
//  elemento = pu1, pu2, pu3, pu4, pot1  // elementos conectados

vois setup(){
// para el 4051 entrada analogicas y digitales
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);

}

void loop(){
// para el 4051
for (int w=0; w < 5; w++) { //loop through each channel, checking for a signal
   
   int row = puerto[w]; //channel 5 = 5th element in the bin list -> 101 etc.
   
   R0 = bitRead(row,0); //bitRead() -> parameter 1 = binary sequence, parameter 2 = which bit to read, starting from the right most bit
   R1 = bitRead(row,1); //channel 7 = 111, 1 = 2nd bit
   R2 = bitRead(row,2); // third bit
 
   digitalWrite(S0, R0); // send the bits to the digital pins
   digitalWrite(S1, R1);
   digitalWrite(S2, R2);
       
   Serial.print(w);
   Serial.print(" ==== ");
   Serial.println(analogRead(1)); // after sending the binary sequence, the mux determines which channel to read from and sends it to this analog input
 
   delay (250); // time to read the values
   
 }
}

Se puede mejorar supongo, necesito que sea lo más agil posible y que no de lecturas raras

Por otra parte tenía una rutina antes que analizaba si los pulsadores se habían pulsado más de 2 segundos y si era el caso, guardaba una variable del encoder y lanzaba un destello con el led correspondiente al botón (cada botón lleva un led asociado).

Eso ahora ya no se como hacerlo, antes lo hacia con un while mientras el input del boton estaba a high y ese while estaba dentro de un for que recorría los 4 botones, cuando encontraba uno a high se paraba a contar y luego salia del while y con un if miraba cuanto tiempo había sido pulsado, para hacer sus cositas. Ahora no se como montar lo mismo con esto del 4051

Bueno, creo que tendré que descartar usar el 4051 para entradas analógicas. Se vuelve muy inestable y no sé a qué es debido
Tan pronto funciona bien como se le va la pinza. No sé ni por dónde mirar

Creo que voy a valorar pasar al nano directamente que tiene algún pin más analógico y podría usarlo como entrada digital.

Incluso estaba pensando en meter los 4 pulsadores con resistencias en serie y en una entrada analógica y averiguar cual han pulsado por el rango de valor que me entre por el pin analógico, así me ahorro 4 entradas digitales.

¿alguna sugerencia o idea? Alguien podría aportar algo????????????

Bueno, creo que tendré que descartar usar el 4051 para entradas analógicas. Se vuelve muy inestable y no sé a qué es debido
Tan pronto funciona bien como se le va la pinza. No sé ni por dónde mirar

las entradas libres del 4051 deben tener siempre un resistor de 10k a GND para que no queden flotando.
X eso las lecturas se vuelven erráticas al sacar la pinza.
Ojo con las entradas analógicas extras del NANO. A6 y A7 no pueden configurarse como DIGITAL INPUT.
Solo como entradas analógicas.
Asi que si quieres usarlo cambia A4 y A5 para uso digital y A6 y A7 como entradas analógicas.

Ese arreglo es el que usa el Shield LCD de Arduino con mas teclas inclusive, UP DOWN RIGH LEFT SELECT ENTER

Aca un código de como usarlo link
Tiene diagramas del arreglo.


Aca otro link

Probaré lo de los 10Kohms en las entradas libres del 4051, supongo que de patilla a resistencia y de resistencia a negativo, no?

Por otra parte no quiero usar LCD, ahora estoy con él porque no me llegaron los OLED de china. Pero quiero poner 2 pantallas OLED juntas. Aunque me equivoqué y las pedí SPI, pero bueno, me servirán para hacerlas funcionar y practicar, luego las cambiaré por 2 pantallas OLED I2C.

Gracias por lo del NANO, no lo sabía. Pero supongo que me apañaré porque necesito si o si entradas analógicas así que tiraré primero de la 6 y la 7.

Bueno, pruebo lo de las resistencias y te digo, ójala funcione, no me gustaría descartar la opción del 4051, porque aún tengo que conectar las pantallas OLED y el nRF24L01 y eso se como muchos pines.

Mira si todo es SPI tienes nRF24 y las dos OLED tmb SPI entonces todo lo conectas a MOSI, MISO, CLK pero a cada uno le debes asignar un Chip Select CS distinto.
Y cada uno debe tener su resistencia pull up que asegure que estara inactivo cuando no se ponga en low.

Eso ya te consume 3 mas 3 6 pines.
Considera entonces usar o bien dispositivos SPI o bien dispositivos I2C o combinaciones.
Ejemplo: para expandir pines digitales usa el PCF8574 que es I2C y puedes montar los que quieras. Los 595 son mas baratos, pero requieren 3 pines.Este usará el bus I2C
Hay muchos dispositivos I2C para analizar y usar.

Bueno, definitivamente abandono, no se que mierdas le pasa al 4051

Intentaré la solución que me dices y que se usa en las pantallas lcd para detectar los botones con una sola entrada digital.

Espera, has un esquema de como tienes el 4051
no entiendo que ocurre pq solo dices lo que hace mal.
Esquema código y luego seguimos.

Ya, lo quité el 4051, me estaba cabreando.

He optado por la solución que usan las pantallas LCD con botones que me recomendaste y funciona ok. Ya identifico el boton pulsado y cuanto tiempo lo tienen pulsado. Esto ultimo es para distinguir si quiere desplazar el motor a la posición grabada previamente (pulsación corta) o lo que quiere es grabar una posición (pulsación larga).

Bien, ahora surge otro problemilla.

Seguí el esquema que me has puesto en la entrada#12 del post y todo ok, pero puse (buscando por google) todas las resistencias iguales. Eso hace que a un lado quede la resistencia con 10K y al otro las 4 de 10K en serie (cada pulsador tendrá una menos y el último pasa por las cuatro, logicamente.

Con esta configuración los valores que entran en la entrada Analogica están entre 150 y 510 aprox, pensé que aumentando mucho la resistencia que está entre A0 y GND (a 47K) conseguiría ampliar el rango para mayor seguridad de pulsaciones, pero lo que hace es que me cambia el rango entre 500 y 800 aprox, es decir, me he movido en la escala pero no he ampliado el rango como yo quería. Quería estar con los 4 pulsador entre 100 y 1000 aprox.

Espero haberme explicado. Alguna sugerencia????

La mejor surgerencia es que uses los valores indicados.
Sino papel y lapiz y a calcular pero no se que vas a ganar.
Tienes solo resistencias de 10k? Pues manten la relación que ves pero no es fácil.

Veo resistencias de
2k, 330, 680, 1k, 3k3.
x 10 seria

20k facil son 2 de 10k
3k3 a comprar, o 3 en paralelo de 10k
6k8 a comprar dos grupos en serie de 3 paralelos de 10k
10k facil, ya la tienes.
33k podrian ser 3 de 10k

Vale la pena? ve y compra los valores.

Tengo resistencias de varios valores, no hay problema. No me hace falta hacer montajes raros.

Pero pensé que poniendolas todas iguales cubriría el rango de 100 a 1000 en la entrada analógica, pero veo que no es así. Que tendré que calcularlas todas.

Por otra parte había pensado meter el switch del encoder mecánico como un pulsador más. Dejándolo el último y metiendole una resistencia que equivalga a la suma de las demás que están en los pulsadores más lo que le corresponda para que entregue el valor más bajo a la entrada analógica. Así con el mismo pin distingo los 4 pulsadores y el pulsador del encoder mecánico.

¿ves algún problema en ese diseño?
Gracias