Autor Tema: Control de varios servos con pulsadores (push boton) y el pic 16F628A  (Leído 31495 veces)

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

Desconectado slayfer

  • PIC10
  • *
  • Mensajes: 9
Control de varios servos con pulsadores (push boton) y el pic 16F628A
« en: 20 de Septiembre de 2009, 22:07:50 »
hola que tal a todos

bueno soy estudiante de Sistemas digitales  y para este fin de semestre tengo que mostrar un proyecto mi idea es hacer un brazo robot con 2 tipos de uso , el primero con una secuencia de movimientos totalmente automatizados , y la segunda poder controlar el brazo por medio de un control  ( elaborado por mi mismo con push boton). el problema con el que me encuentro es el siguiente, no soy bueno en eso de la programacion de los "Pic" tengo conocimientos muy basicos de programacion con Pic Basic Pro, y por medio de unos tutoriales en logrado controlar un servo HS-311  con una movimiento de 180°  quiero mostrarles el codigo que elabore , lo que deseo es poder controlar 3 servos con diferentes votones , ejemplo  2 pulsadores para cada servo(esto podria ser derecha izquierda ariba o abajo depende) el codigo que les presento es  para un Pic  12F629  pero me hacen falta terminales para conectar mis servos y pulsadores yo nesesito un minimo de 12  pin's

Citar

cmcon=7
control var gpio.0    'Pin para el servo motor
incrementar var gpio.1 'Pin de pulsador para incremento
disminuir var gpio.2 'Pin de pulsador para decremento
x var byte 'x de tamaño 256
r var byte 'y de tamaño 256
trisio=%00000110
gpio=0
x=150 ; 'Posición inicial del servo motor
inicio:
pulsout control,x 'Envía x por el pin portb.1 (control)
gosub timer 'Subrutina de chequeo del pulsador
goto inicio
timer:
if incrementar=0 then gosub mas 'Si el p esta a tierra, ir a subr "mas"
if disminuir=0 then gosub menos 'Si el p esta a tierra, ir a subr "menos"
return
mas: 'Subrutina de aumento de posición
pause 10
x=x+1 ; 'Aumento del pulso de salida
if x>250 then x=250 'Determina un valor máximo de 300
return
menos: 'Subrutina de disminución de posición
pause 10
x=x-1 'Disminución del pulso de salida
if x<50 then x=50 'Determina un valor mínimo de 300
return
end



muchas gracias por su tiempo ,  qusiera un pequeña orientacion sobre como programar .

Desconectado _Maxi

  • PIC10
  • *
  • Mensajes: 34
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #1 en: 21 de Septiembre de 2009, 08:53:58 »
Hola Slayfer... no entiendo mucho del lenguaje que usas, pero es relativamente sencillo de hacer lo que pides, usando C con compilador CCS. Aquí el compañero RedPic explica cómo manejar hasta 8 servos: http://www.todopic.com.ar/foros/index.php?topic=20335.0

Acá tenés el foro para programar en C: http://www.todopic.com.ar/foros/index.php?board=4.0

Acá tenés un tutorial para arrancar (hecho por alguien del foro, no recuerdo quien): http://www.mediafire.com/download.php?atcxoneynnm

Y acá "ejemplitos":

http://www.todopic.com.ar/foros/index.php?topic=4530.0

http://www.todopic.com.ar/foros/index.php?topic=4531.0

Si te decides por este lenguaje, te puedo dar una mano...

Te cuento lo que tuve que hacer yo. Yo tengo que manejar una mano, y para eso, tengo que sensar el movimiento de 5 dedos con un sensor que me entrega una señal analógica según la posición del dedo, después interpretarlo, y controlar el ancho del pulso de cada servo según ese valor analógico. Es decir, mientras más alto el valor que llega, más largo el pulso, y viceversa.

El circuito que usé es éste:



Y el código es éste: No está nada perfecto, de hecho está en etapa "beta", pero sirve por el momento. Si no lo entiendes, recuerda leer primero el topic que te puse arriba sobre el algoritmo para controlar los servos.

Código: C
  1. #include <16f887.h>
  2. #device ADC=10
  3. #use delay (clock=20000000)
  4. #include <lcd.c>
  5. #use fast_io(a)
  6. #use fast_io(c)
  7.  
  8. #define pinServo0 PIN_C0
  9. #define pinServo1 PIN_C1
  10. #define pinServo2 PIN_C2
  11. #define pinServo3 PIN_C3
  12. #define pinServo4 PIN_C4
  13. #define pinServo5 PIN_C5
  14. #define pinServo6 PIN_C6
  15. #define pinServo7 PIN_C7
  16.  
  17. int16 ticksTotalServo = 12500; //tickAltoMaximo = 11500 tickAltoMinimo = 3500
  18. int16 ticksAltoServo[8];
  19. int8 servoAMover=0;
  20. int1 subir=1, enableServo[8]={1,1,1,1,1,0,0,0};
  21.  
  22. #int_timer1
  23. void intTimer(void)
  24. {
  25.    if(subir==1)
  26.    {
  27.       if(servoAMover == 0 && enableServo[0] == 1) output_high(pinServo0);
  28.       if(servoAMover == 1 && enableServo[1] == 1) output_high(pinServo1);
  29.       if(servoAMover == 2 && enableServo[2] == 1) output_high(pinServo2);
  30.       if(servoAMover == 3 && enableServo[3] == 1) output_high(pinServo3);
  31.       if(servoAMover == 4 && enableServo[4] == 1) output_high(pinServo4);
  32.       if(servoAMover == 5 && enableServo[5] == 1) output_high(pinServo5);
  33.       if(servoAMover == 6 && enableServo[6] == 1) output_high(pinServo6);
  34.       if(servoAMover == 7 && enableServo[7] == 1) output_high(pinServo7);
  35.    set_timer1(65535 - ticksAltoServo[servoAMover]);  
  36.    subir = 0;
  37.    }
  38.    else if(subir==0)
  39.    {
  40.       if(servoAMover == 0 && enableServo[0] == 1) output_low(pinServo0);
  41.       if(servoAMover == 1 && enableServo[1] == 1) output_low(pinServo1);
  42.       if(servoAMover == 2 && enableServo[2] == 1) output_low(pinServo2);
  43.       if(servoAMover == 3 && enableServo[3] == 1) output_low(pinServo3);
  44.       if(servoAMover == 4 && enableServo[4] == 1) output_low(pinServo4);
  45.       if(servoAMover == 5 && enableServo[5] == 1) output_low(pinServo5);
  46.       if(servoAMover == 6 && enableServo[6] == 1) output_low(pinServo6);
  47.       if(servoAMover == 7 && enableServo[7] == 1) output_low(pinServo7);
  48.    set_timer1(65535 - ticksTotalServo + ticksAltoServo[servoAMover]);  
  49.    servoamover++;
  50.    if (servoAMover > 7) servoAMover = 0 ;
  51.    subir = 1;
  52.    }
  53. }
  54.  
  55. void main()
  56. {
  57.  
  58.    int8 i;
  59.  
  60.    set_tris_c(0x00);
  61.    set_tris_a(0xFF);
  62.  
  63.    setup_adc(ADC_CLOCK_INTERNAL);
  64.    setup_adc_ports(ALL_ANALOG);  
  65.    
  66.    disable_interrupts(global);
  67.    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  68.    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  69.    setup_timer_2(T2_DISABLED,0,1);
  70.    port_b_pullups(FALSE);
  71.  
  72.    enable_interrupts(int_timer1);
  73.    enable_interrupts(global);
  74.    
  75.    set_timer1(60000);
  76.      
  77.    while(1)
  78.    {
  79.    
  80.       for(i=0;i<8;i++) //leyendo los valores de los LDR
  81.       {
  82.          if(enableServo[i]==1)
  83.          set_adc_channel(i);
  84.          delay_ms(10);
  85.          ticksAltoServo[i] = 4750 + (read_adc()*5)  ;
  86.          
  87.       }
  88.      
  89.            
  90.    }
  91.  
  92. }

Cualquier duda me decís! :)

Suerte.
« Última modificación: 21 de Septiembre de 2009, 08:55:59 por _Maxi »

Desconectado slayfer

  • PIC10
  • *
  • Mensajes: 9
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #2 en: 21 de Septiembre de 2009, 12:53:09 »
hola que tal

muchas garcias a sido de gran ayuda,  tengo principios basico de C  ( solo nesesito implementarlo mas con los PIC) agradesco tu ayuda y tomare como referencia   tu diagrama y tu codigo espero y no haya inconveniente tratare de modificarlo para  utilizar Pulsadores  y no los sensores que implementas.

implementava PIC Basic porque me comentaron que el manejo de Servos con Pic relativamente sensillos era muy facil, ( pero que se perdia un poco el control y no se explotavan los recursos al maximo)

una preguntita mas utilizas el PIC 16F887   yo planeo contruirme  el Programador  Pickit2 clone reloaded de "  felixls " ( de echo hoy compre todos los componentes por la mañana ) y quisiera saver si sera posible grabar el pic que tu propones o el que yo propongo. ( tengo entendido que va muy bien con Pic gama media pero grabara estos pic)


gracias y hasta luego ( muy buenos link) 

Desconectado _Maxi

  • PIC10
  • *
  • Mensajes: 34
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #3 en: 21 de Septiembre de 2009, 15:32:06 »
Slayfer, supongo que será compatible, no lo se. Yo uso un programador por puerto serie (JDM). El programa que uso para grabar es el picpgm, que es compatible con 16f887. El winpic800 creo que también, pero sólo con grabador usb, razón por la cual me pasé a picpgm. En fin, si ya tenés los componentes, no te queda otra que armarlo y probarlo con varios programas a ver si te anda y cuál te gusta más. Suerte!

Desconectado piedrita

  • PIC10
  • *
  • Mensajes: 1
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #4 en: 19 de Noviembre de 2009, 09:35:13 »
hola soy estudiante de Ing. electronica estoy haciendo un brazo robotico con 4 servomotores y eso va estar colocado en un carrito , pero mi carrito tiene dos mootres dc a 6 v. me compre 2 pic 16f877a y el modulo rf(czs-3) que es transmisor y el receptor mi idea es controlarlo todo mediante rf haber si alguien me ayuda con la programacion ya sea en lenguaje c o en lenguaje picbasic. te agradece su apoyo brindado.

Desconectado PRIAN

  • PIC10
  • *
  • Mensajes: 6
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #5 en: 08 de Julio de 2010, 07:59:35 »
hola a todos
Bueno solo queria decir en este caso preguntar, si los servos que tienes conectado a tu micro te funcionan en la protoboar con el voltaje suministrado al pic?
Pregunto esto por que yo tengo conectado 2 servos a un pic 16f628A y solo me funciona uno de ellos y en este caso tengo que suministrar energia independiente, osea 5 volt para el pic y 5 volt para el servo. El pic esta programado para actuar por si solo, y la programación realiza el movimiento de 2 servos que giran en un sentido cada uno, el problema como ya dije es que en la simulacion (Proteus) todo va perfecto, pero cuando paso ala protoboard el voltage del micro no me puede alimentar ni siquiera a uno de los servos, de forma que conecto los 2 servos con energia independiente pero aún asi solo me funciona uno de ellos , el otro se queda como queriendo pero no se inmuta, lo mismo me ocurre cuando actuo con pulsadores solo uno de los motores puede ser comandado y con energia a parte.
Me podeis ayudar en algo? he visto videos donde con un solo micro alimentado por una señal ttl de 5vol funcionan hasta 8 servos HS 322.
Tambien decir que puedo subir el código para comandar 8 servos,  y la simulación en proteus, por si os sirve de algo, yo vuelvpo a repetir tengo todo programado perfectamente y conectado llevo semanas calentandome la olla y no consigo entender por que no puedo moverlos con la carga suministrada al micro.
Un cordial saludo y gracias de antemano.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #6 en: 08 de Julio de 2010, 08:57:23 »
hola Prian, pues si, para alimentar los servos necesitaras energia adicional, creo con un transistor en saturación te serviria para cada uno de los servos.

Si tu fuente es por ejemplo de 1A, para controlar 8 servos de los mas pequeños tendria que funcionar, dependerá de la corriente que consuma el servo que tengas. O sea, con la misma fuente podras alimentar el PIC y los servos.

Si estas usando dos fuentes, verifica que las masas esten unidas, suele ser algo que se pasa por alto :mrgreen:
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado PRIAN

  • PIC10
  • *
  • Mensajes: 6
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #7 en: 08 de Julio de 2010, 14:45:54 »
hola willynovi y gracias por tu rapida respuesta, Entonces? para utilizar 8 servos necesito alimentación adicional?, no acabo de entenderte, podrias esplicarme un poco más la cosa??  y eso de los transistores en saturación , que transitores tendría que usar, te refierre a usar un CI L293D, L293B, UCN5804 ,de estos? si es asi aver si puedes subir un esquema de la conecxión , la verdad es que no sabia si es que se trastase de estos CIs que se pudiesen usar con servos, de no ser asi intenta explicarmelo  con los transitores normales.
Referente alos servos  decirte que son unos Hitec 322HD, creo que funcionan entre 4.8 volt y 6 volt y la caida de tensión en miliamperes no se exactamente cual es, cuando uso energia adicional las masas van unidas osea la del pic con la de la fuente exerna  eso lo comprobe , y vi que  alimentando el servo con fase y neutro de la misma fuente no ivan, vueno espero que me eches un cablecito.
gracias por todo y un cordial saludo.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #8 en: 08 de Julio de 2010, 15:56:41 »
fijate esa imagen que te adjunto, a eso me refiero con lo del transistor, no lo he probado, pero estoy seguro que anda :mrgreen:
El servo tiene una entrada que es la señal de PWM, esa es la que conectas desde el transistor.

ya si esto no funciona, entraria a sospechar del programa, cual estas usando?
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado PRIAN

  • PIC10
  • *
  • Mensajes: 6
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #9 en: 09 de Julio de 2010, 08:48:35 »
Wenas willynovi, no vea que peaso de caló que hace aqui en mi tierra, bueno te comento, la programación la realizo en basic pro, lo que me deja una mijita fuera de juego es lo de conectar el transistor al PWM, esta es la entrada de datos del servo no? el pin del puerto B RB0 en este caso se supone que lo conectaría mediante una resistencia de 470 homs ala Base del transistor, el colector a señal de 5 vols, y me dices que el emisor según tu ejemplo entra en masa mediante resistencia de 10K y lo llevamos ala entrada de datos del servo. Ahora te pregunto desde mi punto de vista de la ignorancia , ya te digo yo soy un profano en el campo de la electronica, solo se lo minimo, pero entonce el servo sigue alimentadose  de igual forma que anteriormente con los 5 vols que suministro al pic no?, lo siento tio si soy un torpe pero me lo va a tener que explicar otra vez.
Se supone que la mision del transistor es amplificar la señal, no se si estoy en lo cierto, si es asi , ?no deveria el emisor conectarse ala entrada de corriente del servo?  te pregunto ..
Bueno espero tu respuesta, y de verdad muchas gracias por tu ayuda, ave si entre tu y yo echamos andar los dichosos servos, gracias de nuevo y un cordial saludo.


Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #10 en: 09 de Julio de 2010, 09:28:20 »
si es asi como lo explicaste tu, tal cual esta en el dibujito que te pase, asi me ha funcionado para mi cuando quiero alimentar algo desde el pic.
Como te decia, si la fuente que tienes puede suministrar la corriente que consumen los servos, pues no habria problema.

Si, el servo tiene tres cables, 5V, GND y SEÑAL.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado PRIAN

  • PIC10
  • *
  • Mensajes: 6
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #11 en: 09 de Julio de 2010, 10:01:03 »
Buenas  de nuevo, entonces para concretar, tendria que poner un transistor para cada servo , es correcto? y la referencia que me das el NPN-2N3904 es el que tendria que usar? teniendo en cuenta que  los servos funcionan con una corriente de entre 4.5 a 6 volt?
Buenno Willy voya probar aver que tal ,esta tarde me pillo 8 transistores y ya te cuento. gracias de nuevo un saludo.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #12 en: 09 de Julio de 2010, 12:36:39 »
el 2N3904 te lo he nombrado porque es uno de los mas comunes, sino tambien tienes el BC547.
Si no para tu aplicacion creo que cualquier transistor que consigas mientras que sea NPN te servirá.

Luego que tengas los transistores consiguete el datasheet para ver las patas, porque no todos son iguales.

Saludos
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado PRIAN

  • PIC10
  • *
  • Mensajes: 6
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #13 en: 09 de Julio de 2010, 14:36:03 »
Hola y gracias willynovi, ahora iva a salir y hacerme de ellos, Una preguntita, este proyecto de servo me lance ala aventura por que no habia forma de echar andar motores de pasos bipolaree que tengo un monton de ello, hice pruebas y mas pruebas con los driver l293D, l293B, ULN2003A, nada de nada, mire casi todos los ejemplos y videos de la red y no pude conseguir echarlos andar, incluso en la simulación, ISIS los motores bipolares hacian lo que le daban la gana, los unipolares me funcionan perfecto al menos en simulacion ISIS, y en el protoboar tambien logre echar andar uno de ellos pero me aburrio y tube que abandonar, tienes algún truco para que furule bien dichos motores?, o sabes si trucando los servos siguen siguen funsionando los pulsos de igual manera?, si tienes algo referente a bipolares te agradeceria la información, ya te digo que tengo un monton de ellos todos bipolares de impresoras desechables, bueno gracias de nuevo, ya te ire contando cuando termine  el montaje.

Desconectado PRIAN

  • PIC10
  • *
  • Mensajes: 6
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #14 en: 09 de Julio de 2010, 20:58:07 »
Hola de nuevo , bueno acabo de conectar una fuente de 12 volt mediante un trial regulador de corriente para obtener un voltaje plano de 5 volt, el cual me alimenta al pic, luego del pin 6 puerto B RB0 he sacado conexión hacia la base del transistor pasando por una resistencia de
465 hom, del emisor conectado a una resistencia de 10K he conecxionado con la entrada de señal del servo, la masa del servo lo he llevado a masa y el cable rojo de corriente a corriente, y no reacciona en absoluto, estoy haciendo algo mal? he quemado en el pic un pequeño programita que solo hace la funsion de mover el servo en dos sentidos hacia delante y hacia detras, probado en ISIS todo perfecto pero  reitero en la protoboad no responde,,,, ayuda plisss... el transistor es el 547
Un cordial saludo.



 

anything