Schalterstellung 0: Schaltersignal wird duchgeschleift, Achse 1 wird durchgeschleift, das servo an 2 soll auf Mittelstellung
Schalterstellung 1: Schaltersignal durchschleifen, Achse 1 zum Flightcontroller soll ein durch die Arduino erzeugtes Mittelstellungssignal bekommen, Achse 2 wird nun über den Stick gesteuert
Wenn ich wieder auf 0 schalte, möchte ich, dass das Servo langsam in Mittelstellung zurück fährt, Achse 1 wird wieder durchgeschleift
Die RC geben ein PPM Signal aus ( einen Impuls von 1 bis 2 mS alle 20mS falls es keine Hubschraubersteuerung ist) .
Das mußt Du einlesen und Verarbeitenund wieder als PPM für die Servos ausgeben.
Hast Du versucht etwas selbst zu programmieren?
Grüße Uwe
chC == chFout; ecc
das doppel= ist ein Vergleich und man braucht es in den bedingungen wie IF ecc.
Zuweisungen sind mit Einfach=
also: chC = chFout;
Grüße Uwe
Da hab ich zumindest was die PPM Dekodierung angeht eine Bibliothek. Ausgänge wären dann ganz normale Servos?
Tut mir leid, aber weder aus deinem Programm, noch aus deiner Beschreibung werd ich richtig schlau.
Mal doch mal ein Bild?
void setup(){
pinMode(13,OUTPUT); // set pin 13 witch is no HW PWM pin as output
}
void loop(){
digitalWrite(13,HIGH); // set it to High
delayMicroseconds(1500); //wait for 1500us. this gives a PPM signal of 1500us (50% throttle or servo's middle position)
digitalWrite(13,LOW); // set it to LOW
delayMicroseconds(500); // let it stay 500us at low state to have a overall loop time of 2000us (500Hz)
}
servo1.writeMicroseconds(1500);
servo2.write(90); // set servo to mid-point (90°)
}
void loop() {}
Hab noch nie mit servo.h gearbeitet und mich bei meiner ganzen Suche immer nur auf PPM beschränkt
Macht servo.h denn genau die 50Hz, also in Mittelstellung 1,5ms High + 18,5ms low?
Nein bitte so nicht, da kriegste das Timing nicht hin, denn der Arduino muss ja auch noch andere Dinge machen.
Nimm dafür zumindest die interne Servo Bibliothek.
4 RC Kanälen auswerten kannst du bei meiner Lib nur mit dem Mega. Weil ich die direkten Intterrupts verwende.
Es gibt aber auch eine andere Lib, die den Pinchange Interrup einer Gruppe von Pins auswerten kann. Beispiel: Arduino Playground - ReadReceiver
Übrigens gibt dein Empfänger dir bereits ein Servokompatibles 50Hz Signal. Einfach auf einen nicht benutzen Kanal syncronisieren...
else if (ch3>950 && ch3<1050)
{
gas.writeMicroseconds(1500); //Gas
yaw.writeMicroseconds(1500); //Yaw
kanal5.writeMicroseconds(ch3); //Schalter durchschleifen
yawservo.writeMicroseconds(ch2); //Kanal Nick auf Servo
nick.writeMicroseconds(ch1); //Kanal Gas auf Brushless Nick
}
Das funktioniert ganz gut, wenn die Kanäle in der loop() auch genau in dieser Reihefolge kommen.
Wenn nicht, dann hast du ganz heftige Verzögerungen in deiner Loop.
Wenn z.B. der Enpfänger alle Servo-Signale zum gleichen Zeitpunkt sendet (das machen die neueren 2,4GHz System gerne)
dann wird dein Verarbeitungsteil nur mit alle 80ms mal aufgerufen.
Wenn die in der richtigen Reihenfolge kommen, dann alle 20ms.
Allerdings ist das jetzt sowieso noch egal, weil durch deine "Debugausgaben" eh das gesamte Timing hin ist...
Leider werden beim pulseIn auch die Aktualisierung der Servos mit eingerechnet, sodaß die Werte der pulsIn Funktion nicht genau sind. Da kommen schon mehr ein paar heftige Jitters mit rein. Faustregel, je mehr im Interruptbetrieb auf dem Controller los ist, umso ungenauer ist die pulsIn Funktion.
z.B. würde ich den Kanal5, der ja immer wie Kanal 3 ist, nicht über dne Arduino schleifen, sondern einfach per Y-Kabel belegen.
Dann hast du schon mal einen Servo weniger...
Das mit dem Y-Kabel ist eine gute Idee und einfach umzusetzen.
Wüsste jetzt nicht was ich noch verbessern könnte, mein Wissen zu Arduino und Programmierung ist leider begrenzt. Daher habe ich wahrscheinlich einiges nicht berücksichtigt.
Tipps nehme ich gerne entgegen