From ad6370083abcb50cbedafd46e5b6cd1a20a078d9 Mon Sep 17 00:00:00 2001 From: eaman Date: Mon, 30 Jan 2017 18:32:09 +0100 Subject: [PATCH] common update, reorder --- {zeta => aerei/zeta/zeta}/zeta.ino | 5 ++ .../zeta/zeta_5_no_state}/zeta_5_no_state.ino | 0 .../zeta/zeta_5_state}/zeta_5_state.ino | 0 .../zeta_5_state_no_aserial.ino | 0 .../zeta/zeta_full}/zeta_full.ino | 0 .../zeta/zeta_prot}/zeta_prot.ino | 0 .../bussola}/red_white/red_white.ino | 0 .../bussola}/rgb_states/rgb_states.ino | 0 esempi/state_throttle/state_throttle.ino | 76 +++++++++++++++++ libraries/common/TODO | 10 ++- libraries/common/common.cpp | 83 +++++++++++++++++-- libraries/common/common.h | 13 ++- libraries/common/examples/blink/blink.ino | 9 +- libraries/common/examples/pwm/pwm.ino | 15 ++-- libraries/common/examples/rgb/rgb.ino | 12 ++- libraries/common/keywords.txt | 21 ++++- pragmatica.rst | 14 ++++ 17 files changed, 229 insertions(+), 29 deletions(-) rename {zeta => aerei/zeta/zeta}/zeta.ino (96%) rename {zeta_5_no_state => aerei/zeta/zeta_5_no_state}/zeta_5_no_state.ino (100%) rename {zeta_5_state => aerei/zeta/zeta_5_state}/zeta_5_state.ino (100%) rename {zeta_5_state_no_aserial => aerei/zeta/zeta_5_state_no_aserial}/zeta_5_state_no_aserial.ino (100%) rename {zeta_full => aerei/zeta/zeta_full}/zeta_full.ino (100%) rename {zeta_prot => aerei/zeta/zeta_prot}/zeta_prot.ino (100%) rename {bussola => esempi/bussola}/red_white/red_white.ino (100%) rename {bussola => esempi/bussola}/rgb_states/rgb_states.ino (100%) create mode 100644 esempi/state_throttle/state_throttle.ino diff --git a/zeta/zeta.ino b/aerei/zeta/zeta/zeta.ino similarity index 96% rename from zeta/zeta.ino rename to aerei/zeta/zeta/zeta.ino index af87d04..45e1f2e 100644 --- a/zeta/zeta.ino +++ b/aerei/zeta/zeta/zeta.ino @@ -27,6 +27,7 @@ Pwm lwhite = 5; Pwm rtp = 6 ; Pwm ltp = 9 ; +RGBLed rgb(7,8,4,255); void setup() { left.Invert() ; // Parte da stato invertito rispetto al default @@ -41,6 +42,7 @@ void setup() { void loop() { + thrIn = pulseIn(thrPin, HIGH, 25000); thr = constrain(map(thrIn, 983, 2000, 0, 255), 0, 255) ; // Inserire necro delay @@ -58,6 +60,7 @@ void loop() { switch (state) { case idle: + rgb.Red(); rwhite.UD(2000); // Utilizza il coseno lwhite.UD(2000); // Bisognerebbe evitare di calcolarlo 4 volte uguale ltp.UD(2000); @@ -65,6 +68,7 @@ void loop() { break; case normal: + rgb.Green(); // Due LED con lampeggio alternato: right.Blink(1120 - 4 * thr ); left.Blink(1120 - 4 * thr ); @@ -73,6 +77,7 @@ void loop() { break; case full: + rgb.Blue(); pausa = random(30, 125); // Due LED con lampeggio alternato: right.Blink(1120 - 4 * thr ); diff --git a/zeta_5_no_state/zeta_5_no_state.ino b/aerei/zeta/zeta_5_no_state/zeta_5_no_state.ino similarity index 100% rename from zeta_5_no_state/zeta_5_no_state.ino rename to aerei/zeta/zeta_5_no_state/zeta_5_no_state.ino diff --git a/zeta_5_state/zeta_5_state.ino b/aerei/zeta/zeta_5_state/zeta_5_state.ino similarity index 100% rename from zeta_5_state/zeta_5_state.ino rename to aerei/zeta/zeta_5_state/zeta_5_state.ino diff --git a/zeta_5_state_no_aserial/zeta_5_state_no_aserial.ino b/aerei/zeta/zeta_5_state_no_aserial/zeta_5_state_no_aserial.ino similarity index 100% rename from zeta_5_state_no_aserial/zeta_5_state_no_aserial.ino rename to aerei/zeta/zeta_5_state_no_aserial/zeta_5_state_no_aserial.ino diff --git a/zeta_full/zeta_full.ino b/aerei/zeta/zeta_full/zeta_full.ino similarity index 100% rename from zeta_full/zeta_full.ino rename to aerei/zeta/zeta_full/zeta_full.ino diff --git a/zeta_prot/zeta_prot.ino b/aerei/zeta/zeta_prot/zeta_prot.ino similarity index 100% rename from zeta_prot/zeta_prot.ino rename to aerei/zeta/zeta_prot/zeta_prot.ino diff --git a/bussola/red_white/red_white.ino b/esempi/bussola/red_white/red_white.ino similarity index 100% rename from bussola/red_white/red_white.ino rename to esempi/bussola/red_white/red_white.ino diff --git a/bussola/rgb_states/rgb_states.ino b/esempi/bussola/rgb_states/rgb_states.ino similarity index 100% rename from bussola/rgb_states/rgb_states.ino rename to esempi/bussola/rgb_states/rgb_states.ino diff --git a/esempi/state_throttle/state_throttle.ino b/esempi/state_throttle/state_throttle.ino new file mode 100644 index 0000000..c263642 --- /dev/null +++ b/esempi/state_throttle/state_throttle.ino @@ -0,0 +1,76 @@ +/* Throttle state machine + +Idle, throttle e averburner effect basati sono sul canale throttle. + + +*/ + +#include + +enum { // Stati della FMS + idle, // Throttle a zero + normal, // Th normale + full, // Th massimo +} state ; + +// Due LED con lampeggio alternato: +Lampeggiatore right = 3; +Lampeggiatore left = 5; +Pwm motor = 7; + +const byte thrPin = A3; +byte thr ; // Valore a 8bit per il throttle +int thrIn ; // Valore rilevato del 3 Ch della RX + + + +void setup() { + left.Invert() ; // Parte da stato invertito rispetto al default + randomSeed(analogRead(0)); +} + +void loop() { + + // Lettura Throttle channel: FAKE con un potenziometro + //thrIn = analogRead(3); + //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 campbiare con + // con un altra ricevente, fare una calibrazione nel caso. + + // FMS dispatcher + if ( thr < 10 ) { + state = idle ; + } else if ( thr > 245 ) { + state = full ; + } else { + state = normal ; + } + + switch (state) { + case idle: + // Lampeggia i lati fissi e fa un PWD Up/Down col motore + right.Blink(); + left.Blink(); + motore.UD(1000); + break; + + case normal: + // right e left lampeggiano alternativamente in base al th, + // il motore e' acceso con correzione di luminosita' in proporzione al th + right.Blink(1120 - 4 * thr ); // lampeggio piu' rapido in base al Th + left.Blink(1120 - 4 * thr ); + motore.lSet(thr); + break; + + case full: + // lampeggi e PWM a caso + right.Swap(); + left.Swap(); + motore.lSet(random(0,255); + delay(random(20, 100)); + break; + } + diff --git a/libraries/common/TODO b/libraries/common/TODO index e78d265..bfd3808 100644 --- a/libraries/common/TODO +++ b/libraries/common/TODO @@ -1,8 +1,10 @@ -* inserire knight rider con millis + +* 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 -** Schemi -** descrizione componenti: transistor, array, stepdown +** battery voltage reader -> RGB ** digital compass e RGB ** barometer ** 6 axis diff --git a/libraries/common/common.cpp b/libraries/common/common.cpp index cbf8fdd..3598969 100644 --- a/libraries/common/common.cpp +++ b/libraries/common/common.cpp @@ -9,12 +9,27 @@ ////////////////////// // RGB LED -// Common anode +// Common anode / cat -RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) { +RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) { + // Per un common catodo, valore max / min invertiti redPin = pinR ; greenPin = pinG ; bluePin = pinB ; + common = 0 ; + + // Equvalente del Setup() per inizializzare i PIN + pinMode(redPin, OUTPUT); + pinMode(greenPin, OUTPUT); + pinMode(greenPin, OUTPUT); +}; + +RGBLed::RGBLed(byte pinR, byte pinG, byte pinB, byte com) { + // Per un common anode, valore max / min normali + redPin = pinR ; + greenPin = pinG ; + bluePin = pinB ; + common = com ; // Equvalente del Setup() per inizializzare i PIN pinMode(redPin, OUTPUT); @@ -24,9 +39,9 @@ RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) { void RGBLed::SetColor (byte r, byte g, byte b) { // Imposta il colore di un LED RGB - analogWrite(redPin, r); - analogWrite(greenPin, g); - analogWrite(bluePin, b); + analogWrite(redPin, common - r); + analogWrite(greenPin, common - g); + analogWrite(bluePin, common - b); }; void RGBLed::Red () { @@ -134,6 +149,24 @@ void Lampeggiatore::Blink(long up, long down) { digitalWrite(ledPin, ledState); }; +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)); +} + ///////////////////////////////////// // Pwm // Constructor @@ -150,7 +183,7 @@ Pwm::Pwm(int pin) }; void Pwm::Up(long speed) { - // Aumenta progressivamente la luminosita' usanndo millis() + // Aumenta linearmente la luminosita' usanndo millis() // quindi senza bloccare il processore // Viene usato un float, in alternativa un coseno @@ -162,8 +195,21 @@ void Pwm::Up(long speed) { }; } +void Pwm::lUp(long speed) { + // Aumenta usanndo millis() con correzione luminosita' LED + // quindi senza bloccare il processore + // Viene usato un float, in alternativa un coseno + + if (millis() != previousMillis) { // si potrebbe togliere + brightness = 255.0 /(float)speed * millis() ; + analogWrite(ledPin, lum(brightness)); + + previousMillis = millis(); + }; +} + void Pwm::Down(long speed ) { - // Riduce progressivamente la luminosita' usanndo millis() + // Riduce linearmente la luminosita' usanndo millis() // quindi senza bloccare il processore if (millis() != previousMillis) { @@ -174,12 +220,35 @@ void Pwm::Down(long speed ) { }; } +void Pwm::lDown(long speed ) { + // Riduce usanndo millis() con correzione della luminosita' + // quindi senza bloccare il processore + + if (millis() != previousMillis) { + brightness = 255 - 255.0 /(float)speed * millis() ; + analogWrite(ledPin, lum(brightness)); + + previousMillis = millis(); + }; +} + void Pwm::UD(long speed ) { // Aumenta e riduce in sequenza la luminosita' usanndo millis() brightness = 128 + 127 * cos(2 * PI / speed * millis()); analogWrite(ledPin, brightness); } +void Pwm::Set(byte brightness) { + // Imposta il valore del PWM + analogWrite(ledPin, brightness); +} + + +void Pwm::lSet(byte brightness) { + // Imposta il valore del PWM + analogWrite(ledPin, lum(brightness)); +} + ///////////////////////////////////// // Sequenza diff --git a/libraries/common/common.h b/libraries/common/common.h index f5a763c..25b84dd 100644 --- a/libraries/common/common.h +++ b/libraries/common/common.h @@ -43,9 +43,11 @@ class RGBLed { byte redValue ; byte greenValue ; byte blueValue ; + byte common ; public: RGBLed (byte pinR, byte pinG, byte pinB) ; + RGBLed (byte pinR, byte pinG, byte pinB, byte com) ; void SetColor (byte r, byte g, byte b) ; void Red (); void Green (); @@ -71,9 +73,12 @@ class Lampeggiatore { public: Lampeggiatore(int pin); void Invert(); // Inverte il lampeggio - void Blink(); // Lampeggia ogni 500ms + void Blink(); // Lampeggia ogni 500ms void Blink(long interval); // Lampeggia inpostando l'intervallo void Blink(long on, long down); // Imposta il tempo acceso e il tempo spento + void High(); // Accende il LED + void Low(); // Spegne il LED + void Swap(); // Inverte lo stato del LED }; @@ -89,14 +94,18 @@ class Pwm { int ledPin ; // il numero del LED pin int speed ; // velocita' del ciclo in ms unsigned long previousMillis ; //precedente cambio di stato - byte increment ; // aumenta brighteness nel loop UD + byte increment ; // aumenta brighteness nel loop UD // Constructor: come viene instanziato un oggetto facente parte della classe public: Pwm(int pin); // numero di pin, velocita' di ciclo void Up(long speed); + void lUp(long speed); void Down(long speed); + void lDown(long speed); void UD(long speed); + void Set(byte brighteness); + void lSet(byte brighteness); byte brightness ; // luminostia' iniziale }; diff --git a/libraries/common/examples/blink/blink.ino b/libraries/common/examples/blink/blink.ino index b3f9b2b..b796020 100644 --- a/libraries/common/examples/blink/blink.ino +++ b/libraries/common/examples/blink/blink.ino @@ -19,7 +19,10 @@ led.Invert() ; // Opzionale: inverte l'ordine del lampeggio da } void loop() { - led.Blink(); // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW) - led.Blink(500); // Lampeggia ogni 500ms - led.Blink(500,200); // Imposta il tempo acceso e il tempo spento + led.Blink(); // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW) +// led.Blink(500); // Lampeggia ogni 500ms +// led.Blink(500,200); // Imposta il tempo acceso e il tempo spento +// led.High(); // Stato su HI +// led.Low(); // Stato su LOW +// led.Swap(); // Inverte lo Stato } diff --git a/libraries/common/examples/pwm/pwm.ino b/libraries/common/examples/pwm/pwm.ino index 2880dda..deeb8ea 100644 --- a/libraries/common/examples/pwm/pwm.ino +++ b/libraries/common/examples/pwm/pwm.ino @@ -11,12 +11,17 @@ Pwm led = 9; 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. } void loop() { - led.Up(2000); // Aumenta la luminosita' in 2 sec - led.Down(1000); // Diminuisce la luminosita' in 1 sec - led.UD(4000); // Aumenta e poi diminuisce la luminostia' in 4 sec. + led.Up(2000); // Aumenta la luminosita' linearmente in 2 sec + //led.lUp(2000); // Aumenta la luminosita' con correzione luminosita' per LED + // led.Down(1000); // Diminuisce la luminosita' in 1 sec + // led.lDown(1000); // Diminuisce la luminosita' con correzione luminosita' + // led.UD(4000); // Aumenta e poi diminuisce la luminostia' in 4 sec (coseno) + // led.set(100); // Imposta il valore del PWM da 0-255 + // led.lSet(100); // Imposta il valore del PWM con correzione luminosita + // analogWrite(lum100); // Equivalente a sopra } diff --git a/libraries/common/examples/rgb/rgb.ino b/libraries/common/examples/rgb/rgb.ino index 98c980b..0dd3863 100644 --- a/libraries/common/examples/rgb/rgb.ino +++ b/libraries/common/examples/rgb/rgb.ino @@ -11,15 +11,13 @@ void setup() { } // Instanziamo un LED -RGBLed led(11, 10, 9); //Istanziamo un oggetto led facente parte - // della classe RGBLed +RGBLed led(11, 10,9); //Istanziamo un oggetto led (common catodo) +// facente parte della classe RGBLed +//RGBLed led(10,9,11,255); // Inizializzazione Common anodo, valori invertiti void loop() { - led.Red(); - delay(1000); - led.SetColor(255, 0, 255) ; // Mettiamo il LED in Green - delay(1000); - led.Off(); + led.White(); + } /* Colori disponibili: diff --git a/libraries/common/keywords.txt b/libraries/common/keywords.txt index 3bbb239..1ef357b 100644 --- a/libraries/common/keywords.txt +++ b/libraries/common/keywords.txt @@ -1,4 +1,4 @@ -RGBLed KEYWORD1 +RGBLed KEYWORD1 Red KEYWORD2 Green KEYWORD2 Blue KEYWORD2 @@ -9,3 +9,22 @@ Yellow KEYWORD2 Off KEYWORD2 SetColor KEYWORD2 brilla KEYWORD2 +Lampeggiatore KEYWORD1 +Invert KEYWORD2 +Blink KEYWORD2 +Blink KEYWORD2 +Blink KEYWORD2 +High KEYWORD2 +Low KEYWORD2 +Swap KEYWORD2 +Pwm KEYWORD1 +Up KEYWORD2 +lUp KEYWORD2 +Down KEYWORD2 +lDown KEYWORD2 +UD KEYWORD2 +Set KEYWORD2 +lSet KEYWORD2 +lum KEYWORD2 +Sequenza KEYWORD1 +Update KEYWORD2 diff --git a/pragmatica.rst b/pragmatica.rst index 096b2d7..5664066 100644 --- a/pragmatica.rst +++ b/pragmatica.rst @@ -40,6 +40,7 @@ Sequenziali * il minimo per un sequenziale e' 3 segmenti + * questi possono essere messi in serie a 3 canali RGB * I segmenti posso essere ripetuti * I segmenti posso essere messi in mirror (es. dal centro all'esterno per le ali) * si puo' variare il rapporto tra accesi / spenti @@ -92,3 +93,16 @@ Sensori * per rilevare lo stato della carica delle batterie bastano le entrate A. 5v di un Arduino * il throttle e' in genere l'unico che non prevede trim, per gli altri bisognerebbe compensare i trim con una autocalibrazione iniziale per fissare lo 0 + +Hardware +======== + +* SMD 2835: 40-60mAh, 25lm, ~1e/m + * consigliato per il rosso, 120' di diffusione, ottimo dissipatore +* SMD3528: 20mA, 6lm, 0.e/m + * Il bianco e' adeguato, 90' di diffusione, ottimo con alta densita' +* SMD 5050: triplo chip, adatto per RGB, molto calore. + +Links: + +* https://www.flexfireleds.com/pages/Comparison-between-3528-LEDs-and-5050-LEDs.html -- 2.39.2