Arduineces y otras hierbas (Monitorizar fugas de agua)

Todo cuanto tiene que ver con la obtención, almacenamiento y proceso de la información digital, sus aplicaciones y el software y hardware utilizado.
Responder
Mensaje
Autor
Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos con Arduino

#351 Mensaje por Anilandro »

El problema de la espera de 20 mS se evita con la orden "millis()", que devuelve los milisegundos que la placa Arduino está en marcha. Así podemos contar tiempo y sólo llamar a "servos()" para crear secuencia "marca" de los servos, utilizando el resto del tiempo para el programa...

Imagen


En esta ocasión, en el montaje práctico he cambiado los dos potenciómetros por un joy-stick que los integra, y los dos servos separados por un soporte "pan & tilt" de dos grados de libertad, que podría por ejemplo mover una cámara...

Imagen

Imagen


Continuará...

Saludos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

alberttoy
Mensajes: 1090
Registrado: Mar Sep 16, 2014 12:55 am
País: españa
Ciudad: barcelona

Re: Los servos con Arduino

#352 Mensaje por alberttoy »

Al hacer proyectos didacticos (robots y similares) con servos, el problema que me he encotrado es que son muy bruscos (van a maxima velocidad a su nueva posición).
La solución es ir enviando posiciones intermedias, pero no es fácil si se mueven varios ejes a la vez a distintas velocidades (no es fácil a nivel didactico).

Existe una libreria llamada VarSpeedServo https://github.com/netlabtoolkit/VarSpeedServo que soluciona esto.

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos con Arduino

#353 Mensaje por Anilandro »

Es que lo conveniente para un servo es precisamente que sea rápido. En sus usos normales de radiocontrol esto es positivo. Aprovecharlos para robótica didáctica está bien porque simplifican los montajes al suministrar mucho par y una posición angular absoluta, lo cual nos ahorra complejidades mecánicas, encoders y finales de carrera, pero eso ha sido un aprovechamiento posterior.

Nunca he tenido la necesidad de que se movieran lentamente, pero lo que haría sería precisamente lo que dices, darle pequeños movimientos en vez de uno solo mayor. Con muchos servos, imaginemos por ejemplo una serpiente robótica o un "arácnido" de muchas patas, el tiempo de cálculo puede ser más largo lo cual complica mantener ciclos rápidos, y a veces es necesario ir a microcontroladores más potentes o en algún caso a FPGA's, que procesan por hardware en paralelo.

Esta librería que citas puede ser interesante, la bajaré. Otra cosa es que verás que no utilizo la librería "servo.h" normal, porque la idea de estos montajes es didáctica y prefiero mostrar las interioridades de las funciones en vez de utilizar las "opacas" contenidas en una librería. Ya llegará el momento de dejar los "delays" y meterme con los "timers" a nivel de registros...

Saludos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos con Arduino

#354 Mensaje por Anilandro »

En la versión _05_01 hay algunas diferencias respecto a la _04. La variable "tiempo" entera sin signo de doble resolución. La inclusión de las órdenes "millis()" y que ya no está el "delay(20)", cuyo tiempo puede utilizar el programa para cualquier otra acción...

Para la coincidencia entre el Joy-Stick y el Pan & Tilt, tuve que invertir la señal vertical, con las órdenes:

pulso1 = 2124 - analogRead (A1); // Invertido
pulso2 = 976 + analogRead (A2); // Normal

...Siendo los valores experimentales 2124 y 976, para centrar los servos...

El correcto funcionamiento de este programa, que modificando la función "servos()" podría controlar hasta 9 o 10 servos sin problemas, puede verse en la siguiente secuencia de imágenes... En este caso moviendo una minicámara montada en el soporte Pan & Tilt...

Imagen

Imagen

Imagen

Imagen


El programa "PruebaServos_05_01" puede bajarse de mi Drive con el enlace: https://t.co/ULNO8sqink

Continuará...

Saludos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos con Arduino

#355 Mensaje por Anilandro »

Bien, ahora que ya controlo los servos a gusto, pienso que podría aprovechar algo de lo que vi en el tema del infrarrojo y moverlos mediante el mando a distancia IR...

Imagen


En primer lugar, con mi programa "IR_NEC_DecoderMonitor_01", encuentro los códigos de cada una de las teclas de este mando. Ya sé que anteriormente los publiqué en binario y hexadecimal, pero los obtuve con una función de la librería IR de Arduino, que fallaba bastante y daba valores extraños.

Imagen


...De los botones del mando, los que voy a utilizar serán solamente cinco...

Imagen


Continurá...

Saludos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos con Arduino

#356 Mensaje por Anilandro »

El programa es sencillo, 1º declaración de variables, 2º configuración de pines, y 3º en LOOP, si detecta señales de entrada IR llama a función que las decodifica, llama a función que ejecuta una acción según el código IR, y luego la función Servos() que mueve la plataforma...

Imagen


La función "Decode_IR_NEC( )" es la misma que utilicé en el tema IR y ya está explicada... Sólo decir que devuelve en decimal el código IR recibido, si es una tecla siempre pulsada añade luego el valor -2 y si es un código erróneo devuelve -1...

Imagen


La función "Acciones( )" cambia 10 puntos arriba o abajo las variables globales "pulso1" y "pulso2" dependiendo del código IR recibido: 21, 70, 67 y 68 y guarda en variable "ultimo" el valor. El 64 coloca ambos a 1500, correspondiente a los servos en su punto medio...

Imagen


El final de "Acciones()" detecta si el código es -2 (tecla que permanece pulsada), y teniendo en cuenta cual ha sido la orden guardada en "ultimo", repite dicha acción mientras no se suelta la tecla... Las valores pulso1 y pulso2 pueden cambiar de 10 en 10 entre 1000 y 2000...

Imagen


Finalmente, la función "Servos()" utiliza los valores guardados en pulso1 y pulso2 por la función anterior y cada 20 milisegundos genera los impulsos para mover cada servo... Y nada más...

Imagen


Continuará...

Saludos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos con Arduino

#357 Mensaje por Anilandro »

El esquema de este montaje es el siguiente... Aunque naturalmente, los dos servos están montados en la base Pan & Tilt...

Imagen


Este programa PruebaServos_07_01 lo podéis bajar en formato .rar desde el enlace de Drive: https://t.co/hGQ3yY7IZxç

También podéis ver un corto vídeo de este montaje desde el enlace: https://youtu.be/G9--ACvlvLA

Saludos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos con Arduino

#358 Mensaje por Anilandro »

Vale, ahora que ya hemos conseguido las señales de control de servo mediante software, iremos un poco más allá para iniciar interesante tema de los "Timers" de Arduino, que en la librería oficial "servo.h" son precisamente los encargados de generar éstas y otras señales repetitivas...

La teoría de los "Timers" es fácil de encontrar en la red, pero más complejo es llegar a saber cómo y porqué se utilizan sus instrucciones de configuración y manejo. También leído muchas generalidades, las típicas explicaciones sólo accesibles a quienes no las necesitan, y bastantes errores copiados de un sitio a otro.

En esencia, un "Timer" es un contador independiente por hardware conectado al reloj del Arduino (que va a 16 Mhz). El micro Atmega-328 tiene 3 Timers, el Timer0, el 1 y el 2. El 0 y el 2 son de 8 bits, y el 1 de 16 bits. Así que el 0 y el 2 "contarán" hasta 255, y el uno hasta 65535...

¿Y cuanto tiempo tardan los Timers del Arduino UNO en llegar al tope y volver a 0? ...pues muy poco. Con un reloj a 16 millones de ciclos por segundo los Timers0/2 lo harán en tan solo 16 uS, y el Timer1 en 4,096 mS, tiempos que en muchos casos serán demasiado cortos para nuestras necesidades...

...Entonces, para que este hardware sea más versátil, cada Timer dispone además de un "Prescaler", un divisor programable insertado entre la señal de reloj y el contador. Los prescalers de los Timers0/1 pueden dividir por 1/8/64/256/1024, y los del Timer2 por 1/8/32/64/128/256/1024...

Imagen


En el gráfico-resumen anterior, que he confeccionado a partir de datos dispersos, pueden verse los valores de tiempo y frecuencia posibles de cada Timer del Arduino UNO dependiendo del "Prescaler" que se utilice...

Continuará...

Saludos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos (y los "Timers") con Arduino...

#359 Mensaje por Anilandro »

Observar otra vez en el gráfico que los Prescalers/Timers permiten tiempos de 16uS-16,38mS en Timer0 y Timer2, ambos de 8 bits, y de 4,09mS-4,1S en Timer1 de 16 bits. Pero los Timer0/1 sólo dan 5 valores fijos de Prescaler mientras que el Timer2 da 7 valores...

Ya sabemos que el Arduino UNO dispone de los pines 2 y 3 para generar interrupciones externas, pues bien, los Timers actúan de la misma manera pero internamente. Cuando su contador alcanza el tope (255 en los Timers0/2 de 8 bits y 65535 en el Timer1 de 16) se desborda y vuelve a 0, momento en que también generan interrupciones específicas de cada Timer que podrán llamar a una función ISR para ejecutar un código determinado....

La cuestión es que los valores de tiempo/frecuencia conseguidos a partir de los Prescalers y los contadores serían inicialmente fijos, con lo cual no podríamos programar el Timer para que nos dé el tiempo o la frecuencia que queremos. Por suerte existe un sistema mediante el registro OCRnA, en el que nosotros podemos introducir un número. Entonces un comparador relaciona dicho registro con el contador principal, y cuando éste iguala a nuestro número se produce la puesta a 0 del Timer y se genera la interrupción.

En los registros d comparación OCRnA del Timer0/2 de 8 bits podemos introducir valores entre 0-255, y en el del Timer1 de 16 bits, valores 0-65535, lo cual permite generar por hardware y por cada Prescaler toda una gama de tiempos menores y mayores frecuencias, con resoluciones saltos que dependen del Timer y el Prescaler utilizado...

Saludos a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Los servos (y los "Timers") con Arduino...

#360 Mensaje por Anilandro »

Hasta aquí las generalidades de los Timers, que podremos configurar para generar señales cíclicas. En internet hay miles de confusas explicaciones, complejos códigos binarios y operaciones con bits, así que pasaré de tales métodos simplificando en lo posible la programación. Ahora bien, nuestra utilización de los Timers también tiene sus limitaciones, porque el Arduino los usa en las salidas PWM (y por tanto en las órdenes "analogWrite()"), el Timer0 los utiliza concretamente en los delay(), micros() y millis(), el Timer1 en las funciones de la librería "Servo" y el Timer2 en las funciones tone() y notone(), con lo cual cualquier interacción con tales órdenes podría dar resultados inesperados...

Un ejemplo. Si con el Timer2 del Arduino queremos generar 1 Khz, cuyo período es de 1/1000=1mS, deberemos dividir este tiempo por 2 para crear interrupciones que pongan de forma cíclica el Pin-13 a 0 y a 1 ...Por tanto se deberá crear una interrupción cada 0,5 mS = 500 uS. En la tabla el valor más cercano por exceso a éste es:

Imagen


Siempre deberemos elegir la columna de Prescalers más baja posible pero cuyo tiempo iguale o supere el tiempo que queremos generar. En este caso corresponde al Prescaler 32, cuyo código de activación es 3, que asignaremos al registro TCCR2B = 3; En realidad también habríamos podido elegir los Prescalers mayores, el 64, 128, 256... pero la resolución de tiempo (y por tanto de frecuencia) sería menor (1/2, 1/4, 1/8...) por tanto, por norma, siempre deberemos elegir el menor posible...

...Vale, con el Prescaler 32 ya tendríamos el Timer2 generando interrupciones cada 512 uS, con su contador de 8 bits alcanzando 255 y volviendo a 0, pero como queremos que sea cada 500 uS, el valor del comparador deberá ser menor de 255 y saldrá de una regla de tres 255x500/512=249,02, por tanto en OCR2A entraremos el valor 249.

Entonces, el Timer2 llamará a la rutina ISR de interrupción llamada "TIMER2_COMPA_vect", nombre que no podemos elegir, y cada 500 uS cambiará el estado del Pin 13, 0-1-0-1-0 etc... generando una bonita señal cuadrada de 1.000 Hz...

El programa completo será:

Imagen


Observemos que dentro del "loop()" no hay código, porque los Timers van de forma independiente al programa general. Pero si quisiéramos cambiar la frecuencia del Timer podríamos hacerlo desde el "loop()", asignando distintos valores a TCCR2B y OCR2A, siempre de acuerdo con la tabla de Prescalers...

...Y su resultado visto en el osciloscopio...

Imagen


...Este sencillo programa de prueba lo podéis bajar desde el Drive: https://t.co/VjvqnvySdP

Saludos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados