Go Down

Topic: Por qué no usar pulsein? (Read 280 times) previous topic - next topic

rva1945

May 03, 2014, 04:44 am Last Edit: May 03, 2014, 04:46 am by rva1945 Reason: 1
Hola:

He leido por ahi que si bien es la forma más fácil de leer pulsos, no es lo más adeucuado porque puede ser lento, no sé cuántas razones más. Que mejor usar interrupts.

Puede ser, no lo voy a discutir pues soy recién llegado a esto de programar placas, pero parece que he logrado resolver mi necesidad de controlar 2 motores de manera proporcional para el clásico vehículo con orugas.

Por el momento estoy encendiendo leds, para todo/nada, tomando los extremos de cada canal, y enciendo además leds proporcionando el brillo, con apagado en el centro. La idea es testear pra luego mandar las salidas de los pins a un L293D (puente H doble), proporcionando además la velocidad de los motores. Acciono ambos canales a la vez y no veo problemas. Lo único que el timeout del pulsein no debe ser inferior a 15000 caso contrario no lee uno de los canales:

Code: [Select]
//
//  LEER 2 CANALES RC. ENCENDER LEDS RESPECTIVOS PARA CADA EXTREMO DE CANAL (ARRIBA/ABAJO-IZQUIERDA/DERECHA)
//  Y UN LED CON BRILLO PROPORCIONAL PARA CADA CANAL
//  CONTEMPLA ZONA NEUTRA

/*
HARDWARE
Conectar 4 LEDS con su resistor de 220R a pins de salida para UP y DOWN
Conectar 2 LEDS con su resistor de 220R a 2 pins de salida analoga para PWM
Conectar 2 canales RC a 2 pins de entrada para leer canales RC
*/

//        DEFINICION DE VARIABLES UTILIZADAS EN EL SKETCH (PROGRAMA)

//  EN ESTAS 2 VARIABLES GUARDAREMOS VALOR DEL ANCHO DE PULSO LEIDO EN AMBOS CANALES
int ch1;
int ch2;

//  PINS PARA LEER 2 CANALES DE RC
int pinCh1 = 11;
int pinCh2 = 12;

//  EN ESTAS 2 VARIABLES SE CALCULARA EL PWM PARA VELOCIDAD DE MOTORES
int pwm_1=0;
int pwm_2=0;

// PINS PARA SALIDA ANALOGICA PWM
int pinPWM_1=6;
int pinPWM_2=9;

//  PINS PARA SALIDA DIGITAL, ENCIENDEN LEDS EN EXTREMOS DE PALANCAS (UP/DOWN - LEFT/RIGHT)
int pinLED1up=5;
int pinLED1down=7;
int pinLED2left=8;
int pinLED2right=10;

//  TIEMPO EN MILISEGUNDOS PARA ESPERA DEL PULSO (DE CANAL RC)
int timeout = 20000;

//  ANCHO DE ZONA NEUTRAL (EN MILISEGUNDOS), Y MAXIMOS Y MINIMOS A CONSIDERAR POR CANAL. ESTO PUEDE SER NECESARIO
//  REVISARLO PUES DISTINTAS RADIOS PUEDEN VARIAR EN LOS ANCHOS DE PULSOS MINIMOS Y MAXIMOS
int neutralZone = 20;
int minPulseWidth = 900;
int maxPulseWidth = 2100;

int minMaxPWM = 255;

///////////////////////////////////////////////////////////////////////////////////////////

void setup()
{
//  INDICAR CUALES PINS SON DE SALIDA Y CUALES DE ENTRADA

//  ESTOS 2 SON UTILIZADOS PARA LEER CANALES
pinMode(pinCh1, INPUT);
pinMode(pinCh2, INPUT);

//  ESTOS SON DE SALIDA PARA LOS LEDS
pinMode(pinLED1up, OUTPUT);
pinMode(pinLED1down, OUTPUT);
pinMode(pinLED2left, OUTPUT);
pinMode(pinLED2right, OUTPUT);
pinMode(pinPWM_1, OUTPUT);
pinMode(pinPWM_2, OUTPUT);
}

/////////////////////////////////////////////////////////////////////////////////////////


void loop()
{
//  LEER VALOR DEL ANCHO DE PULSO PARA CADA CANAL
ch1 = pulseIn(pinCh1, HIGH, timeout);
ch2 = pulseIn(pinCh2, HIGH, timeout);

//  CONVERTIR EL RANGO DE VALORES MIN/MAX DE ANCHO DE PULSO A -255,255
pwm_1=map(ch1,minPulseWidth,maxPulseWidth,-minMaxPWM,minMaxPWM);
pwm_2=map(ch2,minPulseWidth,maxPulseWidth,-minMaxPWM,minMaxPWM);

if (abs(pwm_1) <= neutralZone)  //  SI ESTA DENTRO DE LA ZONA NEUTRAL, APAGAR LOS PINS
{
 digitalWrite(pinLED1up,LOW);
 digitalWrite(pinLED1down,LOW);
 analogWrite(pinPWM_1,0);
}
else  //  CASO CONTRARIO, ACTIVAR PINS SEGUN PARA CADA EXTREMO
{
 if (pwm_1 < -neutralZone)
 {
   digitalWrite(pinLED1up,HIGH);
   digitalWrite(pinLED1down,LOW);
 }
 if (pwm_1 > neutralZone)
 {
   digitalWrite(pinLED1up,LOW);
   digitalWrite(pinLED1down,HIGH);
 }
 // Y ENCENDER LED PROPORCIONALMENTE
 analogWrite(pinPWM_1,abs(pwm_1));
}

if (abs(pwm_2) <= neutralZone)  //  SI ESTA DENTRO DE LA ZONA NEUTRAL, APAGAR LOS PINS
{
 digitalWrite(pinLED2left,LOW);
 digitalWrite(pinLED2right,LOW);
 analogWrite(pinPWM_2,0);
}
else  //  CASO CONTRARIO, ACTIVAR PINS SEGUN PARA CADA EXTREMO
{
 if (pwm_2 < -neutralZone)
 {
   digitalWrite(pinLED2left,HIGH);
   digitalWrite(pinLED2right,LOW);
 }
 if (pwm_2 > neutralZone)
 {
   digitalWrite(pinLED2left,LOW);
   digitalWrite(pinLED2right,HIGH);
 }
 // Y ENCENDER LED PROPORCIONALMENTE
 analogWrite(pinPWM_2,abs(pwm_2));
}
}

Go Up