TODOPIC

FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: Marttyn en 17 de Enero de 2007, 00:27:25

Título: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 17 de Enero de 2007, 00:27:25
hola a todos!
hace un tiempo estaba con un proyecto de "iniciacion" en el cual hacia bailar a un oso de peluche con una musica de una tarjeta de felicitacion. gratamente me han dado la informacion necesaria para poder concluir ese proyecto, que no servia para nada, pero me daba practica para empezar con los micros.
ahora, habiendo concluido ese extraño proyecto quiero iniciar uno nuevo, aun mas extraño:
quiero hacer que una boca cante una cancion...
raro verdad? la cosa es asi: tengo una plancha de plastico que por detras tiene una palanca con la cual al apretarla abre una boca que hay delante de la plancha. manualmente puedo darle a la palanca siguiendo la letra de una cancion y da la sensacion de que la boca canta... pero para complicarlo quiero que esto lo haga un servo. es decir, grabar los movimientos de un servo al compas de la letra para que al reproducir los movimientos de este servo se ejecunten tal como se grabaron y pueda cantar la cancion autonomamente... jeje, a que mola?  :mrgreen:
mi idea es esta: para grabar los movimientos del servo mantendria pulsado un boton y haria girar un potenciometro para un lado o para otro para abrir o cerrar la boca durante la totalidad de la cancion. una vez grabados los movimientos poder darle a otro boton y que los movimientos tal y como se grabaron se reproduzcan, incluso a la misma velocidad para que esten sincronizados con la cancion.
estuve mirando por el foro y no encontre la manera de grabar las posiciones en cada instante del servo, ni tampoco como moverlo con el potenciometro, aunque esto creo que sabria hacerlo con la funcion de escalado (para mover entre 0 y 180º), y un filtro de paso bajo en el potenciometro para evitar las vibraciones de impresicion que se generan al girar la ruedita.
alguien podria ayudarme? aunque sea orientarme y decirme donde buscar, porque lo que encontre sobre esto funciona bajo soft de pc, pero me gustaria que no tuviera que usar el pc mas que para grabar el codigo en el micro y luego que el propio micro pueda gestionar la grabacion y reproducion de los movimientos.
si algun dia consigo sacar adelante este proyecto lo fusionare con el muñeco que baila al compas de la musica para hacer un MUÑECO QUE CANTA Y BAILA!!!
que surrealista lo mio, no? pero no hay mejor manera de aprender que diviertiendose  :D
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Nocturno en 17 de Enero de 2007, 03:42:58
Jeje, lo tuyo es la animatrónica eh  :D

A primera vista parece un proyecto muy divertido. Se me ocurre que tendrás que manejar cuatro periféricos:

- el conversor ADC para leer el potenciómetro
- la salida PWM para mover el servo. En su defecto puedes generar PWM por software.
- el timer para registrar en qué momento se lee el potenciómetro
- una comunicación hacia memoria externa, típicamente I2C, para almacenar los movimientos de la boca. Podrías tener una EEPROM para cada canción  :-)

Ánimo con el proyecto y a ver si nos cuelgas un vídeo.
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 17 de Enero de 2007, 12:33:21
pues mas o menos es lo que tenia pensado hacer...
aunque con alguna variacion:
-que el aparato se pueda encender o apagar y se quede en standby
-en modo standby poder mover el potenciometro y que se mueva el servo, sin que estos movimientos sean guardados
-el timer para la grabacion no lo veo, simplemente, al mantener pulsado un boton se borra la eeprom y comienza a grabar desde el principio de la misma hasta que el boton se suelta
-estando en standby, se le da a otro boton en el momento exacto que empieza la cancion y la boca seguira la letra como se haya grabado

podrias darme alguna nocion de como grabar los movimintos del servo en tiempo real en una memoria eeprom?
gracias!
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: 5GTT en 17 de Enero de 2007, 12:43:37
No se si sabras que el servo internamente tiene un potenciometro, si lo abres y sacas un cable de una de sus patillas puedes medir con el A/D del pic su tension en cada momento. Monitoreas programando el pic para que lea esa tension cada cierto tiempo y guardas esos valores en algun sitio.

Despues solo tienes que interpretar que siginfica cada tension del potenciometro, es decir a que angulo corresponde y a partir de ahi ejecutar el movimiento autonomammente.

Otra opcion muchisimo mas complicada seria la de poner un microfono y segun la nota musical que le entre mover la boca...
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 17 de Enero de 2007, 13:00:14
uyuy. eso de mover la boca segun las notas musicales suena a mi proximo proyecto, porque por ahora no creo que sea capaz.
lo de sacar la señal de la posicion directamente del servo puede ser una opcion, pero creo que para esta aplicacion no tendria mucho sentido... ya que necesito que el servo se mueva como yo quiera, y por eso es el potenciometro externo, y una vez leida la señal del externo para mover el servo, para que complicar leyendo otro potenciometro, si ese dato ya lo tengo del potenciometro externo... no? a menos que el potenciometro interno sea mas lineal, entonces seria mas preciso, pero tendria que hacer una equivalencia entre los dos potenciometros, para que lo que yo muevo y lo que se graba sea lo mismo...  :shock: me estoy liando
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: 5GTT en 17 de Enero de 2007, 14:16:49
A ver que me explique. Si usas el potenciometro interno NO necesitas un potenciometro externo, los valores de este potenciometro te daran exactamente la posicion.

Edito: Esto que sugiero no es posible, ya que si quieres leer los valores del potenciometro interno, debes tener el servo encendido. Con lo cual no te permitira moverlo con la mano asi que a no ser que lo muevas "electronicamente" antes de guardar los movimentos no se puede usar la opcion del pote interno.

Saludos y perdon por la equivocacion.
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Nocturno en 17 de Enero de 2007, 14:24:17
Yo programaría el Timer para que lanzase su interrupción cada X tiempo, podrías probar cada 50ms, por ejemplo.

En la interrupción lees el valor del ADC y lo guardas en la eeprom. Suponiendo que guardas lecturas de 8 bits (256 posibilidades de apertura de la boca no está nada mal) y que utilices una eeprom de 64K por ejemplo, tendrías espacio para almacenar 21 minutos de movimientos, lo que da para varias canciones.

El proceso de reproducción sería similar: el timer se programa a la misma velocidad, pero en este caso la interrupción lee la eeprom y envía posición al servo.

Y si aceleras la música para que suene como los pitufos, siempre puedes modificar el Timer a tu antojo :D
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 18 de Enero de 2007, 01:56:18
si nocturno, buena idea....
hare como dices... pero estuve intentando ver como calculaste que con una memoria de 64k, grabando un dato de 8 bits cada 50 ms te dan 21 min de grabacion.... estoy mas que seguro que no tengo la experiencia ni los conocimientos suficientes para aventurarme en dicho calculo, pero aun asi creo que la manera que lo intente hacer tiene su logica, pero no da:
8bits=1byte
64k=65536bytes, es decir se pueden guardar 65536 lecturas
65536 * 50ms = 3276800 ms de grabacion
3276800 / 1000 = 3276,8 segundos
3276,8 / 60 = 54,6 minutos ¿?  :?

cuando sepa como calcular el tiempo de grabacion hare el correspondiente pedido de samples a microchip  :mrgreen: asi pido algunas memorias y micros que valgan para este fin.... yo creo que los micros de la serie 12xxx pueden valer, no? (los de 8 pines) un pin adc para leer valores, un pwm para el control del servo, un pin normal para el boton d guardar, otro para el de reproducir, y cuantas patas del micro se usan para conectarse con una memoria externa? si con 2 llega ya tendria justito los 6 pines que me dan estos micros!  :-/
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Nocturno en 18 de Enero de 2007, 02:25:19
Sí, tienes razón, me confundí en el cálculo.
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 19 de Enero de 2007, 00:19:01
y para manejar la memoria externa es imprescindible el rs232? o se podria hacer directamente desde el micro?
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Nocturno en 19 de Enero de 2007, 02:11:07
No dije RS232, sino I2C, que se maneja directamente con dos pines del micro.
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 19 de Enero de 2007, 12:00:17
mi ignorancia es infinita  :D
gracias nocturno!
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 26 de Marzo de 2007, 00:44:45
Lo consegui! despues de muchas vueltas por el foro y de la ayuda incansable de un monton de gente respondiendo a mis preguntas he conseguido la primer parte de este proyecto! Con un PIC 12F683 hice un programa que leyera un potenciometro con el ADC y moviera un servo segun el potenciometro. Solo falta la parte de grabar los movimientos en la memoria.
el codigo es asi:

Código: [Seleccionar]
#include <12F683.h>
#device adc=8
#FUSES NOWDT,NOMCLR,INTRC_IO
#use delay(clock=4000000)

#define SERVO PIN_A1

int Posicion = 93;            //donde se posiciona el servo segun la lectura del adc
int1 flag5RTCC = 1; //indica si se completaron 5 RTCC
int1 flagPULSO_ALTO = 0; //indica si el pulso esta en alto
int contRTCC = 0; //contador de RTCC

#int_RTCC
void RTCC_isr(void){           //timer que se encarga de la señal del servo

   contRTCC = contRTCC + 1;

   if(contRTCC==4){
      set_TIMER0(30);
   }
   if(contRTCC==5){
      flag5RTCC=1;
      contRTCC=0;
   }
}

#int_TIMER1
void TIMER1_isr(void) {    //timer que registra el valor del potenciometro
int16 ValorADC;

   ValorADC=read_adc();
   Posicion = 31 + (long)((long)(ValorADC * 124) / 255);
}

void main() {

   int ValTMR0;

   delay_ms(333);

   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_4MHZ);

   set_adc_channel(0);

do {

// DISPARO DEL PULSO PWM
if(flag5RTCC==1){
flag5RTCC=0;
output_high(SERVO);
flagPULSO_ALTO=1;
}

// CONTROL DE ANCHO DEL PULSO PWM
if(flagPULSO_ALTO==1){
valTMR0 = get_TIMER0();
if(valTMR0>Posicion){ //baja el pulso en el tiempo correspondiente a Posicion
flagPULSO_ALTO=0;
output_low(SERVO);
}
}

} while(true);

}

con las modificaciones pertinentes se puede adaptar a otros pics que tengan adc y 2 timers, yo use este porque es el que tengo.
incluso se podria adaptar a uno que solo tenga un timer, poniendo las instrucciones del timer1 en el timer0. yo lo hice asi para que pense que era mejor que los valores de ADC se tomaran con menos frecuencia.
la conexion con el potenciometro fue asi: Potenciometro de 10kOhm - pata central de potenciometro a una Resistencia 10k - R10k a pin A0 del PIC.
el pin A1 va al cable de control del servo y nada mas....
el unico problema que surje es que el servo no deja de bailar cuando deberia estar quieto. intente filtrar el voltaje que viene del potenciometro con un condensador entre A0 y Vss, pero lo unico que hace es que tarde un poco mas en responder a los movimientos del potenciometro, pero sigue bailando cuando no debe.
a alguien se le ocurre algo para solucionar esto?
yo seguire trabajando para conseguir la siguiente fase, que es guardar los movimientos en una memoria externa y luego poder reproducirlos
espero que esto sea de interes para alguien
salu2
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 02 de Abril de 2007, 17:02:45
el unico problema que surje es que el servo no deja de bailar cuando deberia estar quieto. intente filtrar el voltaje que viene del potenciometro con un condensador entre A0 y Vss, pero lo unico que hace es que tarde un poco mas en responder a los movimientos del potenciometro, pero sigue bailando cuando no debe.
a alguien se le ocurre algo para solucionar esto?

este problema ya esta resuelto, el servo no dejaba de bailar porque mi fuente no estaba estabilizada. a mi 7805 no le habia puesto consensadores y el voltaje de salida era el que bailaba... entonces el ADC tenia un Vref diferente cada vez y eso hacia que las mediciones fueran siempre diferentes. usando pilas, o filtrando bien la fuente no hay problemas.

sigo en mi cruzada por grabar y reproducir los movimientos de una eeprom por I2C, pero me esta costando un poco, aunque parece MUY simple con los drivers para este fin del CCS. en fin, cuando lo tenga terminado lo cuelgo. salu2
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: gauchosuizo en 03 de Abril de 2007, 15:21:05
hola

una pregunta: como distinguis la musica cantada de la no cantada? Tenes planeado hacer esto?
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: Marttyn en 03 de Abril de 2007, 19:04:45
en principio este proyecto no contempla que la boca se mueva siguiendo la cancion, sino que se PROGRAMAN MANUALMENTE los movimientos para cada cancion en concreto, con lo que eres tu mismo el que abre o cierra la boca (con el potenciometro) siguiendo la letra de la cancion. no hay ningun sensor que siga los graves, agudos o esas cosas de la musica.
tal vez en un fututro proyecto se pueda hacer algo asi, pero no lo tengo planteado.
este proyecto, en si, no tiene ningun sentido. me lo plantee asi para aprender a usar servos, y con las contribuciones que se hicieron a este hilo colateralmente estoy aprendiendo interrupciones, timers, ADC, I2C, PWM... la verdad que nada mal para ser el segundo proyecto que hago.
quien sabe cual sera mi proximo proyecto... con lo loco que soy  :mrgreen:
eso si... por ahora esto no esta terminado y me quedan muchas cosas por hacer aqui. cuando lo termine a ver que locura se me ocurre  :-/
Título: Re: Mover servo con potenciometro y grabar los movimientos
Publicado por: gauchosuizo en 05 de Abril de 2007, 03:14:00
hola

pues puedes ir pensando ya como distinguir los diferentes tonos de una cancion :).