Il Grumman F4F Wildcat di Daniele: in questo aereo il comportamento delle luci e’ e determinato dai canali throttle e alettoni, decodificati dal segnale PWM della ricevente tramite interrupts. Le luci vengono accese / spente tramite un interruttore della radio.
In contemporanea con l’attacco a pearl harbour , i giapponesi eseguono altre
6 azioni offensive,
tra le quali l’assalto , respinto in prima battuta , a Wake Island :
distruggono di sorpresa al suolo 8 wildcat, ma i 4 sopravvissuti combattono
accanitamente
contro la flotta di invasione e, in configurazione di emergenza come
cacciabombardieri, affondandano ben due navi da guerra avversarie
incassando una quantità di colpi impressionante da parte della contraerea e
degli zero, allora armati con mitragliatrici leggere da 7,7 i cui colpi
rimbalzavano sulla corazzatura del Wildcat.
Codice
Nella configurazione attuale il Throttle influenza i due led laterali tramite un ciclo if, i due LED agli estremi delle ali lampeggiano piu’ o meno rapidamente a seconda che l’aereo stia rollando a dx o sx.
/* Aereo di Daniele
FSM: il throttle e' a posto
Prototipo: F8 Bearcat
Output:
2 LED PWM ai lati con lampeggio alternato
2 LED PWM alle estremita ali
Input:
2 interrupts per th e alettone
PIN 2: alettone
PIN 3: throttle
PIN A1: interruttore On/ Off
NOTE : aggiunta libreria aero per gestione interruttore ,
da testare .
TODO
* testare
* Vedere la calibrazione automatica
* Min e max a 1000 - 2000 per alettone
* /
#include <common.h>
#include <aero.h>
# define dEBUG
/ / Instanziamo un LED fuori dal loop
Lampeggiatore left = 6 ;
Lampeggiatore right = 9 ;
Lampeggiatore codasx = 5 ;
Lampeggiatore codadx = 10 ;
Pwm pleft = 6 ;
Pwm pright = 9 ;
Pwm pcodasx = 5 ;
Pwm pcodadx = 10 ;
// 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
const byte chPin = A1 ; // PIN interruttore generale
// Variabili per autocalibrazione 0
const byte chPin2 = 2 ; // PIN per la calibrazione alettone
int mid_point2 = 1500 ;
// Variabili per autocalibrazione 1
const byte chPin3 = 3 ; // PIN per la calibrazione
int mid_point3 = 1000 ;
// Variabili
int caso ;
int thrBit ;
void setup () {
// I PINs vengono impostati dal constructor al momento
// della dichiarazione dell 'ogetto.
right.Invert();
codadx.Invert();
// HI -> LOW --> LOW -> HI
// per avere 2 LED che lampeggiano alternativamente
// 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
#ifdef dEBUG
Serial.begin(9600);
#endif
}
void loop() {
if (toggleRead(A0)) { // Interruttore generale
// Gestione throttle
if (chValue3 < 1050) {
// IDLE
//pleft.Up(1000);
//pright.Up(1000);
pcodasx.UD(2000);
pcodadx.UD(2000);
pleft.lUp(1000);
pright.lDown(1000);
}
else if (chValue3 > 1900) {
// Throttle al massimo: LED laterali lampeggiano a caso,
// Sotto luminosita' a caso
caso = random ( 30 , 250 ) ;
pleft . Set ( caso );
pright . Set ( caso );
pcodasx . Set ( caso );
pcodadx . Set ( caso );
delay ( caso );
}
else {
// Throttle medio
thrBit = map ( chValue3 , 1050 , 1900 , 0 , 255 );
codasx . Blink ( 1220 - 4 * thrBit );
codadx . Blink ( 1220 - 4 * thrBit );
left . Blink ( map ( chValue2 , 1000 , 2000 , 200 , 800 ));
right . Blink ( map ( chValue2 , 1000 , 2000 , 800 , 200 ));
}
#ifdef DEBUG
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 );
#endif
} else { // Interruttore off
pleft . Set ( 0 );
pright . Set ( 0 );
pcodasx . Set ( 0 );
pcodadx . Set ( 0 );
}
}
// 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 ;
}
Please enable JavaScript to view the comments powered by Disqus.