From b8a84f85fea878902ab2e9c7ac65525d7abafd24 Mon Sep 17 00:00:00 2001 From: Andrea Manni Date: Thu, 9 Feb 2017 18:21:13 +0100 Subject: [PATCH] Snippets per leggere i canali dei servo --- README.html | 401 ++++++++++++++++++ README => README.rst | 11 +- README.txt | 23 +- .../lettura_servo_ch_pulse.ino | 30 +- .../lettura_servo_ch_pulse.ino | 52 +++ .../lettura_servo_interrupt.ino | 43 ++ .../lettura_servo_interrupt_change.ino | 49 +++ .../lettura_servo_interrupt_doppio.ino | 70 +++ libraries/common/common.cpp | 8 +- 9 files changed, 656 insertions(+), 31 deletions(-) create mode 100644 README.html rename README => README.rst (84%) create mode 100644 esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse.ino create mode 100644 esempi/snippets/lettura_servo_interrupt/lettura_servo_interrupt.ino create mode 100644 esempi/snippets/lettura_servo_interrupt_change/lettura_servo_interrupt_change.ino create mode 100644 esempi/snippets/lettura_servo_interrupt_doppio/lettura_servo_interrupt_doppio.ino diff --git a/README.html b/README.html new file mode 100644 index 0000000..e1fe268 --- /dev/null +++ b/README.html @@ -0,0 +1,401 @@ + + + + + + +Luci per Aerei con Arduino + + + +
+

Luci per Aerei con Arduino

+ +

Sketches e librerie per la gestione delle luci di aeromodelli RC con +microcontroller compatibili con *arduino

+
+

Setup

+

Gli sketch utilizzano la libreria common presente nella cartella +libraries/common/: questa deve essere quindi inclusa tra le librerie +utilizzate. Un modo rapido per farlo e' settare nelle preferences dell'Arduino +IDE l'intero repo aerei_arduino come cartella degli sketchbook, oppure +copiare la cartella libraries/common dentro libraries dello sketchbook +attuale.

+
+
+

Aggiornamenti

+
+
Download tramite git:
+
git clone git://git.andreamanni.com/aerei
+
+

Per aggiornare all'ultima versione:

+
+cd ~/aerei
+git pull
+
+
+
Download manuale archivio:
+
http://git.andreamanni.com/web?p=aerei;a=snapshot;h=HEAD;sf=tgz
+
Browse on line:
+
http://aerei.piffa.net/repo/
+
Interfaccia git Web:
+
http://git.andreamanni.com/web?p=aerei
+
Discussioni:
+
https://forum.piffa.net/viewforum.php?f=4&sid=aef380599d890d6e7b9f92743fab9d7e
+
+
+
+ + diff --git a/README b/README.rst similarity index 84% rename from README rename to README.rst index 316820a..dcd8c23 100644 --- a/README +++ b/README.rst @@ -18,7 +18,7 @@ attuale. Aggiornamenti =============== -Download: +Download tramite git: git clone git://git.andreamanni.com/aerei Per aggiornare all'ultima versione:: @@ -26,11 +26,14 @@ Per aggiornare all'ultima versione:: cd ~/aerei git pull -Download manuale: +Download manuale archivio: http://git.andreamanni.com/web?p=aerei;a=snapshot;h=HEAD;sf=tgz -Interfaccia Web: - http://git.andreamanni.com/ +Browse on line: + http://aerei.piffa.net/repo/ + +Interfaccia git Web: + http://git.andreamanni.com/web?p=aerei Discussioni: https://forum.piffa.net/viewforum.php?f=4&sid=aef380599d890d6e7b9f92743fab9d7e diff --git a/README.txt b/README.txt index bdf6808..5451a4a 100644 --- a/README.txt +++ b/README.txt @@ -14,27 +14,30 @@ Setup Aggiornamenti - Download: + Download tramite git: git clone git://git.andreamanni.com/aerei Per aggiornare all'ultima versione: + cd ~/aerei + git pull - cd ~/aerei - git pull - - Download manuale: + Download manuale archivio: [1]http://git.andreamanni.com/web?p=aerei;a=snapshot;h=HEAD;sf=t gz - Interfaccia Web: - [2]http://git.andreamanni.com/ + Browse on line: + [2]http://aerei.piffa.net/repo/ + + Interfaccia git Web: + [3]http://git.andreamanni.com/web?p=aerei Discussioni: - [3]https://forum.piffa.net/viewforum.php?f=4&sid=aef380599d890d6 + [4]https://forum.piffa.net/viewforum.php?f=4&sid=aef380599d890d6 e7b9f92743fab9d7e References 1. http://git.andreamanni.com/web?p=aerei;a=snapshot;h=HEAD;sf=tgz - 2. http://git.andreamanni.com/ - 3. https://forum.piffa.net/viewforum.php?f=4&sid=aef380599d890d6e7b9f92743fab9d7e + 2. http://aerei.piffa.net/repo/ + 3. http://git.andreamanni.com/web?p=aerei + 4. https://forum.piffa.net/viewforum.php?f=4&sid=aef380599d890d6e7b9f92743fab9d7e diff --git a/esempi/snippets/lettura_servo_ch_pulse/lettura_servo_ch_pulse.ino b/esempi/snippets/lettura_servo_ch_pulse/lettura_servo_ch_pulse.ino index f138c84..ccd6c68 100644 --- a/esempi/snippets/lettura_servo_ch_pulse/lettura_servo_ch_pulse.ino +++ b/esempi/snippets/lettura_servo_ch_pulse/lettura_servo_ch_pulse.ino @@ -1,45 +1,49 @@ /* Lettura di un canale servo della RX - Lettura tramite la finzione pulsein + 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. + + Il segnale dalla rx dovrebbe essere ~50hz, + vedere questo sketch $_millis con lettura a intervalli programmabili. + */ #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 +// Variabili per autocalibrazione +int mid_point = 1500; + void setup() { // Funzione relativa a calibrazione: -// mid_point = calibraTrim(chPin) ; // + LED di servizio per monitor calibrazione + mid_point = calibraTrim(chPin) - 10; // Con pulse in si toglie 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; - } ; -// Lettura Aileron channel: FAKE con un potenziometro 10K -// chIn = analogRead(chPin); -// chValue = 1000 + 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.ino b/esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse.ino new file mode 100644 index 0000000..abee674 --- /dev/null +++ b/esempi/snippets/lettura_servo_ch_pulse_millis/lettura_servo_ch_pulse.ino @@ -0,0 +1,52 @@ + +/* 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_interrupt/lettura_servo_interrupt.ino b/esempi/snippets/lettura_servo_interrupt/lettura_servo_interrupt.ino new file mode 100644 index 0000000..91cd7c6 --- /dev/null +++ b/esempi/snippets/lettura_servo_interrupt/lettura_servo_interrupt.ino @@ -0,0 +1,43 @@ + +/* Lettura di un canale servo della RX + + Lettura tramite uno dei due external interrupt ala Arduino + Utilizzabile solo sui PIN 2-3 + +*/ + +#include + + +// Variabili per interrupt 0 +volatile unsigned int chValue = 1500; // Valore computato +volatile unsigned int chStart = 1500; // Inizio rilevamento + +// Variabili per autocalibrazione +const byte chPin = 2; // PIN per la calibrazione +int mid_point = 1500; + +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 +Serial.begin(9600); // Warning: interrupts e serial potrebbero dare problemi +} ; + +void loop() { + Serial.print(chValue); + Serial.print(" - base: "); + Serial.println(mid_point); + delay(200); +} + +// Functions +void chRise() { + attachInterrupt(0, chFall, FALLING); + chStart = micros(); +} + +void chFall() { + attachInterrupt(0, chRise, RISING); + chValue = micros() - chStart; +} diff --git a/esempi/snippets/lettura_servo_interrupt_change/lettura_servo_interrupt_change.ino b/esempi/snippets/lettura_servo_interrupt_change/lettura_servo_interrupt_change.ino new file mode 100644 index 0000000..478f034 --- /dev/null +++ b/esempi/snippets/lettura_servo_interrupt_change/lettura_servo_interrupt_change.ino @@ -0,0 +1,49 @@ + +/* Lettura di un canale servo della RX + + Lettura tramite i pin change interrupts + Utilizzabile su tutti i PINS + +- http://playground.arduino.cc/Main/PinChangeInterrupt + +*/ + +#include + + +// Variabili per interrupt 0 +unsigned int chValue = 1500; // Valore computato +unsigned int chStart = 1500; // Inizio rilevamento + +// Variabili per autocalibrazione +const byte chPin = 2; // PIN per la calibrazione +int mid_point = 1500; + +void setup() { + pinMode(13,OUTPUT); // LED + // Funzione relativa a calibrazione con pulsein: + mid_point = calibraTrim(chPin) ; // Calibrazione del TRIM attivo sul canale + pciSetup(10); +Serial.begin(9600); // Warning: interrupts e serial potrebbero dare problemi +} ; + +void loop() { + Serial.print(chValue); + Serial.print(" - "); + Serial.println(mid_point); + delay(200); +} + +// Functions +// Install Pin change interrupt for a pin, can be called multiple times +void pciSetup(byte pin) +{ + *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin + PCIFR |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt + PCICR |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group +} + +ISR (PCINT0_vect) // handle pin change interrupt for D8 to D13 here + { + digitalWrite(13,digitalRead(8) and digitalRead(9)); + } 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 new file mode 100644 index 0000000..db1922a --- /dev/null +++ b/esempi/snippets/lettura_servo_interrupt_doppio/lettura_servo_interrupt_doppio.ino @@ -0,0 +1,70 @@ + +/* Lettura di 2 canali servo della RX con interrupts + + Lettura tramite i due external interrupt ala Arduino + Utilizzabile solo sui PIN 2-3 + +*/ + +#include + + +// Variabili per interrupt 0 si PIN 2 +volatile unsigned int chValue2 = 1500; // Valore computato +volatile unsigned int chStart2 = 1500; // Inizio rilevamento + +// Variabili per interrupt 1 su PIN 3 +volatile unsigned int chValue3 = 1500; // Valore computato +volatile unsigned int chStart3 = 1500; // Inizio rilevamento + +// Variabili per autocalibrazione 0 +const byte chPin2 = 2; // PIN per la calibrazione +int mid_point2 = 1500; + +// Variabili per autocalibrazione 1 +const byte chPin3 = 3; // PIN per la calibrazione +int mid_point3 = 1500; + +void setup() { + // Funzione relativa a calibrazione con pulsein: + mid_point2 = calibraTrim(chPin2) ; // Calibrazione del TRIM attivo sul canale + 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 +} ; + +void loop() { + + Serial.print("PIN2: "); + Serial.print(chValue2); + Serial.print(" -base: "); + Serial.print(mid_point2); + + Serial.print(" |-| PIN3:"); + Serial.print(chValue3); + Serial.print(" -base: "); + Serial.println(mid_point3); + delay(200); +} + +// Functions +void chRise2() { + attachInterrupt(0, chFall2, FALLING); + chStart2 = micros(); +} + +void chFall2() { + attachInterrupt(0, chRise2, RISING); + chValue2 = micros() - chStart2; +} +// Seconod iterrupt +void chRise3() { + attachInterrupt(1, chFall3, FALLING); + chStart3 = micros(); +} + +void chFall3() { + attachInterrupt(1, chRise3, RISING); + chValue3 = micros() - chStart3; +} diff --git a/libraries/common/common.cpp b/libraries/common/common.cpp index de93b51..7f05627 100644 --- a/libraries/common/common.cpp +++ b/libraries/common/common.cpp @@ -401,7 +401,7 @@ int calibraTrim(int pin, const byte ledPin) { break; }; servoValue = pulseIn(pin, HIGH, 25000); - if (servoValue != 0 && servoValue > 1000 && servoValue <2000) { + if (servoValue != 0 && servoValue > 950 && servoValue <2000) { middle = middle + servoValue ; a++ ; #ifdef DEBUG @@ -410,15 +410,15 @@ int calibraTrim(int pin, const byte ledPin) { Serial.println(middle / a); #endif digitalWrite(ledPin, !digitalRead(ledPin)); - delay(100); + delay(50); } } #ifdef DEBUG Serial.print(">> Fine Calibrazione, media: "); - Serial.println(middle / 10); + Serial.println(middle / 10 + 10); Serial.flush() ; #endif - return(middle / 10) ; + return(middle / 10 + 10) ; // END calibrazione }; -- 2.39.2