1 /* Ailerons state machine
2 Serial.print(mid_point);
4 Pilotare un LED RGB in base al canale degli alettoni:
5 Questo sketch usa 2 interrupts per thr e alettoni.
16 = 3 stati + 2 transizioni:
26 * clean up magic numbers
33 // Variabili per interrupt 0 si PIN 2
34 volatile unsigned int thr = 1500; // Valore computato
35 volatile unsigned int chStart2 = 1500; // Inizio rilevamento
37 // Variabili per interrupt 1 su PIN 3
38 volatile unsigned int ail = 1500; // Valore computato
39 volatile unsigned int chStart3 = 1500; // Inizio rilevamento
41 // Variabili per autocalibrazione 0
42 const byte chPin2 = 3; // PIN per la calibrazione
43 int mid_point2 = 1500;
47 unsigned long currentMillis; // timestamp reference per millis per tutto il loop
52 RGBLed ailerons(11,10,9,255); // Common Cat
55 Lampeggiatore sxLamp(10); // Lampeggiatore
56 Lampeggiatore dxLamp(9); // Lampeggiatore
59 // Variabili per lettura canale servo
60 byte ailPin = 3; // Calibrazione
63 int mid_point = 1560 ; // centro del segnale, trimmato nel setup
64 const int deviation = 50 ; // deviazione dal punto medio
65 //per entrare nello stato successivo dal centro
68 // FSM gestione alettoni
69 enum { // Stati della FMS
71 sxin, // transizione a sx
73 dxin, // transizione a dx
78 unsigned long FSM_lastMillis = 0 ; // Timestamp per la FSM degli alettoni
79 unsigned long pausa = 500; // Pausa per la transizione durante gli stati 2, 4 della FSM
81 ///////////////////////////////////////////////////////////
89 attachInterrupt(0, chRise2, RISING); // PIN 2 su 328p / 168
90 attachInterrupt(1, chRise3, RISING); // PIN 3 su 328p / 168
93 // Funzione relativa a calibrazione:
94 mid_point = calibraTrim(ailPin) + 10 ; // + LED di servizio per monitor calibrazione
95 //Serial.print(mid_point);
101 currentMillis = millis(); // Timestamp per tutto il loop
107 if (ail > mid_point + deviation + deviation /3) {
108 // extra margine per avere un po' di gioco
110 FSM_lastMillis = currentMillis;
112 else if (ail < mid_point - deviation - deviation / 3) {
114 FSM_lastMillis = currentMillis ;
121 if (currentMillis - pausa > FSM_lastMillis ) {
128 if (ail < mid_point + deviation) {
131 else if (ail < mid_point - deviation) {
132 FSM_lastMillis = currentMillis;
140 if (currentMillis - pausa > FSM_lastMillis ) {
147 if (ail > mid_point - deviation) {
150 else if (ail > mid_point + deviation) {
151 FSM_lastMillis = currentMillis;
158 motore.lSet((thr - 980) / 4); // 980 = minimo
161 Serial.print((thr - 980) / 4);
162 Serial.print("\tail: ");
164 Serial.print("\t ailstate:");
165 Serial.println(ailstate);
170 attachInterrupt(0, chFall2, FALLING);
175 attachInterrupt(0, chRise2, RISING);
176 thr = micros() - chStart2;
180 attachInterrupt(1, chFall3, FALLING);
185 attachInterrupt(1, chRise3, RISING);
186 ail = micros() - chStart3;