Tütenflieger:
Die schlechte ist, daß es trotzdem weiterhin eine Menge Fehlermeldungen von RCReceiver gibt, auch wenn die Knüppel nur in der Neutralstellung verbleiben.
Wenn das Signal vom RC-Empfänger in Ordnung ist, aber Deine RCReceiver-Library die Impulse nicht korrekt auswerten kann, stimmt da etwas nicht. Entweder mit der RCReceiver-Library selbst oder mit dem Zusammenspiel des Codes in Deinem Sketch.
Ich persönlich würde allenfalls nur die Servo-Library verwenden und das Signal vom RC-Empfänger im Code in einer geeigneten Weise pollen. Und die RCReceiver-Library weglassen.
Ich kenne das genaue Timing-Diagramm der Kanäle nicht, aber bei 20ms Refresh-Rate und 1,5...2,5ms Impulsbreite würde ich mal raten, dass Innerhalb des 20ms Fensters je 3ms pro Kanal laufen, d.h. 4 Kanäle sind nach spätestens 12 ms abgefrühstückt.
Wenn Du jedes einzelne 20ms Zeitfenster pollst, hast Du also 50 mal pro Sekunde je 8ms für andere Aktionen Deines Programms zur Verfügung.
Wenn Du jedes zweite 20ms Zeitfenster pollst, hast Du nach dem Pollen des Signals jedesmal 28ms für andere Aktionen im Sketch. Bei jedem dritten Zeitfenster wären es 48ms für andere Aktionen.
Ich würde es mal ohne die RCReceiver-Library probieren, die loop-Funktion auf den Start des Refresh-Impulses von Kanal-1 synchronisieren, und die Servosignale einfach pollen. Geeignete Timeouts nicht vergessen, damit sich das Polling nicht totläuft, wenn der RC-Empfänger kein Signal liefern sollte.
Nachtrag:
Ich habe mal versucht, einen Sketch zu machen, der die Impulse von einem 4-Kanal RC-Empfänger ausliest.
Testen konnte ich ihn allerdings nicht, da ich hier keinen RC-Empfänger griffbereit habe. Eventuell sind also noch Änderungen notwendig. Damit Änderungen leicht möglich sind, ist der Code von mir kommentiert:
#define TIMEOUTSLICE 21000 // 21 Millisekunden als Zeitscheiben-Timeout
#define TIMEOUTCHANNEL 5000 // 5 Millisekunden als Timeout zwischen den Kanälen
#define TIMEOUTIMPULSE 3000 // 3 Millisekunden Impuls-Timeout
#define CHANNELS 4 // 4 Kanäle
int channelPins[CHANNELS]={2,3,4,5}; // define pin numbers for rc receiver channels
int impulseDuration[CHANNELS];
int readRcTiming(int* impulseTime)
/* Rückgabewert
0 ==> Impulslängen wurden erfolgreich gemessen und stehen im übergebenen int-Array
Negative Rückgabewerte stehen für Timeout
-1 ==> Kein Impuls auf erstem Kanal festgestellt
-2 ==> Keine Folgeimpulse auf weiteren Kanälen festgestellt
-3 ==> Impuls dauert zu lange
*/
{
unsigned long duration, timeout;
unsigned long now=micros();
while (digitalRead(channelPins[0])==HIGH && micros()-now<TIMEOUTIMPULSE) ; // nur warten
if (micros()-now>=TIMEOUTIMPULSE) return -3; // exit mit Timeout-Rückgabewert
now=micros();
for (int i=0;i<CHANNELS;i++)
{
if (i==0) timeout=TIMEOUTSLICE; else timeout=TIMEOUTCHANNEL;
while (digitalRead(channelPins[i])==LOW && micros()-now<timeout) ; // nur warten
if (micros()-now>=timeout)
{
if (timeout==TIMEOUTSLICE) return -1; // exit mit Timeout-Rückgabewert
else return -2; // exit mit Timeout-Rückgabewert
}
now=micros(); // Kanal geht HIGH, Beginn des Impulses
while (digitalRead(channelPins[i])==HIGH && micros()-now<TIMEOUTIMPULSE) ; // nur warten
duration=micros()-now;
if (duration>=TIMEOUTIMPULSE) return -3; // exit mit Timeout-Rückgabewert
impulseTime[i]=duration;
}
return 0; // ende ohne Timeout
}
void setup() {
Serial.begin(9600);
}
void loop() {
char charbuf[10];
int result=readRcTiming(impulseDuration);
if (result<0) Serial.println(result);
else
{
for(int i=0;i<CHANNELS;i++)
{
snprintf(charbuf,sizeof(charbuf),"%6d ",impulseDuration[i]);
Serial.print(charbuf);
}
Serial.println();
}
}