Forum: Mikrocontroller und Digitale Elektronik Servo Mischer für Zeppelin


von Manoel V. (ram-it)


Lesenswert?

Hallo zusammen,

bin mal wieder nächtelang durch diverse Shops, Foren und Co gesurft, hab 
aber leider nicht gefunden was ich bräuchte... :-(

Also es geht um folgendes: Ich bin zZ mit meinem Bruder und einem gutem 
Freund im Aufbau eines 9,50m Zeppelins bzw Blimp. Die einzelnen Kanäle 
sollen aber im Zepp direkt gemischt werden, weil es über die 
Fernsteuerung nur bedingt möglich ist...

Im prinzip ein Mikrocontroller der 5 Kanäle
(Gas, Höhenruder, Querruder, Seitenruder und Flugzustand)
verarbeiten, und dann 6 Kanäle
(Schwenkmotor Links + Rechts, Gas Links + Rechts und Rudder Links + 
Rechts) gemischt wieder ausgeben kann...

Als Beispiel:

Schalter Flugzustand is in "Schwebemodus" geschalten...
Schwenkmotoren drehen sich senkrecht nach oben. Wenn man jetzt Querruder 
steuert sollen sich die 2 Schwenkantriebe gegeneinander verdrehen - 
Zeppelin dreht sich am fleck... bei Höhenruder bewegen sich beide 
Schwenkantriebe in die gleiche richtung um vorwärts und rückwärts zu 
fliegen...

Ähnlich dann im Flugzustand "normal"... Motoren sind nach vorne 
gerichtet... dann müssen noch die "X-Förmigen" leitwerke mit beigemischt 
werden...

Ich bzw Wir wären für jede Hilfe dankbar!
Hoffe hier kann uns jemand helfen

Lg

von G. Stank (Gast)


Lesenswert?

Es gibt einen Haufen Mikrocontroller-Quellcode zum Thema RC, PPM, Servo. 
Sowohl Lesen als auch Schreiben. Bestimmt auch schon Mixer.. Schon 
gesucht?

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Hallo!

Manoel Vogl schrieb:
> Die einzelnen Kanäle
> sollen aber im Zepp direkt gemischt werden, weil es über die
> Fernsteuerung nur bedingt möglich ist...

Mit unserer Fernsteuerung iVol 2G16 sind auch senderseitig solche 
Mischer überhaupt kein Problem. Das ganze lässt sich am PC mit einer 
grafischen Oberfläche zusammenkonfigurieren:

http://www. baltic-seagull.de/

Mit freundlichen Grüßen
Andreas Schweigstill

von Servo (Gast)


Lesenswert?

Manoel Vogl schrieb:
> Ich bzw Wir wären für jede Hilfe dankbar!
> Hoffe hier kann uns jemand helfen

Wie lautet denn die Frage?

Wenn du 5 Kanäle verarbeiten willst, dann musst du eben einen beliebigen 
Mikrocontroller verwenden, der 10 freie Portpins hat. Fünf nimmst du als 
Eingänge und liest alle Werte ein, dann werden sie miteinander 
verrechnet und an 5 weiteren Pins wieder ausgegeben.
Mit zwei Kanälen habe ich das schon gemacht. Mit 20 Kanälen ist es 
genauso einfach.

von Manoel V. (ram-it)


Lesenswert?

Schonmal danke für die Antworten :-)

Wir fliegen mit Spektrum Anlagen (DX8) evtl zukünftig auch mit einer 
DX10...
Hab in meiner DX8 die Mischer schon geschrieben, funktioniert auch, aber 
der haken ist dass wir noch als Backup einen "autopiloten + 
lagestabilisierung" im Zepp haben werden der bei Empfangsverlust 
richtung Startpunkt zurückfliegt...

Dieser kann aber leider nicht mischen, somit muss der Mischer nach dem 
Autopiloten kommen :-S

Hab leider keine Programmierkentnisse ausser Logo und MPC :-(
Falls es jemanden gibt der uns da unter die Arme greifen würde...?
Ich denke man würde sich da schon irgendwie einigen können ;-)

von Fernsteuerer (Gast)


Lesenswert?

Servo schrieb:
> Wenn du 5 Kanäle verarbeiten willst, dann musst du eben einen beliebigen
> Mikrocontroller verwenden, der 10 freie Portpins hat.

Das ist etwas übertrieben. Du kannst genauso gut direkt das Summensignal 
der Fernsteuerung in einen Pin hineinfüttern, den µC die 5 Werte für die 
Pulsdauer bestimmen lassen und daraus Pulse für die 6 neuen Kanäle 
generieren - macht 7 Pins (4 weniger als Servo)

von Servo (Gast)


Lesenswert?

Aber nur wenn das Summensignal zur Verfügung steht.
Deiner Aussage folgend reichen ja schon 2 Pins: nämlich das 
ursprüngliche Summensignal einlesen, mischen und wieder als Summensignal 
ausgeben. Macht also (5 Pins weniger als Fernsteuerer)

von Manoel V. (ram-it)


Lesenswert?

Also kein Summensignal...
Wir fliegen mit einem AR9110 empfänger, der kann kein Summensignal 
ausgeben und der der Autopilot auch nicht :-S

Lg

von Manoel V. (ram-it)


Lesenswert?

Wie groß wäre für mich schätzungsweise der Aufwand das ganze selber zu 
schreiben bzw wieviel Ahnung müsste ich mir für dieses Projekt aneignen? 
Hab hald bis jetzt noch keinen Peil :-S

von STK500-Besitzer (Gast)


Lesenswert?

Manoel Vogl schrieb:
> Wie groß wäre für mich schätzungsweise der Aufwand das ganze selber zu
> schreiben bzw wieviel Ahnung müsste ich mir für dieses Projekt aneignen?
> Hab hald bis jetzt noch keinen Peil :-S

Im Unterforum "Codesammlung" hat schon jemand einen Code zum Einlesen 
von 4 Kanälen gepostet. Der Code bietet zwar noch Optimierungspotential, 
aber für den Anfang sollte er gehen. Er ist auch problemlos erweiterbar.
Die Ausgabe hat der liebe Mensch auch gleich realisiert.
Die Verarbeitung dazwischen sollte auch lösbar sein.

von Hannes L. (hannes)


Lesenswert?

Manoel Vogl schrieb:
> Wie groß wäre für mich schätzungsweise der Aufwand das ganze selber zu
> schreiben bzw wieviel Ahnung müsste ich mir für dieses Projekt aneignen?
> Hab hald bis jetzt noch keinen Peil :-S

Das kommt drauf an, wie gut Du "logisch denken" kannst. Nur mir 
erlernbarem Handwerk alleine ist es nicht getan, da gehört auch ein 
bissel Talent zu. Ich habe z.B. einige Bekannte und Freunde, die 
hochkarätige Elektroniker sind und so manches Ding wieder zum Laufen 
kriegen, bei dem ich aufgeben würde. Sie können aber einfach nicht 
programmieren, da fehlt das Talent. Ist wie Malen (mit Pinsel & Farbe, 
nicht mit Copy & Paste) oder Musizieren (mit Dur & Moll, nicht mit Play 
& Stop), das kann auch nicht jeder.

Aber geh' erstmal systematisch an die Sache heran...
Überprüfe erstmal, ob die vom Autopiloten generierten Servoimpulse exakt 
nacheinander kommen, so wie bei älteren RC-Anlagen (oder der Planet T5 / 
R6m von JP) aus dem Empfänger. Ist dies der Fall, so kannst Du Kanal 1, 
3 und 5 mit Dioden zu einer Leitung zusammenfassen und die Kanäle 2, 4 
und 6 zur zweiten Leitung. Beide Leitungen kommen an 2 Bits eines Ports 
mit PC-Interrupt (PinChange), wodurch bei jedem "Kanalwechsel" ein 
Interrupt ausgelöst wird, in dem man per Software ICP die Zeit des 
jeweiligen Impulses nehmen kann. Zeiten im unteren µs-Bereich sind 
ungültig, die Zeit länger als etwa 2,5 ms ist die Synchronpause. Somit 
kannst Du in einer State-Machine im PC-Interrupt alle Impulsbreiten 
einlesen und im RAM (Array) sammeln. Wird die Synchronpause erkannt, 
wird der Index des Arrayzugriffs (Kanalnummer) auf 0 gesetzt und ein 
Merker gesetzt, der der Mainloop sagt, dass ein neues Telegramm komplett 
empfangen wurde und das Mixen gestartet werden kann.

Bisher verbrauchte Ressourcen:
Mit 1 MHz durchlaufender Timer1
Pinchange-Interrupt mit 2 Pins
16-Bit-Subtraktion
Test auf Plausiblität und Synchronpause (Index auf 0, Merker setzen)
ein paar Bytes SRAM für das Array (2 Bytes pro Servoimpuls)
Array-Zugriffe (scheibend) mit Index
2 I/O-Pins eines PCI-tauglichen I/O-Ports

Läuft das, dann geht's weiter...
Ein zweites Array für die auszugebenden Impulse anlegen, wieder 2 Bytes 
je Kanal. Im OC1A-Interrupt (oder OC1B) eine State-Machine 
programmieren, die reihum die Ausgabe-Impulsbreiten aus dem zweiten 
Array holt und als Intervall zum nächsten OCR1x-Interrupt-Termin setzt. 
Aus einem dritten Array, in das man beim Initialisieren die Bitmuster 
der Output-Kanäle abgelegt hat, das Bitmuster holen und an den 
Ausgangsport der Kanalimpulse legen. Zur Synchronisation empfielt sich 
noch ein Merker, über den die Mainloop mitteilt, dass die neuen Werte 
berechnet und upgedatet sind, also dass die Impulserzeugung beginnen 
darf, ohne dass ihr ein Wert unter dem Hintern geändert wurde.

Dafür verbrauchte Ressourcen:
Ein Compare-Interrupt (z.B. OC1A-Int.) des 16-Bit-Timers
16-Bit-Addition,
Array-Zugriffe (lesend) mit Index und dessen Zählumfangsbegrenzung
Port-Zugriff (scheibend)

Die Mainloop wartet auf den Merker, der das neue Telegramm meldet. Ist 
er gesetzt, dann macht sie Folgendes:
Merker löschen
empfangene Impulsbreitenwerte aus Array in ein weiteres Array kopieren,
um mit den Kopien arbeiten zu können (erspart atomare Zugriffe)
Mixen der Signale, Schreiben der Ergebnisse in ein Hilfsarray
Kopieren der Ergebnisse aus dem Hilfsarray in das Ausgabe-Array
Setzen des Merkers, der die Impulsausgabe startet.
Sleep im Mode Idle (bis zum nächsten Interrupt)
wenn Merker nicht gesetzt, dann Sleep bis zum nächsten Int.

Dafür verbrauchte Ressourcen:
2 weitere Hilfsarrays
ein paar mathematische Operationen zum Mischen
Array-Zugriffe (2 x Kopieren, Lesen der Eingangsimpulsdauern, Schreiben 
der Ausgangsimpulsdauern)
Merker-Zugriffe

Mit 8 MHz Controllertakt und Timer-Vorteiler 1 zu 8 (1 MHz Timertakt) 
solltest Du das mit 1 µs Auflösung relativ jitterarm realisieren können.

Falls zum Mischen Subtraktionen reichen, genügt dazu ein Tiny2313. 
Werden Multiplikationen gebraucht, so empfiehlt sich der Einsatz eines 
Mega48, bei komplizierteren Mix-Berechnungen (mit viel Programmcode in 
einer Hochsprache) ein Mega88/168.

Fazit:
Es ist machbar, ob Du es umsetzen kannst und wie lange Du dazu brauchen 
wirst, kann ich leider nicht beurteilen.

...

von Manoel V. (ram-it)


Lesenswert?

WoW ;-) Danke für die ausführliche Beschreibung...!
Logisch denken kann ich schon irgendwie, aber ob es dafür reicht weiß 
ich nicht...
Hab öfters schon in diverse bücher und im Internet geschaut, bin aber 
noch nicht wirklich dahinter gestiegen... Im Prinzip von der denk bzw 
arbeitsweiße wie oben sehr schön beschrieben verstehe ichs schon ;-)

Allgemein war unser erster Grundgedanke, jemanden zu suchen der und das 
progi, etc machen würde... Aber selbigen erst zu finden is nicht 
wirklich einfach :-(
Jetzt muss ich ran bzw werd's versuchen ;-)
Im Januar - Februar sollte es dennoch funktionsfähig fertig sein :-P

von Kein Name (Gast)


Lesenswert?

Hallo Manoel,

den Aufwand solltest du nicht unterschätzen.

Wenn ein "normales" Programm einen Fehler hat, stürzt der Rechner halt 
ab. Nicht weiter schlimm.

Bei so einem Zeppelin dagegen, musst du das Programm von vorn herein 
zuverlässig und fehlerfrei anlegen. Dazu irgendeine Art von Simulation 
oder Test, bei dem ein Programmfehler keine größeren Schäden anrichtet.

Wahrscheinlich wirst du im Februar erst die nötigen Erfahrungen 
gesammelt haben. Dein Programm wegwerfen und nochmal mit einem 
verlässlichem Konzept neu anfangen.

von as sembler (Gast)


Lesenswert?

Hannes Lux schrieb:
> Falls zum Mischen Subtraktionen reichen, genügt dazu ein Tiny2313.
> Werden Multiplikationen gebraucht, so empfiehlt sich der Einsatz eines
> Mega48, bei komplizierteren Mix-Berechnungen (mit viel Programmcode in
> einer Hochsprache) ein Mega88/168.

Oder man beherrscht PIC oder AVR Assembler, dann genügt ein kleiner µC 
und simple Routinen und das Problem ist gelöst.
Die Antwort klingt ja wie eine Marsmission, aber nicht wie das einfache 
Einlesen von einigen Servopulsen, verrechnen und wieder ausgeben.
Einen Interrupt braucht man z.B. garnicht, weil die Mainloop der Reihe 
nach alle Eingänge einliest und nach der Berechnung der Mischung alle 
gleichzeitig oder einen nach dem anderen wieder ausgibt.


Man kann auch einen Lamborghini kaufen und ihn zum Einkaufen im 
Supermarkt hin und wieder zurückschieben. Dann werden halt einige seiner 
Ressourcen nicht benutzt -> Servos verarbeiten mit dem Mega168 per 
Hochsprache.

von Karl H. (kbuchegg)


Lesenswert?

as sembler schrieb:

> Die Antwort klingt ja wie eine Marsmission, aber nicht wie das einfache
> Einlesen von einigen Servopulsen, verrechnen und wieder ausgeben.
> Einen Interrupt braucht man z.B. garnicht, weil die Mainloop der Reihe
> nach alle Eingänge einliest und nach der Berechnung der Mischung alle
> gleichzeitig oder einen nach dem anderen wieder ausgibt.

das zb ist keine gute Lösung, auch wenn ich dir im Prinzip beim Rest 
recht gebe.

PS: 2 Signale A + B mit einem Parameter t (0 bis 1) zu mischen bedeutet

     Ergebnis = t*A + (1-t)*B

t kann man in den Zahlenbereich 0 bis 255 skalieren, das ist kein Thema. 
Aber um 2 Multiplikationen kommt man nicht herum, zumal t (das 
Mischungsverhältnis) variabel einstellbar sein muss. Aber auch das ist 
doch kein Problem: überlässt man das Erzeugen der Servoimpulse einem 
Timer, dann macht der das mehr oder weniger eigenständig im Hintergrund. 
Und eine Updaterate von 50Hz kriegt man auch mit 
Softwaremultiplikationen leicht hin. Einzig zum bestimmen der 
Impulslängen an den Eingängen wären Pin Change Interrupts schön. Da wird 
es aufwändiger, wenn man die Flankendetektion selbst machen muss ohne 
den µC volle 100% auf diese Detektion anzusetzen.

von Kein Name (Gast)


Lesenswert?

Da gebe ich Karl Heinz vollkommen recht.

Eine kleine Anmerkung. Die Ausgangsimpulse müssen immer gleich lang 
sein. Dürfen keinen Jitter haben. Sonst summen die Servos die ganze Zeit 
hin und her. Verbrauchen unnötig Strom. Nach 1/4 Stunde ist der Akku 
leer.

Bekommt man am einfachsten mit einem Timer hin. Na gut, nicht ganz so 
einfach. Man muss den Timer in der Interruptroutine umprogrammieren.

Ähnliches an den Eingängen. Liefert der Sender gleich lange Impulse, so 
sollen auch gleiche Werte gemessen werden. Bekommt man wohl am 
einfachsten mit einem Timer im Capture Modus hin.

Und noch ein Punkt: Eingabe- und Ausgabe-Timer wirst du wahrscheinlich 
niemals umbauen. Aber kann sein, dass du nach den ersten Probeflügen die 
Signale anders mischen willst. Da ist es recht praktisch, wenn die 
zeitkritische Ein- Ausgabe von der Berechnung komplett getrennt ist.

Grüße und viel Erfolg. Stellst du ein Foto in diesen Thread sobald der 
Zeppelin fliegt?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.