From: Andrea Manni Date: Mon, 13 Feb 2017 18:02:36 +0000 (+0100) Subject: Stati / RGB X-Git-Url: http://git.piffa.net/web?a=commitdiff_plain;h=b47bc61da5b760cbfceb6c9d1e34d29cce79d428;p=aerei Stati / RGB --- diff --git a/README.rst b/README.rst index 47aa85f..881a593 100644 --- a/README.rst +++ b/README.rst @@ -15,7 +15,7 @@ IDE l'intero repo ``aerei_arduino`` come cartella degli sketchbook, oppure copiare la cartella ``libraries/common`` dentro ``libraries`` dello sketchbook attuale. -Aggiornamenti +Download =============== Download tramite git: @@ -30,7 +30,16 @@ Per aggiornare all'ultima versione:: * `Browse on line `_ * `Interfaccia git Web `_ * `Foum di Discussione `_ - + +Libreria +------------ + +La sola libreria Common contenete gli oggetti base puo' essere scaricata direttamente nella vostra cartella libraries da: + git clone git://git.andreamanni.com/common + +* `Download manuale archivio `_ +* `Browse on line `_ +* `Interfaccia git Web `_ Links diff --git a/TODO b/TODO index 43e0a49..e8f9ccf 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,5 @@ +* Pubblicare la libreria common su arduino, via github + * aggiungere uno snippet per sniffing canale RX con interrupt * mettere questo e quello in pulsein in una funzione / oggetto * Ailerons RGB: creare un metodo per lo stato intermedio @@ -23,3 +25,12 @@ Calibrazione: # Creare un PWM con correzione di luminosita' su look table da 32 / 256 valori, eventualmente uno con coseno. + +* Flasher con sequenza arbitraria di lampeggio +* oggetti che lavorino contemporaneamente su piu' PIN +* Link a Schemi / Schemi +** battery voltage reader -> RGB +** digital compass e RGB +** barometer +** 6 axis +** Neopixel diff --git a/aerei/cirso/cirso.ino b/aerei/cirso/cirso.ino deleted file mode 100644 index 5e5c3d8..0000000 --- a/aerei/cirso/cirso.ino +++ /dev/null @@ -1,28 +0,0 @@ -/* Aereo di Cirso - - Esempio base: - 2 LED ai lati con lampeggio alternato - 1 LED in coda lampeggio a freq doppia -*/ - -#include - -// Instanziamo un LED fuori dal loop -Lampeggiatore left = 5; -Lampeggiatore right = 6; -Lampeggiatore coda = 9; - -void setup() { - // I PINs vengono impostati dal constructor al momento - // della dichiarazione dell'ogetto. - - right.Invert() ; // Opzionale: inverte l'ordine del lampeggio da - // HI -> LOW --> LOW -> HI - // per avere 2 LED che lampeggiano alternativamente -} - -void loop() { - left.Blink(); // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW) - right.Blink(); - coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo -} diff --git a/aerei/cirso/prototipo/prototipo.ino b/aerei/cirso/prototipo/prototipo.ino new file mode 100644 index 0000000..5e5c3d8 --- /dev/null +++ b/aerei/cirso/prototipo/prototipo.ino @@ -0,0 +1,28 @@ +/* Aereo di Cirso + + Esempio base: + 2 LED ai lati con lampeggio alternato + 1 LED in coda lampeggio a freq doppia +*/ + +#include + +// Instanziamo un LED fuori dal loop +Lampeggiatore left = 5; +Lampeggiatore right = 6; +Lampeggiatore coda = 9; + +void setup() { + // I PINs vengono impostati dal constructor al momento + // della dichiarazione dell'ogetto. + + right.Invert() ; // Opzionale: inverte l'ordine del lampeggio da + // HI -> LOW --> LOW -> HI + // per avere 2 LED che lampeggiano alternativamente +} + +void loop() { + left.Blink(); // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW) + right.Blink(); + coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo +} diff --git a/aerei/cirso/trigger_on/trigger_on.ino b/aerei/cirso/trigger_on/trigger_on.ino new file mode 100644 index 0000000..32c7052 --- /dev/null +++ b/aerei/cirso/trigger_on/trigger_on.ino @@ -0,0 +1,54 @@ +/* Aereo di Cirso + +Output: + 2 LED ai lati con lampeggio alternato + 1 LED in coda lampeggio a freq doppia + +Input: + 1 interruttore su interrupt 0 per accensione / spegnimento luci +*/ + +#include + +// Variabili per interrupt 0 +volatile unsigned int chValue = 1500; // Valore computato +volatile unsigned int chStart = 1500; // Inizio rilevamento + +// Instanziamo un LED fuori dal loop +Lampeggiatore left = 5; +Lampeggiatore right = 6; +Lampeggiatore coda = 9; + +void setup() { + // I PINs vengono impostati dal constructor al momento + // della dichiarazione dell'ogetto. + + right.Invert() ; // Opzionale: inverte l'ordine del lampeggio da + // HI -> LOW --> LOW -> HI + // per avere 2 LED che lampeggiano alternativamente +} + +void loop() { + + if (chValue > 1400) { + left.Blink(); // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW) + right.Blink(); + coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo + } else { +// sarebbe carino mettere una transizione da on -> off con un fade down... + left.Low(); + right.Low(); + coda.Low(); + } ; +} + +// Functions +void chRise() { + attachInterrupt(0, chFall, FALLING); + chStart = micros(); +}; + +void chFall() { + attachInterrupt(0, chRise, RISING); + chValue = micros() - chStart; +}; diff --git a/aerei/cirso/trigger_transition/trigger_transition.ino b/aerei/cirso/trigger_transition/trigger_transition.ino new file mode 100644 index 0000000..5a6c8b1 --- /dev/null +++ b/aerei/cirso/trigger_transition/trigger_transition.ino @@ -0,0 +1,116 @@ +/* Cirso TransStates + +Output: + 2 LED ai lati con lampeggio alternato + 1 LED in coda lampeggio a freq doppia + +Input: + 1 interruttore su interrupt 0 per accensione / spegnimento luci + +FSM per la gesrione delle transizioni tra i 2 stati. + +*/ + +#include + +// FSM gestione interruttore luci +enum { // Stati della FMS + On, // Acceso + toOff, // Trans On -> Off + Off, // Spento + toOn // Trans OFF -> On +} toggle = Off; + +// Variabili per interrupt 0 +volatile unsigned int chValue = 1500; // Valore computato +volatile unsigned int chStart = 1500; // Inizio rilevamento +const int soglia = 1400; // soglia per scatto toggle a 2 posizioni + +// Var FSM +unsigned long FSM_lastMillis = 0 ; // Timestamp per la FSM degli alettoni +unsigned long pausa = 2000; // Pausa per la transizione durante gli stati 2, 4 della FSM + +// Instanziamo gli oggetti per gli stati On / Off +Lampeggiatore left = 5; +Lampeggiatore right = 6; +Lampeggiatore coda = 9; + +// Instanziamo gli oggetti per gli stati di transizione +Pwm leftPWM = 5; +Pwm righatPWM = 6; +Pwm codaPWM = 9; + +void setup() { + // I PINs vengono impostati dal constructor al momento + // della dichiarazione dell'ogetto. + + right.Invert() ; // Opzionale: inverte l'ordine del lampeggio da + // HI -> LOW --> LOW -> HI + // per avere 2 LED che lampeggiano alternativamente +} + +void loop() { + +switch (toggle) { + case Off: + // Spento + left.Low(); + right.Low(); + coda.Low(); + + if (chValue > soglia) { + FSM_lastMillis = millis(); + toggle = toOn ; + } + break; + + case On: + // Acceso + left.Blink(); // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW) + right.Blink(); + coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo + + if (chValue <= soglia) { + FSM_lastMillis = millis(); + toggle = toOff ; + } + break; + + case ToOn: + // Trans off -> on + leftPWM.lUp(pausa); + rightPWM.lUp(pausa); + codaPWM.lUp(pausa); + + if (chValue > soglia && currentMillis - pausa > FSM_lastMillis ) { + toggle = On ; + } else if (chValue <= soglia) { + toggle = Off ; + } + break; + + case ToOff: + // Trans on -> off + leftPWM.lDown(pausa); + rightPWM.lDown(pausa); + codaPWM.lDown(pausa); + + if (chValue <= soglia && currentMillis - pausa > FSM_lastMillis ) { + toggle = Off ; + } else if (chValue > soglia) { + toggle = On ; + } + break; +} ; +} + +// Functions +void chRise() { + attachInterrupt(0, chFall, FALLING); + chStart = micros(); +}; + +void chFall() { + attachInterrupt(0, chRise, RISING); + chValue = micros() - chStart; +}; diff --git a/esempi/ailerons_state_rgb/ailerons_state_rgb.ino b/esempi/ailerons_state_rgb/ailerons_state_rgb.ino index 7eb4c25..3ffa994 100644 --- a/esempi/ailerons_state_rgb/ailerons_state_rgb.ino +++ b/esempi/ailerons_state_rgb/ailerons_state_rgb.ino @@ -21,7 +21,12 @@ TODO: unsigned long currentMillis; // timestamp reference per millis per tutto il loop // Un LED RGB -RGBLed ailerons(11,10,9,255); +RGBLed ailerons(11,10,9,255); // Common Cat + +// Transizione: Pwm +Pwm sxLamp(10); // Lampeggiatore +Pwm dxLamp(9); // Lampeggiatore + // Variabili per lettura canale servo const byte ailPin = A4; @@ -39,8 +44,11 @@ enum { // Stati della FMS dx // dx } ailstate = middle; +// Vars FSM unsigned long FSM_lastMillis = 0 ; // Timestamp per la FSM degli alettoni unsigned long pausa = 1000; // Pausa per la transizione durante gli stati 2, 4 della FSM + +// Vars Alettoni int mid_point = 1560 ; // centro del segnale, trimmato nel setup const int deviation = 50 ; // deviazione dal punto medio //per entrare nello stato successivo dal centro @@ -48,9 +56,12 @@ const int deviation = 50 ; // deviazione dal punto medio /////////////////////////////////////////////////////////// void setup() { -// Serial.begin(9600); // #define DEBUG +#ifdef DEBUG + Serial.begin(9600); +#endif + // Funzione relativa a calibrazione: mid_point = calibraTrim(ailPin) ; // + LED di servizio per monitor calibrazione } @@ -60,22 +71,20 @@ void loop() { // Lettura ailerons channel ogni 200ms if (currentMillis - ailTimer>= 200) { - ailTimer = currentMillis ; ailIn = pulseIn(ailPin, HIGH, 25000); - if (ailIn != 0 && ailIn > 960 && ailIn <2000) { + if (ailIn > 960 && ailIn <2000) { // get only resonable values ail = ailIn; + ailTimer = currentMillis ; } ; -// Lettura Aileron channel: FAKE con un potenziometro 10K -// ailIn = analogRead(3); -// ail = 1000 + ailIn } switch (ailstate) { case middle: + ailerons.White(); // Alettoni piatti if (ail > mid_point + deviation + deviation /3) { // extra margine per avere un po' di gioco @@ -86,12 +95,11 @@ void loop() { ailstate = dxin; FSM_lastMillis = currentMillis ; } ; - ailerons.Red(); break; case sxin: // Transizione a sx - ailerons.Off(); + sxLamp.(200); if (currentMillis - pausa > FSM_lastMillis ) { ailstate = sx; } @@ -111,7 +119,7 @@ void loop() { case dxin: // Transizione a dx - ailerons.Off(); + dxLamp.(200); if (currentMillis - pausa > FSM_lastMillis ) { ailstate = dx; } diff --git a/esempi/base_th/base_th.ino b/esempi/base_th/base_th.ino index 0bb90e6..5f53496 100644 --- a/esempi/base_th/base_th.ino +++ b/esempi/base_th/base_th.ino @@ -16,8 +16,11 @@ Pwm sotto = 9; // Variabili const byte thrPin = 3; // PIN collegato al CH3 -byte thr ; // Throttle -int thrIn ; +byte thr ; // Valore a 8bit per il throttle +int thrIn ; // Valore rilevato del 3 Ch della RX +const int thMin = 983; // In genere il valore minimo del TH resta costante, +// per calcolarlo si puo' usare la funzione di calibrazione nel setup + void setup() { // I PINs vengono impostati dal constructor al momento @@ -31,13 +34,12 @@ void setup() { void loop() { // Lettura CH3 thrIn = pulseIn(thrPin, HIGH, 25000); - if (thrIn != 0 && ailIn > 983 && ailIn < 2000) { // clean up - thr = map(thrIn, 983, 2000, 0, 255); // mappato su 8bit per PWM - } + if (thrIn >= thMin && thrIn < 2000) { // clean up + thr = map(thrIn, thMin, 2000, 0, 255); // mappato su 8bit per PWM + }; // Attivazione LEDs left.Blink(100 + thr); right.Blink(100 + thr); sotto.lSet(thr); // Luminosita' proporzionale al throttle - delay(10); // Opzionale } diff --git a/esempi/base_th_3stati/base_th_3stati.ino b/esempi/base_th_3stati/base_th_3stati.ino index 21656ae..f69bae1 100644 --- a/esempi/base_th_3stati/base_th_3stati.ino +++ b/esempi/base_th_3stati/base_th_3stati.ino @@ -20,47 +20,51 @@ Pwm rpwm = 11; // Variabili const byte thrPin = 3; // PIN collegato al CH3 -byte thr ; // Throttle -int thrIn ; +byte thr ; // Valore a 8bit per il throttle +int thrIn ; // Valore rilevato del 3 Ch della RX +const int thMin = 983; // In genere il valore minimo del TH resta costante, +// per calcolarlo si puo' usare la funzione di calibrazione nel setup + byte caso; void setup() { - // I PINs vengono impostati dal constructor al momento - // della dichiarazione dell'ogetto. + // I PINs vengono impostati dal constructor al momento + // della dichiarazione dell'ogetto. - right.Invert() ; // Opzionale: inverte l'ordine del lampeggio da - // HI -> LOW --> LOW -> HI - // per avere 2 LED che lampeggiano alternativamente + right.Invert() ; // Opzionale: inverte l'ordine del lampeggio da + // HI -> LOW --> LOW -> HI + // per avere 2 LED che lampeggiano alternativamente - randomSeed(analogRead(0)); + randomSeed(analogRead(0)); } void loop() { - // Lettura CH3 - thrIn = pulseIn(thrPin, HIGH, 25000); - thr = constrain(map(thrIn, 983, 2000, 0, 255), 0, 255) ; + // Lettura CH3 con pulsein, per usare interrupts vedi ../snippets. + thrIn = pulseIn(thrPin, HIGH, 25000); + if (thrIn >= thMin && thrIn < 2000) { // clean up + thr = thrIn ; + }; // Gestione throttle - if (thr > 0 && thr < 15) { - // IDLE - - rpwm.UD(2000); - lpwm.UD(2000); - sotto.lDown(1500); - } else if (thr < 245) { - // Throttle medio - - right.Blink(1120 - 4 * thr ); - left.Blink(1120 - 4 * thr ); - sotto.lSet(thr); // Luminosita' proporzionale al throttle - } else { - // Throttle al massimo: LED laterali lampeggiano a caso, - // Sotto luminosita' a caso + if (thr < 1050) { + // IDLE - caso = random(20, 240) ; - right.Swap(); - left.Swap(); - sotto.lSet(caso); - delay(caso); - } + rpwm.UD(2000); + lpwm.UD(2000); + sotto.lDown(1500); + } + else if (thr < 1900) { + // Throttle medio + right.Blink(1120 - 4 * thr ); + left.Blink(1120 - 4 * thr ); + sotto.lSet(map(thrIn, thMin, 2000, 0, 255)); // Luminosita' proporzionale al throttle + } + else { + // Throttle al massimo: LED laterali lampeggiano a caso, + // Sotto luminosita' a caso + caso = random(20, 240) ; + right.Swap(); + left.Swap(); + sotto.lSet(caso); + } } diff --git a/esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse.ino b/esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse.ino deleted file mode 100644 index abee674..0000000 --- a/esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse.ino +++ /dev/null @@ -1,52 +0,0 @@ - -/* Lettura di un canale servo della RX - - Lettura tramite la funzione pulsein - Utilizzabile su qualunque PIN - - Il codice e' blocking fin tanto che il segnale passa da RISE a FALL - quindi blocca per 1-2ms a ogni esecuzione. Con la variabile freq - si imposta ogni quanto fare una lettura. - - -*/ - -#include - -unsigned long currentMillis; // timestamp reference per millis per tutto il loop - -// Variabili -const byte chPin = A4; // PIN su cui e' collegato il canale -long unsigned chStamp = 0; // Timestamp per -unsigned int chIn = 1500; // Valore catturato -unsigned int chValue = 1500; // Valore computato -unsigned int freq = 200 ; // Ogni quanti millisecondi leggere il valore -// Attenzione che pulsein e' blocking - -void setup() { - // Funzione relativa a calibrazione: -// mid_point = calibraTrim(chPin) +10 ; // Con pulse in c'e' una traslazione ~10 -//Serial.begin(9600); // Warning: interrupts e serial potrebbero dare problemi -} ; - -void loop() { - currentMillis = millis(); // Timestamp per tutto il loop - -// Lettura ailerons channel ogni 200ms - if (currentMillis - chStamp >= freq) { - chStamp = currentMillis ; - - chIn = pulseIn(chPin, HIGH, 25000); - if (chIn != 0 && chIn > 1000 && chIn <2000) { - // get only resonable values - chValue = chIn; - } ; - }; - -// do something with chValue -// Serial.print(chValue); -// Serial.print(" - base: "); -// Serial.println(mid_point); -// delay(200); - -} diff --git a/esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse_millis.ino b/esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse_millis.ino new file mode 100644 index 0000000..81cdd77 --- /dev/null +++ b/esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse_millis.ino @@ -0,0 +1,57 @@ + +/* Lettura di un canale servo della RX + + Lettura tramite la funzione pulsein + Utilizzabile su qualunque PIN + + Il codice e' blocking fin tanto che il segnale passa da RISE a FALL + quindi blocca per 1-2ms a ogni esecuzione. Con la variabile freq + si imposta ogni quanto fare una lettura. + + +*/ + +#define DEBUG +#include + +unsigned long currentMillis; // timestamp reference per millis per tutto il loop + +// Variabili +const byte chPin = A4; // PIN su cui e' collegato il canale +long unsigned chStamp = 0; // Timestamp per +unsigned int chIn = 1500; // Valore catturato +unsigned int chValue = 1500; // Valore computato +unsigned int freq = 200 ; // Ogni quanti millisecondi leggere il valore +// Attenzione che pulsein e' blocking + +void setup() { + // Funzione relativa a calibrazione: +// mid_point = calibraTrim(chPin) +10 ; // Con pulse in c'e' una traslazione ~10 +#ifdef DEBUG +Serial.begin(9600); // Warning: interrupts e serial potrebbero dare problemi +} ; +#endif + +void loop() { + currentMillis = millis(); // Timestamp per tutto il loop + +// Lettura ailerons channel ogni 200ms + if (currentMillis - chStamp >= freq) { + + chIn = pulseIn(chPin, HIGH, 25000); + if (chIn != 0 && chIn > 1000 && chIn <2000) { + // get only resonable values + chValue = chIn; + chStamp = currentMillis ; + } ; + }; + +// do something with chValue +#ifdef DEBUG + Serial.print(chValue); + Serial.print(" - base: "); + Serial.println(mid_point); + delay(200); +#endif + +} diff --git a/esempi/snippets/lettura_servo_interrupt/lettura_servo_interrupt.ino b/esempi/snippets/lettura_servo_interrupt/lettura_servo_interrupt.ino index 91cd7c6..e52cade 100644 --- a/esempi/snippets/lettura_servo_interrupt/lettura_servo_interrupt.ino +++ b/esempi/snippets/lettura_servo_interrupt/lettura_servo_interrupt.ino @@ -7,7 +7,7 @@ */ #include - +#define DEBUG // Variabili per interrupt 0 volatile unsigned int chValue = 1500; // Valore computato @@ -21,14 +21,19 @@ void setup() { // Funzione relativa a calibrazione con pulsein: mid_point = calibraTrim(chPin) ; // Calibrazione del TRIM attivo sul canale attachInterrupt(0, chRise, RISING); // PIN 2 su 328p / 168 +#ifdef DEBUG Serial.begin(9600); // Warning: interrupts e serial potrebbero dare problemi } ; +#endif +} ; void loop() { +#ifdef DEBUG Serial.print(chValue); Serial.print(" - base: "); Serial.println(mid_point); delay(200); +#endif } // Functions diff --git a/esempi/snippets/lettura_servo_interrupt_doppio/lettura_servo_interrupt_doppio.ino b/esempi/snippets/lettura_servo_interrupt_doppio/lettura_servo_interrupt_doppio.ino index db1922a..9add4e9 100644 --- a/esempi/snippets/lettura_servo_interrupt_doppio/lettura_servo_interrupt_doppio.ino +++ b/esempi/snippets/lettura_servo_interrupt_doppio/lettura_servo_interrupt_doppio.ino @@ -7,6 +7,7 @@ */ #include +#define DEBUG // Variabili per interrupt 0 si PIN 2 @@ -31,11 +32,14 @@ void setup() { mid_point3 = calibraTrim(chPin3) ; // Calibrazione del TRIM attivo sul canale attachInterrupt(0, chRise2, RISING); // PIN 2 su 328p / 168 attachInterrupt(1, chRise3, RISING); // PIN 3 su 328p / 168 -Serial.begin(9600); // Warning: interrupts e serial potrebbero dare problemi +#ifdef DEBUG +Serial.begin(9600); } ; +#endif void loop() { - +// Il loop fa solo debug +#ifdef DEBUG Serial.print("PIN2: "); Serial.print(chValue2); Serial.print(" -base: "); @@ -46,6 +50,7 @@ void loop() { Serial.print(" -base: "); Serial.println(mid_point3); delay(200); +#endif } // Functions diff --git a/esempi/state_throttle/state_throttle.ino b/esempi/state_throttle/state_throttle.ino index 7220876..9509771 100644 --- a/esempi/state_throttle/state_throttle.ino +++ b/esempi/state_throttle/state_throttle.ino @@ -18,12 +18,12 @@ enum { // Stati della FMS // Due LED con lampeggio alternato: Lampeggiatore right = 3; Lampeggiatore left = 5; -Pwm motor = 7; +Pwm motore = 7; const byte thrPin = A3; byte thr ; // Valore a 8bit per il throttle int thrIn ; // Valore rilevato del 3 Ch della RX - +const int thMin = 983; // In genere il valore minimo del TH resta costante, void setup() { @@ -38,9 +38,10 @@ void loop() { //thr = constrain(thrIn / 4 , 0, 255) ; // Lettura Throttle channel - thrIn = pulseIn(thrPin, HIGH, 25000); - thr = constrain(map(thrIn, 983, 2000, 0, 255), 0, 255) ; // 983 potrebbe cambiare - // con un altra ricevente, fare una calibrazione nel caso. + thrIn = pulseIn(thrPin, HIGH, 25000); + if (thrIn >= thMin && thrIn < 2000) { // clean up + thr = map(thrIn, thMin, 2000, 0, 255); // mappato su 8bit per PWM + } ; // FMS dispatcher if ( thr < 10 ) { @@ -71,7 +72,7 @@ void loop() { // lampeggi e PWM a caso right.Swap(); left.Swap(); - motore.lSet(random(0,255); + motore.lSet(random(0,255)); delay(random(20, 100)); break; } diff --git a/esempi/toggle_transition/toggle_transition.ino b/esempi/toggle_transition/toggle_transition.ino new file mode 100644 index 0000000..0b49d9b --- /dev/null +++ b/esempi/toggle_transition/toggle_transition.ino @@ -0,0 +1,103 @@ +/* Toggle con transizioni tra On | OFF + +Output esempio: + 1 Lampeggiatore in coda. + +Input: + 1 interruttore su interrupt 0 per accensione / spegnimento luci + +FSM per la gesrione delle transizioni tra i 2 stati. + +*/ + +#include + +// FSM gestione interruttore luci +enum { // Stati della FMS + On, // Acceso + toOff, // Trans On -> Off + Off, // Spento + toOn // Trans OFF -> On +} toggle = Off; + +// Variabili per interrupt 0 +volatile unsigned int chValue = 1500; // Valore computato +volatile unsigned int chStart = 1500; // Inizio rilevamento +const int soglia = 1400; // soglia per scatto toggle a 2 posizioni + +// Var FSM +unsigned long FSM_lastMillis = 0 ; // Timestamp per la FSM degli alettoni +unsigned long pausa = 2000; // Pausa per la transizione durante gli stati 2, 4 della FSM + +// Instanziamo gli oggetti per gli stati On / Off +Lampeggiatore coda = 9; + +// Instanziamo gli oggetti per gli stati di transizione +Pwm codaPWM = 9; + +void setup() { + // I PINs vengono impostati dal constructor al momento + // della dichiarazione dell'ogetto. + + right.Invert() ; // Opzionale: inverte l'ordine del lampeggio da + // HI -> LOW --> LOW -> HI + // per avere 2 LED che lampeggiano alternativamente +} + +void loop() { + +switch (toggle) { + case Off: + // Spento + coda.Low(); + + if (chValue > soglia) { + FSM_lastMillis = millis(); + toggle = toOn ; + } + break; + + case On: + // Acceso + coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo + + if (chValue <= soglia) { + FSM_lastMillis = millis(); + toggle = toOff ; + } + break; + + case ToOn: + // Trans off -> on + codaPWM.lUp(pausa); + + if (chValue > soglia && currentMillis - pausa > FSM_lastMillis ) { + toggle = On ; + } else if (chValue <= soglia) { + toggle = Off ; + } + break; + + case ToOff: + // Trans on -> off + codaPWM.lDown(pausa); + + if (chValue <= soglia && currentMillis - pausa > FSM_lastMillis ) { + toggle = Off ; + } else if (chValue > soglia) { + toggle = On ; + } + break; +} ; +} + +// Functions +void chRise() { + attachInterrupt(0, chFall, FALLING); + chStart = micros(); +}; + +void chFall() { + attachInterrupt(0, chRise, RISING); + chValue = micros() - chStart; +}; diff --git a/libraries/common/TODO b/libraries/common/TODO index bfd3808..5ab7c7a 100644 --- a/libraries/common/TODO +++ b/libraries/common/TODO @@ -1,11 +1,4 @@ -* aggiungere un displace temporale ai blink / pwm * Flasher con sequenza arbitraria di lampeggio * oggetti che lavorino contemporaneamente su piu' PIN * Link a Schemi / Schemi -* esempio con state machine per flight modes -** battery voltage reader -> RGB -** digital compass e RGB -** barometer -** 6 axis -** Neopixel diff --git a/libraries/common/common.cpp b/libraries/common/common.cpp index 5a7230d..e696ff4 100644 --- a/libraries/common/common.cpp +++ b/libraries/common/common.cpp @@ -177,19 +177,16 @@ void Lampeggiatore::Blink(long up, long down, long drift ) { void Lampeggiatore::High() { // Accende il LED - digitalWrite(ledPin, HIGH); } void Lampeggiatore::Low() { // Spegne il LED - digitalWrite(ledPin, LOW); } void Lampeggiatore::Swap() { // Inverte lo stato del LED - digitalWrite(ledPin, !digitalRead(ledPin)); } diff --git a/libraries/common/library.properties b/libraries/common/library.properties new file mode 100644 index 0000000..8f17f8a --- /dev/null +++ b/libraries/common/library.properties @@ -0,0 +1,9 @@ +name=Common: oggetti comuni non blocking +version=1.0 +author=Andrea Manni +maintainer=Andrea Manni +sentence=Vari oggetti e funzioni per la gestione delle luci. +paragraph=Elementi di base per lampeggi, fade e sequenze di luci tramite codice non blocking. Realizzati durante i corsi di Arduino di Andrea Manni su piffa.net . +category=Display +url=https://piffa.net +architectures=*