From: eaman Date: Thu, 2 Feb 2017 18:26:48 +0000 (+0100) Subject: RGB ailerons prototipo: trasformare con millis X-Git-Url: http://git.piffa.net/web?a=commitdiff_plain;h=380ac4884b079256f766d5a13e9a00fc1104bcb1;p=aerei RGB ailerons prototipo: trasformare con millis --- diff --git a/aerei/zeta/zeta_prot/zeta_prot.ino b/aerei/zeta/zeta_prot/zeta_prot.ino index 98194a0..1927f1b 100644 --- a/aerei/zeta/zeta_prot/zeta_prot.ino +++ b/aerei/zeta/zeta_prot/zeta_prot.ino @@ -12,8 +12,10 @@ enum { // Stati della FMS } state ; // Due LED con lampeggio alternato: -Lampeggiatore right = 3; +Lampeggiatore right = 13; Pwm rpwm = 3; + +// Variabili const byte thrPin = A3; byte thr ; int thrIn ; @@ -21,15 +23,21 @@ int thrIn ; void setup() { - // Serial.begin(9600); + Serial.begin(9600); pinMode(A3, INPUT); randomSeed(analogRead(0)); } void loop() { - thrIn = analogRead(3); - thr = constrain(thrIn / 4 , 0, 255) ; + // Utilizzando un potenziometro + // thrIn = analogRead(3); + // thr = constrain(thrIn / 4 , 0, 255) ; + + // Utilizzando una RX + thrIn = pulseIn(thrPin, HIGH, 25000); + // Hint: thrIn andrebbe calibrato son un Serial.write + thr = constrain(map(thrIn, 960, 2000, 0, 255), 0, 255); // FMS dispatcher if ( thr < 10 ) { @@ -42,26 +50,32 @@ void loop() { switch (state) { case idle: - // digitalWrite(3,LOW); -rpwm.Up(1000); + rpwm.UD(2000); + right.Blink(); break; case normal: // Due LED con lampeggio alternato: right.Blink(1120 - 4 * thr ); + rpwm.lSet(thr); break; case full: digitalWrite(3, HIGH); - + rpwm.Set(0); + right.Swap(); + delay(50); + rpwm.Set(255); + right.Swap(); + delay(50); break; } -// Serial.print(thrIn); -// Serial.print("\t thr:"); -// Serial.print(thr); -// Serial.print("\t state:"); -// Serial.println(state); -// delay(200); + Serial.print(thrIn); + Serial.print("\t thr:"); + Serial.print(thr); + Serial.print("\t state:"); + Serial.println(state); + // delay(200); } diff --git a/esempi/ailerons_state_rgb/ailerons_state_rgb.ino b/esempi/ailerons_state_rgb/ailerons_state_rgb.ino new file mode 100644 index 0000000..0c188ee --- /dev/null +++ b/esempi/ailerons_state_rgb/ailerons_state_rgb.ino @@ -0,0 +1,108 @@ +/* Ailerons state machine + +Pilotare un LED RGB in base al canale degli alettoni: + += 3 stati + 2 transizioni: +- piatto +- roll a sx +- roll a dx + +Trasizioni per accentuare il cambio di assetto (ad esempio con dei blink +e introdurre un po' di inerzia temporale per il cambio di stato + +*/ + +#include + +enum { // Stati della FMS + middle, // centrale + sxin, // transizione a sx + sx, // sx + dxin, // transizione a dx + dx // dx +} ailstate = middle; + +// Un LED RGB +RGBLed ailerons(11,10,9); + +const byte ailPin = A4; +int ail ; // Valore a 8bit per ailerons +int ailIn ; // Valore rilevato del 4 Ch della RX + + + +void setup() { +/* Bisognerebbe introdurre una calibrazione per compensare i TRIM + ed eventualmente i dual rates. +- attivarla se allo start un ale e' al massimo +- fargli leggere i valori massimi +- salvarli in eprom +- per i dual rates: si potrebbe intercettare valori oltre al max + e in base a questi traslare le soglie automaticamente + +Hint: leggere la soglia di rollio significativo in volo + e inserirla nei riferimenti. +*/ + + Serial.begin(9600); +} + +void loop() { + + // Lettura Aileron channel: FAKE con un potenziometro + //ailIn = analogRead(3); + //ail = constrain(aliIn / 4 , 0, 255) ; + + // Lettura ailerons channel + ailIn = pulseIn(ailPin, HIGH, 25000); + if (ailIn != 0) {ail = constrain(ailIn, 1000, 2000); } ; + // con un altra ricevente, fare una calibrazione nel caso. + // Middle = 1512 + + + switch (ailstate) { + case middle: + // Alettoni piatti + if (ail > 1600) { ailstate = sxin; } ; + if (ail < 1400) { ailstate = dxin; } ; + ailerons.White(); + + break; + + case sxin: + // Transizione a sx + ailerons.Off(); + delay(1000); + ailstate = sx; + break; + + case sx: + // dx + ailerons.Green(); + if (ail < 1600) { ailstate = middle; } ; + if (ail < 1400) { ailstate = dxin; } ; + break; + + case dxin: + // Transizione a dx + ailerons.Off(); + delay(1000); + ailstate = dx; + break; + + case dx: + // sx + ailerons.Blue(); + if (ail > 1400) { ailstate = middle; } ; + if (ail > 1600) { ailstate = dxin; } ; + break; + } + + Serial.print("ailIn: "); + Serial.print(ailIn); + Serial.print("\tail: "); + Serial.print(ail); + Serial.print("\t ailstate:"); + Serial.println(ailstate); + // delay(200); + }