Go Down

Topic: VirtualWire y ServoTimer2 ((( Problemas con el Servo ))) (Read 182 times) previous topic - next topic

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:

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy