Pages: [1]   Go Down
Author Topic: VirtualWire y ServoTimer2 ((( Problemas con el Servo )))  (Read 124 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Amigos.

Tengo un problema y seguro que algunos de vosotros me puede ayudar a resolver.

Tengo un emisor y un receptor realizado con VirtualWire, todo me fucniona perfectamente, mando dos datos analogicos y dos digitales, cuando hago la lectura en el puerto serie del receptor todo me funciona correctamente, la variación de los datos analógicos que yo comando en mi emisor, son leido y interpretados perfectamente e mi emisor, hasta ahi todo ok.

Utilizo esos datos para encender dos leds en el caso de las lecturas digitales y otras dos analogicas, estas últimas las utilizo para controlar la intensidad de un led y el parpadeo de otro y perfecto, todo me funciona correctamente, aquí esta el codigo el cual gobierna el receptor.

 /* es decir 2 bytes para el Data0, otros dos para Data1, otros dos para Data2 y otros dos para Data3 */
  uint8_t Buffer_Size = 8; /* declara el tamaño del array para recibir los datos */
  unsigned int Data0; /* Declara las variables para el volcado de datos de recepción (unsigned int de 8 bits) */
  unsigned int Data1;
  unsigned int Data2;
  unsigned int Data3;
  uint8_t RxBuffer[Buffer_Size]; /* declara el array para la recepción de datos */
  /* Condicional ¿se ha recibido el mensaje?*/
  if (vw_get_message(RxBuffer, &Buffer_Size)) {
    Data0 = RxBuffer[0] << 8 | RxBuffer[1];
    Data1 = RxBuffer[2] << 8 | RxBuffer[3];
    Data2 = RxBuffer[4] << 8 | RxBuffer[5];
    Data3 = RxBuffer[6] << 8 | RxBuffer[7];
    Serial.print("Analogue pin A0: ");
    Serial.print(Data0);
    Serial.print(" "); Serial.print(Data1);
    Serial.print(" "); Serial.print(Data2);
    Serial.print(" "); Serial.println(Data3);
    // Non-blocking
    /* Almacena el dato recibido en un byte high y low */
    /* Output this data to the UART (imprime en la consola ese mensaje) */
    /* Output this data to the UART (imprime en consola el dato recibido*/
    if (Data2 == 0) {
      digitalWrite(8, LOW);  /* si el Data2 correspondiente a la entrada digital del emisor es 0, apaga el LED 13 */
    }
    if (Data2 == 1) {
      digitalWrite(8, HIGH);  /* si el Data2 correspondiente a la entrada digital del emisor es 1, enciende LED 13 */
    }
    if (Data3 == 0) {
      digitalWrite(12, LOW);
    }
    if (Data3 == 1) {
      digitalWrite(12, HIGH);
    }

    {

      Data0 = map(Data0, 0, 800, 0, 254 ); // aumento del brillodel led (0 a 5v) en funcion de Data1
      analogWrite(analogPin, Data0);
      delay(15);

    }

    if (Data1 > 0) {

      Data1 = map(Data1, 1023, 0, 0, 255); // parpadeo led en funcion de la lectura en Data0
      digitalWrite(10, HIGH);
      delay(Data1);
      digitalWrite(10, LOW);
      delay(Data1);
    }
    else {
      digitalWrite(10, LOW);
    }
    Serial.print(Data1);

  }
}


Pues bien, ahora es donde expongo mi problema ya que cuando utilizo mi Data0 que antes utilizaba para gobernar el incremento de intensidad de luz de un led y funciona perfectamente, cuando empleo esta Data0 para gobernar mi servo con la librería ServoTimer2, el servo me oscila mucho,
a pesar de que hago lectura en el monitor serie y leo lecturas correctas que van de 0 a 1023 y si mapeo tambien tengo lecturas perfectas, pero sin embargo el servo oscila, sobre todo en valores altos. Sabeis que esta pasando y como puedo solucionarlo ??????



    {

        val=map(Data0,0,1023,0,180);  // con 0 se posiciona en 0º -- con 180 se posiciona en 180º
        myservo.write(val); 

    }

    if (Data1 > 0) {

      Data1 = map(Data1, 1023, 0, 0, 255); // parpadeo led en funcion de la lectura en Data0
      digitalWrite(10, HIGH);
      delay(Data1);
      digitalWrite(10, LOW);
      delay(Data1);
    }
    else {
      digitalWrite(10, LOW);
    }
    Serial.print(Data1);

  }
}


smiley-eek
Logged

Pages: [1]   Go Up
Jump to: