Autor Tema: Problema con cotrol de servos y 16F84A (SOLUCIONADO)  (Leído 21344 veces)

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

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Problema con cotrol de servos y 16F84A (SOLUCIONADO)
« en: 10 de Febrero de 2009, 00:56:41 »
Hola a todos, soy nuevo en el foro y en el mundo de los pics.
Estoy con un problema, tengo unos servos Tower Pro SG90 y me arme un programita para probarlos.
El problema es que los servos nisiquiera responden.

Código: [Seleccionar]
#INCLUDE <16F84A.h>

#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)
#DEFINE INTS_PER_SECOND 250 // (4000000/(4*4*250))

int int_count,milisegundos,segundos;

#INT_RTCC
Interrupcion_RTCC() {
   set_timer0(0);
   if(--int_count==0) {
      milisegundos++;
      if(milisegundos==1000) {
         segundos++;
         milisegundos==0;
      }
      int_count=INTS_PER_SECOND;
   }
}

void main() {
   int_count=INTS_PER_SECOND;
   milisegundos = 0;
   segundos = 0;

   setup_counters(RTCC_INTERNAL,RTCC_DIV_4);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   set_timer0(0);

   while(1) {
      if(segundos==2 || segundos==3) { // IR A 90°
         output_high(PIN_B1);
         delay_us(1500);
         output_low(PIN_B1);
         delay_us(18500);
      }
      if(segundos==4 || segundos==5) { // IR A 180°
         output_high(PIN_B1);
         delay_us(2100);
         output_low(PIN_B1);
         delay_us(17900);
      }
      if(segundos==6 || segundos==7) { // IR A 0°
         output_high(PIN_B1);
         delay_us(900);
         output_low(PIN_B1);
         delay_us(19100);
      }
      if(segundos==8) {
         segundos = 0;
      }
   }
}
« Última modificación: 15 de Febrero de 2009, 06:06:06 por chacruna »

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Problema con cotrol de servos y 16F84A
« Respuesta #1 en: 10 de Febrero de 2009, 07:07:34 »
Hola chacruna, se bienvenido al foro:

Has mirado con un osciloscopio que realmente te está sacando el PWM requerido para tu servo. Has probado algo tan sencillo como esto para ver si responde.

Código: [Seleccionar]
#INCLUDE <16F84A.h>

#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)


void main() {

   while(1) {
         output_high(PIN_B1);
         delay_us(1500);
         output_low(PIN_B1);
         delay_us(18500);
   }
}

Un saludete.

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #2 en: 10 de Febrero de 2009, 11:55:56 »
No he mirado en el osciloscopio basicamente porque no cuento con uno. De todos modos simule el programa con el PIC Simulator IDE, pero el problema es que lo simula demasiado lento, entonses puedo ver cuando se pone en 1 la salida, pero ese estado dura entre 900us y 2000us que parece que es MUUUUUCHO para la velocidad de la simulacion, entonses "nunca" baja a 0, cuanto cambio a valores como 5us se puede ver el PWM.

Saludos
« Última modificación: 10 de Febrero de 2009, 11:58:04 por chacruna »

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #3 en: 10 de Febrero de 2009, 12:26:46 »
Agrego un detalle:

Para que el PIC Simulator IDE funcione tuve que agregar "set_tris_b(0);". Sin esto no alteraba el estado de la salida.

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #4 en: 10 de Febrero de 2009, 13:34:46 »
Escribi un codigo para simularlo con el PC IDE Simulator. Dividi por 100 los tiempos para que se pueda visualizar mejor.
Los resultados parecen estar bien, sin embargo el servo sigue sin funcionar :shock:


Código: [Seleccionar]
#INCLUDE <16F84A.h>

#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)

void main() {
   set_tris_b(0);

   while(1) {
         output_high(PIN_B0);
         output_high(PIN_B1);
         output_high(PIN_B2);
         
         delay_us(9);
         output_low(PIN_B0);
         
         delay_us(6);
         output_low(PIN_B1);

         delay_us(6);
         output_low(PIN_B2);
         
         delay_us(179);
   }
}


Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Problema con cotrol de servos y 16F84A
« Respuesta #5 en: 10 de Febrero de 2009, 15:20:09 »
Pues ocurren varias cosas, no le estas metiendo la señal al servo por la patilla adecuda, por norma el cable blanco y por supuesto tener la alimentación 5V al rojo y la masa al negro, además de tener conectadas entre sí las masas del pic y del servo sino vamos mal.

El servo esté roto, con lo que la única manera de asegurarte es con un osciloscopio para mirar si la señal es la adecuada, por otro lado mira el datasheet del servo a ver si va a tener un rango de tiempos distintos.

Vamos que no debería de darte tantos quebraderos de cabeza algo tan sencillo.

Ya me comentarás haciendo todo lo que te comento.

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #6 en: 10 de Febrero de 2009, 15:28:35 »
Los cables estan bien conectados (Naranja = Datos, Rojo = Vcc, Marron = Gnd)

Quizas los servos esten rotos, hoy voy a probar con un servo nuevo.



Citar
"Tower Pro SG90 Micro Servo"

It fit for most brands of radio equipment including Hitec, Futaba, GWS, JR, Sanwa ….

Specification :

* Weight : 9 g

* Size : 22 x 11.5 x 27 mm

* Operating Speed (4.8V no load): 0.12sec/60 degrees
* Stall Torque (4.8V): 17.5oz/in (1.2 kg/cm)

* Temperature Range: -30 to +60 Degree C
* Dead Band Width: 7usec
Operating Voltage:3.0-7.2 Volts



Encontre estos "TowerPro SG90 Test Programs" y por lo que veo las señales son las correctas.


Código: [Seleccionar]
*** Seeeduino & Towerpro SG90 Test Program - TL Fong 2009jan08

/******************************************************************************
* Hello Servo - Turn TowerPro SG90 servo to middle position
* Created - 2009jan07, Last update - 2008jan07
* Function - Turn servo to middle position
* MPU/Programming language - Seeeduino v1.1/Arduino v12.0
* Author - TL Fong (tlfong01, TaoBao)
* Copyright - Creative Commons Attribution - ShareAlike 3.0 Licence
*
* Test procedure
* (1) FIRST run the program,
* (2) Manually turn servo clockwise or counterclock to limit,
* (3) Connect 5V power and MPU signal to servo,
* (4) WARNING - Disconnect 5V power before stopping program,
*
* TowerPro SG90 Spec
* CCW end 900uS, CW end 2100uS, middle 1500uS, 3.0 to 6.0V,
* 9g, 22 * 11.5 * 27mm, 0.12sec/60 degrees (4.8V no load),
* stall torque 17.5ozin/1.2 kgcm) (4.8V), dead band 7usec,
* coreless motor, all nylon gear, RMB30 (TaoBao).
*
* Notes
* 1. To turn counter clockwise limit, change pulse width from 1500 to 900.
* 2. To turn clockwise limit, change pulse width from to 2100.
******************************************************************************/

int signalPin = 8; //servo signal pin

void setup()
{
 pinMode(signalPin, OUTPUT);
}

void loop()
{
   digitalWrite(signalPin, HIGH);  // control signal high
   delayMicroseconds(1500);        //   for 1500 uS
   digitalWrite(signalPin, LOW);   // control signal low
   delay(20);                      // wait 20mS
 }

/* End of program */


Código: [Seleccionar]

/******************************************************************************
* Hello Servo - v2.0
* Created - 2009jan07, Last update - 2008jan07
* Function - Repeatedly position servo to one end, middle, and the other end
* Servo - Towerpro SG90
* MPU/Programming language - Seeeduino v1.1/Arduino v12.0
* Author - TL Fong (tlfong01, TaoBao)
* Copyright - Creative Commons Attribution - ShareAlike 3.0 Licence
*
* Test procedure
* (1) FIRST run the program,
* (2) Manually turn servo clockwise or counterclock to limit,
* (3) Connect 5V power and MPU signal to servo,
* (4) WARNING - Disconnect 5V power before stopping program.
*
* TowerPro SG90 Spec
* CCW end 900uS, CW end 2100uS, middle 1500uS, 3.0 to 6.0V,
* 9g, 22 * 11.5 * 27mm, 0.12sec/60 degrees (4.8V no load),
* stall torque 17.5ozin/1.2 kgcm) (4.8V), dead band 7usec,
* coreless motor, all nylon gear, RMB30 (TaoBao).
*
* Notes
  * Hold time = 100 * 20mS = 2 seconds
*
* Disclaimer
* Use the program at your own risk.  This program is written by a servo newie.
* There is no guarantee that the program will not damage your servo.
******************************************************************************/

int signalPin = 8; //servo signal pin

void setup()
{
 pinMode(signalPin, OUTPUT);
}

void loop()
{
  for (int i=0; i <= 100; i++)     // turn to CCW end, hold 2 seconds
   {
   digitalWrite(signalPin, HIGH);  // control signal high
   delayMicroseconds(900);        //   for 900 uS
   digitalWrite(signalPin, LOW);   // control signal low
   delay(20);                      // wait 20mS
   }

  for (int i=0; i <= 100; i++)     // turn to middle, hold 2 seconds
   {
   digitalWrite(signalPin, HIGH);  // control signal high
   delayMicroseconds(1500);        //   for 1500 uS
   digitalWrite(signalPin, LOW);   // control signal low
   delay(20);                      // wait 20mS
   }

  for (int i=0; i <= 100; i++)     // turn to CW end, hold 2 seconds
   {
   digitalWrite(signalPin, HIGH);  // control signal high
   delayMicroseconds(2100);        //   for 1500 uS
   digitalWrite(signalPin, LOW);   // control signal low
   delay(20);                      // wait 20mS
   }
 
   for (int i=0; i <= 100; i++)     // turn to middle, hold 2 seconds
   {
   digitalWrite(signalPin, HIGH);  // control signal high
   delayMicroseconds(1500);        //   for 1500 uS
   digitalWrite(signalPin, LOW);   // control signal low
   delay(20);                      // wait 20mS
   }
 }

/* End of program */

[ENDS]
« Última modificación: 10 de Febrero de 2009, 15:33:49 por chacruna »

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Problema con cotrol de servos y 16F84A
« Respuesta #7 en: 10 de Febrero de 2009, 15:33:30 »
Emmm porqué tiene tanto cable en la foto....

En vez de ponerle un periodo de 20ms ponselo de 30ms y sino de 40 y sino de 50 y nada más porque de ahí nunca he visto que funcione bien ningún servo. Aunque arriba usa 20 ms.

Tambien prueba a poner delay_ms(20) en vez de delay_us(20000), por si acaso en us es mucho delay aunque he visto en el compilador que debería de funcionar pero nunca se sabe.

Un saludete.
« Última modificación: 10 de Febrero de 2009, 15:40:24 por c4_esp_VR »

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #8 en: 10 de Febrero de 2009, 15:36:33 »
Pfff tenes razon, no se porque tantos cables :S


Una foto mas acertada.




Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #9 en: 10 de Febrero de 2009, 18:53:47 »
Acabo de probar con un servo nuevo, varios codigos diferentes, pero nada.

Cuando lo prendo el servo se va a una posicion determinada, si lo muevo (desenchufado) cuando lo vuelvo a conectar vuelve a la posicion anterior.

Pero todavia no responde a ninguna de las 3 señales.


Alguien alguna idea???

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #10 en: 10 de Febrero de 2009, 20:01:13 »
Probe con 15ms, 20ms, 30ms, 35ms, 40ms y 50ms y NADA!!!

Cuando lo conecto a la señal se siente una vibracion en el servo (como la oscilacion, que prende y apaga).

Dependiendo en que estado se encuentre el servo al conectarlo se mueve erraticamente hasta que queda fijo en un punto del cual no se mueve mas.

El codigo que estoy usando para probar es el siguiente:

Código: [Seleccionar]
#INCLUDE <16F84A.h>

#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)

void main() {
   int i;

   set_tris_b(0);

   i=0;

   output_high(PIN_B3);
   while(1) {
         output_high(PIN_B0);
         output_high(PIN_B1);
         output_high(PIN_B2);

         delay_us(900);
         output_low(PIN_B0);

         delay_us(600);
         output_low(PIN_B1);

         delay_us(600);
         output_low(PIN_B2);

         delay_ms(20);

         i++;
         if(i==25) { // LED CONTROL
            output_toggle(PIN_B3);
            i=0;
         }
   }
}

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #11 en: 11 de Febrero de 2009, 04:15:25 »
Baje un software (Scope) que me transformo la placa de sonido en un osciloscopio :).

Las señales estan bien, por lo tanto el problema son los servos, pero 2 son casi nuevos y 1 es nuevo nuevo.

Los cables supuestamente estan bien, ya lei en varios sitios como son los colores.


Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Problema con cotrol de servos y 16F84A
« Respuesta #12 en: 11 de Febrero de 2009, 05:40:18 »
Por lo que me estas diciendo el servo funciona bien.

Es decir si lo conectas a B0 este se irá a uno de los extremos siempre.
Si lo conectas a B1 este se irá al centro siempre.
Si lo conectas a B2 este se irá al otro extremos siempre.

Y siempre en puntos fijos ya que le estas metiendo el mismo PWM. No veo el error que me comentas.

Un saludete.

Desconectado chacruna

  • PIC10
  • *
  • Mensajes: 41
Re: Problema con cotrol de servos y 16F84A
« Respuesta #13 en: 11 de Febrero de 2009, 06:55:16 »
El codigo anterior no funciona bien, es decir, solo en el PIN_B2 hay una señal consistente, en el B0 y B1 no hay señal consistente. No tengo idea porque.

Con este nuevo codigo el osciloscopio me muestra perfecto el cambio entre las señales y los tiempos son correctos.
Pero los servos no se mueven!!!!

Código: [Seleccionar]
#INCLUDE <16F84A.h>

#FUSES XT,NOWDT
#USE delay (clock=4000000)
#USE fast_io(B)

void main() {
   int i,segundos;

   i = 0;

   set_tris_b(0);

   segundos = 0;

   while(1) {
      if(segundos>=0 && segundos<=4) {
         output_high(PIN_B4);
         delay_us(1500);
         output_low(PIN_B4);
         delay_us(18500);
         i++;
         if(i==50) {
            segundos++;
            i=0;
         }
      }
      if(segundos>=5 && segundos<=10) {
         output_high(PIN_B4);
         delay_us(2100);
         output_low(PIN_B4);
         delay_us(17900);
         i++;
         if(i==50) {
            segundos++;
            i=0;
         }
      }
      if(segundos>=11 && segundos<=16) {
         output_high(PIN_B4);
         delay_us(900);
         output_low(PIN_B4);
         delay_us(19100);
         i++;
         if(i==50) {
            segundos++;
            i=0;
         }
      }
      if(segundos==17) {
         segundos = 0;
         i=0;
      }
   }
}



« Última modificación: 11 de Febrero de 2009, 07:00:22 por chacruna »

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Problema con cotrol de servos y 16F84A
« Respuesta #14 en: 11 de Febrero de 2009, 08:07:35 »
Si has medido con el osciloscopio y la señal de pic es la que pone en el datasheet de cada servo (que casi siempre suele ser la misma), es que no queda otra que tengas algo mal a nivel de hardware.

Que tengas mal conectada la señal del pic al servo o la alimentación y masa, que por lo que veo por ahí no van las cosas.

Que no le estarás dando la tensión suficiente, entre 5 y 6 voltios o lo que ponga el datasheet del servo, o tendrás limitada la corriente de la fuente de alimentación o la fuente no te da suficiente corriente para darle al servo si usas una pila. ¿¿¿Estas usando una fuente de alimentación que te asegure el consumo del servo (intensidad) y la tensión que le estas dando???.

Por otro lado estas seguro que has conectado la masa del servo, la masa del pic y la masa de la fuente de alimentación entre sí.

Si estas seguro que todo esto está bien, amigo mio, a mi se me han acabado las ideas  :D :D :D :D por lo que espero que sea algo de lo comentado anteriormente.

Un saludete y suerte.


 

anything