]> git.piffa.net Git - aerei/commitdiff
RGB ailerons prototipo: trasformare con millis
authoreaman <andrea@piffa.net>
Thu, 2 Feb 2017 18:26:48 +0000 (19:26 +0100)
committereaman <andrea@piffa.net>
Thu, 2 Feb 2017 18:26:48 +0000 (19:26 +0100)
aerei/zeta/zeta_prot/zeta_prot.ino
esempi/ailerons_state_rgb/ailerons_state_rgb.ino [new file with mode: 0644]

index 98194a0ecf31db6fe8db7901af267a47f61c52e1..1927f1b1532dd98edbc37d38292b497098db9f6f 100644 (file)
@@ -12,8 +12,10 @@ enum  { // Stati della FMS
 } state  ;
 
 // Due LED con lampeggio alternato:
-Lampeggiatore right = 3;
+Lampeggiatore right = 13;
 Pwm rpwm = 3;
+
+// Variabili
 const byte thrPin = A3;
 byte thr ;
 int thrIn ;
@@ -21,15 +23,21 @@ int thrIn ;
 
 
 void setup() {
// Serial.begin(9600);
+  Serial.begin(9600);
   pinMode(A3, INPUT);
   randomSeed(analogRead(0));
 }
 
 void loop() {
 
-  thrIn = analogRead(3);
-  thr = constrain(thrIn / 4 , 0, 255) ;
+  // Utilizzando un potenziometro
+  //  thrIn = analogRead(3);
+  //  thr = constrain(thrIn / 4 , 0, 255) ;
+
+  // Utilizzando una RX
+  thrIn = pulseIn(thrPin, HIGH, 25000);
+  // Hint: thrIn andrebbe calibrato son un Serial.write
+  thr = constrain(map(thrIn, 960, 2000, 0, 255), 0, 255);
 
   // FMS dispatcher
   if ( thr < 10 ) {
@@ -42,26 +50,32 @@ void loop() {
 
   switch (state) {
     case idle:
-     // digitalWrite(3,LOW);
-rpwm.Up(1000);
+      rpwm.UD(2000);
+      right.Blink();
       break;
 
     case normal:
       // Due LED con lampeggio alternato:
       right.Blink(1120 - 4 * thr );
+      rpwm.lSet(thr);
       break;
 
     case full:
       digitalWrite(3, HIGH);
-
+      rpwm.Set(0);
+      right.Swap();
+      delay(50);
+      rpwm.Set(255);
+      right.Swap();
+      delay(50);
       break;
   }
 
 
-//  Serial.print(thrIn);
-//  Serial.print("\t thr:");
-//  Serial.print(thr);
-//  Serial.print("\t state:");
-//  Serial.println(state);
-//  delay(200);
+  Serial.print(thrIn);
+  Serial.print("\t thr:");
+  Serial.print(thr);
+  Serial.print("\t state:");
+  Serial.println(state);
+  //  delay(200);
 }
diff --git a/esempi/ailerons_state_rgb/ailerons_state_rgb.ino b/esempi/ailerons_state_rgb/ailerons_state_rgb.ino
new file mode 100644 (file)
index 0000000..0c188ee
--- /dev/null
@@ -0,0 +1,108 @@
+/* Ailerons state machine
+
+Pilotare un LED RGB in base al canale degli alettoni:
+
+= 3 stati + 2 transizioni:
+- piatto
+- roll a sx
+- roll a dx
+
+Trasizioni per accentuare il cambio di assetto (ad esempio con dei blink
+e introdurre un po' di inerzia temporale per il cambio di stato
+
+*/
+
+#include <common.h>
+
+enum  { // Stati della FMS
+  middle,   // centrale
+  sxin,     // transizione a sx
+  sx,       // sx
+  dxin,     // transizione a dx
+  dx        // dx
+} ailstate  = middle;
+
+// Un LED RGB
+RGBLed ailerons(11,10,9);
+
+const byte ailPin = A4;
+int ail ; // Valore a 8bit per ailerons
+int ailIn ; // Valore rilevato del 4 Ch della RX 
+
+
+
+void setup() {
+/* Bisognerebbe introdurre una calibrazione per compensare i TRIM
+   ed eventualmente i dual rates.
+- attivarla se allo start un ale e' al massimo
+- fargli leggere i valori massimi 
+- salvarli in eprom
+- per i dual rates: si potrebbe intercettare valori oltre al max
+  e in base a questi traslare le soglie automaticamente
+
+Hint: leggere la soglia di rollio significativo in volo
+      e inserirla nei riferimenti.
+*/
+
+  Serial.begin(9600);
+}
+
+void loop() {
+
+ // Lettura Aileron channel: FAKE con un potenziometro
+ //ailIn = analogRead(3);
+ //ail = constrain(aliIn / 4 , 0, 255) ;
+
+ // Lettura ailerons channel
+ ailIn = pulseIn(ailPin, HIGH, 25000);
+ if (ailIn != 0) {ail = constrain(ailIn, 1000, 2000); } ;
+           // con un altra ricevente, fare una calibrazione nel caso.
+           // Middle = 1512
+
+
+ switch (ailstate) {
+     case middle:
+       // Alettoni piatti
+       if (ail > 1600) { ailstate = sxin; } ;
+       if (ail < 1400) { ailstate = dxin; } ;
+       ailerons.White();
+
+     break;
+
+   case sxin:
+   // Transizione a sx
+       ailerons.Off();
+       delay(1000);
+       ailstate = sx;
+     break;
+
+   case sx:
+   // dx
+       ailerons.Green();
+       if (ail < 1600) { ailstate = middle; } ;
+       if (ail < 1400) { ailstate = dxin; } ;
+     break;
+
+   case dxin:
+   // Transizione a dx
+       ailerons.Off();
+       delay(1000);
+       ailstate = dx;
+     break;
+
+   case dx:
+   // sx
+       ailerons.Blue();
+       if (ail > 1400) { ailstate = middle; } ;
+       if (ail > 1600) { ailstate = dxin; } ;
+     break;
+  }
+
+  Serial.print("ailIn: ");
+  Serial.print(ailIn);
+  Serial.print("\tail: ");
+  Serial.print(ail);
+  Serial.print("\t ailstate:");
+  Serial.println(ailstate);
+  //  delay(200);
+ }