Home

Bauanleitungen

Links

Gästebuch

Gästebuch

News

Projekte

Impressum

(Funk-) Fernsteuerung

Inhalt

1. Vorwort

2. Funktionsprinzip von Fernsteuerungen

3. Funktionsprinzip der digitalen Fernsteuerung

4. Das Übertragungsprotokoll

5. Eckdaten

6. Software - Sender

7. Software - Empfänger

8. Nachbau

 

Fernsteuerung

Wer kennt sie nicht, die Funkfernbedienung von fischertechnik. Damals nicht oft gekauft und heute heißbegehrt. Die heute zum Verkauf stehende IR-Fernbedienung hat zwar auch ihren Reiz, aber die Möglichkeiten sind dennoch begrenzt. Da ich von Haus aus ein notorischer Bastler bin und mit rein gar nichts zufrieden, dachte ich mir, daß mal wieder eine Funkfernsteuerung her muß. Da es für einen Privatmann allerdings kaum möglich ist, eine allgemeine Betriebserlaubnis für Funksender zu bekommen (und wir wollen ja auch keinen Ärger haben mit den Nachbarn, die ausgerechnet dann Probleme mit dem Radioempfang bekommen, wenn wir mit einem ft-Modell "spielen"), fiel die Entscheidung auf fertige Komponenten, die das 433MHz-Band nutzen. Einziger Nachteil: Die Reichweite dürfte nicht mehr als 100 m betragen, das ist nicht viel, aber immer noch besser als Infrarot....

Doch warum sich so etwas selber bauen, wenn es doch gebraucht professionelle Funkfernsteuerungen schon ab EUR 25,- gibt?

Hauptgrund war für mich, daß man niemals genügend Kanäle zur Verfügung hat, um Sonderfunktionen zu steuern. Außerdem braucht man noch zusätzliches Material, um ein Modell per Fernsteuerung zu bewegen: Neben den Servos, die zumeist schon beiliegen, braucht man für jeden Fahrmotor einen Fahrtregler, wobei der nochmals mit ca. 25 Euro zu buche schlagen kann.

Weiteres Manko von "normalen" Funkfernsteuerungen: Ein Sender kann nur einen Empfänger ansprechen (gemeint ist: Nur auf einer Frequenz senden). Meines Wissens gibt es auf dem Markt keine Funkfernsteuerung, die mehrere Empfänger (auf unterschiedlichen Frequenzen) ansprechen kann - zumindest nicht die Fernsteuerungen, die für 25 Euro zu haben sind.... (Inzwischen hat sich die Lage durch PLL-Sender geändert, allerdings sind diese Sender auch nicht in der 25 Euro-Preisklasse zu haben...).

Ein wichtiger Aspekt ist natürlich auch der Preis, zu dem diese Fernsteuerung zu haben ist. Dieser ist weitestgehend abhängig von den verwendeten Funk-Modulen (oder Kabel / Infrarot). Die verwendeten Prozessoren an sich kosten pro Stück ca. € 7,50 (wobei die Preise ständig fallen), die sonstigen Teile drumherum sind mit ca. € 7-10 schon hoch angesetzt. Funkmodule gibt es schon ab € 15,- (Sender incl.Empfänger).

Funktionsprinzip von Fernsteuerungen

 

Mit Fernsteuerungen werden analoge und digitale Stellgrößen von einem Sender zu einem Empfänger übertragen, wobei es im Normalfall keine Rückmeldung des Empfängers zum Senders gibt.

 

Was sind "analoge und digitale Stellgrößen"?

 

Analoge Stellgrößen sind (fast) stufenlose vorgaben von Drehwinkeln oder Strecken. Das hört sich jetzt kompliziert an, es ist nichts anderes als die Steuerung eines sog.  Servos, ein im Modellbau üblicher Stellmotor. Wenn man ein Modellauto lenkt, braucht man i.a. mehrere Stellungen der Vorderräder, um exakt lenken zu können. Am Sender habe ich einen Sensor, der einen Drehwinkel erfaßt (Steuerknüppel oder Lenkrad), und dieser Drehwinkel wird zum Empfänger gesendet. Dort wird der Servo vom eingebauten Motor so lange verdreht, bis die Winkelvorgabe des Senders mit dem Winkel des Servos übereinstimmt.

Die Erfassung der Drehwinkel geschieht mit recht trivialen Methoden: Man nimmt einfach ein Potentiometer (= veränderlicher Widerstand). Einen solchen Analogen Kanal benötigt man auch, falls man das Fahrzeug mit unterschiedlichen Geschwindigkeiten fahren möchte.

 

 

Digitale Stellgrößen haben, wie in der Computertechnik auch, nur zwei Zustände: An oder Aus. Dies kann man benutzen, um beispielsweise Lichter oder auch Motoren ein- und auszuschalten.

 

In einem Handelsüblichen Funksender geschieht die gesamte Übertragung analog, d.h. Stufenlos. Die Steuersignale werden mit Pulsweitenmodulation, die auf eine Trägerfrequenz aufmoduliert ist, übertragen. Aber dieses Thema möchte ich jetzt hier nicht weiter vertiefen. Zwar gibt es auch digitale Funksteueranlagen, diese sind jedoch momentan eher die Ausnahme und relativ teuer.

 

Das Funktionsprinzip der digitalen Fernsteuerung

 

Die hier vorliegende digitale Fernsteuerung macht einen kleinen "Umweg", der uns allerdings einige Vorteile bringt. Die Eingangssignale (analog/digital) werden alle zu einem digitalen Datenpaket zusammengefaßt und dann vom Sender zum Empfänger seriell übertragen. Die serielle Übertragung entspricht dabei fast der, die wir vom seriellen Port des Computers her kennen.

Die Vorteile hierbei: Durch die Möglichkeit, Prüfsummen zu berechnen, kann die Datenübertragung sicherer gemacht werden. Falsche Übertragungen können zuverlässig herausgefiltert werden. Außerdem besteht die Möglichkeit der Adressierung: Durch das Senden einer Adresse können bestimmte Empfänger angesprochen werden. Dies ist Vorteilhaft bei mehreren Modellen. Beispiel: EinTieflader mit einem Bulldozer - beide Modelle können getrennt voneinander mit dem gleichen Sender gesteuert werden. In diesem Projekt sind 16 Adressen vorgesehen, so daß ebenso viele Modell mit dem gleichen Sender gesteuert werden können.

 

Das Übertragungsprotokoll

In den ersten Versionen habe ich noch eine relativ teure FM-Übertragung verwendet (FM= Frequenzmodulation). Diese Übertragungsweise hat den Vorteil sehr großer Störsicherheit und Übertragungsrate, allerdings kosten Sender- und Empfängermodul zusammen schon mehr als 85 Euro. Ich habe einen Hersteller von AM-Modulen (AM=Amplitudenmodulation) gefunden, der die Module für ca. 15 Euro liefern kann (Sender+Empfänger), und sogar bei Conrad-Elektronik gibt es für diesen Preis ein Sender + Empfänger -Paket, das einigermaßen Funktioniert. Für einen weiteren Ausbau ist es aber besser, wenn man Empfänger-Module einzeln nachkaufen kann, sonst hat man irgendwann massenweise Sender herumliegen, die man nicht mehr braucht.

Nachteil der AM-Übertragung: Man muß die Daten so aufbereiten, daß der Empfänger sie richtig auswerten kann. Dazu ist eine sogenannte Manchester-Codierung notwendig. Ich habe allerdings keine "echte" Manchester-Codierung verwendet, sondern nur eine abgewandelte Form, um die eingebaute serielle Schnittstelle des Microcontrollers verwenden zu können, dies vereinfacht den Softwareaufwand enorm.

Wie funktionierts?
Die analogen Werte der Potentiometer werden eingelesen und digitalisiert. Der verwendete Controller hat einen 10-Bit A/D-Wandler, d.h. wir bekommen einen 10-Bit Wert (0-1023) geliefert. Dies paßt nicht in das normale 8-Bit-Schema, deshalb werden die abgeschnittenen 2 Bits von vier Kanälen zusammengefasst und ergeben ein zusätzliches Byte für die Übertragung. Die untere Tabelle zeigt das fertige Datenpaket, das aus 7 Bytes besteht:

SSSSAAAA

H1H2H3H4

Analog 1

Analog 2

Analog 3

Analog 4

Digital


SSSS 4 Startbits
AAAA 4 Adressbits (=16 Adressen)
H1H2H3H4 4x 2High-Bits der Analogwerte
Analog1 8 Bit Analogwert Kanal1
Analog2 s.o., Kanal2
Analog3 s.o., Kanal3
Analog4 s.o., Kanal4
Digital 8 Bit Digitalkanäle

Diese 7 Bytes werden nun in den Manchestercode umgerechnet. Dadurch ergeben sich 14 Bytes, die dann seriell gesendet werden. Eine Sonderstellung haben die Start-Bits. Sie werden bei der Manchestercodierung in den eigentlich unerlaubten Code $F0 = 0b11110000 umgewandelt. Der Manchestercode stellt normalerweise sicher, dass max. 2 gleiche Bits hintereinander vorkommen. Durch diesen "fehlerhaften" Code weiß der Empfänger immer, wo genau die Datensequenz beginnt. Außerhalb der Startbits werden mehr als 2 gleiche Bits hintereinander als Fehler interpretiert und entsprechend behandelt.

 

Eckdaten

Sender:

- 4 analoge Kanäle (Eingänge für Potentiometer)

- 8 digitale Kanäle

- 4 Adresseingänge (16 Adressen)

Empfänger:

- 4 Fahrtregler-Ausgänge (direkter Anschluß von Motoren möglich, ca. 100 Geschwindigkeitsstufen,     Drehrichtung umkehrbar)

- 1 Servo-Ausgang für handelsübliche analoge Servos

Für die ersten Versuche können die Funkmodule auch weggelassen werden. Wichtig: Die Masse des Senders muß mit der Masse des Empfängers verbunden sein. So lässt sich auch eine Kabelfernbedienung realisieren. Vorteil: Anstelle vieler Kabel muß nur eines von Bedienpult zur Motorsteuerung gelegt werden.

Die Software

Ich beschreibe nur kurz den Aufbau der Software, ein komplettes Tutorial für Anfänger ist mir leider aus Zeitgründen nicht möglich. Benutzt werden Atmel Mikrocontroller, die ich in Assembler programmiere. Falls Fragen auftreten, stellt diese bitte ins Forum.

Der Sender

Die Software des Senders hat folgende Aufgaben:

- Lesen der analogen und digitalen Eingänge und der gewählten Adresse

- zusammenstellen eines Datenpakets aus den obigen Informationen

- Umwandlung des Datenpakets in Manchester-Code

- Senden der Daten

Lesen der analogen Eingänge:

Der für den Sender benutzte ATMega-8 hat insgesamt 6 A/D-Wandler-Eingänge, von denen wir 4 Stück benutzen. Allerdings haben sich die Entwickler mit einem Trick beholfen: Um den Aufwand geringer zu halten, wurde tatsächlich nur ein A/D-Wandler in den Controller eingebaut, allerdings kann der Eingang mit einem Multiplexer (Umschalter) auf insgesamt 6 Anschlüsse des Controllers geschaltet werden. Man muß also die Werte der Analog-Eingänge nacheinander einlesen.

Damit ich mir während des Ablaufs des Programms nicht zuviele Sorgen machen muß, welcher Kanal den nun gerade ausgelesen werden muß, verwende ich einen Interrupt für das Einlesen und stelle dem Hauptprogramm die Daten der 4 Analogkanäle fix und fertig im Speicher zur Verfügung. Der A/D-Wandler braucht auch eine gewisse Zeit, bis er mit der Wandlung fertig ist. Mit der Interrupt-Methode erspare ich mir auch das Warten auf das Ergebnis.

Der A/D-Wandler wird im "Single Conversion Mode" betrieben, für jede weitere Wandlung muß der A/D-Wandler wieder gestartet werden. Dieser Neustart geschieht automatisch. Man kann den Controller dazu veranlassen, bei jeder erfolgreichen Wandlung einen Interrupt auszulösen

Die Daten werden, wie schon oben erwähnt, mit der im Controller eingebauten seriellen Schnittstelle übertragen. Zunächst werden die Daten (Analog- und Digitalwerte) zusammengestellt und dann in den Manchestercode umgerechnet. Anschließend werden die Daten gesendet. Auch hier findet ein Interrupt Verwendung: Er wird ausgelöst, wenn die Sendung eines Zeichens über die serielle Schnittstelle abgeschlossen ist. Durch einen Zähler wird festgestellt, ob alle Daten übertragen wurden, und alles beginnt von vorne.

Durch diesen Programmaufbau wird das eigentliche Hauptprogramm arbeitslos - es besteht nur aus einer Endlosschleife.

Der Empfänger

Die Software des Empfängers hat folgende Aufgaben:

- Empfangen der Daten
- Dekodieren des Manchester-Codes und Fehlererkennung
- Überprüfen der Adresse, umrechnen der Daten und Zuordnung der Kanäle
- Erzeugen der PWM für die Motorausgänge
- Erzeugen der Signale für den Servo-Ausgang

Das Hauptprogramm des Empfängers besteht im wesentlichen aus einer Endlosschleife, die über Flags gesteuert verschiedene Programmteile ausführt.
So wird z.B. die Dekodierung der Daten (Manchester - > Normaldaten) immer dann ausgeführt, wenn eine serielle Übertragung abgeschlossen ist. Man könnte auch die Dekodierungsroutine direkt im Interrupt ausführen, allerdings sollte man die Interruptroutinen so kurz wie möglich halten.

Auch für den Empfang der Daten nutze ich die eingebaute Hardware des Controllers. Die Rohdaten (in Manchester kodiert) werden als Paket eingelesen. Der Empfang wird in einem Interrupt ausgeführt, der bei Empfang jedes Zeichens einmal ausgelöst wird.

Die PWM wird durch einen Timer gesteuert. Er wird mehr als 14.000 mal pro Sekunde ausgelöst und stellt eine 32-stufige Geschwindigkeitssteuerung mit ca. 200 Hertz zur Verfügung.
Ich lasse einen Zähler mit einem Wertebereich von 0-31 mitzählen

Auch der Servo-Ausgang ist eine Art PWM, alle 20ms erwartet der Servo ein positives Signal mit der Dauer von 1 - 2 ms. 1,5ms repräsentieren die Mittelstellung. Die Impulse müssen sehr genau berechnet und erzeugt werden, da sonst der Servo anfängt zu zittern. Hier nutze ich die Eigenschaften des Controllers, ein solches Signal mit Unterstützung der Hardware erzeugen zu können. Ich habe den preisgünstigsten Servo benutzt, den ich finden konnte und festgestellt, daß er einen Stellweg von 180° hat. Um diesen Stellweg voll ausnutzen zu können und auch andere Servos anpassen zu können, sind die Parameter für die Servo-PWM ebenfalls im EEPROM abgelegt. Ich habe die Werte experimentell ermittelt.

Die Einzelheiten der Servo-PWM sind etwas komplizierter, aber wer sich dafür interessiert:
Basis der Servo-PWM ist der Timer1, der ein 16-Bit Register im Prozessor-Takt zählt. Bei 3,6864 MHz wird 56,25 mal pro Sekunde ein Überlauf des Zählers ausgelöst (3686400 / 65536), dies entspricht 17,7 ms , die ich anstelle der 20ms-Pause verwende. Beim Timer-Überlauf wird das Compare-Match Register des Timers mit dem Sollwert für den Servo-Impuls geladen und festgelegt, daß beim nächsten Compare-Match der Servo-Ausgang auf "0" gesetzt wird.  Dieses Compare-Match Register kann so verwendet werden, daß bei Übereinstimmung von Timer und Register der Port-Pin PB3 geschaltet wird. Dies ist notwendig, denn wenn man den Servo komplett per Software ansteuern würde, käme es durch die vielen anderen Prozesse, die ausgeführt werden, zu Ungenauigkeiten. Der Servo würde unkontrolliert zittern. Wird nun der Zählerstand erreicht, dann wird automatisch per Hardware der Pin auf "0" gelegt und ein Interrupt ausgelöst. In diesem Interrupt wird das Compare-Match Register auf $FFE0 gesetzt und festgelegt, daß der Pin bei erreichen dieses Zählerstands auf "1" gesetzt werden soll. Nun beginnt das Ganze von vorn. Um genauer zu verstehen, wie dies funktioniert, kann das Datenblatt von Atmel herangezogen werden.

Der Empfänger berechnet die Analogwerte intern mit 8 Bit, d.h. der Servo kann mit 256 Schritten angesteuert werden. Dies ist für einen Einsatz als Lenkung vollkommen ausreichend. Sollten irgendwann einmal die 256 Schritte nicht ausreichen, wäre die Erhöhung auf 1024 Schritte möglich, da der Sender einen 10-Bit Wert sendet. Also entspricht die eine Endstellung des Servos "0", die andere dem Zahlenwert "255". Würde ich diese Werte direkt der Servo-PWM zuführen, käme nicht viel dabei heraus, denn ich muß ja einen Wert zwischen 1ms und 2ms erreichen - wie nun geht das? Hierzu muß ich ein wenig rechnen. Zuerst muß ich wissen, wieviele Taktzyklen (=Zählerimpulse) 1ms darstellen. Dies ist relativ einfach: Der Quarz schwingt mit 3686400 Zyklen pro Sekunde, also sind es in einer ms 1000 mal weniger, ungefähr 3686 mal. Dies also ist mein "Offset", der Wert, der nicht unterschritten werden sollte, auch wenn mein Analog-Wert =0 ist, d.h. ich addiere diesen Wert 3686 hinzu. Die zweite Endstellung wird bei 2ms erreicht, d.h. zwischen Endstellung1 und Endstellung2 des Servos liegt 1ms - und dies entspricht wieder dem Wert 3686. Da ich 256 Schritte zur Verfügung habe, muß ich also für jeden Schritt einen Wert von 14 (gerundet) hernehmen. Dies geschieht, indem ich den Analogwert mit 14 multipliziere, sol bekomme ich bei Vollausschlag einen Wert von 3570, dies entspricht dann 0,97 ms, mit dieser Abweichung kann ich leben. Nochmal zusammengefaßt:
Mit einem Offset von 3686 und einem Multiplikator von 14 bekomme ich ein Servo-Signal von 1ms bis 1,97ms. Daß diese 1-2 ms ein sehr theoretischer Wert sind, habe ich bei meinen Experimenten festgestellt. Die Servos an sich haben Toleranzen, ausserdem gibt es noch ein wenig "Luft" bei der Ansteuerung, um beispielsweise Modelle trimmen zu können. Der von mir verwendete Servo hat die Werte 2720 für die linke und 9095 für die rechte Endstellung, d.h. er verarbeitet Signale von 0,737 bis 2,46ms und stellt mit diesen Werten einen Drehwinkel von 180° zur Verfügung, der in Kombination mit einem 10er Zahnrad genau richtig für die Lenkzahnstange ist. In meinem Beispiel wird also als Offset 2720 (=$0AA0) und als Multiplikator 25 (=$19) verwendet. Diese Werte werden im EEPROM unter Adresse $20,$21 (Offset) und $22 (Multiplikator) abgelegt.

Der Empfänger ist frei programmierbar, die Parameter werden im EEPROM abgelegt. Dieser Speicherbereich kann unabhängig vom Programmspeicher des Controllers verändert werden.
Jedem Ausgang (PWM-Ausgänge 1-4, Servo-Ausgang) kann ein Kanal des Senders zugeordnet werden. So ist es möglich, mehrere Empfänger zu kaskadieren, falls mehr als 4 Ausgänge an einem Modell benötigt werden, oder auch zwei Motoren mit dem gleichen Kanal zu steuern. Außerdem wird in diesen Parametern festgelegt, ob die Potentiometer der Analog-Kanäle mit 90° oder 270° Stellwinkel berechnet werden sollen. Bei den Digitalen Eingängen werden immer zwei zu einem Kanal zusammengefaßt. Momentan können diese Werte nur mit einem Programmiergerät und entsprechender Software (z.B. Ponyprog) verändert werden. Ich habe später einmal vor, eine Software für den PC zu entwickeln, die diese Einstellvorgänge etwas komfortabler macht.
Die Analogkanäle haben die Nummern 0 bis 3, die Digitalkanäle die Nummer 4 bis 7.  Der Empfänger hat 5 Kanäle für die Ausgabe: 4x Motortreiber und einen Servoausgang. Die Zuordnung, welcher Senderkanal auf welchen Empfängerausgang einfluß hat, ist folgendermaßen festgelegt:
EEPROM-Adresse
$00 = Motor-Ausgang 1
$01 = Motor-Ausgang 2
$02 = Motor-Ausgang 3
$03 = Motor-Ausgang 4
$04 = Servo-Ausgang.

In die entsprechende Adresse wird ein Byte geschrieben, das folgende Informationen enthält:

Bit 0..3 Nummer des Sender-Kanals
Bit 4 Bei Analog-Kanälen: 1=90°, 0=270° Stellweg (Potentiometer am Sender)

Der Nachbau

Ich habe viele 433Mhz-Funkmodule ausprobiert. Das bisher günstigste Preis-Leistungsverhältnis (und vor allem auch für Privatanwender verfügbar) hat die Fa. Conrad-Elektronik.

Sende-Modul: SAW-00K Transmitter module (Aurel), Best.-Nr. 190224-41 (EUR 7,95 - Stand 02/2004)
Empfänger-Modul: AC-RX Receiver module (Aurel), Best.- Nr. 190276-41 (EUR 7,25 - Stand 02/2004)

Vorsicht! Diese Module sind auf einem Keramik-Träger aufgebaut. Kleinste Belastungen an der falschen Stelle, und die Platine bricht - das Modul ist unbrauchbar.
Als Antenne reicht bereits ein Stück Draht mit 17cm Länge, es sollte allerdings möglichst gerade ausgerichtet werden. Sollen größere Reichweiten erreicht werden, ist der Kauf einer professionellen Antenne unumgänglich, denn mit der Qualität der Antenne steht und fällt alles.

Das Sender-Empfänger Set (Best.-Nr. 130428-41, knapp 15 Euro) kann ich nur bedingt empfehlen. Dieses Set funktioniert nur mit einer Baudrate von max. 1200 Baud (die Assembler-Datei kann entsprechend angepasst werden) und die Reichweite ist wesentlich geringer.

Die o.g. Einzelmodule unterstützen eine Baudrate von 2400 Baud ohne Probleme. Weiterer Vorteil der Einzelmodule: Man kann mehrere Empfänger einzeln kaufen.

Hinweis zu den Motor-Treibern TLE4205: Sie können bezogen werden bei der Fa. Kessler-Elektronik. Ich habe die DIP-Version verwendet, aber um Platz zu sparen, baue ich sie aufrecht in die Schaltung. Der Baustein hat 18 Anschlußpins, wobei Pin 10...18 (die ganze rechte Seite) auf Masse gelegt ist. Diese Pins schneide ich ab und löte sie alle mit einem Draht zusammen. Die linke Seite (Pin 1..9) wird so umgebogen, daß der Baustein in der Platine aufrecht steht.
(Fotos kommen noch)

Software:

Sender
asm-Datei
Schaltplan als Eagle-sch-Datei
Schaltplan als JPG


Empfänger
asm-Datei
Schaltplan als Eagle-sch-Datei
Schaltplan als JPG

Ich habe bei mir einen weiteren Empfänger in Arbeit (als Prototyp funktioniert er bereits) der mit Hilfe eigener A/D-Wandler und entsprechender Software Eigenbau-Servos (benötigen keine Elektronik, nur Motor und Potentiometer) unterstützt.

Home

Bauanleitungen

Links

Gästebuch

Gästebuch

News

Projekte

Impressum