1 /* Ailerons state machine
3 Pilotare un LED RGB in base al canale degli alettoni:
5 = 3 stati + 2 transizioni:
10 NOTE: uso di goto all'interno dell FSM.
14 * clean up magic numbers
21 unsigned long currentMillis; // timestamp reference per millis per tutto il loop
24 RGBLed ailerons(11,10,9,255);
26 // Variabili per lettura canale servo
27 const byte ailPin = A4;
28 int ail ; // Valore a 8bit per ailerons
29 int ailIn ; // Valore rilevato del 4 Ch della RX
30 unsigned long ailTimer ; // millis per ail
33 // FSM gestione alettoni
34 enum { // Stati della FMS
36 sxin, // transizione a sx
38 dxin, // transizione a dx
42 unsigned long FSM_lastMillis = 0 ; // Timestamp per la FSM degli alettoni
43 unsigned long pausa = 1000; // Pausa per la transizione durante gli stati 2, 4 della FSM
44 int mid_point = 1560 ; // centro del segnale, trimmato nel setup
45 const int deviation = 50 ; // deviazione dal punto medio
46 //per entrare nello stato successivo dal centro
48 ///////////////////////////////////////////////////////////
51 // Serial.begin(9600);
54 // Funzione relativa a calibrazione:
55 mid_point = calibraTrim(ailPin) ; // + LED di servizio per monitor calibrazione
59 currentMillis = millis(); // Timestamp per tutto il loop
61 // Lettura ailerons channel ogni 200ms
62 if (currentMillis - ailTimer>= 200) {
63 ailTimer = currentMillis ;
65 ailIn = pulseIn(ailPin, HIGH, 25000);
66 if (ailIn != 0 && ailIn > 1000 && ailIn <2000) {
67 // get only resonable values
70 // Lettura Aileron channel: FAKE con un potenziometro 10K
71 // ailIn = analogRead(3);
80 if (ail > mid_point + deviation + deviation /3) {
81 // extra margine per avere un po' di gioco
83 FSM_lastMillis = currentMillis;
85 else if (ail < mid_point - deviation - deviation / 3) {
87 FSM_lastMillis = currentMillis ;
95 if (currentMillis - pausa > FSM_lastMillis ) {
103 if (ail < mid_point + deviation) {
106 else if (ail < mid_point - deviation) {
107 FSM_lastMillis = currentMillis;
115 if (currentMillis - pausa > FSM_lastMillis ) {
123 if (ail > mid_point - deviation) {
126 else if (ail > mid_point + deviation) {
127 FSM_lastMillis = currentMillis;
133 Serial.print("ailIn: ");
135 Serial.print("\tail: ");
137 Serial.print("\t ailstate:");
138 Serial.println(ailstate);