]> git.piffa.net Git - aerei/blob - esempi/ailerons_state_rgb/ailerons_state_rgb.ino
RGB ailerons prototipo: trasformare con millis
[aerei] / esempi / ailerons_state_rgb / ailerons_state_rgb.ino
1 /* Ailerons state machine
2
3 Pilotare un LED RGB in base al canale degli alettoni:
4
5 = 3 stati + 2 transizioni:
6 - piatto
7 - roll a sx
8 - roll a dx
9
10 Trasizioni per accentuare il cambio di assetto (ad esempio con dei blink
11 e introdurre un po' di inerzia temporale per il cambio di stato
12
13 */
14
15 #include <common.h>
16
17 enum  { // Stati della FMS
18   middle,   // centrale
19   sxin,     // transizione a sx
20   sx,       // sx
21   dxin,     // transizione a dx
22   dx        // dx
23 } ailstate  = middle;
24
25 // Un LED RGB
26 RGBLed ailerons(11,10,9);
27
28 const byte ailPin = A4;
29 int ail ; // Valore a 8bit per ailerons
30 int ailIn ; // Valore rilevato del 4 Ch della RX 
31
32
33
34 void setup() {
35 /* Bisognerebbe introdurre una calibrazione per compensare i TRIM
36    ed eventualmente i dual rates.
37 - attivarla se allo start un ale e' al massimo
38 - fargli leggere i valori massimi 
39 - salvarli in eprom
40 - per i dual rates: si potrebbe intercettare valori oltre al max
41   e in base a questi traslare le soglie automaticamente
42
43 Hint: leggere la soglia di rollio significativo in volo
44       e inserirla nei riferimenti.
45 */
46
47   Serial.begin(9600);
48 }
49
50 void loop() {
51
52  // Lettura Aileron channel: FAKE con un potenziometro
53  //ailIn = analogRead(3);
54  //ail = constrain(aliIn / 4 , 0, 255) ;
55
56  // Lettura ailerons channel
57  ailIn = pulseIn(ailPin, HIGH, 25000);
58  if (ailIn != 0) {ail = constrain(ailIn, 1000, 2000); } ;
59            // con un altra ricevente, fare una calibrazione nel caso.
60            // Middle = 1512
61
62
63  switch (ailstate) {
64      case middle:
65        // Alettoni piatti
66        if (ail > 1600) { ailstate = sxin; } ;
67        if (ail < 1400) { ailstate = dxin; } ;
68        ailerons.White();
69
70      break;
71
72    case sxin:
73    // Transizione a sx
74        ailerons.Off();
75        delay(1000);
76        ailstate = sx;
77      break;
78
79    case sx:
80    // dx
81        ailerons.Green();
82        if (ail < 1600) { ailstate = middle; } ;
83        if (ail < 1400) { ailstate = dxin; } ;
84      break;
85
86    case dxin:
87    // Transizione a dx
88        ailerons.Off();
89        delay(1000);
90        ailstate = dx;
91      break;
92
93    case dx:
94    // sx
95        ailerons.Blue();
96        if (ail > 1400) { ailstate = middle; } ;
97        if (ail > 1600) { ailstate = dxin; } ;
98      break;
99   }
100
101   Serial.print("ailIn: ");
102   Serial.print(ailIn);
103   Serial.print("\tail: ");
104   Serial.print(ail);
105   Serial.print("\t ailstate:");
106   Serial.println(ailstate);
107   //  delay(200);
108  }