Hola, que tal, a ver si me podeis ayudar por aqui con un problema. El tema es que estoy intentando leer y procesar la señal de un receptor de RC para controlar un carrito de golf con el mando y no consigo hacerlo. Cuando lo monitorizo a traves de la consola de Arduino los datos me dicen que esta bien, pero cuando veo la señal en el osciloscopio veo que no esta bien.
En teoria se supone que el pulso varia de 1 a 2 ms estando en una posicion inicial de 1,5ms y con un periodo de 20ms, que es lo que aparece en la consola, mueves el gatillo hacia delante/atras y derecha/izquierda con el volante y veo como varia el tiempo en la consola perfecto, pero a la hora de ver la señal en el osciloscopio los datos no son los mismos.
Me aparece una duracion de unos pocos microsegundos el periodo es de 2ms, la frecuencia en Khz, y el ciclo de trabajo es muy alto cuando deberia ser mucho mas bajo.
La medida que he tomado con el osciloscopio directamente del receptor es esta:
T=16ms
Freq= 62,5 Hz
duracion=1,5ms
ciclo de trabajo 9,4%
Una vez que he procesado la señal utilizo analogWrite() para escribir la señal y he leido que esta funcion escribe a otra frecuencia 490Hz, supongo que sera ese el problema. He seguido leyendo en foros y la red en general sobre el tema de los registros para configurar las salidas modificando los "timer" para obtener otra frecuencia a la salida, en mi caso la de la emisora.
Bueno he metido un buen rollo de info, espero que me podais echar un cable, os pongo el codigo que tengo. y gracias de antemano.
#include <Servo.h>
unsigned long ch1; // Direccion
unsigned long ch2; // Aceleracion
//int ch3;
int direccion=0; // Derecha / Izquierda
int aceleracion=0; // Delante / Atras
int adj_direccion=0;
int adj_aceleracion=0;
int girar=0;
int acelerar=0;
int salida_direccion= 3;
int salida_aceleracion=11; // Salidas donde se escribiran los valores
// de cada canal
void setup() {
Serial.begin(9600);
pinMode(4,INPUT);
pinMode(8,INPUT);
pinMode(3,OUTPUT);
pinMode(11,OUTPUT);
//delay(500);
//cambio de valores en los bits del registro para obtener salida a 50 hz
//
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS22) | _BV(CS21) | _BV(CS20);
OCR2A = 156;
OCR2B = 4;
}
void loop() {
ch1=pulseIn(4, HIGH, 20000); // escucha de pulsos positivos
ch2=pulseIn(8, HIGH, 20000); // durante 20ms (periodo de señal)
// ch3=pulseIn(7, HIGH, 20000);
/////// me aseguro de que no hay pulsos indeseados////////
if(ch1 >= 1000 && ch1 <= 2000){
adj_direccion=map(ch1,1000,2000,-500,500); // mapeo la señal de 1 a 2 ms y la paso a un rango valido para pwm
direccion=constrain(adj_direccion,-255,255); // limitar valores validos para pwm
}
else{
direccion=0;
}
if(ch2 >= 1000 && ch2 <= 2000){
adj_aceleracion=map(ch2,1000,2000,-500,500); // mapeo la señal de 1 a 2 ms y la paso a un rango valido para pwm
aceleracion=constrain(adj_aceleracion,-255,255); // limitar valores validos para pwm
}
else{
aceleracion=0;
}
//////////////////////////////////////////////////////
girar=abs(direccion);
acelerar=abs(aceleracion);
analogWrite(salida_direccion, girar);
analogWrite(salida_aceleracion, acelerar);
Serial.print("duracion pulso canal 1: ");
Serial.println(ch1);
Serial.print("duracion pulso canal 2: ");
Serial.println(ch2);
//Serial.print("canal 3: ");
//Serial.println(ch3);
//delay(1000);
Serial.println();
Serial.print("Volante:");
Serial.println(direccion);
Serial.print("Acelerador:");
Serial.println(aceleracion);
Serial.println();
Serial.println();
Serial.println();
Serial.print("Girar:");
Serial.println(girar);
Serial.print("Acelerar:");
Serial.println(acelerar);
Serial.println();
Serial.println();
Serial.println();
delay(1000);
}