La Wing Wing z84 (Zeta) di Andrea, il primo aereo usato per il volo notturno.

zeta

Della Zeta sono disponibili vari prototipi.

La particolarita’ di Zeta e’ che invece che usare un integrato ULN2803a per pilotare i LED buona parte delle striscie sono attivate da transistors incastonati nel telaio dell’aereo in prossimita’ delle strisce. Non e’ buon sistema ;)

La flessione delle ali, atterraggi e transporto rendono molto instabile i circuiti: molto piu’ semplice cablare tutto con l’integrato e fine (vedi https://lab.piffa.net/schemi/uln2_darlinghton_arduino_bb.png ).

Per un gruppo di transistors e’ stato fatto in piccolo circuito su una scheda preforata per metterne in array 4, questo sistema puo’ essere seguito se non si hanno a disposizione gli integrati darlighton. TODO: aggiungere foto

zeta-illuminata

/* Zeta

Versione con solo il throttle come input via pulseIn.

Aggiunta striscia RGB sotto.


*/

#include <common.h>
enum states_available { // Stati della FMS
  idle,    // Throttle a zero
  normal,  // Th normale
  full,    // Th massimo
};
states_available state  ;

// Due LED con lampeggio alternato:
Lampeggiatore right = 3; // Lampeggiatori superiori a lato fusoliera
Lampeggiatore left = 5;
const byte rtail = 6; // Luci del motore posteriore
const byte ltail = 9;
const byte thrPin = A3; 
byte pausa ;
byte thr ;
int thrIn ;

Pwm rwhite = 3; // PWM sui lampeggiatori
Pwm lwhite = 5; 
Pwm rtp = 6 ;   // PWM sulla coda
Pwm ltp = 9 ;

RGBLed rgb(7,8,4,255);

void setup() {
  left.Invert() ; // Parte da stato invertito rispetto al default
  pinMode(rtail, OUTPUT);
  pinMode(ltail, OUTPUT);
  pinMode(thrPin, INPUT);
  // Warning: serial breaks PWM
  // Serial.begin(9600);

  randomSeed(analogRead(0));
    // Test iniziale dei LED per verifica contatti:
  left.High();
  right.High();
  rgb.White();
  rtp.Set(255);
  ltp.Set(255);
  delay(4000);
}

void loop() {


  thrIn = pulseIn(thrPin, HIGH, 25000);
  thr = constrain(map(thrIn, 983, 2000, 0, 255), 0, 255) ;
  delay(10); // Se si abilita il serial debug
  // togliere il delay

  // FMS dispatcher
  if ( thr < 10 ) {
    state = idle ;
  } else if ( thr > 245 ) {
    state = full ;
  } else {
    state = normal ;
  }

  switch (state) {
    case idle:
    rgb.Green();
    
      rwhite.UD(2000);  // Utilizza il coseno
      lwhite.UD(2000);  // Bisognerebbe evitare di calcolarli 4 volte uguale
      ltp.shift = 500;
      ltp.lUp(1000);
      rtp.lUp(1000);
      break;

    case normal:
    rgb.Blue();
      // Due LED con lampeggio alternato:
      right.Blink(1120 - 4 * thr );
      left.Blink(1120 - 4 * thr );
      analogWrite(rtail, lum(thr));
      analogWrite(ltail, lum(thr));
      break;

    case full:
    rgb.Red();
      pausa = random(30, 125);
      // Due LED con lampeggio alternato:
      right.Blink(1120 - 4 * thr );
      digitalWrite(ltail, !digitalRead(ltail));
      digitalWrite(3, !digitalRead(3));
  

      left.Blink(1120 - 4 * thr );
      digitalWrite(rtail, !digitalRead(rtail));
      digitalWrite(5, !digitalRead(5));
      delay(pausa);
      break;
  }


  //  Serial.println(thrIn);
  //  Serial.print("\t thr:");
  //  Serial.print(thr);
  //  Serial.print("\t state:");
  //  Serial.println(state);

}