erstellt  12.12.2014
Funkübertragung mit Funkmodul
Um Informationen mit Funk zu übertragen gibt es heutzutage schon allerlei fertige Funkmodule die Daten mehr oder weniger einfach
übertragen , allerdings sind diese in der Regel relativ teuer.
Um Daten per Funk zu übermitteln sollte man sich einige grundlegende Gedanken machen.
  • Welche Schnittstelle wird zum Beispiel benötigt
  • Welche Spannung steht zur Verfügung ( Batterie oder Netzteil )
  • Wie groß soll die Reichweite sein
  • Wie werden die Daten übertragen, also übernimmt das Funk Modul schon das Protokoll, oder muss es extern erst erzeugt werden.

Ein zu einem kalkulierbaren Preis ( ca. 12 Euro Stk.) angebotenen Funkbaustein  ist das Modul mit der Bezeichnung RF7020.
Im hier vorliegenden Fall teste ich eine Datenübertragung mit dem Funkmodul RF7020 der Firma Octamex, dieses Modul ist ein sogenannter Tranceiver
(
Tranceiver = zusammen gesetztes Wort) aus Tranceiver ( Senden ) und Receiver( Empfänger) ein Tranceiver kann also senden und empfangen.

Das RF7020 D13 Modul arbeitet im Lizenz freien Band was soviel bedeutet,als das es nicht angemeldet werden muss und es auch ansonsten keine
Genehmigung für den Betrieb bedarf.
Enthalten  ist ein 256 Byte Puffer, außerdem bietet  das Modul eine Standard-UART/TTL-Schnittstelle und arbeitet in einem Spannungsbereich
von 3,3  bis 5.5V mit besonders niedrigen Standby-Strom.
Das Modul arbeitet auf  einer Frequenz von 433,92 MHz ,und ist Standardmäßig auf 9600 Baud Datenübertragungsrate eingestellt.
Die  Ausgangsleistung beträgt  25 mW.
Einige Parameter können laut Hersteller Softwaremäßig angepasst werden.
Habe es aber noch nicht geschafft eine passende funktionierende Software dafür zu bekommen, auch ist es mir manuell noch nicht gelungen das Modul
laut Datenblatt in den Konfigurations-Modus zu versetzen.
Auf der Betreiberseite der Firma  "Octamex" ist zwar in der Artikelbeschreibung die Rede von einer kostenlosen Software zur  Konfiguration des Modules,
jedoch wird diese Software von Octamex offenbar nicht angeboten, auf mehrfachen Anschreiben meinerseits fand diese Firma wohl keinen Grund
überhaupt zu Antworten.
Optional gibt es eine USB Schnittstelle, die es ermöglicht das RF7720 Modul direkt an eine USB Schnittstelle am PC zu betreiben.
Dieses USB-RS232 Wandlermodul (TTL-Pegel) stellt einen virtuellen COM Port dar.
Treiber / Software für alle WIN-Systeme ab XP-32/64 sind bei Silabs erhältlich.
Als Link gibt es den Treiber auch hier, allerdings ist es dann möglicherweise nicht die neuste Version:

Somit kommt es als Schnittstelle für Funkmodule bei der Mikrocontrolleranbindung an den PC zum Einsatz.
Der Name des verbauten Treiber  von Silabs lautet CP2102.

Pinbelegung der Buchsenleiste (RM2,54)

PIN1 - GND
PIN2 - VCC
PIN3 - not connected
PIN4 - TXD
PIN5 - RXD
PIN6 - not connected


 
Weil es bei einer fertigen Schaltung die man selbst erstellt hat früher oder später meist zu irgend welchen Problemen kommt ,
und man dann sehr umständlich nach dem Fehler suchen muss, zumal man meist nicht weiß ob die Ursache in der Hard-oder Software zu finden ist,
hab ich mir angewöhnt nach jedem noch so kleinen Schritt die Schaltung zu testen.
Also teste ich erst einmal ob die Übertragung vom PC zum Wandlermodul funktioniert indem am Wandler Modul PIN 4 und Pin 5 kurzgeschlossen wird,
dann muss beim anschließenden Senden vom Terminal alle angegebenen Zeichen auch im Terminal erscheinen.
Die Zeichen werden also im Terminalprogramm  erzeugt gelangen über USB auf Pin 4 dann über die Brücke in Pin 5 wieder zurück zum Terminal Programm.
Sollte dieser Test erfolgreich sein ist damit schon einmal sicher gestellt das dass Terminalprogramm samt der eingegebenen COM Schnittstelle in Ordnung ist.

Als Terminalprogramm benutze ich der einfacherhalber das Interne Terminal Programm der Bascom Oberfläche .
Zu erreichen im Program "Bascom" im Menü unter Tools  ----> Terminal Emulator.
Dann noch die wichtigsten Parameter wie ComPort und Baudrate einegeben.
Baudrate liegt bei 9600 vom Modulhersteller die Standardvorgabe , die COM Schnittstelle ist bei jedem PC unterschiedlich
und kann wenn man es gar nicht weiß einfach getestet werden indem man bei 1 anfängt und sich dann nach oben vorarbeitet.
Dann geben wir einen Text ein, wen wunderst hier einmal den Text " Hallo Welt"
Wenn wir so weit gekommen sind stimmt schon einmal die Kommunikation zwischen PC und TTL -USB Modul.
Nun kann es aber sein das im Terminal Programm eine Echo Funktion aktiviert ist, das würde bedeuten das der Text
den ich im Terminal Programm eingebe als Echo , also einfach als Duplikat angezeigt wird obwohl es vielleicht gar nicht
über die USB Schnittstelle und zurück gekommen ist.
Um also sicher zu stellen das mein Text auf jeden Fall über die USB Schnittstelle und zurück gekommen ist entferne
ich einfach das USB Kabel .
Kommt dann keine Text mehr zurück, kann man sich sicher sein das alles Ordnungsgemäß funktioniert.

Um einen vollständigen Datenaustausch zu Verwirklichen und zwar zwischen PC und Mikroprozessor benutze ich einen Atmega 8 Mikroprozessor mit folgender Grundschaltung:

Mit den Jumper 1(schwarz) und 2 (Blau) aktiviere oder deaktiviere ich den Spannungsregler, je nach Eingangsspannung.
Der Stromverbrauch bei einer Eingangsspannung von 5 Volt und  deaktivierten Spannungsregler liegt bei etwa 
8 mA , also die reine Schaltung ohne Display.
10 mA zieht die Schaltung mit Display
und insgesammt 15 mA mit Max 232.
mit zusätzlichen Transeiver kommen wir auf ungefähr 55 mA.
Funktion:
Die Schaltung bekommt ihre Versorgungsspannung wahlweise über eine Netzteil 6 bis 30 Volt oder aber über vier Akkus ( 4 mal 1,2 Volt)
um Alternativ mit beiden möglichen Spannungen zu arbeiten befinden sich zwei Jumper (Jumper 12 + 13) in der Schaltung.
  • Möglichkeit 1 : Jumper 1 ist gesteckt und Jumper 2 entfernt, der Spannungsregler ist somit außer Betrieb und wir dürfen eine Maximale Spannung von 5 Volt anlegen, können so also mit vier Akkus die Schaltung versorgen.
  • Möglichkeit 2 : Jumper 1 ist entfernt und Jumper 2 ist gesteckt, so können wir eine Spannung zwischen 6 und 30 Volt anlegen die durch den Regler VR4 auf 5 Volt begrenzt wird, um so ein Netzteil anzuschließen.
Das Display ist ein Industrie Standard Display  mit der Bezeichnung 162A mit einer Auflösung von 2 mal 16 Zeichen.
P3 dient zur Kontrasteinstellung für das Display.
Der Widerstand R7 und die zugehörige Leitung kann weg gelassen werden, wird nur benötigt wenn im Display eine Hintergrundbeleuchtung
vorhanden ist die auch genutzt werden soll, ist hier aber nicht der Fall.
Die USB A Schnittstelle dient zur Programmierung.
Der Quarz ist normalerweise nicht nötig, wird hier aber unbedingt benötigt um später mit dem Funkmodul richtig kommunizieren zu können.
Die Rote  Led dient als Funktionsanzeige des Mikroprozessor.
Erstellen wir doch gleich ein kleines Programm um die Schaltung zu testen, dazu lassen wir die Rote Led blinken und geben einen Text auf dem Display aus.
Funkmodul RF7020 Version 1A
Zeile
Programmcode
Erklärung
Allgemeine Prozessor Konfiguration

$regfile "m8def.dat"  Definiert den Atmega als Atmega8

$crystal = 1000000 Gibt die Quarzfrequenz an in Herz

$hwstack = 32     Defaultwert 32 Hardware reservierte Speicher

$swstack = 10      Default Software Resvierung Speicher
Konfiguration für das Display

Config Lcd = 16 * 2 Gibt die Anzahl der Zeilen und Spalten des Displays an

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , Rs = Portc.5 , E = Portc.4 Gibt die Verbindungspins des Display zum Atmega an
Konfiguration der Ein/Ausgänge

Ddrd.7 = 1 Portd.6 wird Ausgang gesetzt für Rote Led
 Startmeldung auf Display ausgeben

Cls
LCD löschen

Locate 1 , 1 Zeile 1 Spalte 1 im Display anspringen

Lcd "Funkmodul_RF7020" Text in Zeile  eins auf Display ausgeben

Locate 2 , 1 Zeile 2 Spalte 1im Display anspringen

Lcd "Version 1A " Text in Zeile zwei auf Display ausgeben

Cursor Off Cursor ausschalten

Wait 2 Pause von 2 Sekunden einfügen
Programm Anfang

Do Anfang der Programmschleife

Portd.7 = 1 Portd.6 einschalten ( Rote Led an )

Waitms 500 Pause von 500 Millisekunden einfügen

Portd.7 = 0 Portd.6 ausschalten ( Rote Led aus )

Waitms 500 Pause von 500 Millisekunden einfügen

Loop Rücksprung zum Anfang der Programmschleife
Wenn es bis hier funktioniert können wir weiter machen, und schließen als nächstes unser Funkmodul an, dazu legen wir die Spannungsversorgung von 5 Volt an.

Als nächstes werden noch zwei Led' incl Widerstände eingelötet, diese sollen später das Senden und Emfpangen von Daten signalisieren

Der nächste Schritt ist eine Datenverbindung mit der die Daten die vom Mikroprozessor gesendet werden zum Funk Modul gelangen

Jetzt erweitern wir das Programm um die in BLAU angezeigeten Programmzeilen
Funkmodul RF7020 Version 1B
Zeile
Programmcode
Erklärung
Allgemeine Prozessor Konfiguration

$regfile "m8def.dat"  Definiert den Atmega als Atmega8

$crystal = 3686400 Gibt die Quarzfrequenz an in Herz

$hwstack = 32     Defaultwert 32 Hardware reservierte Speicher

$swstack = 10      Default Software Resvierung Speicher

$Baud=9600
Übertragungsrate einstellen
Konfiguration für das Display

Config Lcd = 16 * 2 Gibt die Anzahl der Zeilen und Spalten des Displays an

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , Rs = Portc.5 , E = Portc.4 Gibt die Verbindungspins des Display zum Atmega an
Konfiguration der Ein/Ausgänge

Ddrd.7 = 1 Portd.7 wird Ausgang gesetzt für Rote Led

Ddrd.5 = 1
Portd5 als Ausgang für Gelbe Led setzen
 Startmeldung auf Display ausgeben

Cls
LCD löschen




Locate 1 , 1 Zeile 1 Spalte 1 im Display anspringen

Lcd "Funkmodul_RF7020" Text in Zeile  eins auf Display ausgeben

Locate 2 , 1 Zeile 2 Spalte 1im Display anspringen

Lcd "Version 1B " Text in Zeile zwei auf Display ausgeben

Cursor Off Cursor ausschalten

Wait 2 Pause von 2 Sekunden einfügen
Programm Anfang

Do Anfang der Programmschleife

gosub Senden
Springt zur Routine "Senden"

Portd.7 = 1 Portd.6 einschalten ( Rote Led an )

Waitms 500 Pause von 500 Millisekunden einfügen

Portd.7 = 0 Portd.6 ausschalten ( Rote Led aus )

Waitms 500 Pause von 500 Millisekunden einfügen

Loop Rücksprung zum Anfang der Programmschleife




Senden:
Routine zum versenden von Daten

Portd.5=1
Gelbe Led einschalten

Print " Hallo Welt " Ausgabe von Aski Zeichen an UART Schnittstelle

waitms 100
Pause damit Led zeit zum leuchten hat

Portd.5=0
Gelbe Led ausschalten

Return
Zurück zur Ursprungzeile
Im Programmcode sehen wir das zwei zusätzlichen Zeilen eingefügt wurden, zuerst die Anweisung " $Baud 9600" und die Anweisung Print"Hallo Welt".
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 angewiesen die Pins 2 und 3 als sogenannten UART Schnittstelle  bereitzustellen an denen dann Daten gesendet und empfangen werden können.
Jetzt werden am Pin3 Daten ausgesendet, und zwar die Daten die mit der Anweisung Print Formuliert wurden.
Es werden also die Worte " Hallo Welt" am Pin 3 ausgesendet.
Um das in einem ersten Ergebnis zu überprüfen befindet in der Sende Rotine die Anweisung die gelbe Led kurz ein und wieder aus zu schalten.

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.

Wenn die Gelbe  Sende-Led  nun aufleuchtet sollten diese Daten auch über das Funkmodul versendet werden, um das zu prüfen kann man Beispielsweise eine Funkscanner wer denn einen solchen hat auf die Frequenz von 433,92 MHz einstellen und sollte das Funken im Scanner hören können.
Möglich ist es auch mit einen sogenannten Wanzenfinder die Funktion zu sehen oder zu hören.

Die elegantere Möglichkeit ist aber die vom Prozessor ausgesandte Daten mit einem Terminal Programm am PC zu empfangen.
Dazu benötigen wir ein zweites Funkmodul und einen passenden Pegelwandler für USB.

Das Funkmodul wird mit dem Pegelwandler zusammengesteckt, so das ein Stift wie im Foto unten ( Blauer Pfeil ) zu sehen übersteht, dieser Stift dient nur der Konfiguration des Funk Modules und wird deerzeit nicht benötigt.
Das ganze Teil wird dann in eine USB Schnittstelle des PC gesteckt.



Funkmodul
Pegelwandler
Komplett zusammengesteckt, der mit Blauen Pfeil gekennzeichnete Stift muss überstehen, wird nur zur Konfiguration benötigt.

Nachdem hoffentlich bei Windows diese neue Schnittstelle automatisch erkannt wurde, kann man ein X beliebiges Terminal Programm aufrufen.
Wer kein Spezielles hat nimmt einfach das Interne zu Bascom gehörige stellt in der Konfiguration die Baudrate von 9600 und die passende COM Schnittstelle ein.
Leider funktionierte das nicht immer bei mir , so hab ich mir dann ein kostenloses Terminal Programm herunter geladen mit dem namen Hterm.
Das funktionierte tadellos.
Jetzt sollten die vom Prozessor ausgesandten  Aski Zeichen ungefähr folgendermaßen dargestellt werden, ungefähr desahlab weil es je nach Konfiguration des Terminal Programm etws anders ausehen könnte, zumindest aber sollte der Text "Hallo Welt "zu lesen sein.



Nun wollen wir aber nicht nur Daten senden sondern auch empfangen, dazu erweitern wir die Software um folgende Programmschritte ( wieder in Blau) .
Funkmodul RF7020 Version 1C
Zeile
Programmcode
Erklärung
Allgemeine Prozessor Konfiguration

$regfile "m8def.dat"  Definiert den Atmega als Atmega8

$crystal = 3686400 Gibt die Quarzfrequenz an in Herz

$hwstack = 32     Defaultwert 32 Hardware reservierte Speicher

$swstack = 10      Default Software Resvierung Speicher

$Baud=9600
Übertragungsrate einstellen
Konfiguration für das Display

Config Lcd = 16 * 2 Gibt die Anzahl der Zeilen und Spalten des Displays an

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , Rs = Portc.5 , E = Portc.4 Gibt die Verbindungspins des Display zum Atmega an
Konfiguration für Datenempfang

Enable interrupts
Globale Interrups freigeben

on Urxc Datenempfang
Deklarieren der Routine die beim Interrupt Ereignis angesprungen werden soll

Enable Urxc
Freigabe des Interrups für URXC

Dim X as Byte
Variable für Datenempfang



Konfiguration der Ein/Ausgänge

Ddrd.7 = 1 Portd.6 wird Ausgang gesetzt für Rote Led

Ddrd.5 = 1
Portd 5 als Ausgang für Gelbe Led setzen

DDRD.6=1
Portd 6 als Ausgang für Blaue Led setzen
 Startmeldung auf Display ausgeben

Cls
LCD löschen




Locate 1 , 1 Zeile 1 Spalte 1 im Display anspringen

Lcd "Funkmodul_RF7020" Text in Zeile  eins auf Display ausgeben

Locate 2 , 1 Zeile 2 Spalte 1im Display anspringen

Lcd "Version 1B " Text in Zeile zwei auf Display ausgeben

Cursor Off Cursor ausschalten

Wait 2 Pause von 2 Sekunden einfügen
Programm Anfang

Do Anfang der Programmschleife

gosub Senden
Springt zur Routine "Senden"

Portd.7 = 1 Portd.6 einschalten ( Rote Led an )

Waitms 500 Pause von 500 Millisekunden einfügen

Portd.7 = 0 Portd.6 ausschalten ( Rote Led aus )

Waitms 500 Pause von 500 Millisekunden einfügen

Loop Rücksprung zum Anfang der Programmschleife
Routine zu Versenden von Daten

Senden:
Routine zum versenden von Daten

Portd.5=1
Gelbe Led einschalten

Print " Hallo Welt " Ausgabe von Aski Zeichen an UART Schnittstelle

waitms 100
Pause damit Led zeit zum leuchten hat

Portd.5=0
Gelbe Led ausschalten

Return
Zurück zur Ursprungzeile
Routine zum Empfang der Daten

Portd.6=1
Blaue Led einschalten

cls
Display löschen

Locate 1,1
Cursor im Display auf Zeile 1 Spalte 1 setzen

lcd"Empfange=";chr(x)


X=Udr


udr=x


waitms 50


Portd.6=0







Damit empfangen wir nicht nur wie gehabt die Daten "HalloWelt" sondern können auch auf einen beliebigen Tastedruck am PC gefolgt von der Enter Taste sehen wie die Blaue led kurz aufleuchtet und auf dem Display dann der Scan Code der gedrückten Taste angezeigt wird.
Für die Taste A der Code 97 oder Taste H der Code 104.


Um Daten von einem Mikrocontroller zum anderen Mikrokontroller zu übertragen , benötige ich eine zweite Platine mit Prozessor, damit das Programm dann nicht für jede Platine einzeln erstellt werden muss, solte die zweite Platine Baugleich sein, somit kann dann ein und das selbe Programm für beide Platinen  benutzt werde.

Auf jeder der beiden Platine kommt noch ein Taster und ein Piezo zu Versuchszwecke drauf.

Mit dem Taster sollen  Daten zum versenden aktiviert werden als Daten werden erst einamal Willkürlich einige Werte angegeben und mit dem Piezo soll jeweils ein Ton ausgeführt werden wenn Daten Empfangen werden.
Das dazugehörige Programm für beide Mikrocontroller sieht dann folgendermaßen aus.
Die Frequenzangabe $crystal = 3686400  könnte etwas irritieren , weil ich nur zwei unterschiedliche Quarze zu Verfügung hatte, sind meine Bascom Programme nicht identisch weil sie sich in der Quarzfrequenzangabe unterscheiden, auch die Konfiguration des Displays unterscheiden sich bei mir weil sich meine Platinen weil schon vorhanden auch dort nicht gleichen.Wie gehabt gehört nur der Blaue Text zum Programm , der Rest dient nur der Verständlichkeit.
Bascom Programm für Funkmodul 1 Version 1F
Allgemeine Prozessor Konfiguration
$regfile "m8def.dat"   
Definiert den Atmega als Atmega8
$crystal = 3686400      
Gibt die Quarzfrequenz an in Herz
$hwstack = 32        
Default use 32 Hardware reservierte Speicher
$swstack = 10          
Default Software resvierung Speicher
$baud = 9600 RS232 Datenübertragungsrate
Configuration für das  Display
Config Lcd = 16 * 2 Display mit 2 Zeilen und 16 Spalten
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , Rs = Portc.5 , E = Portc.4 Anschlußpins  Display <-> Mikrokontroller
Konfiguration der Ein/Ausgänge
Ddrd.6 = 1
Portd.6 als Ausgang setzen
Ddrd.5 = 1 Portd.5 als Ausgang setzten
Ddrd.7 = 1 Portd.7 als Ausgang setzten
Ddrd.2 = 0
Portd.2 als Ausgang setzten
Portd.2 = 1
Pind.2 Als Eingang Setzen für Taster
Interrupt INT0
Enable Interrupts Interrupt Allgemein freigeben
On Int0 Taster 
Interrupt Routine  Bezeichnung "Taster"
Mcucr = &B00000010 Interrupt Eingang reagiert auf Flanke von High nach Low
Gicr = &B01000000 Interrupt 0 aktivieren
Konfiguration für das Senden von Daten
On Urxc Datenempfang
Enable Urxc
Dim X As Byte
Startmeldung
Portd.5 = 1           
Gelbe Led an
Waitms 500 Pause
Portd.5 = 0   Gelbe Led aus
Portd.6 = 1 Blaue Led an
Waitms 500
Portd.6 = 0 
Blaue Led aus
Portd.7 = 1 Rote Led an
Waitms 500
Portd.7 = 0
Rote Led aus
Cls 
LCD löschen
Locate 1 , 1 Display löschen
Lcd "Funkmodul_1" Textausgabe auf Display
Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
Lcd "Version 1F " Textausgabe
Cursor Off Cursor ausschalten
Wait 2 Pause
Programm Anfang
Do
Portd.7 = 1
Rote Led an
Waitms 500 Pause
Portd.7 = 0
Rote Led aus
Waitms 500
Loop
Routine zum  Senden von Daten
Senden: Anfang der Senden Routine
Portd.5 = 1   
Gelbe Led an
Print 123 Ausgabe am UART (Pin3)
Waitms 100 Pause
Portd.5 = 0 Gelbe Led aus
Return Rücksprung
Routine zum Empfang von Daten
Datenempfang: Anfang Routine Daten Empfangen
X = Udr 
Emfangener Wert im Register udr in Variable X kopieren
Portd.6 = 1 Blaue Led an
Gosub Ton Zur Routine "Ton " springen
Cls Display löschen
Waitms 10 Pause
Lcd "Empfange=" ; X Textausgabe
Portd.6 = 0 Led Blau aus
Return Rücksprung
Interrupt Taster 1
Taster:
Gosub Senden
Return
Tonausgabe
Ton:
Sound Portb.1 , 500 , 60
Return
Ende


Jetzt will ich versuchen eines der Funkmodule ( Funkmodul_2) mit einen Temperatursensor zu versehen um dann die gemessenen Temperatur per Funk zu übertragen.
Funkmodul 2





Aktualisiert 16.01.2019
Copyright by Manfred Schrod 2009