astrobeed:
Stefanoxjx:
Mi viene il dubbio e chiedo una conferma a voi che il radiocomando invii il segnale solo quando ci sono delle variazioni sui valori
(movimento stick) mentre quando non ci sono variazioni, non invia nulla o invia solo un segnale di conferma che secondo me
potrebbe essere un segnale alto che dura 22.1ms + una pausa di 0.4ms.
Il segnale viene trasmesso di continuo, il tremolio dei servi vuol dire che il tuo segnale non è stabile nel tempo, ovvero non vengono generate sequenze di impulsi perfettamente identiche a parità di condizioni.
Come generi il ppm e in base a cosa vari le durate dei singoli impulsi ?
Eccomi, scusate il ritardo nella risposta ma nel frattempo ho provato a vedere se ne capivo qualcosa di più e riuscivo a cavarmela da solo............. ovviamente non ci sono riuscito
Questo è lo sketch che genera il segnale PPM:
#define Durata 22000
#define Pausa 400
#define PPMPin 8
void setup()
{
Serial.begin(9600);
pinMode(PPMPin, OUTPUT);
}
void loop()
{
int ch[8] = {720, 1120, 1120, 1120, 1120, 1120, 1120, 1120};
long timeframe;
timeframe=0;
//1
digitalWrite(PPMPin, HIGH);
delayMicroseconds(ch[0]);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
timeframe=timeframe+ch[0]+Pausa;
//2
digitalWrite(PPMPin, HIGH);
delayMicroseconds(ch[1]);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
timeframe=timeframe+ch[1]+Pausa;
//3
digitalWrite(PPMPin, HIGH);
delayMicroseconds(ch[2]);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
timeframe=timeframe+ch[2]+Pausa;
//4
digitalWrite(PPMPin, HIGH);
delayMicroseconds(ch[3]);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
timeframe=timeframe+ch[3]+Pausa;
//5
digitalWrite(PPMPin, HIGH);
delayMicroseconds(ch[4]);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
timeframe=timeframe+ch[4]+Pausa;
//6
digitalWrite(PPMPin, HIGH);
delayMicroseconds(ch[5]);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
timeframe=timeframe+ch[5]+Pausa;
//7
digitalWrite(PPMPin, HIGH);
delayMicroseconds(ch[6]);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
timeframe=timeframe+ch[6]+Pausa;
//8
digitalWrite(PPMPin, HIGH);
delayMicroseconds(ch[7]);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
timeframe=timeframe+ch[7]+Pausa;
//Completa il frame 20ms
digitalWrite(PPMPin, HIGH);
delayMicroseconds(Durata -timeframe);
digitalWrite(PPMPin, LOW);
delayMicroseconds(Pausa);
}
Questo sketch genera un segnale PPM che dovrebbe lasciare tutti i servocomandi fermi nella posizione impostata.
Provando a commentare le righe inerenti a tutti i canali e lasciando solo quella del primo canale, con l'oscilloscopio ho effettivamente notato una cosa che
non riuscivo a vedere analizzando l'onda di tutti gli 8 canali.
Il segnale non è precisissimo, ha delle piccole oscillazioni che sono effettivamente quelle che generano il tremolio dei servocomandi.
Nel frattempo ho fatto qualche ricerca per capire se magari dipendesse dal fatto che la serie di istruzioni faceva perdere del tempo prezioso di elaborazione
ma non credo sia quello il problema.
Infatti ho provato a scrivere un piccolo sketch che genera un'onda quadra direttamente tramite il timer ma anche con questo vedo che la lettura non è sempre
uguale, ci sono delle piccole variazioni:
void setup()
{
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV (COM2A1) | _BV (COM2B1) |_BV (WGM21) | _BV (WGM20);
TCCR2B = _BV (CS22);
OCR2A = 200;
OCR2B = 100;
}
void loop()
{}
Quindi a questo punto la domanda è: qual'è il trucco per avere un segnale pulito e stabile?
Grazie dell'aiuto.
Ciao.