Pages: [1]   Go Down
Author Topic: Por qué no usar pulsein?  (Read 212 times)
0 Members and 1 Guest are viewing this topic.
Argentina
Offline Offline
Newbie
*
Karma: 0
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
//
//  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));
}
}
« Last Edit: May 02, 2014, 09:46:14 pm by rva1945 » Logged

Pages: [1]   Go Up
Jump to: