X-Git-Url: http://git.piffa.net/web?a=blobdiff_plain;f=esempi%2Failerons_state_rgb%2Failerons_state_rgb.ino;fp=esempi%2Failerons_state_rgb%2Failerons_state_rgb.ino;h=1ec982e1b31a2f9d43dead0ee45031afc49368c7;hb=5b38ddfa00f7c92607b220adc874107fba2bda0e;hp=0c188ee6fa2381cbd0d6e4604dc4cfb28b42fd1d;hpb=380ac4884b079256f766d5a13e9a00fc1104bcb1;p=aerei diff --git a/esempi/ailerons_state_rgb/ailerons_state_rgb.ino b/esempi/ailerons_state_rgb/ailerons_state_rgb.ino index 0c188ee..1ec982e 100644 --- a/esempi/ailerons_state_rgb/ailerons_state_rgb.ino +++ b/esempi/ailerons_state_rgb/ailerons_state_rgb.ino @@ -7,19 +7,22 @@ Pilotare un LED RGB in base al canale degli alettoni: - 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 +NOTE: uso di goto all'interno dell FSM. + +TODO: + +* clean up magic numbers */ #include enum { // Stati della FMS - middle, // centrale - sxin, // transizione a sx - sx, // sx - dxin, // transizione a dx - dx // dx + middle, // centrale + sxin, // transizione a sx + sx, // sx + dxin, // transizione a dx + dx // dx } ailstate = middle; // Un LED RGB @@ -27,82 +30,138 @@ 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 +int ailIn ; // Valore rilevato del 4 Ch della RX +unsigned long now; // timestamp reference for millis +unsigned long pausa = 1000; -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. -*/ +int mid_point = 1500 ; // centro del segnale, trimmato nel setup +const int deviation = 50 ; // deviazione per entrare nello stato succiessivo - Serial.begin(9600); +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); + +/* START Calibrazione TRIM canale: + Lettura di 10 smaple + calcolo del valore medio esclusi gli 0 + */ + byte a = 0; + Serial.println(">> Calibrazione: "); + while (a < 10) { + ailIn = pulseIn(ailPin, HIGH, 25000); + if (ailIn != 0 ) { + ail = ail + ailIn ; + a++ ; + Serial.print(a); + Serial.print(": "); + Serial.println(ail); + digitalWrite(13, !digitalRead(13)); + delay(10); + } + } + mid_point = ail / 10 ; + Serial.print(">> Fine Calibrazione: "); + Serial.print(mid_point); + Serial.println("--"); +// END calibrazione + + // Funzione relativa a calibrazione: +//mid_point = calibraTrim(ailPin) ; // Pin a cui e' collegato il canale +//mid_point = calibraTrim(aliPin,11) ; // + LED di servizio per calibrazione } 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); - } +// Lettura Aileron channel: FAKE con un potenziometro 10K +//ailIn = analogRead(3); +//ail = constrain(aliIn * 2 , 0, 2000) ; + +// 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 > mid_point + deviation + deviation /3) { + ailstate = sxin; + now = millis() ; + goto sxin ; + } + else if (ail < mid_point - deviation - deviation / 3) { + ailstate = dxin; + now = millis() ; + goto dxin ; + } ; + ailerons.White(); + + break; + + case sxin: +sxin: + // Transizione a sx + ailerons.Off(); + if (millis() - pausa > now ) { + ailstate = sx; + } + break; + + case sx: + // dx + ailerons.Green(); + if (ail < mid_point + deviation) { + ailstate = middle; + } + else if (ail < mid_point - deviation) { + ailstate = dxin; + } ; + break; + + case dxin: + // Transizione a dx +dxin: + ailerons.Off(); + if (millis() - pausa > now ) { + ailstate = dx; + } + break; + + case dx: + // sx + ailerons.Blue(); + if (ail > mid_point - deviation) { + ailstate = middle; + } + else if (ail > mid_point + deviation) { + ailstate = dxin; + } ; + break; + } + + Serial.print("ailIn: "); + Serial.print(ailIn); + Serial.print("\tail: "); + Serial.print(ail); + Serial.print("\t ailstate:"); + Serial.println(ailstate); + // delay(200); +}