Alte Graupner Varioprop Servos ohne Elektronik weiter nutzen
- Simulation einer Varioprop Schaltstufe durch Arduino -
Angeregt durch die softwaremäßige Realisierung von Impulsteilen durch einen Arduino wie zum Beispiel für alte Varioprop oder sogar die Tipp Tipp Anlagen Varioton. Nachdem ich eine alte Variophon 8S mit Arduino-Impulsteil und einem FrSky 2,4 GHz HF-Teil versorgt habe wollte ich die Absicht einen Weg zu finden, wie man die alten Bellamatic in eine schöne Retro-Lösung mit einbeziehen könnte. Also vorweg genommen, es funktioniert sowohl die Lösung für Varioton/Variophon-Anlagen als in abgeänderter Form natürlich für Varioprop-Anlagen Hier möchte ich die Lösung für Varioprop vorstellen. Also stellte ich ein paar Überlegungen an, wie man zunächst an die Empfängersignale kommt. Ich dachte am besten wäre wohl ein PPM-Signal. Dies würde sich durch mehrere Schaltstufen durchleiten lassen und jede Schaltstufe nimmt sich gemäß ihrer Nummer Kanal 1, 2 usw. einfach das richtige Signal raus. Zum Glück habe ich im Internet ein Programmstück für den Arduino gefunden, welches genau das ermöglicht. Eine PWM Lösung wäre auch nicht uninteressant aber wohl aufwendiger, wenn man mit mehreren Schaltstufen arbeiten möchte und letzten Endes müsste man zum durchleiten doch wieder ein Summensignal daraus erzeugen. Deswegen habe ich mich gleich für einen PPM-Empfänger entschieden. Der FrSky D4R-II kann bei richtigem jumpern am ersten Anschluß ein PPM-Signal für 8 Kanäle liefern. Ich habe auch Postings im Internet gefunden, die von einem Graupner C12, C17 und C19 PPM Signale abgreifen.
Siehe:
https://wiki.mikrokopter.de/c17
https://wiki.mikrokopter.de/c12
https://wiki.mikrokopter.de/c19
Hier der Link zu dem Programmstück:
https://www.hackster.io/abhilashpatel121/reading-rc-receiver-ppm-signal-using-arduino-c42929
Das Progrämmchen arbeitet folgendermaßen: Liegt am Pin 2 des Arduino eine fallende Flanke an, wird per Interrupt ein Unterprogramm aufgerufen. Es liefert im Array
ch[1], ch[2], ch[3], ch[4], ch[5], ch[6] 6 Signale für 6 Kanäle. Reicht also zum Beispiel für eine Varioprop 12. Die Werte muss man jetzt nur noch weiterverarbeiten.
Die alten Graupner Varioprop Servos ohne Elektronik werden mit einer Spannung von 2,4V betrieben. Eine Richtungsänderung wird durch Umpolung erreicht. Der von mir verwendete Arduino proMini arbeitet mit 16MHz und einer Arbeitsspannung von 5V. Das sind zuviel für die alten Servos. Also verwendete ich eine H-Brücke L298N DUAL FULL-BRIDGE DRIVER MULTIWATT15 ST für die Stromversorgung und die Umpolung.
L298N DUAL FULL-BRIDGE DRIVER MULTIWATT15 ST
Damit lässt sich das Servo mit einer externen 2,4V Quelle versorgen und die Laufrichtung ändern. Ein solcher Baustein kann so zwei Motoren steuern. Das Bauteil hier ist fast etwas zu groß um in ein leeres Schaltstufengehäuse eingebaut zu werden. Es gibt auch kleinere Lösungen mit anderen Bauteilen, diese können aber nur ein Servo schalten.
Bei der H-Bridge müsste man aus der Bohrung am Kühlkörper eine entsprechend große Nut reinsägen, die Pins links vollkommen nach innen biegen und einzeln gut isolieren. Dann könnte alles reinpassen. Übrigens der Arduino hier ist ein proMini. Die Schaltstufenplatine ist von einer Varioton, aber die Varioprop hat in etwa die gleichen Abmessungen.
Arduino | H_Bridge | Empfänger | Servo (Rundstecker) |
5V | | Plus | |
Pin 2 | | Signal | |
Pin 3 | Pin 6 (ENABLE A) | | |
Pin 4 in_1 | Pin 5 (INPUT 1) | | |
Pin 5 in_2 | Pin 7 (INPUT 2) | | |
5V | Pin 9 (Logic Supply Voltage Vss) | | |
A0 | | | Pin 5 (Abgriff Servopoti) |
| Pin 2 (OUTPUT 1) | | Pin 1 (+/- 2,4V) |
| Pin 3 (OUTPUT 2) | | Pin 3 (-/+ 2,4V) |
GND/Masse | Pin 8 (GND)
Pin 1*1) | | |
GND/Masse | | GND | |
GND/Masse | | | Pin 8 (Servopoti minus) |
5V | | | Pin 6 (Servopoti plus) |
| | | |
- Stimmt hier die Originalbeschreibung nicht? Laut Beschreibung wäre hier der Anschluss „Current Sensing A“. Erst als ich mich traute Masse anzulegen funktionierte es.
Servostecker-Belegung Varioprop Micro 05
Normalerweise würde man bei der H-Bridge an Pin 4 wohl die externe Stromversorgung von 2,4 V anschließen. Ich war aber mutig und habe probiert was die Servomotoren so vertragen. Dabei stellte ich fest, daß nur noch eine Spannung von 3V an den Output-Pins übrigblieb. Ein Blick in einen alten Graupnerkatalog bestätigte, daß die Servomotoren bis zu 3V vertragen.
Meine Versuchsanordnung
Programmcode
C-ähnlich:
unsigned long int a,b,c;
int x[15],ch1[15],ch[7],i;
//specifing arrays and variables to store values
const int in_1 = 4 ;
const int in_2 = 5 ;
const int intrpt = 2; // setze interrupt auf pin 2
const int schaltstufe = 2; // TAER 1=Throttle, 2=Aileron, 3=Elevator, 4=Rudder
const int pwmPin = 3 ; //initialisiere pin 3 als pwmPin
const int ServoPin = 0; // Analog In - Servo potentiometer
const int servoSpeed = 200 ; // Servomotorgeschwindigkeit, Maximum ist 255
int ServoPos = 1500 ; // Servoposition Mitte
int KnueppelPos = 1500 ;
float Diff = 0 ;
float Teiler = 1.5 ; // 1.5 hat sich als brauchbarer Wert herausgestellt.
void setup() { // Interruptroutine
pinMode(intrpt, INPUT_PULLUP);
pinMode(in_1, OUTPUT);
pinMode(in_2, OUTPUT);
pinMode(pwmPin,OUTPUT);
ch[schaltstufe] = 512; // Knüppel neutral
attachInterrupt(digitalPinToInterrupt(intrpt), read_me, FALLING);
// enabling interrupt at pin intrpt
}
void loop() {
read_rc();
// Diese Abfrage wird deswegen benötigt, da der erste Wert von ch[schaltstufe]
// = -1000 ist und auch zwischendurch Werte aus dem Rahmen fallen.
if (ch[schaltstufe] > 0 && ch[schaltstufe] < 1023){
ServoPos = map(analogRead(ServoPin), 0, 1023, 1000, 2000);
KnueppelPos = map(ch[schaltstufe], 0, 1023, 1000, 2000);
}
Diff = KnueppelPos - ServoPos;
// Servo in eine Richtung
if (Diff > 40){ // So 50, 60 sind hier gute Werte Je genauer die
// Knüppel arbeiten, desto geringer kann der Wert sein
// Servomotor in die gewünschte eine Richtung laufen lassen
digitalWrite(in_1,LOW) ;
digitalWrite(in_2,HIGH) ;
analogWrite(pwmPin,servoSpeed) ;
// Hier wird der Servoweg auf mehrere Schleifendurchläufe aufgeteilt,
// damit der Bremsweg des Motors nicht so lang ist. Teiler wurde auch
// durch Versuche ermittelt.
delay(Diff/Teiler);
//Servomotor zum Abbremsen umpolen
digitalWrite(in_1,HIGH) ;
digitalWrite(in_2,LOW) ;
analogWrite(pwmPin,servoSpeed) ;
delay(30); // Dieser Wert wurde durch Versuche ermittelt. Am besten
// wäre eine Funktion, die den Bremsweg berücksichtigt.
//Servomotor aus
digitalWrite(in_1,LOW) ;
digitalWrite(in_2,LOW) ;
analogWrite(pwmPin,servoSpeed) ;
}
// Servo in andere Richtung
if (Diff < -40){
// Servomotor in die gewünschte andere Richtung laufen lassen
digitalWrite(in_1,HIGH) ;
digitalWrite(in_2,LOW) ;
analogWrite(pwmPin,servoSpeed) ;
// Hier wird der Servoweg auf mehrere Schleifendurchläufe aufgeteilt,
// damit der Bremsweg des Motors nicht so lang ist. Teiler wurde auch
// durch Versuche ermittelt.
delay((abs(Diff/Teiler)));
//Servomotor zum Abbremsen umpolen
digitalWrite(in_1,LOW) ;
digitalWrite(in_2,HIGH) ;
analogWrite(pwmPin,servoSpeed) ;
delay(30); // Dieser Wert wurde durch Versuche ermittelt. Am besten
// wäre eine Funktion, die den Bremsweg berücksichtigt.
//Servomotor aus
digitalWrite(in_1,LOW) ;
digitalWrite(in_2,LOW) ;
analogWrite(pwmPin,servoSpeed) ;
}
} // loop
Hier kommt der Code der die PPM Signale beschafft rein. Er findet sich mit Hilfe des obigen Links. Man kann den Code fast 1:1 so verwenden, man muß nur die Variablendeklarationen nach oben ziehen, die Hauptschleife eliminieren und oben in die Hauptschleife integrieren.
void read_me() {
….
}
void read_rc(){
…
}
Probleme und Fazit:
Ein Problem war immer wieder das Nachlaufen des Motors beim Abschalten, was zur Folge hatte, daß das Servo nicht richtig neutralisierte. Erst als ich begann, die Pinbelegung des Servopotis heraus zu messen um so den genauen Rückweg anzusteuern und im Programm zu berücksichtigen besserte sich das Problem etwas. Statt der 30ms Abbremsung wäre eine Funktion wünschenswert, die dynamischer reagiert.
Da ich mich zu erinnern glaubte, daß es damals schon Servos gab, die nicht so genau neutralisierten schloß ich, dass die Ingenieure früher hardwaremäßig ein ähnliches Problem hatten, wie ich softwaremäßig.
Die Servobewegung wirkt vielleicht etwas wenig flüssig. Das liegt daran, dass die Bewegungen über mehrere Schleifendurchläufe erzielt werden. Vermutlich ist der Arduino für diese Aufgabe etwas zu schwach getaktet. Eine Funktion die genau den Bremsweg berechnen könnte wäre wünschenswert.
Als erstes habe ich mich nach der viel investierten Zeit gefreut, dass es im Prinzip funktioniert. Nicht ganz perfekt, aber immerhin ließe sich ein leichter Segler sicher damit steuern. Vielleicht kann ich den einen oder anderen anregen sich weitere Gedanken zu machen. Ich versuche nun –ein paar leere Schaltstufengehäuse oder wirklich kaputte Schaltstufen aufzutreiben (Funtionierende wären zu schade) und mit einer günstigen Schaumwaffel die auch noch zu beschaffen wäre erste Flugerfahrung zu sammeln.