erstellt  12.12.2014
Funkfernbedienung
Für einen Model Panzer der mit einer Infrarot Fernbedienung gesteuert wurde und dadurch bedingt manchmal einen sehr schlechten Empfang hatte
und somit nicht sauber gesteuert werden konnte , soll hier eine Fernbedienung mit Funk erstellt werden.
Ein Fertiges Funk Modul soll hier eingesetzt werden damit die Probleme mit dem Protokoll usw. schon einmal gelöst sind.
Als Modul dient ein Modul RF7020 der Firma Octamex.
Das Modul arbeitet mit einer Betriebsspannung von 5 Volt und passt so wunderbar zum Atmega der auch mit 5 Volt arbeitet.
Die Datenübertragung zwischen Modul und Mikroprozessor findet Seriell statt über TXD und RXD.

Die Standard Datenübertragungsrate ist 9600 Baud, also sollte der Mikroprozessor in der Lage sein die Geschwindigkeit zu ermöglichen
was hervorragend gelingt wenn man einen Quarz mit 3,6864 nutzt.
Man muss natürlich darauf achten das auch der Empfänger mit der gleichen Datenübertragungsrate arbeitet.

Hier sieht man den ersten Entwurf mit fünf Tasten für die Funktionen Vor/Zurück , Links/Rechts, und Stop.
Darüber der Quarz , und oberhalb vom Quarz der Mikroprozessor "Atmega 8".
Rechts oben in der Ecke Eine USB-Kupplung  die als Programmierschnittstelle dient.
Weiter noch drei Leuchtdioden als Funktionsanzeigen

und eben das besagte Funkmodul.
Die Verbindung zwischen Funk Modul und Prozessor besteht nur aus 4 Leitungen.

Pin
Funktion
Beschreibung
1
GND
Masse
2
Vcc
Plus 5 V
3
-------
-------
4
TXD
Sendeleitung
5
RXD
Empfangsleitung
6
-------
-------
7
-------
-------


Schaltplan



Funktion

Nach dem Einschalten blinkt die Orange Led ( Mitte) und zeigt an das der Sender aktiv ist.
Durch drücken der jeweiligen Tasten werden Kommandos verschickt , die später dann mein Ferngesteuertes Fahrzeug steuern sollen.
Taste "nach oben" für Vorwärts fahrt ( beide Motoren vor)
Taste "mittig" für Stop ( Alle Motoren Stop )
Taste "nach unten" für Rückwärts fahrt ( Alle Motoren zurück)
Taste "nach links" für linker Motor vor
Taste "nach rechts" für rechter Motor vor
Beim senden eines Befehls leuchtet kurz die Weiße Led auf um zu signalisieren das der Befehl verschickt wurde,
anschließend leuchtet kurz die blaue Led auf weil der Empfänger das

Signal zurück sendet.Damit wird überprüft ob das Signal auch korrekt am Empfänger angekommen ist.

Programm
Funk Sender
Zeile
Programmcode
Erklärung
Allgemeine Prozessor Konfiguration
1
$regfile "m8def.dat"  Definiert den Atmega als Atmega8
2
$crystal = 3686400 Gibt die Quarzfrequenz an in Herz
3
$hwstack = 32     Defaultwert 32 Hardware reservierte Speicher
4
$swstack = 10      Default Software Reservierung Speicher
5
$baud=9600

Konfiguration der Ein/Ausgänge
6
Ddrc.5=1 Port wird als Ausgang gesetzt für Weiße Led
7
Ddrc.4=1 Port wird als Ausgang gesetzt für Orange Led
8
Ddrc.3=1 Port wird als Ausgang gesetzt für Blaue Led
9
Portd.2=1 PullUp setzen für Schalter S1
10
Portd.3=1 PullUp setzen für Schalter S2
11
Portd.4=1 PullUp setzen für Schalter S3
12
Portd.5=1 PullUp setzen für Schalter S4
13
Portd.6=1 PullUp setzen für Schalter S5
Variable deklarieren
14
Dim a as word
Damit Orange Betriebs_Led langsam blinkt
Konfiguration zum Senden und Empfangen von Daten über USAR
15
Enable interrupts
Interrupts Global freigeben
16
on urxc Datenempfang
Routine festlegen die beim Interupt aufgerufen wird
17
enable urxc
Empfangspuffer freigeben
18
dim x as byte
Variable in der die Empfangenen Zeichen rein kopiert werden



Programm Anfang
19
Do Anfang der Programmschleife
20
A=A+1
Variable beim Schleifendurchgang hoch zählen
21
If A > 64900 Then Portc.4 = 1 Else Portc.4 = 0
Beim Wert über 64900 geht Orange Led an um bei 65535 wieder aus zu gehen
22
if pind.2=0 then gosub Taste_auf
Wenn Taste gedrückt zur Routine springen
23
if pind.3=0 then gosub Taste_links Wenn Taste gedrückt zur Routine springen
24
if pind.4=0 then gosub Taste_mitte Wenn Taste gedrückt zur Routine springen
25
if pind.5=0 then gosub Taste_rechts Wenn Taste gedrückt zur Routine springen
26
if pind.6=0 then gosub Taste_unten Wenn Taste gedrückt zur Routine springen
27
loop

Routine für "Taste auf"
28
Taste_auf:
Anfang der Routine
29
Portc.5=1
Weiße Led an
30
Printbin 1
Wert 1 über TXD versenden
31
waitms 50
Pause
32
Portc.5=0
Weiße Led aus
33
Return
Ende der Routine und Rücksprung von wo her gekommen
Routine für "Taste links"
34
Taste_links:

35
Portc.5=1

36
Printbin 2

37
waitms 50

38
Portc.5=0

39
Return

Routine für "Taste mitte"
40
Taste_mitte

41
Portc.5=1

42
Printbin 3

43
Waitms 50

44
Portc.5=0

45
Return

Routine " Taste rechts"
46
Taste_rechts:

47
Portc.5=1

48
Printbin 4

49
Waitms 50

50
Portc.5=0

51
Return

Routine "Taste unten"
52
Taste_unten:

53
Portc.5=1

54
Printbin 5

55
waitms 50

56
Portc.5=0

57
Return

Routine zum Empfang der Daten
58
Datemempfang:

59
X=UDR
Empfangener Wert aus Register UDR in Variable X kopieren
60
Portc.3=1
Blaue Led an
61
Waitms 100
Pause
62
Portc.3=0
Blaue Led aus
63
Return


Im Programmcode sehen wir in Zeile 5 die Anweisung " $Baud 9600" .
Viele der Anschluss-Pins des Atmega haben mehrere Funktionen , Standardmäßig können die meisten Pins als Digitale Ein oder Ausgänge benutzt werden,
mit der Anweisung
$Baud wird der Atmega 8 angewiesen die Pins 2 und 3 als sogenannten UART Schnittstelle  bereitzustellen
an denen dann Daten gesendet und empfangen werden können.

Diese Datenschnittstelle wird mit der Gegenstelle nicht Synchronisiert, deswegen muss auf beiden Seiten sichergestellt sein das die Daten mit gleicher Geschwindigkeit
gesendet wie auch empfangen werden.
Die Geschwindigkeit ist im Funkmodul Standardmäßig mit 9600 Baud festgelegt, also muss auch der Mikroprozessor mit 9600 Baud arbeiten.

 Fertige Fernsteuerung

Nachtrag
Was ich vergesse hatte war eine Geschwindigkeitsregelung, also kommen noch zwei zusätzliche Taster zu Einsatz.
Ein Taster um die Geschwindigkeit zu erhöhen (Taster S7) , und einen um die Geschwindigkeit zu verringern (Taster S6).
Und wenn ich einmal dabei bin noch eine zusätzliche Led( Grün).


So sieht dann die Schaltung mit den rechts auf der Platine befindlichen 2 zusätzlichen  Taster und der zusatzlichen  Led aus.

Natürlich kommen dadurch auch einige Programm Anweisungen hinzu die hier alle Rot markiert sind , und auch keine Zeilen Nummern aufweisen um sie besser zu erkennen.
Funk Sender
Zeile
Programmcode
Erklärung
Allgemeine Prozessor Konfiguration
1
$regfile "m8def.dat"  Definiert den Atmega als Atmega8
2
$crystal = 3686400 Gibt die Quarzfrequenz an in Herz
3
$hwstack = 32     Defaultwert 32 Hardware reservierte Speicher
4
$swstack = 10      Default Software Resvierung Speicher
5
$baud=9600

Konfiguration der Ein/Ausgänge
6
Ddrc.5=1 Port wird als Ausgang gesetzt für Weiße Led
7
Ddrc.4=1 Port wird als Ausgang gesetzt für Orange Led
8
Ddrc.3=1 Port wird als Ausgang gesetzt für Blaue Led

Ddrc.2=1
Port als Ausgang für Grüne Led
9
Portd.2=1 PullUp setzen für Schalter S1
10
Portd.3=1 PullUp setzen für Schalter S2
11
Portd.4=1 PullUp setzen für Schalter S3
12
Portd.5=1 PullUp setzen für Schalter S4
13
Portd.6=1 PullUp setzen für Schalter S5

Portd.7=1
PullUp setzen für Schalter S6

Portb.0=1
PullUp setzen für Schalter S7
Variable deklarieren
14
Dim a as word
Damit Orange Betriebs_Led langsam blinkt
Konfiguratiuon zum Senden und Empfangen von Daten über USAR
15
Enable interrupts
Interrupts Global freigeben
16
on urxc Datenempfang
Routine festlegen die beim Interupt aufgerufen wird
17
enable urxc
Empfangspuffer freigeben
18
dim x as byte
Variable in der die Empfangennen Zeichen rein kopiert werden



Programm Anfang
19
Do Anfang der Programmschleife
20
A=A+1
Variable beim Schleifendurchgang hoch zählen
21
if A=60000 then Toggle portc.4
Beim Wert von 60000 immer die Orange Led umschalten
22
if pind.2=0 then gosub Taste_auf
Wenn Taste gedrückt zur Routine springen
23
if pind.3=0 then gosub Taste_links Wenn Taste gedrückt zur Routine springen
24
if pind.4=0 then gosub Taste_mitte Wenn Taste gedrückt zur Routine springen
25
if pind.5=0 then gosub Taste_rechts Wenn Taste gedrückt zur Routine springen
26
if pind.6=0 then gosub Taste_unten Wenn Taste gedrückt zur Routine springen

If Pinb.0 = 0 Then Gosub Schneller
Wenn Taste gedrückt zur Routine springen

If Pind.7 = 0 Then Gosub Langsamer
Wenn Taste gedrückt zur Routine springen
27
loop

Routine für "Taste auf"
28
Taste_auf:
Anfang der Routine
29
Portc.5=1
Weiße Led an
30
Printbin 1
Wert 1 über TXD versenden
31
waitms 50
Pause
32
Portc.5=0
Weiße Led aus
33
Return
Ende der Routine und Rücksprung von wo her gekommen
Routine für "Taste links"
34
Taste_links:

35
Portc.5=1

36
Printbin 2

37
waitms 50

38
Portc.5=0

39
Return

Routine für "Taste mitte"
40
Taste_mitte

41
Portc.5=1

42
Printbin 3

43
Waitms 50

44
Portc.5=0

45
Return

Routine " Taste rechts"
46
Taste_rechts:

47
Portc.5=1

48
Printbin 4

49
Waitms 50

50
Portc.5=0

51
Return

Routine "Taste unten"
52
Taste_unten:

53
Portc.5=1

54
Printbin 5

55
waitms 50

56
Portc.5=0

57
Return

Routine " Taster schneller"

Schneller:

Portc.5 = 1

Printbin 6

Waitms 50

Portc.5 = 0


Return
Routine "Taste langsamer"

Langsamer:

Portc.5 = 1

Printbin 7

Waitms 50


Portc.5 = 0

Return
Routine zum Empfang der Daten
58
Datemempfang:

59
X=UDR
Empfangener Wert aus Register UDR in Variable X kopieren
60
Portc.3=1
Blaue Led an
61
Waitms 100
Pause
62
Portc.3=0
Blaue Led aus
63
Return


Was also passiert bei der Datenübertragung über eine UART Schnittstelle:
Zunächst wissen wir das die Daten mit einer Geschwindigkeit von 9600 Baud / Sekunde übertragen werden.
Ein Baud besteht in diesen Fall aus 8 Datenbits und ein Stopbit, also 9 Zeichen.
9600/9 = 1066 Bits/Sekunde
Somit wird alle 0,9375 mSekunden ein Zeichen übertragen.

Um Also das Wort " Hallo Welt" zu übertrage werden also 5 Zeichen für Hallo , 1 Zeichen als Leerzeichen und noch einmal 4 Zeichen für Welt übertragen.
Das macht 10 Zeichen + Stopzeichen= 11 Zeichen
11 Zeichen mal 0,9375= 10 mSekunden , also 10 Zeichen in einer Sekunde.

Taste
Zeichen
Signal
S1
1

S3
3

S5
5


Hallo Welt














Das Askii Zeichen "H" ergibt binär folgenden Wert 0100 1000
Ascii Zeichen





H
0100
1000



a
0110
0001



l
0110
1100



o
0110
1111












Stromverbrauch bei 5 Volt Betriebsspannung
mA
Atmega
8
Funkmodul im Leerlauf
20



Aktualisiert 27.05.2019
Copyright by Ms 2009