Cientificosaficionados.com

Los foros de los científicos aficionados de la red.
Fecha actual Dom Sep 20, 2020 11:46 pm

Todos los horarios son UTC [ DST ]




Nuevo tema Responder al tema  [ 405 mensajes ]  Ir a página Anterior  1 ... 33, 34, 35, 36, 37, 38, 39 ... 41  Siguiente
Autor Mensaje
NotaPublicado: Sab Ago 10, 2019 12:12 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
NotaPublicado: Sab Ago 10, 2019 1:59 pm 
Desconectado

Registrado: Mar Sep 16, 2014 12:55 am
Mensajes: 936
País: españa
Ciudad: barcelona
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.


Arriba
 Perfil  
 
NotaPublicado: Sab Ago 10, 2019 5:37 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
NotaPublicado: Dom Ago 11, 2019 3:59 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
NotaPublicado: Mar Ago 13, 2019 4:33 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
NotaPublicado: Jue Ago 15, 2019 11:35 am 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
NotaPublicado: Vie Ago 16, 2019 9:07 am 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
NotaPublicado: Vie Ago 16, 2019 10:00 am 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
NotaPublicado: Sab Ago 17, 2019 12:03 am 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
NotaPublicado: Sab Ago 17, 2019 8:44 am 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4905
Ubicación: Islas Baleares, España
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


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 405 mensajes ]  Ir a página Anterior  1 ... 33, 34, 35, 36, 37, 38, 39 ... 41  Siguiente

Todos los horarios son UTC [ DST ]


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com