erstellt  21.02.2015
Ultraschall- Funkübertragung
Erst einmal eine Grundschaltung :
Es handelt sich um einen Mikroprozessor Atmega 8 mit 5 Volt Spannungsversorgung und Programmierschnittstelle. (Bild 1)
Allerdings müssen es nicht immer 5 Volt sein, die meisten Atmega's funktionieren auch noch mit 4,8 Volt , einige sogar mit 3,6 Volt.
So ist es meist möglich den Atmega mit 4 Akkus a 1,2 Volt zu betreiben.
Das hat auch einige Vorteile, gerade wenn man noch im Experimentierstadium ist,
mann schließt somit aus das irgend welche Störimpulse die im Netzteil schon mal auftreten unsere Schaltung beeinflusst.
Mann kann eigentlich generell sagen, das man Schaltungen alternativ an Akkus betreibt um so Störimpulse
die aus vielen Netzteilen austreten aus zu schließen.
Bild 1
Anschließend werden noch einige Komponenten hinzugefügt die es uns ermöglichen zu erkennen was der Atmega gerade macht,
beziehungsweise um Daten sichtbar zu machen.
Also bekommt die Schaltung noch ein Display und einige Leuchtdioden samt Vorwiderstände. ( Bild 2)


Bild 2

Wir erstellen ein erstes kleines Testprogramm um die angeschlossenen Komponenten zu testen die da wären, Led's  , Display und Programmierschnittstelle.
Nur die in Blau Fett dargestellten Zeichen gehören zum Programm, der Rest dient nur der Information.


Ultraschall Funkmodul Testprogramm
$regfile "m8def.dat" Definiert den Atmega als Atmega8
$crystal = 1000000
Gibt die Quarzfrequenz an in Herz
$hwstack = 32 Default use 32 Hardware reservierte Speicher
$swstack = 10
Default Software resvierung Speicher
Output / Input
Ddrd.7 = 1  
Led Grün
Konfiguration fürs Display
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.6 , Db6 = Portd.3 , Db7 = Portd.2 , Rs = Portc.4 , E = Portc.5
Programm
Do
toggle Portd.7
Zustand Led Gelb wechseln
 Cls Display löschen
 Lcd " Test test"
Anzeige von Text
waitms 500
Pause
Loop Rücksprung zum Programm Anfang

Als nächstes wird das Ultraschall Modul HC-SR04 angeschlossen (Bild3)

Bild 3



Das Ultraschallmodul  (HC-SR04 ) ist ein  Modul auf dem Sender und Empfänger schon vorhanden sind und das Signal auch schon aufbereitet wird.
Dieses  Modul muss nur noch mit einer Betriebspannung von 5 Volt und natürlich Masse (GND) versorgt werden.
Es gibt einen Eingang (Trigger) womit das Senden eines 40KHz Ultraschallsignal ausgelöst wird indem dieser Eingang für 10 Mikrosekunden auf
TTL Pegel High gelegt wird also auf 5 Volt.
472 Mikrosekunden nach beenden des Trigger Signal  wird innerhalb dieses Modul vom Senden in den Empfang umgeschaltet.
Im Signalschema (Bild4) erkennt man ab der Bezeichnung A das Triggersignal welches für 10 Mikrosekunden  ansteht, ab der Bezeichnung B erkennt man das
Signal als Rückantwort welches immer zur gleichen Zeit im Verhältnis zu A  zurück kommt.
Bezeichnung C  zeigt das Ende des zurück kommenden Signals was sich im Verhältnis zur Position B je nach Entfernung stetig ändert.
Um das zurück kommende Signal (Echo) auszuwerten wird bei einem Flankenwechsel der interne 16 Bit Zähler aktiviert und beim nächsten Flankenwechsel gestoppt.
Der gezählte Wert ist unser Maß für die zurück gelegte Strecke.
Kommt kein Impuls innerhalb von 672 Millisekunden  zurück wird in der Variable " Err " ein Fehler sprich eine 1 ausgegeben.


Bild 4
Die einfachste Möglichkeit mit einem Atmega die Länge eines Impulses zu bestimmen  besteht mit dem Befehl " Pulsein"
Mit dem Befehl Pulsein misst der Atmega automatisch die Zeit des am Pin anliegenden Signals und zwar von einer Flanke zur nächsten Flanke .
Dem Befehl "Pulsein" muss man mit Parameter versehen und zwar mit der Angabe des zu erfassenden Pin  Eingang, und ob der Impuls bei aufsteigender
oder absteigende Flanke gemessen werden soll. Die Form kann folgendermaßen aussehen:

Pulsein PIND,5,1

PIND gibt dabei den Port an
5 gibt die PIN Nummer an
1 gibt an das die Messung an der nächsten aufsteigende Flanke beginnen soll, und an der dann nächsten abfallende Flanke enden soll.
Der Messwert selber wird in einem internen 16 BIT Zähler verarbeitet der unabhängig vom eigentlichen Programm zählt.
Dieser Wert muss dann noch umgerechnet werden in einen Wert der einhergeht mit der Schallgeschwindigkeit.
Das Programm

Ultraschall Funkmodul Version 1A
$regfile "m8def.dat" Definiert den Atmega als Atmega8
$crystal = 1000000
Gibt die Quarzfrequenz an in Herz
$hwstack = 32 Default use 32 Hardware reservierte Speicher
$swstack = 10
Default Software resvierung Speicher
Output / Input
Ddrd.7 = 1  
Led Grün
Ddrd.5 = 0 
Echo Eingang
Ddrb.0 = 1 Trigger Ausgang
Portb.0 = 1 
Pull up aktivieren für Trigger Ausgang
Portd.5 = 1 Pull Up for Echo
Konfiguration fürs Display
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.6 , Db6 = Portd.3 , Db7 = Portd.2 , Rs = Portc.4 , E = Portc.5
Variable
Dim Puls As Word

Startmeldung
Cls
Locate 1 , 1
Lcd "US-Funk"
Locate 2 , 1
Lcd "Version 1C"
Wait 3

Programm
Do
Portd.7 = 1 Led gelb einschalten (Triggermeldung)
Portb.0 = 1
Trigger für US aussenden
Waitus 10 Pause
Portb.0 = 0 Trigger beenden
Waitms 10 Pause damit Trigger Led Zeit zum leuchten hat
Portd.7 = 0 Led gelb ausschalten
Pulsein Puls , Pind , 5 , 1 Eingang abfragen ob Echo anliegt und in Variable speichern
 Cls Display löschen
Locate 1 , 1 Cursor in Zeile 1 Spalte 1 setzen
 Lcd " Puls=" ; Puls Anzeige von Text und Variableninhalt
Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
Lcd "Error=" ; Err Error Variable anzeigen
Wait 1 Pause damit Display nicht flackert
Loop Rücksprung zum Programm Anfang

Um eintretende Fehler als frei definierten Text anzuzeigen werden folgen Zeilen ( in Blau) geändert bz. hinzugefügt.

Ultraschall Funkmodul Version 1B
$regfile "m8def.dat" Definiert den Atmega als Atmega8
$crystal = 1000000
Gibt die Quarzfrequenz an in Herz
$hwstack = 32 Default use 32 Hardware reservierte Speicher
$swstack = 10
Default Software resvierung Speicher
Output / Input
Ddrd.7 = 1  
Led Grün
Ddrd.5 = 0 
Echo Eingang
Ddrb.0 = 1 Trigger Ausgang
Portb.0 = 1 
Pull up aktivieren für Trigger Ausgang
Portd.5 = 1 Pull Up for Echo
Konfiguration fürs Display
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.6 , Db6 = Portd.3 , Db7 = Portd.2 , Rs = Portc.4 , E = Portc.5
Variable
Dim Puls As Word

Dim Stoerung As String * 7
Variable für Fehler Text
Startmeldung
Cls
Locate 1 , 1
Lcd "US-Funk"
Locate 2 , 1
Lcd "Version 1C"
Wait 3

Programm
Do
Portd.7 = 1 Led gelb einschalten (Triggermeldung)
Portb.0 = 1
Trigger für US aussenden
Waitus 10 Pause
Portb.0 = 0 Trigger beenden
Waitms 10 Pause damit Trigger Led Zeit zum leuchten hat
Portd.7 = 0 Led gelb ausschalten
Pulsein Puls , Pind , 5 , 1 Eingang abfragen ob Echo anliegt und in Variable speichern
if err=1 then Stoerung="Fehler" else Stoerung=""

If Err = 1 Then Stoerung = "Fehler" Else Stoerung = ""
Err Variable nur Anzeigen wenn Störung vorhanden
 Cls Display löschen
Locate 1 , 1 Cursor in Zeile 1 Spalte 1 setzen
 Lcd " Puls=" ; Puls Anzeige von Text und Variableninhalt
Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
Lcd Stoerung
Error Variable als Text anzeigen
Wait 1 Pause damit Display nicht flackert
Loop Rücksprung zum Programm Anfang

Um die Berechnung zu Bewerkstelligen, hab ich die Ultraschall Sensoren auf ein festes Maß zur Wand die Puls messen lassen.
Ich kam so auf 134 Pulse bei einer Entfernung von 68 Cm.
Nun berechne ich die Entfernung die pro Impuls zurück gelegt wird.
Also 134 Pulse = 68 Cm
1 Puls = 68/134 = 0,507 cm
Es werden also folgende in Blau und Fett dargestellten Programmzeilen hinzugefügt.


Ultraschall Funkmodul Version 1C
$regfile "m8def.dat" Definiert den Atmega als Atmega8
$crystal = 1000000
Gibt die Quarzfrequenz an in Herz
$hwstack = 32 Default use 32 Hardware reservierte Speicher
$swstack = 10
Default Software resvierung Speicher
Output / Input
Ddrd.7 = 1  
Led Grün
Ddrd.5 = 0 
Echo Eingang
Ddrb.0 = 1 Trigger Ausgang
Portb.0 = 1 
Pull up aktivieren für Trigger Ausgang
Portd.5 = 1 Pull Up for Echo
Konfiguration fürs Display
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.6 , Db6 = Portd.3 , Db7 = Portd.2 , Rs = Portc.4 , E = Portc.5
Variable
Dim Puls As Word

Dim Stoerung As String * 7
Variable für Fehler Text
Dim cm as single
Variable für die Berechnete Entfernung
Dim cm_format as String * 10
Variable zur Formatierung der Variable Ausgabe auf Display
Startmeldung
Cls
Locate 1 , 1
Lcd "US-Funk"
Locate 2 , 1
Lcd "Version 1C"
Wait 3

Programm
Do
Portd.7 = 1 Led gelb einschalten (Triggermeldung)
Portb.0 = 1
Trigger für US aussenden
Waitus 10 Pause
Portb.0 = 0 Trigger beenden
Waitms 10 Pause damit Trigger Led Zeit zum leuchten hat
Portd.7 = 0 Led gelb ausschalten
Pulsein Puls , Pind , 5 , 1 Eingang abfragen ob Echo anliegt und in Variable speichern
If Err = 1 Then Stoerung = "Fehler" Else Stoerung = ""
Err Variable nur Anzeigen wenn Störung vorhanden
cm=puls * 0.507
Berechnung der Entfernung
cm_format=fusing(cm,"#.#")
Formatierung der Längen Ausgabe
 Cls Display löschen
Locate 1 , 1 Cursor in Zeile 1 Spalte 1 setzen
 Lcd " Puls=" ; Puls Anzeige von Text und Variableninhalt
Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
Lcd Stoerung
Error Variable als Text anzeigen
Locate 2,8
Cursor in 2 Zeile 8.Spalte setzen
Lcd"cm=";cm_format
Ausgabe der Länge in Centimeter auf Display
Wait 1 Pause damit Display nicht flackert
Loop Rücksprung zum Programm Anfang

Damit ist die Schaltung in die Lage , per Ultraschall die Entfernung zum Objekt in Zentimeter anzuzeigen



Um diese Informationen per Funk zu übertragen benötigen wir noch das Funkmodul und für eine geringe Fehlerquote bei der Übertragung
per SPI einen Quarz der die Baudrate von 9600 unterstützt.
Die Kondensatoren (Keramik), sollen laut Datenblatt zwischen 12 und 22 pF sein



Das Funkmodul besitzt außer den Spannungsversorgungsanschlüssen Pin1 =GND / Pin 2=Plus) und den Anschlüssen für die
Datenübertragungen ( Pin 4 und 5 ) noch einen sogenannten Enable Anschluss.
(Pin 3 / Enable= Freigabe) , wenn dieser Anschluss auf  Plus gelegt wird, wird das Funkmodul erst freigegeben, bei Minus ist das Funkmodul nur im Standby und verbraucht somit weniger Strom.

Ereignis beim Ultraschall läst sich per Funk übertragen, allerdings hab ich eingegeben,das es überträgt wenn eine bestimmte Entfernung unterschritten wird.
Sinnvoll wäre es aber wenn ein x beliebiger Wert innerhalb einer kurzen Zeit ändert das dann erst gesendet wird

außerdem läst sich so der Zahlenwert 1 bis 9 übertragen aber kein Text, warum nicht ???
Um nicht nur einen Alarm bei einer gewissen Enbtfernung zu aktivieren , was bedeuten würde das je nach Positionierung wenn ein festeger Gegenstand im Ultraschallfeld liegt es einen Alarm auslösen würde,sondern nur dann wenn das Ultraschall Signal sich verändert, Es wird also das jeweilige Ultraschall elde gespeicher und nur bei einer veränderung ein Alarm ausgelöst.

Ultraschall Funkmodul Version 1D
$regfile "m8def.dat" Definiert den Atmega als Atmega8
$crystal = 3276800
Gibt die Quarzfrequenz an in Herz
$hwstack = 32 Default use 32 Hardware reservierte Speicher
$swstack = 10
Default Software resvierung Speicher
$Baud

Output / Input
Ddrd.7 = 1  
Led Grün
Ddrd.5 = 0 
Echo Eingang
Ddrb.0 = 1 Trigger Ausgang
Portb.0 = 1 
Pull up aktivieren für Trigger Ausgang
Portd.5 = 1 Pull Up for Echo
Konfiguration fürs Display
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.6 , Db6 = Portd.3 , Db7 = Portd.2 , Rs = Portc.4 , E = Portc.5
Variable
Dim Puls1 as Long

Dim Puls2 as Long
Dim Puls1a as Long
Dim Puls2a as Long
Dim Stoerung As String * 7
Variable für Fehler Text
Dim cm as single
Variable für die Berechnete Entfernung
Dim cm_format as String * 10
Variable zur Formatierung der Variable Ausgabe auf Display
Startmeldung
Cls
Locate 1 , 1
Lcd "US-Funk"
Locate 2 , 1
Lcd "Version 1D"
Wait 3

Programm
Do
Portb.0 = 1
Trigger für US aussenden
Waitus 100 Pause
Portb.0 = 0 Trigger beenden
Waitms 10 Pause damit Trigger Led Zeit zum leuchten hat
Portd.7 = 0 Led gelb ausschalten
Pulsein Puls1 , Pind , 5 , 1 Eingang abfragen ob Echo anliegt und in Variable speichern
Puls1a=Puls1
sorgt dafür das erst wenn beide Variable nicht mehr gleich sind, sich also eine Verändert hat, das die Freigabe für Funkmodul gesetzt wird und dann zur Unterroutine Senden gesprungen wird.


Puls1a=puls1a/10
if puls1a <> Puls2a then Portb.1=1 else Portb.1=0
if puls1a <>Puls2a then gosub Senden


If Err = 1 Then Stoerung = "Fehler" Else Stoerung = ""
Err Variable nur Anzeigen wenn Störung vorhanden
cm=puls * 0.507
Berechnung der Entfernung
cm_format=fusing(cm,"#.#")
Formatierung der Längen Ausgabe
Puls2=puls1

Puls2a=Puls1

Puls2a=puls2a/10

wait 1

 Cls Display löschen
Locate 1 , 1 Cursor in Zeile 1 Spalte 1 setzen
 Lcd " P1=" ; Puls1 Anzeige von Text und Variableninhalt
Locate 1,8

Lcd "P2=";Puls2

Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
Lcd Stoerung
Error Variable als Text anzeigen
Locate 2,8
Cursor in 2 Zeile 8.Spalte setzen
Lcd"cm=";cm_format
Ausgabe der Länge in Centimeter auf Display
Waitms 100
Pause damit Display nicht flackert
Loop Rücksprung zum Programm Anfang








SAtromverbrauch bei 5 Volt
Ultraschall 5 mA
Funk 40 mA wenn aktiv
Funk 26 mA wenn Standby
Display nicht nennenswert



 
  • Falls die Pulszeit immer mit Null angezeigt werden sollte , kann es sein das die Zeit zwischen Trigger und Empfangener Impuls zu groß ist , evtl. ein Wait Statement zu groß, oder eine Pause enthalten die zu lang ist.
  • Beim Einschalten über den Mechanischen Ein/Aus Schalter zeigt das Display nicht immer die Einschaltmeldung an, sondern ab und zu nur Kästchen ohne Inhalt. - Die Spannungsversorgung zeigte ein Einschaltprellen und ein leichtes absinken der Betriebsspannung an.Das Prellen dauerte ungefähr 700 us.

aktualisiert 11.01.2014