Wer nicht weiss, worum es geht, aber trotzdem interessiert ist, kann mal hier nachlesen:
http://wiki.rc-network.de/PPM
http://www.mftech.de/ppm.htm
Eines der wichtigsten Dinge an meinem "HELUINO" (fiel mir grad so ein ) ist ja u.a. auch das Einlesen des PPM-Steuersignal von meiner Fernbedienung (ne alte Robbe FX-18), weil ich die sehr handlich finde und ich mechanische Dinge nicht neu basteln muss.
Einen interessanten Artikel mit Source dazu hatte ich neulich hier gefunden:
.... allerdings funktioniert das bei mir hinten und vorne nicht - also "eben mal schnell" was eigenes gebastelt.
PPM-Signal aus der "Lehrer-Buchse" am Sender zur Anpassung und Invertierung über einen Transistor an Pin 2 für INT0
Das sieht dann im Sketch elementar so aus:
#define NUM_OF_CHL 8 // we are working with an 8-ch-Transmitter
#define NUM_OF_AVG 3 // 3 added values for average
volatile int valuesInt[9] = {0};
volatile int valuesUse[9] = {0};
volatile byte counter = NUM_OF_CHL;
volatile byte average = NUM_OF_AVG;
volatile boolean ready = false;
volatile long timelast;
long timelastloop;
void EvalPPM()
{
long timenew = micros();
long timediff = timenew - timelast;
timelast = timenew;
if (timediff > 2500) // this must be the gap between set of pulses to synchronize
{ valuesInt[8] = valuesInt[8] + timediff;
counter = 0;
if (average == NUM_OF_AVG)
{ for (int i = 0; i < NUM_OF_CHL + 1; i++)
{ valuesUse[i] = (valuesInt[i] + 0.5) / average;
valuesInt[i] = 0;
}
average = 0;
ready = true;
}
average++;
}
else
{ if (counter < NUM_OF_CHL)
{ valuesInt[counter] = valuesInt[counter] + timediff;
counter++;
}
}
}
void setup()
{ Serial.begin(115200);
Serial.println(F("Start reading PPM-Signal from Remote-Control"));
pinMode(2, INPUT_PULLUP);
attachInterrupt(0, EvalPPM, RISING);
timelast = micros();
timelastloop = timelast;
}
void loop()
{ if (ready)
{ long timenew = micros();
Serial.print(timenew - timelastloop); Serial.print(" | ");
for (int i = 0; i < NUM_OF_CHL + 1; i++)
{ Serial.print(valuesUse[i]);
if (i < 8) Serial.print(" - ");
}
Serial.println();
ready = false;
timelastloop = timenew;
}
}
Im Monitor kommt dann folgendes dabei raus:
Start reading PPM-Signal from Remote-Control
16784 | 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 3742
67472 | 1401 - 1402 - 1521 - 1408 - 952 - 1522 - 1520 - 1517 - -10617
67424 | 1402 - 1401 - 1522 - 1408 - 952 - 1521 - 1520 - 1518 - -10617
67424 | 1401 - 1402 - 1522 - 1406 - 952 - 1522 - 1520 - 1517 - -10617
67428 | 1402 - 1401 - 1522 - 1408 - 952 - 1522 - 1518 - 1518 - -10617
67416 | 1401 - 1402 - 1522 - 1406 - 952 - 1522 - 1520 - 1517 - -10617
67428 | 1402 - 1401 - 1522 - 1408 - 952 - 1522 - 1518 - 1518 - -10617
67408 | 1401 - 1404 - 1520 - 1408 - 952 - 1524 - 1518 - 1517 - -10617
67428 | 1402 - 1401 - 1524 - 1406 - 952 - 1521 - 1520 - 1518 - -10617
67416 | 1401 - 1402 - 1522 - 1406 - 952 - 1524 - 1518 - 1517 - -10617
67428 | 1402 - 1401 - 1522 - 1408 - 952 - 1525 - 1516 - 1518 - -10617
67424 | 1401 - 1402 - 1525 - 1404 - 952 - 1524 - 1518 - 1517 - -10617
67424 | 1402 - 1401 - 1524 - 1406 - 952 - 1524 - 1517 - 1518 - -10617
67412 | 1401 - 1402 - 1521 - 1408 - 952 - 1524 - 1518 - 1517 - -10617
67424 | 1402 - 1401 - 1522 - 1408 - 952 - 1524 - 1517 - 1518 - -10617
67424 | 1401 - 1402 - 1521 - 1408 - 952 - 1524 - 1518 - 1517 - -10617
67424 | 1402 - 1401 - 1522 - 1408 - 952 - 1525 - 1516 - 1518 - -10617
67428 | 1401 - 1402 - 1522 - 1406 - 952 - 1524 - 1518 - 1517 - -10617
67416 | 1402 - 1401 - 1522 - 1408 - 952 - 1524 - 1517 - 1518 - -10617
67420 | 1401 - 1402 - 1522 - 1406 - 952 - 1524 - 1518 - 1517 - -10617
67416 | 1402 - 1401 - 1522 - 1409 - 950 - 1524 - 1517 - 1518 - -10617
67428 | 1401 - 1402 - 1522 - 1406 - 952 - 1524 - 1518 - 1517 - -10617
67424 | 1402 - 1401 - 1522 - 1408 - 952 - 1524 - 1517 - 1518 - -10617
67424 | 1401 - 1402 - 1522 - 1406 - 953 - 1525 - 1516 - 1517 - -10617
67428 | 1402 - 1401 - 1522 - 1408 - 952 - 1524 - 1517 - 1518 - -10617
67412 | 1401 - 1402 - 1521 - 1408 - 952 - 1524 - 1518 - 1517 - -10617
67420 | 1402 - 1401 - 1524 - 1408 - 950 - 1524 - 1517 - 1518 - -10617
67424 | 1401 - 1402 - 1521 - 1408 - 953 - 1522 - 1518 - 1517 - -10617
67424 | 1402 - 1401 - 1522 - 1408 - 952 - 1524 - 1517 - 1518 - -10617
67428 | 1401 - 1402 - 1522 - 1406 - 952 - 1524 - 1518 - 1517 - -10617
67416 | 1402 - 1402 - 1521 - 1408 - 953 - 1522 - 1517 - 1518 - -10617
67428 | 1401 - 1402 - 1522 - 1406 - 952 - 1524 - 1518 - 1517 - -10617
67408 | 1402 - 1401 - 1522 - 1408 - 952 - 1524 - 1517 - 1518 - -10617
usw.
Als erstes die Zeit zwischen den zwischen den "ready's", dann die Werte für die 8 Kanäle und zum Schluss die Dauer des Sync-Impulses.
Zusammengerechnet etwa 22ms je Sequenz und 3x gesampelt eben halt die 67ms für jeden Aufruf in der Loop.
So weit, so gut. Einfacher & funktioneller als beim code vom o.g. rcarduino.blogspot.
Nur wer mal genau hinsieht:
Ich habe beim messen nichts bedient - die Werte "zappeln" ein wenig trotz 3-fach-Sampling.
Wenn ich NUM_OF_AVG auf 5 setze, wird das zwar besser, aber die Wiederholzeit in der Loop ist dann mit ca. 110ms doch schon etwas lang.
Sprich: Die Reaktion Live am Modell könnte dann ein wenig zu träge sein ....
Meine (eigentlich sichere) Vermutung geht dahin, dass es an der min. Auflösung von micros() mit 4µs liegt.
"Dann lies doch die Timerregister" wird wahrscheinlich kommen (und so hatten die sich das bei rcarduino wohl auch gedacht).
... wie ? Dafür bin ich leider immer noch zu viel Dummy ....
Wer kann helfen oder hat noch ne andere Idee ?