1 /* Ailerons state machine
3 Pilotare un LED RGB in base al canale degli alettoni:
4 Questo sketch usa la funzione pulseIn(),
5 per versione con interrupts vedere esempio successivo.
7 = 3 stati + 2 transizioni:
13 * clean up magic numbers
18 #define dEBUG // Cambiare in DEBUG per il debug
21 unsigned long currentMillis; // timestamp reference per millis per tutto il loop
24 RGBLed ailerons(11,10,9,255); // Common Cat
27 Lampeggiatore sxLamp(10); // Lampeggiatore
28 Lampeggiatore dxLamp(9); // Lampeggiatore
31 // Variabili per lettura canale servo
32 const byte ailPin = A4;
33 int ail ; // Valore a 8bit per ailerons
34 int ailIn ; // Valore rilevato del 4 Ch della RX
35 unsigned long ailTimer ; // millis per ail
38 // FSM gestione alettoni
39 enum { // Stati della FMS
41 sxin, // transizione a sx
43 dxin, // transizione a dx
48 unsigned long FSM_lastMillis = 0 ; // Timestamp per la FSM degli alettoni
49 unsigned long pausa = 1000; // Pausa per la transizione durante gli stati 2, 4 della FSM
52 int mid_point = 1560 ; // centro del segnale, trimmato nel setup
53 const int deviation = 50 ; // deviazione dal punto medio
54 //per entrare nello stato successivo dal centro
56 ///////////////////////////////////////////////////////////
65 // Funzione relativa a calibrazione:
66 mid_point = calibraTrim(ailPin) ; // + LED di servizio per monitor calibrazione
70 currentMillis = millis(); // Timestamp per tutto il loop
72 // Lettura ailerons channel ogni 200ms
73 if (currentMillis - ailTimer>= 200) {
75 ailIn = pulseIn(ailPin, HIGH, 25000);
76 if (ailIn > 960 && ailIn <2000) {
77 // get only resonable values
79 ailTimer = currentMillis ;
89 if (ail > mid_point + deviation + deviation /3) {
90 // extra margine per avere un po' di gioco
92 FSM_lastMillis = currentMillis;
94 else if (ail < mid_point - deviation - deviation / 3) {
96 FSM_lastMillis = currentMillis ;
103 if (currentMillis - pausa > FSM_lastMillis ) {
111 if (ail < mid_point + deviation) {
114 else if (ail < mid_point - deviation) {
115 FSM_lastMillis = currentMillis;
123 if (currentMillis - pausa > FSM_lastMillis ) {
131 if (ail > mid_point - deviation) {
134 else if (ail > mid_point + deviation) {
135 FSM_lastMillis = currentMillis;
141 Serial.print("ailIn: ");
143 Serial.print("\tail: ");
145 Serial.print("\t ailstate:");
146 Serial.println(ailstate);