Hola no manejo mucho de foros, espero no meter la pata jej.
Estoy en un proyecto/desafió personal de armar una cabina simulador de vuelo con un amigo piloto, arme una parte de control, funciona pero tiene un problema.
En uso:
Arduino MEGA 2560, 6 encoders rotativos, 4 leds, un pulsador y un switch. ( por ahora, pero faltan muchas cosas por agregar jeje)
Imprime por puerto serie y es interpretado por el programa Link2FSX.
El problema es el siguiente: avanzando muy lentamente las palancas la lectura de los encoders es correcta, al apurarlos queda estancada la lectura, ejemplo: 1 2 3 4 3 4 3 4 3 4.
Creo que se entiende jej soy muy nuevo en programación voy buscando y leyendo pero entre mi trabajo y la facultad (nada que ver los dos con programación como para tener practica) no tengo mucho tiempo y hago lo que puedo con una o dos horas por día.
ACLARACIÓN: en el código verán que están detallados variables para Motores 1 y 2 pero falta código, borre pq me excedía de 9000 caracteres jeje.
Espero me puedan dar una ayudita, saludos y gracias.
// Variables Globales Encodres
unsigned long time;
// encoder "PGM1" - Palanca de Gases Motor 1
int PGM1_PCLK = 48;//"PCLK" Pin CLK.
int PGM1_PDT = 49;//_"PDT" Pin DT.
int PGM1_RE_P = 0;//_"RE" Rotary Encoder, "P" Posicion.
unsigned long PGM1_RE_T;
bool PGM1_RE_A = true;
bool PGM1_RE_B = true;
// encoder "PGM2" - Palanca de Gases Motor 2
int PGM2_PCLK = 52;// "PCLK" Pin CLK.
int PGM2_PDT = 53;// _"PDT" Pin DT.
int PGM2_RE_P = 0;// _"P" Posicion.
unsigned long PGM2_RE_T;
bool PGM2_RE_A = true;
bool PGM2_RE_B = true;
// encoder "PHM1" - Paso de Helice Motor 1
int PHM1_PCLK = 50;//"PCLK" Pin CLK.
int PHM1_PDT = 51;//_"PDT" Pin DT.
int PHM1_RE_P = 0;//_"RE" Rotary Encoder, "P" Posicion.
unsigned long PHM1_RE_T;
bool PHM1_RE_A = true;
bool PHM1_RE_B = true;
// encoder "PHM2" - Paso de Helice Motor 2
int PHM2_PCLK = 45;// "PCLK" Pin CLK.
int PHM2_PDT = 44;// _"PDT" Pin DT.
int PHM2_RE_P = 0;// _"P" Posicion.
unsigned long PHM2_RE_T;
bool PHM2_RE_A = true;
bool PHM2_RE_B = true;
// encoder "PMM1" - Palanca de Mezcla Motor 1
int PMM1_PCLK = 42;//"PCLK" Pin CLK.
int PMM1_PDT = 43;//_"PDT" Pin DT.
int PMM1_RE_P = 0;//_"RE" Rotary Encoder, "P" Posicion.
unsigned long PMM1_RE_T;
bool PMM1_RE_A = true;
bool PMM1_RE_B = true;
// encoder "PMM2" - Palanca de Mezcla Motor 2
int PMM2_PCLK = 47;// "PCLK" Pin CLK.
int PMM2_PDT = 46;// _"PDT" Pin DT.
int PMM2_RE_P = 0;// _"P" Posicion.
unsigned long PMM2_RE_T;
bool PMM2_RE_A = true;
bool PMM2_RE_B = true;
//Variables Tren de Aterrizaje
int TALN = 41; // _ _ _ "L" Led, "N" Nariz.
int TALI = 40; // _ _ _ "L" Led, "I" Izquierda.
int TALD = 38; // _ _ _ "L" Led, "D" Derecha.
int TALP = 39; // _ _ _ "L" Led, "P" Peligro.
int TAI = 36; //_ _ _ _ "I" Interruptor.
int TAPT = 37; // _ _ _ "P" Pulsador, "T" Test ok.
int TACR; //_ _ _ _ _ _ "C" Codigo, "R" Recibido: Almacena codigo de Link2FS para TA.
void setup() {
Serial.begin (115200);
// SETUP de Encoders
pinMode (PGM1_PCLK,INPUT);
pinMode (PGM1_PDT,INPUT);
pinMode (PGM2_PCLK,INPUT);
pinMode (PGM2_PDT,INPUT);
pinMode (PHM1_PCLK,INPUT);
pinMode (PHM1_PDT,INPUT);
pinMode (PHM2_PCLK,INPUT);
pinMode (PHM2_PDT,INPUT);
pinMode (PMM1_PCLK,INPUT);
pinMode (PMM1_PDT,INPUT);
pinMode (PMM2_PCLK,INPUT);
pinMode (PMM2_PDT,INPUT);
//Setup Tren de aterrizaje
pinMode(TALN, OUTPUT);
pinMode(TALI, OUTPUT);
pinMode(TALD, OUTPUT);
pinMode(TALP, OUTPUT);
pinMode(TAI, INPUT_PULLUP); //Se usa input_pullup para flanco ascendente y asi evitar rebotes
pinMode(TAPT, INPUT_PULLUP); //Se usa input_pullup para flanco ascendente y asi evitar rebotes
}
void loop() {
//_________ LOOP Encoders______________
time = millis();
//------Palanca de Gases Motor 1
//--------------------------------------
if (digitalRead(PGM1_PCLK) == LOW){
PGM1_RE_T = time;
if (PGM1_RE_A == true){
PGM1_RE_P ++;
PGM1_RE_A = false;
PGM1_RE_B = false;
PGM1_RE_P = min(10, max(0, PGM1_RE_P));
if(PGM1_RE_P*99/10 > 9){Serial.print("C560");Serial.println(PGM1_RE_P*99/10);}
if(PGM1_RE_P*99/10 <= 9){Serial.print("C5600");Serial.println(PGM1_RE_P*99/10);}
}
}
if (digitalRead(PGM1_PDT)== LOW){
PGM1_RE_T = time;
if(PGM1_RE_B == true){
PGM1_RE_P --;
PGM1_RE_A = false;
PGM1_RE_B = false;
PGM1_RE_P = min(10, max(0, PGM1_RE_P));
if(PGM1_RE_P*99/10 > 9){Serial.print("C560");Serial.println(PGM1_RE_P*99/10);}
if(PGM1_RE_P*99/10 <= 9){Serial.print("C5600");Serial.println(PGM1_RE_P*99/10);}
}
}
if (time - PGM1_RE_T>10){
PGM1_RE_A = true;
PGM1_RE_B = true;
}
//--------------------------------------
//------Paso Helice Motor 1
//--------------------------------------
if (digitalRead(PHM1_PCLK) == LOW){
PHM1_RE_T = time;
if (PHM1_RE_A == true){
PHM1_RE_P ++;
PHM1_RE_A = false;
PHM1_RE_B = false;
PHM1_RE_P = min(10, max(0, PHM1_RE_P));
if(PHM1_RE_P*99/10 > 9){Serial.print("C600");Serial.println(PHM1_RE_P*99/10);}
if(PHM1_RE_P*99/10 <= 9){Serial.print("C6000");Serial.println(PHM1_RE_P*99/10);}
}
}
if (digitalRead(PHM1_PDT)== LOW){
PHM1_RE_T = time;
if(PHM1_RE_B == true){
PHM1_RE_P --;
PHM1_RE_A = false;
PHM1_RE_B = false;
PHM1_RE_P = min(10, max(0, PHM1_RE_P));
if(PHM1_RE_P*99/10 > 9){Serial.print("C600");Serial.println(PHM1_RE_P*99/10);}
if(PHM1_RE_P*99/10 <= 9){Serial.print("C6000");Serial.println(PHM1_RE_P*99/10);}
}
}
if (time - PHM1_RE_T>10){
PHM1_RE_A = true;
PHM1_RE_B = true;
}
//--------------------------------------
//------Palanca de Mezcla Motor 1
//--------------------------------------
if (digitalRead(PMM1_PCLK) == LOW){
PMM1_RE_T = time;
if (PMM1_RE_A == true){
PMM1_RE_P ++;
PMM1_RE_A = false;
PMM1_RE_B = false;
PMM1_RE_P = min(10, max(0, PMM1_RE_P));
if(PMM1_RE_P*99/10 > 9){Serial.print("C580");Serial.println(PMM1_RE_P*99/10);}
if(PMM1_RE_P*99/10 <= 9){Serial.print("C5800");Serial.println(PMM1_RE_P*99/10);}
}
}
if (digitalRead(PMM1_PDT)== LOW){
PMM1_RE_T = time;
if(PMM1_RE_B == true){
PMM1_RE_P --;
PMM1_RE_A = false;
PMM1_RE_B = false;
PMM1_RE_P = min(10, max(0, PMM1_RE_P));
if(PMM1_RE_P*99/10 > 9){Serial.print("C580");Serial.println(PMM1_RE_P*99/10);}
if(PMM1_RE_P*99/10 <= 9){Serial.print("C5800");Serial.println(PMM1_RE_P*99/10);}
}
}
if (time - PMM1_RE_T>10){
PMM1_RE_A = true;
PMM1_RE_B = true;
}
}
//--------------------------------------
// Control TA - Tren de Aterrizaje
//--------------------------------------
if(Serial.available()){
TACR = getChar(); // _ _ Lectura codigo Link2FS para pocision del TA (ASCII) ? -> 63 Y -> 89
if(TACR == 63){
TACR = getChar();
if(TACR == 89){
int TAVN = getChar()-48; // _ _ "V" Variable, "N" Nariz. (Se resta 48 pq el 2 en ASCII se representa con el codigo 50)
int TAVI = getChar()-48; // _ _ "V" Variable, "I" Izquierda. (Se resta 48 pq el 2 en ASCII se representa con el codigo 50)
int TAVD = getChar()-48; // _ _ "V" Variable, "N" Derecha. (Se resta 48 pq el 2 en ASCII se representa con el codigo 50)
if(TAVN == 2){digitalWrite(TALN, HIGH);}else {digitalWrite(TALN, LOW);}
if(TAVI == 2){digitalWrite(TALI, HIGH);} else {digitalWrite(TALI, LOW);}
if(TAVD == 2){digitalWrite(TALD, HIGH);} else {digitalWrite(TALD, LOW);}
if(TAVN+TAVI+TAVD<6 && TAVN+TAVI+TAVD>0){digitalWrite(TALP, HIGH);} else {digitalWrite(TALP, LOW);}
}
}
}
// Envio de codigo a Link2FS acorde a la posicion del interruptor de TA
int TAVEI = digitalRead(TAI);// "V" Variable, "E" Estado, "I" Interruptor.
if(TAVEI == 0 && digitalRead(TALN)== LOW){Serial.println("C02");}
if(TAVEI != 0 && digitalRead(TALN) == HIGH){Serial.println("C01");}
int TAVPT = digitalRead(TAPT);//"V" Variable, "P" Pulsador, "T" Test.
if(TAVPT == 0){
digitalWrite(TALN, HIGH); digitalWrite(TALI, HIGH); digitalWrite(TALD, HIGH);digitalWrite(TALP, HIGH);delay(500);
digitalWrite(TALN, LOW); digitalWrite(TALI, LOW); digitalWrite(TALD, LOW);digitalWrite(TALP, LOW);}
}
//FUNCION getChar()
char getChar(){
while(Serial.available()==0);
return((char)Serial.read());
}