Autor Tema: Mover servo con potenciometro y grabar los movimientos  (Leído 8383 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1834
    • IDEAA
Mover servo con potenciometro y grabar los movimientos
« 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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #1 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.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1834
    • IDEAA
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #2 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!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #3 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...

Tutoriales y proyectos de electrónica

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1834
    • IDEAA
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #4 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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #5 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.
« Última modificación: 17 de Enero de 2007, 14:19:23 por 5GTT »

Tutoriales y proyectos de electrónica

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #6 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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1834
    • IDEAA
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #7 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!  :-/
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #8 en: 18 de Enero de 2007, 02:25:19 »
Sí, tienes razón, me confundí en el cálculo.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1834
    • IDEAA
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #9 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?
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #10 en: 19 de Enero de 2007, 02:11:07 »
No dije RS232, sino I2C, que se maneja directamente con dos pines del micro.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1834
    • IDEAA
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #11 en: 19 de Enero de 2007, 12:00:17 »
mi ignorancia es infinita  :D
gracias nocturno!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1834
    • IDEAA
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #12 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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1834
    • IDEAA
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #13 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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado gauchosuizo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 457
Re: Mover servo con potenciometro y grabar los movimientos
« Respuesta #14 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?
Saludos desde Suiza, Pablo.


 

anything