Il tuo codice lo vedo molto critico dal punto di vista del segnale generato, cerco di spiegarti il perché:
Codice:
void setup(){
pinMode(throttleInput,INPUT);
auxServo.attach(auxOutput);
auxServo.write(0); //inizializzo il valore del canale aux su BASSO
} a mio giudizio manca un
Codice:
pinMode(auxOutput,OUTPUT);
quindi
Codice:
void setup(){
pinMode(throttleInput,INPUT);
pinMode(auxOutput,OUTPUT);
auxServo.attach(auxOutput);
auxServo.write(0); //inizializzo il valore del canale aux su BASSO
}
continuando....
il seguente codice:
Codice:
//Acquisisco il valore del throttle
throttleVal = pulseIn(throttleInput,HIGH,25000);
Aspetta fino a 25000 microsecondi (25 ms) in attesa di trovare un segnale valido, se non lo trova ritorna 0. Il problema è che ciò rende instabile la generazione del segnale successivo, ma soprattutto rende la generazione del fronte di salita dell'uscita dipendente dal segnale in ingresso.
ovvero il segnale di uscita non verrà generato fino a che, o l'impulso viene rilevato, o avviene un timeout.
Andiamo avanti con l'analisi degli orrori


:
Codice:
//controllo il valore del throttle
if(throttleVal <= 0){ //se il valore del throttle è andato a zero attivo il "failsafe" minore o uguale di 0 ??? La condizione < 0 non sarà mai vera.... al massimo == 0
comunque questo non inficia il funzionamento ma è solo un questione di pulizia del codice.
Tuttavia non confronterei mai con 0, stai aspettando un segnale che deve avere un ampiezza compresa fra 1000 e 2000us.... perché rischiare di prendere delle spurie da pochi uSec come segnale valido ?
Codice:
auxServo.write(179); //"invio" un segnale ALTO
delay(15);
} e invece nel caso il trhottle ci sia non viene generato segnale ??? (secondo me qui manca un else e c'è qualcosa di troppo, vedi in seguito)
Codice:
auxServo.write(179); //"invio" un segnale ALTO
} else {
auxServo.write(0); //"invio" un segnale BASSO
} comunque facciamo l'esempio che il segnale non ci sia e facciamo un analisi dei tempi...
pulseIn aspetta 25ms... ritorna 0..
auxServo.write() genera un impulso di 2ms
delay aspetta 15ms
in totale il tuo impulso viene generato ogni 42 ms...secondo me sono un po' troppi. forse allora togliendo il delay almeno lo avresti generato ogni 27ms e le cose andrebbero meglio.
Nel caso l'impulso sia presente con il tuo codice (tolto il delay e inserito l'else) invece avverrebbe la cosa seguente:
chiamiamo Ton il tempo in cui l'impulso di ingresso va alto:
Tduty la larghezza dell'impulso in ingresso
Ttot il periodo del ppm in ingresso (tipicamente 18ms)
servoin aspetta l'impulso T0=Ton
al tempo Ton+Tduty (variabile e dipendente dall'impulso in ingresso) auxServo.write() genera un impulso di larghezza 1000uSec e ritorna al ciclo successivo di pulseIn
A questo punto pulseIn aspetterà Ttot-1000usec-Tduty che si ripresenti l'impulso successivo.
essendo Tduty variabile è evidente che l'impulso generato da auxServo.write() avrà un jitter dipendente dalle variazioni dell'ingresso... E' vero che all'elettronica che legge l'impulso probabilmente non gliene frega nulla, ma è concettualmente sbagliato.
La generazione del PPM deve essere fatta in un interrupt che setta l'uscita, regola il timer per la chiamata successiva dopo i ms di ampiezza dell'impulso, la chiamata successiva resetta l'uscita e imposta il timeout dell'interrupt successivo a 22.5-(larghezza impulso) ms
(quello che correttamente viene fatto nella ISR(TIMER1_COMPA_vect) del codice da te postato.
nel tuo caso andrebbe fatto per un solo canale e non per tutti quelli dello stream PPM:
Spero di essere stato sufficientemente chiaro,
cordiali saluti