Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche einfache Ultraschall Empfänger + Sender (halbe HC-SR04)
-schumi-
07.09.2014, 23:06
Hallo,
ihr kennt ja mit Sicherheit die HC-SR04 Module:
29026
Das sind Ultraschall Distanzsensoren, die einen high-Pegel für die Laufzeit des Tons (Sender -> Gegenstand -> Empfänger) ausgeben.
Was ich jetzt suche sind im Prinzip halbe HC-SR04:
Sender Modul: Sendet einen Ultraschallton solange an einem Pin high anliegt
Empfänger Modul: Pin high solange dieser Ultraschallton empfangen wird
Das ganze sollte 5V kompatibel sein und sich in seiner Komplexität auf die aufgeführten Punkte beschränken (Hintergrund ist, dass ich mich mit der Erzeugung des Tons als auch der Filterung des empfangenen Tons nicht befassen möchte). Sender und Empfänger dürfen auch ein einziges Modul sein, aber ich muss beides unabhängig ansteuern/auslesen können (Ich möchte via Ultraschall u.a. einige Bytes schicken)
Ich dachte sowas schon mal irgendwo gesehen zu haben, kann jetzt aber nichts derartiges finden...
Würde mich über den ein oder anderen Tipp freuen
Simon
Hallo!
Ich habe mir bei ebay aus China 5 Stück von HC-SR04 zu knapp 5,40 € (inkl.Versand) gekauft und denke, dass man aus zwei Stück durch abschneiden unnötigen Teilen das von dir Gewünsches basteln kann. Siehe bitte dazu: https://www.roboternetz.de/community/threads/65347-Stromverbrauch-vom-HC-SR04 .;)
-schumi-
08.09.2014, 00:46
Hallo!
Ich habe mir bei ebay aus China 5 Stück von HC-SR04 zu knapp 5,40 € (inkl.Versand) gekauft und denke, dass man aus zwei Stück durch abschneiden unnötigen Teilen das von dir Gewünsches basteln kann. Siehe bitte dazu: https://www.roboternetz.de/community/threads/65347-Stromverbrauch-vom-HC-SR04 .;)
Ich habe auch noch 4 Stück da. Der von dir gepostete Link ist wirklich gut! -> http://uglyduck.ath.cx/ep/archive/2014/01/Making_a_better_HC_SR04_Echo_Locator.html
Im Prinzip könnte man also den Mikrocontroller der schon drauf ist entlöten und dann den Empfangs- und Sendeteil selbst ansteuern. Einziger Nachteil ist, dass man das Rechteck (+invertiertes Rechteck) für den Sendeteil wohl selbst einspeisen muss, was dann einen Timer kostet..
Also falls kein besseres Modul hergeht werde ich es so machen, herzlichen Dank! :)
Möglicherweise könnte mann es so "halbieren", dass nur der Empfänger mit LM324 von der HC-SR04 Platine abgeschnitten wird, aber der US Burst generierender µC bleibt und verwendet wird.
Es könnte sogar Empfänger und Sender aus einem Modul mit etwas Fädeln machbar sein. Man könnte, falls nötig, z.B. ein Echo für den µC aus dem entferntem Empfänger mit einem Monoflop zwishen "Threshold" und "Signal" emulieren, damit er eventuell nicht "hängen" bleibt (siehe Schaltplan).
Ich habe an sowas auch gedacht: also einen gepulsten nach oben gerichteten "rundum" Sender mit (halb)kugelförmigen "akustischen Spiegel" und 4 im Quadrat angeordnete umschaltbare Empfänger um freien Weg (z.B. in einem Labyrinth) zu finden, ohne mein "Sokuti" (Solarkunsttier) dafür drehen zu müssen. Deshalb wünsche ich Dir vieeel Erfolg, weil ich davon auch profitieren könnte. :D
-schumi-
08.09.2014, 12:50
Deshalb wünsche ich Dir vieeel Erfolg, weil ich davon auch profitieren könnte. :-)
Es ist immer eine Freude jemandem helfen zu können :)
Ich habe an sowas auch gedacht: also einen gepulsten nach oben gerichteten "rundum" Sender mit (halb)kugelförmigen "akustischen Spiegel" und 4 im Quadrat angeordnete umschaltbare Empfänger um freien Weg (z.B. in einem Labyrinth) zu finden, ohne mein "Sokuti" (Solarkunsttier) dafür drehen zu müssen.
Wobei du hier im Prinzip auch 4 HC-SR04 nehmen könntest du um die nacheinander abzufragen, dauert aber natürlich länger (Auch weil man jedes mal warten muss bis das Echo verschwunden ist)
Bei mir geht es um Postitionsbestimmung, indem die Strecke zu bestimmten Fixpunkten herausgefunden wird. Ich möchte genau wie du auch mit so einem akustischen Spiegel arbeiten. Allerdings wird nicht ein einfacher Burst gesendet, sondern einige Bits. Das ganze soll so funktionieren:
Hauptstation möchte Abstand zu Fixpunkt Nr. 3 wissen
Hauptstation sendet das Datenpaket (entsprichte einem "Empfänger: Nr 3; Befehl: Ping; Parity Bits") über den Spiegel in alle Richtungen und beginnt mit Zeitmessung
Nr. 3 emfängt das Paket
Nr. 3 wartet eine definierte Dauer bis die Echos weg sind
Nr. 3 sendet Antwortpaket ("Sender: Nr 3; Befehl: PingAntwort; Parity Bits")
Hauptstation emfängt Paket und kann aus der Zeitspanne den Abstand errechnen
Möglicherweise könnte mann es so "halbieren", dass nur der Empfänger mit LM324 von der HC-SR04 Platine abgeschnitten wird, aber der US Burst generierender µC bleibt und verwendet wird.
Es könnte sogar Empfänger und Sender aus einem Modul mit etwas Fädeln machbar sein. Man könnte, falls nötig, z.B. ein Echo für den µC aus dem entferntem Empfänger mit einem Monoflop zwishen "Threshold" und "Signal" emulieren, damit er eventuell nicht "hängen" bleibt (siehe Schaltplan).
Ja, das habe ich auch schon überlegt. Allderdings kann man dann die Länge des Bursts nicht selbst bestimmen, welches aber zur Datenübertragung benötigt wird. (Man müsste dann 1Bit=1Burst machen, wohl nicht funktionieren wird weil der IC nach dem ersten Burst damit beschäftigt ist das Signal am "Echo"-Pin des Moduls auszugeben)
Ich habe mich gerade an meine Werkbank gesetzt und werde jetz mal den Mikrocontroller rausbraten und dann einen Steckbrettversuch mit Atmega8 zu machen (sehen ob die Erzeugung und Detektion des Tons gut funktioniert)
-schumi-
08.09.2014, 23:25
Also einfache Abstandsmessung klappt mehr oder weniger:
29027
Allerdings gibt es einige Probleme, vor allem hinsichtlich der Datenübertragung:
- Die Empfängerkapsel hat anscheinend relativ viel Masse, d.h. wenn der Ton kommt braucht sie Zeit um anzuschwingen (ich vermute ein Grund warum der µC zu viel Abstand anzeigt) und wenn der Ton endet schwingt sie sehr lange nach
- Alles muss extrem schnell und auf die 2-3 µSekunden genau gehen. Ich glaube ich muss mich doch in Assembler einarbeiten.. (Einfach PWM mit Timer geht für Datenübertragung schlecht, weil man schlecht die Schwingungen zählen kann. Auch sollten nacheinander folgende highs des Datenstroms die gleiche Phasenlage haben, damit der Empfänger einfach weiterschwingen kann (sonst geht die Amplitude erst durch 0) und das ist schwierig wenn sich schon einzelne C-Befehle (z.B. Jump+for-Abfrage) als Phasenverschiebung bemerkbar machen (und man weis nicht wie lange die Befehle genau dauern))
- Der angebliche max232a (http://uglyduck.ath.cx/HC-SR04E/HC-SR04.svgz) ist bei mir keiner (hat auch keine Beschriftung..). Weder ladungspumpt noch invertiert er das Signal. Ich habe nachgemessen -> die Ein- und Ausgänge sind einfach kurzgeschlossen :mad::mad::mad:
Ich glaube ich mache gleich ein eigenes Design... (BTW hier gibts ein sehr gutes Datenblatt zu solchen Kapseln: http://www.reichelt.de/Sensoren/MUS-40E/3//index.html?ACTION=3&GROUPID=3190&ARTICLE=112244&SEARCH=ultraschall&OFFSET=16&WKID=0& Daran werd ich mich wohl orientieren )
Vielen Dank für so detailierten Bericht ! :)
- Die Empfängerkapsel hat anscheinend relativ viel Masse, d.h. wenn der Ton kommt braucht sie Zeit um anzuschwingen (ich vermute ein Grund warum der µC zu viel Abstand anzeigt) und wenn der Ton endet schwingt sie sehr lange nach
Das Modul ist für schnelle Datenübertragung nicht vorgesehen und man könnte nur mehrere Schwingungen als einen längeren Impuls interpretieren versuchen, so wie du in erstem Beitrag geschrieben hast:
Sender Modul: Sendet einen Ultraschallton solange an einem Pin high anliegt
Empfänger Modul: Pin high solange dieser Ultraschallton empfangen wird
Dann müsste man, wie im Datenblatt (DB): http://www.micropik.com/PDF/HCSR04.pdf mit Pegelwechsel beim Empfänger immer bis zum "Anschwingen" und "Ausklingen" abwarten bzw. schnelle Datenübertragung mit anderen Wandler ohne schwingender Masse z.B. LED + Fotosensor versuchen.
- Alles muss extrem schnell und auf die 2-3 µSekunden genau gehen.
Bei jeder Entwicklung gibt es anfangs nur Konjunktiv, also nie "muss", sondern immer "müsste" und man kann (fast) kein fertiges Bauteil ändern.
- Der angebliche max232a (http://uglyduck.ath.cx/HC-SR04E/HC-SR04.svgz) ist bei mir keiner (hat auch keine Beschriftung..). Weder ladungspumpt noch invertiert er das Signal. Ich habe nachgemessen -> die Ein- und Ausgänge sind einfach kurzgeschlossen :mad::mad::mad:
Ich habe in meinem Thread: https://www.roboternetz.de/community/threads/65347-Stromverbrauch-vom-HC-SR04 schon geschrieben:
Den MAX232 Wandler von 5 auf 20 V für US Sender finde ich echt schlau aber für mich unnötig, weil ich keine Reichweite 4 m brauche. Mir sollten um 15 cm bei ca. 3,7 V völlig ausreichen. ;)
Sollte ich an Telepathie glauben ?
Es könnte auch sein, dass die Chinesen zuerst die Bezeichnung entfernt haben und danach verkehrten IC eingelötet haben bzw. als Schutzmasnahme gegen Kopieren ein paar Brücken in Kunststoff als IC versteckt haben.
Als x-Entwickler kenne ich sowas schon lange, dass früher z.B. defekte Dioden als Brücken benutzt wurden um Reparaturen ohne Schaltplan praktisch unmöglich zu machen, weil auswechseln solcher Diode mit guter, das ganze nur noch veschlimmert hat. :confused:
Ich glaube ich mache gleich ein eigenes Design... (BTW hier gibts ein sehr gutes Datenblatt zu solchen Kapseln: http://www.reichelt.de/Sensoren/MUS-40E/3//index.html?ACTION=3&GROUPID=3190&ARTICLE=112244&SEARCH=ultraschall&OFFSET=16&WKID=0& Daran werd ich mich wohl orientieren )
Ich glaube nicht, dass es mit anderen Kapseln besser gehen könnte._.
Peter(TOO)
09.09.2014, 08:23
Hallo,
Allerdings gibt es einige Probleme, vor allem hinsichtlich der Datenübertragung:
- Die Empfängerkapsel hat anscheinend relativ viel Masse, d.h. wenn der Ton kommt braucht sie Zeit um anzuschwingen (ich vermute ein Grund warum der µC zu viel Abstand anzeigt) und wenn der Ton endet schwingt sie sehr lange nach
- Alles muss extrem schnell und auf die 2-3 µSekunden genau gehen. Ich glaube ich muss mich doch in Assembler einarbeiten.. (Einfach PWM mit Timer geht für Datenübertragung schlecht, weil man schlecht die Schwingungen zählen kann. Auch sollten nacheinander folgende highs des Datenstroms die gleiche Phasenlage haben, damit der Empfänger einfach weiterschwingen kann (sonst geht die Amplitude erst durch 0) und das ist schwierig wenn sich schon einzelne C-Befehle (z.B. Jump+for-Abfrage) als Phasenverschiebung bemerkbar machen (und man weis nicht wie lange die Befehle genau dauern))
Was spricht gegen eine Amplitudenmodulation des Sendesignals?
Deine Daten kannst du dann mit dem UART senden.
Senderseitig recht einfach:
Da brauchst du nur z.B. ein NAND Gatter.
Der Ausgang vom Timer (Oszillator) geht direkt auf dem einen Anschluss der Kapsel, der andere auf den einen Eingang des NAND. Der andere Anschluss der Kapsel geht auf den Ausgang des NAND. Der andere Eingang des NAND geht auf das UART.
Der Empfänger wird etwas aufwändiger:
Verstärker mit Frequenzfilter.
Signal gleichrichten mit grosser Zeitkonstante (Diode/C+R)
Signal gleichrichten mit kleiner Zeitkonstante (Diode/C+R)
Pegel mit Komparator vergleichen. (ca. 2/3 der Spannung mit der grossen Zeitkonstante direkt mit der anderen Spannung).
MfG Peter(TOO)
-schumi-
09.09.2014, 13:07
Was spricht gegen eine Amplitudenmodulation des Sendesignals?
Am Anfang dachte ich, dass es einfach zu lange dauert bis Amplitude der schwingenden Empfängerkapsel wieder runtergeht. Aber eine Messung zeigt, dass es mit ~ 1Bit/ms gehen könnte:
29030
Man kann den Nachteil dieser Emfpänger für Abstandsmessungen sehen: Man kann nicht genau sagen wann der Ton beim Empfänger angekommen ist, da die Amplitude nur langsam ansteigt. Das macht die Abstandsmessung ungenauer (die Abweichung von ~1cm im letzten Bild hängt glaube ich damit zusammen. Warscheinlich wird im orignalen Controller des Moduls ein Pauschalwert abgezogen, der der Zeit enstpricht die der Sinus am Emfpänger braucht um als Signal (also kein Noise) erkannt zu werden)
Vielen Dank für die Beschreibung zur Umsetzung einer Amplitudenmodulation! (In die Richtung geht auch mein Ansatz unten)
Dann müsste man, wie im Datenblatt (DB): http://www.micropik.com/PDF/HCSR04.pdf mit Pegelwechsel beim Empfänger immer bis zum "Anschwingen" und "Ausklingen" abwarten bzw. schnelle Datenübertragung mit anderen Wandler ohne schwingender Masse z.B. LED + Fotosensor versuchen.
Also Akustische Datenübertragung möchte ich nutzen, weil ich gleichzeitig die Laufzeit zur Berechung des Abstands brauche. Zwar währe ein zweiter Kanal zur Datenübertragung denkbar (allerdings dann gleich Funk, weil nicht immer gegeben ist dass der Lichtstrahl nicht unterbrochen wird (wird für draussen)), aber beides in einem wäre mir natürlich lieber.
Es könnte auch sein, dass die Chinesen zuerst die Bezeichnung entfernt haben und danach verkehrten IC eingelötet haben bzw. als Schutzmasnahme gegen Kopieren ein paar Brücken in Kunststoff als IC versteckt haben.
Ich vermute, dass irgend ein Chinesischer Hersteller das Modul nachgebaut hat und für billig billig den falschen MAX232 aufgesessen ist. Beim Test hats trotzdem funktioniert also wirds schon passen. So besonders ist das Modul ja auch nicht, dass man das reverse-Engineering großartig unterbinden müsste. Wenn dem Hersteller die 5V genügen hätte er sich den MAX232, 1 Transistor, 1 Widerstand und 5 Kondensatoren sparen können.. (der µC hat im übrigen auch keine Beschriftung, aber der tut was er soll)
Als x-Entwickler kenne ich sowas schon lange, dass früher z.B. defekte Dioden als Brücken benutzt wurden um Reparaturen ohne Schaltplan praktisch unmöglich zu machen, weil auswechseln solcher Diode mit guter, das ganze nur noch veschlimmert hat. :confused:
Also das ist ja wirklich dreist :-) Heute findet man dafür überall proprietäre Software+LockBits und ASICs..
Inzwischen habe ich viel herumprobiert, und bin heute Vormittag auch ein gutes Stück weitergekommen:
29031
Das Prinzip ist recht simpel: 1Bit=20Wellen 40KHz. Um bei Bit=high den Nulldurchgang der Amplitude zu erzeugen wird zwischen zwei Bits eine Pause von 5µs (+ein wenig CPU-Zeit) gemacht. Das hat zur folge, dass die Empfängerkapsel aus dem tritt kommt und neu einschwingen muss. Der Code ist auch pipieinfach:
void Tx (uint8_t data)
{
uint8_t stream[2+8+1];
uint8_t i, j;
stream[0]=1;
stream[1]=1;
for(i=0; i<8; i++)
{
stream[2+i] = (data&(1<<i))?1:0;
}
stream[10]=1;
for(i=0; i<2+8+1; i++)
{
for(j=0; j<20; j++)
{
Clear(Tx_PORT, Tx1);
Set(Tx_PORT, Tx2);
_delay_us(12);
Set(Tx_PORT, Tx1);
Clear(Tx_PORT, Tx2);
_delay_us(12);
}
if(stream[i])
_delay_us(5);
}
}
[...]
Tx(0b11000110);
Ich glaube das könnte was werden...
Besserwessi
09.09.2014, 18:32
Die Transducer sind halt Resonatoren im US-Bereich und haben eine relativ begrenzte Bandbreite. Dafür bekommt man mit relativ wenig Leistung eine brauchbare Amplitude und beim Empfänger gleich ein Filterung. Für die Laufzeitmessung ist das tatsächlich nicht ideal, aber so sind nun mal die üblichen Transducer. Das Problem ist halt mitzubekommen welche Periode man gerade empfängt. Die Datentransferrate ist halt durch die Bandbreite begrenzt: die dürfte so in der Größenordnung 1-5 kHz liegen - da sind 1 ms/Bit schon recht gut.
Über eine etwas geänderte Signalform könnte man da noch einiges bei der Zeitmessung Verbessern:
Eine Möglichkeit ist dabei als Signal erst etwa 10-20 Periode zu senden (so dass der transducher gut Ampltude erreicht) und dann die Phase um 180 Grad zu ändern - die Ampltude geht dann schnell zurück und auf die andere Phase. Der Empfänger wertet dann den Punkt aus, wo die Amplidude wieder annähernd Null wird. Mit einer Phasenstarren Auswertung (d.h schon etwas Aufwändiger als mit dem HC05 Modul), kann man den Zeitpunkt so recht genau Treffen und damit die Unsicherheit um ganze Perioden überbrücken.
Der Code zum Senden benutzt schon so etwas wie eine Phasenmodulation: bei einem 1 Bit kommt die Extra Verzögerung dazu (sollte vermutlich besser etwa 12 µs sein, nicht nur 5 µs). Das gibt dann beim Empfänger einen deutlichen Einbruch (einmal kurz durch Null) in der Amplitude und auch einen Sprung in der Phase - sofern der Empfänger das misst. Das ist schon ein recht robustes Protokoll. Vermutlich könnte man die Bits sogar noch etwas schneller senden. Bei mehr als etwa 16 Bits muss man sich ggf. noch Gedanken um die Syncronisation machen - wobei der Empfänger im Prinzip die US Periode zählen könnte. Schneller senden hätte den Vorteil, dass einem Echos nicht so dazwischen kommen.
-schumi-
09.09.2014, 20:49
Danke für deine Antwort Besserwessi!
Die Transducer sind halt Resonatoren im US-Bereich und haben eine relativ begrenzte Bandbreite. Dafür bekommt man mit relativ wenig Leistung eine brauchbare Amplitude und beim Empfänger gleich ein Filterung. Für die Laufzeitmessung ist das tatsächlich nicht ideal, aber so sind nun mal die üblichen Transducer. Das Problem ist halt mitzubekommen welche Periode man gerade empfängt. Die Datentransferrate ist halt durch die Bandbreite begrenzt: die dürfte so in der Größenordnung 1-5 kHz liegen - da sind 1 ms/Bit schon recht gut.
Ja, die Filterung ist echt gut. Ich glaube den Bandpass kann ich mir sogar sparen. Von der Datenrate her bin ich inzwischen bei 0.5 ms/Bit angelangt
Über eine etwas geänderte Signalform könnte man da noch einiges bei der Zeitmessung Verbessern:
Eine Möglichkeit ist dabei als Signal erst etwa 10-20 Periode zu senden (so dass der transducher gut Ampltude erreicht) und dann die Phase um 180 Grad zu ändern - die Ampltude geht dann schnell zurück und auf die andere Phase. Der Empfänger wertet dann den Punkt aus, wo die Amplidude wieder annähernd Null wird. Mit einer Phasenstarren Auswertung (d.h schon etwas Aufwändiger als mit dem HC05 Modul), kann man den Zeitpunkt so recht genau Treffen und damit die Unsicherheit um ganze Perioden überbrücken.
Genau so versuche ich es zu machen
Der Code zum Senden benutzt schon so etwas wie eine Phasenmodulation: bei einem 1 Bit kommt die Extra Verzögerung dazu (sollte vermutlich besser etwa 12 µs sein, nicht nur 5 µs).
Genau, dass es 12µs anstatt 5µs sein müssten (für 180° Phasenverschiebung) habe ich mir auch gedacht. Komischerweise schwingt der Empfänger aber komplett unbeeindruckt weiter. Ich habe vieles durchprobiert und 5µs scheinen am besten zu funktionieren. Warum das so ist weis ich noch nicht so recht..
Das gibt dann beim Empfänger einen deutlichen Einbruch (einmal kurz durch Null) in der Amplitude und auch einen Sprung in der Phase - sofern der Empfänger das misst. Das ist schon ein recht robustes Protokoll. Vermutlich könnte man die Bits sogar noch etwas schneller senden. Bei mehr als etwa 16 Bits muss man sich ggf. noch Gedanken um die Syncronisation machen - wobei der Empfänger im Prinzip die US Periode zählen könnte. Schneller senden hätte den Vorteil, dass einem Echos nicht so dazwischen kommen.
Insgesammt habe ich mir das so vergestellt / entwickelt sich es dahin:
Es gibt einen Master, Slaves dürfen nur auf Anfrage senden (Analog zu I2C)
20 Perioden pro Bit
Ein Anfangsbit das einfach nur den Empfänger zum schwingen anregt
2 Start-bits. Der richtige Abstand der beiden Bits weist darauf hin, dass es ein Paket ist (Und kein anderer Ultraschallsender). Ausserdem dienen die beiden Bits als Refferenzpunkt für die Zeitmessung
16 Datenbits
2 Parity bits
für high-bits gibt es eine steigende Flanke (siehe nachfolgenden Inhalt), damit die Snychronisation unterstützt (es zeigt sich nämlich, dass wenn sich Dinge in unmittelbarer Umgebung bewegen es (augenscheinlich) leichte zeitliche Verzerrungen geben kann)
Zum Aktuellen Status. Das ist mein aktueller Versuchsaufbau:
29033
Rechts der Sender, der direkt an einen Atmega8 angeschlossen ist. Links der Empfänger.
29034
Die symmetrische durscheinende Fläche ist das empfangene Signal (Es sieht so zerhackt aus wegen der chopped-Darstellung). Dieses schwingt um ca. 1.3V und wird durch einen CA3140 als Impedanzwandler gejagt. Anschließend einfach gleichgerichtet und durch C mit R-Last gepuffert, dadurch bleibt nur noch die Amplituden-Kontur der oberen Hälfte bestehen.
29035
Von der Amplituden-Kontur wird ein zweites ganz leicht phasenverschobenes Signal erzeugt (R+C), dann werden beide in einen Komparator (CA3140) geführt. Dadurch zeigt der Komparator an ob die Kurve steigt oder fällt (Durch Hysterese werden ganz kleine Schwankungen ignoriert).
Das Ganze funktioniert so gut, dass man bei guten Bedingungen (=obiger Versuchsaufbau) schon allein an der Ausgabe des Komparators die Daten rekonstruieren kann, ganz ohne den Spannungswert der Kontur-Kurve zu beachten.
Das letzte Oszibild schaut wirklich sehr gut aus. Ich möchte bloss nahe Hindernisse detektieren und wegen ausreichender Selektivität und kleinsten Gewicht nur einen Transducer sowohl für Senden als auch Empfangen verwenden. Ich habe schon ein US Modul total zerlegt und gesehen dass die zwei Transducer mit unterschiedlichen Buchstaben ("R"eceiver und "T"ransmitter) markiert waren.
Deshalb habe ich kleine bitte an den -schumi- : falls möglich, bitte die Transducer im Versuchsaufbau nur kurz zu vertauschen um festzustellen, ob sie sich wirklich bedeutend unterscheiden. Herzlichen Dank dafür im voraus. :)
Besserwessi
09.09.2014, 21:44
Ein Grund wieso es nur 5 µs für den Sprung sind, könnte sein, dass die Abfrage davor auch noch etwas Rechenzeit braucht. Das könnte noch etwas besser werden, wenn man die letzte Periode vor der Abfrage an die Rechenzeit anpasst und etwas kürzer macht. So hat man halt immer etwas Verzögerung dazu: Man sieht auch bei den folgen von 0 Bits noch ein bisschen Struktur. Eine zusätzliche Verzögerung von 5-7 µs allein durch die IF Abfrage kommt mir aber auch recht lang vor. Man könnte es ggf. am Sendesignal erkennen. Wie schnell läuft denn der µc ?
Durch ein nicht ganz ideale Frequenz könnte es ggf. auch noch zu ein paar Verschiebungen kommen. Da müsste man ggf, wirklich auf ASN zurückgreifen, oder das Signal per Timer (PWM bzw. Waveform-Generator mode) erzeugen. Damit wäre man von der Programm-Laufzeit weg.
So wie das Signal Aussieht könnte man vermutlich noch bis 0,25 - 0,3 ms je Bit runter gehen - das wäre dann etwa 10-12 Perioden statt 20. Es sollte ausreichen wenn die Amplitude bei einem 0 Bit (als ohne Störung) bis auf etwa 70% des Maximalwertes hoch geht. Länger warten bringt nicht mehr so viel. Nur die Synchrornisation braucht dann ggf. besser ein 101 statt zwei 1 Bits.
Das Signal sieht so schon sehr gut aus, auch schon einfach nur mit dem Komparator. Im realen Fall muss man aber vermutlich das ganze noch an eine variabel Amplitude anpassen. Mit dem Direkten Signal, also ohne Reflexion wird das Signal ggf. sogar noch Stärker ! So ganz schnell ist das Amplituden-Signal auch nicht mehr - das könnte der µC ggf. auch per ADC auswerten. Für die Daten reicht es ja die Amplituden zu den passenden Zeiten Auszuwerten - die Komparatorschaltung wäre mehr etwas zur Synchronisation und für die Abstandsmessung.
Der ADC im AVR ist leider relativ langsam, sonst könnt es ggf. auch klappen die Auswertung größtenteils in Software zu machen: Das Signal mit z.B. 160 kHz Abtasten und dann Rechnen - wegen des begrenzten Speichers, so dass man in Echtzeit damit fertig wird.
-schumi-
09.09.2014, 21:47
falls möglich, bitte die Transducer im Versuchsaufbau nur kurz zu vertauschen um festzustellen, ob sie sich wirklich bedeutend unterscheiden. Herzlichen Dank dafür im voraus. :)
Also die Amplitude bricht um ca. <edit> 2/3 </edit> ein und die Modulation funktioniert nicht mehr so (keine Nulldurchgänge der Amplitude mehr). Wenn du nur senkrechte Flächen und kleine Abstände hast könnte es wohl gehen
Besserwessi
09.09.2014, 21:56
@Picture:
Die Transducer sind schon etwas verschieden. Die Resonanzfrequenz und die Güte ist etwas unterschiedlich und der Empfänger ist etwas hochohmiger (weniger Kapazität). So dramatisch ist der Unterschied nicht - die Amplitude wird halt es etwas kleiner und es rauscht ggf. etwas mehr. Es gibt ja die Module mit nur einem Transducer. Bei kurzer Entfernung ist die Amplitude eher nicht das Problem. Eher hat man ein Problem das die Restamplitude von der Anregung abgefallen sein muss, bevor man vernünftig was empfangen kann. Ein bisschen kann man da am Anfang Tricksen mit der Phase, aber dann wird man ein paar ms Warten müssen das die Eigenschwingung abklingt. Entsprechend muss man mit einer Totzeit von vielleicht 2-5 ms oder 0,3-0,7 m Mindestabstand rechnen.
Schönsten Dank an Ihr beide, dann werde ich sicher versuchen, weil ein Abstand vom Hindernis um 10 cm reicht fast sicher aus.
Die Resonanzfrequenz und die Güte ist etwas unterschiedlich und der Empfänger ist etwas hochohmiger (weniger Kapazität).
Deshalb sollte es mit einem noch besser funktionieren. :Strahl
Besserwessi
09.09.2014, 22:37
Der ein Transducer wird besser gehen als der andere, aber beide haben eine relativ hohe Güte und brauchen entsprechend relativ lange zum Abklingen. Nach den Typischen Kurven in den Datenblättern liegt man so bei etwa 2-5 kHz Bandbreite. Aus den Kurven oben kriegt man auch eine Zeitkonstante für da Abklingen von etwa 0,2-0,5 ms. Von den Zeiten wird man so etwa 0,2 ms Senden müssen, dann noch mal etwa 0,1 ms zum Aktiven reduzieren der Amplitude und dann halt noch einmal 2-3 Zeitkonstanten warten. Da wird man kaum unter 1 ms kommen, bevor man Empfangen kann. 10 cm wird also kaum drin sein - 20 cm vielleicht. Mit anderen stärker gedämpften Transducern, etwa den Wasserfesten könnte es gehen.
Im Prinzip ist die Dämpfung von der äußeren Beschaltung abhängig - ganz ausgeschlossen ist es also nicht da auch Aktiv die Schwingung zu Dämpfen. Es dürfte aber einfacher sein 2 Transducer zu nutzen. Damit sollte es auch kürzer gehen - man kann dann auch gleichzeitig senden und Empfangen.
Ich habe gerade aus 5 vorhandenen chinesischen US Modulen HC-SR04 die 10 Transducers ausgelötet und vermessen. Alle haben Kapazität im Bereich 2,00 bis 2,25 nF. Die Resonanzfrequenz brauche ich bei einem Transducer für Senden und Empfangen nicht messen. :)
Beide ungekenzeichnete Transducer aus dem Kemo-Bausatz von Pollin: http://www.pollin.de/shop/dt/NTg5OTE0OTk-/Bausaetze_Module/Bausaetze/Bausatz_Ultraschall_Abstandswarner.html haben gleiche Kapazitäten 1,4 nF.
Übrigens, das Minimieren des Abklingens werde ich per Reduzieren der Amplitude versuchen, weil ich Hindernisse nicht weit suchen muß und es sollte sehr energiesparsam sein.
Besserwessi
10.09.2014, 17:39
Ein kleinere Amplitude reduziert das Problem mit dem Abklingen nicht wirklich. Es wird halt beides kleiner: die Störungen und das Signal. Was man machen kann, ist so ähnlich wie hier mit der Modulation, einen Phasensprung einzubauen und die Amplitude damit so gut es geht zurück zu fahren - ggf. könnte man dass sogar in einer Art Regelschleife Optimieren. Das geht halt schneller als der Exponentielle Abfall, geht aber nicht perfekt. Über die Beschaltung (Lastwiderstand passend zur Impedanz) kann man die Dämpfung ggf. auch noch etwas erhöhen. Es hängt dann stark davon ab, wie stark das Hindernis zurück streut, ob das Echo stärker ist als das unvermeidliche Nachklingen.
Realistische Chancen hätte ggf. die Nachregelung der Anregung, so dass man mit fast 0 Amplitude aufhört. Also direkt nach der Anregung schon messen, und die Anregung automatisch so anpassen (Nachregeln der Phase bzw. Frequenz und der Stärke des Dämpfungspulses), dass man direkt nach der Anregung fast kein Signal bekommt. Um wirklich nahe 0 zu kommen wird man vermutlich nachregeln müssen, denn mit der Temperatur wird sich die Frequenz/Dämpfung etwas verschieben.
Eine andere Möglichkeit wäre ggf. noch absichtlich nicht bei der Resonanzfrequenz zu senden und Empfangen, sondern ein paar kHz daneben, so dass man das Signal von der Resonanz unterscheiden kann. Das erfordert allerdings schon eine relativ Aufwendige Auswertung, etwa mit Phasenstarrer Detektion.
Vom Aufwand ist aber der 2. Transducer wohl einfacher.
-schumi-
11.09.2014, 14:00
Ein Grund wieso es nur 5 µs für den Sprung sind, könnte sein, dass die Abfrage davor auch noch etwas Rechenzeit braucht. Das könnte noch etwas besser werden, wenn man die letzte Periode vor der Abfrage an die Rechenzeit anpasst und etwas kürzer macht. So hat man halt immer etwas Verzögerung dazu: Man sieht auch bei den folgen von 0 Bits noch ein bisschen Struktur. Eine zusätzliche Verzögerung von 5-7 µs allein durch die IF Abfrage kommt mir aber auch recht lang vor. Man könnte es ggf. am Sendesignal erkennen. Wie schnell läuft denn der µc ?
Weil der interne Oszillator zu ungenau ist um eine Phasnverschiebung um 12µs hinzubekommen (anderer µC -> funzt nicht mehr) habe ich jetzt am Sender einen 12MHz quarz dran. Jetzt sieht das ganze auch schon viel besser aus: Die Wartezeit ist 10µs, die restlichen 2µs gehen vermutlich für das IF usw drauf.
So wie das Signal Aussieht könnte man vermutlich noch bis 0,25 - 0,3 ms je Bit runter gehen - das wäre dann etwa 10-12 Perioden statt 20. Es sollte ausreichen wenn die Amplitude bei einem 0 Bit (als ohne Störung) bis auf etwa 70% des Maximalwertes hoch geht. Länger warten bringt nicht mehr so viel. Nur die Synchrornisation braucht dann ggf. besser ein 101 statt zwei 1 Bits.
Leider musste ich sogar wieder auf 1ms/Bit rauf.. Das liegt daran, dass erst nach so langer Zeit die Amplitude des Empfängers nicht mehr weiter steigt. Ansonsten hat man wenn zwei mal 1 hintereinander gesendet wird eine kleinere Spitzenamplitude als bei 101, was die Zuverlässigkeit der Übertragung deutlich schmälert.
Das Signal sieht so schon sehr gut aus, auch schon einfach nur mit dem Komparator. Im realen Fall muss man aber vermutlich das ganze noch an eine variabel Amplitude anpassen. Mit dem Direkten Signal, also ohne Reflexion wird das Signal ggf. sogar noch Stärker ! So ganz schnell ist das Amplituden-Signal auch nicht mehr - das könnte der µC ggf. auch per ADC auswerten. Für die Daten reicht es ja die Amplituden zu den passenden Zeiten Auszuwerten - die Komparatorschaltung wäre mehr etwas zur Synchronisation und für die Abstandsmessung.
Also ich mache es im Moment mit zwei Komparatoren: Der eine Zeigt an ob das Signal steigt oder fällt (also die Flanken) und der andere ob das Signal über Spitze/2 ist oder nicht (also den Pegel). Wenn eine high-Flanke anfängt und der Pegel (noch) low ist (Nulldurchgang = 1) wird es als eine 1 gewertet. Falls keine Flanken kommen oder der Pegel high ist wird als 0 gewertet.
Hier der Sender.
29039
Atmega8 mit besagtem 12MHz Quarz. Die Leitung ist die Versorgungsspannung (4.3V, was vom USB noch so übrig bleibt :))
Der Empfänger:
29040
Poti links ist für die Spannung um die das Empfängssignal schwingt. Der IC links ist ein CA3140 als Verstärker, das ist der einzige OP den ich da habe der schnell genug ist. Dummerweise kann der bei 5V single supply nur ca. 2.5V maximal ausgeben -> hier muss noch was anderes her. Das Zweite Poti ist die Last für den C, der die Spannung für die Kontur-Kurve puffert. Rechter IC sind 4x OPs, zwei davon als Komparator (Flanken + Pegel)
Und so sieht das am Oszi aus:
29041
Und es funktioniert erstaunlich gut! Über eine Strecke von 6m kann ich das Byte schon stabil übertragen! :cool:
Nur bei Störungen hat man eine Chance von 25% dass die Checksumme stimmt (2bit), von daher können da manchmal Fehler passieren.. (-> längere Checksumme)
Und dabei gibt es noch Verbesserungspotenzial:
CA3140-Alternative mit rail-to-rail
MAX232 für Sender
-schumi-
16.09.2014, 23:31
Das letzte Oszibild schaut wirklich sehr gut aus. Ich möchte bloss nahe Hindernisse detektieren und wegen ausreichender Selektivität und kleinsten Gewicht nur einen Transducer sowohl für Senden als auch Empfangen verwenden.
Vielleicht noch interessant für dich: Ich habe bei Voelkner einen Ultraschall Empfänger+Sender in einem Gehäuse gefunden: http://www.voelkner.de/products/40909/Offener-Ultraschallsensor-A-16p-T-R.html
Hab mir mal welche bestellt, weil bei mir beide Seiten senden und empfangen müssen - spart Platz und macht die akustischen Spiegel einfacher. Werde berichten wie gut die Teile funktionieren :)
Vielen Dank für die Info, aber das ist angeblich nicht so wie du denkst. Beim Lieferumfang sind zwei Kapseln angegeben: Sender + Empfänger, also für mich ist es uninteressant weil ich beides bereits habe. ;)
Besserwessi
17.09.2014, 20:29
Bei der Datenübertragung macht es nichts, wenn die Amplitude bei einer 11 Bitkombination nicht so groß wird. Für die Bitwerte ist es da nur wichtig das Die Amplitude zur passenden Zeit klein ist. Für die Synchronisation ist dann ggf. schon das Muster 101 besser geeignet. Wenn man die Synchronisation einmal hat kann man den Rest rein über die Zeit auswerten, etwa über die SPI Schnittstelle als Master oder ggf. auch die UART am µC. Wenn man will könnte man weitere "Nulldurchgänge" auch noch für die Zeitmessung nutzen - die können aber bei kurzer Bitzeit auch etwas verschoben sein.
Wenn der Empfangende µC nicht viel zu tun hat, sollte es auch reichen das Signal der Einhüllenden über den AD Wandler abzutasten. Bei 0,5 - 1 ms je Bit sollte ein Abtastung mit etwa 5-10 kHz eigentlich locker ausreichen, selbst um die Zeit für die Minima im Signal recht genau zu bestimmen.
Die Transducer sind eigentlich alle sowohl als Sender als auch Empfänger geeignet. So wirklich groß ist der Unterschied nicht. Einen anderen Typen könnte man ggf. Testen - der ist ggf. stärker gedämpft für ein schnellere Übertragung.
-schumi-
30.09.2014, 19:10
Vielen Dank für die Info, aber das ist angeblich nicht so wie du denkst. Beim Lieferumfang sind zwei Kapseln angegeben: Sender + Empfänger, also für mich ist es uninteressant weil ich beides bereits habe. :wink:
Verdammt, da hast du recht. Ist mir erst aufgefallen als das Zeug angekommen ist :-/
Bei der Datenübertragung macht es nichts, wenn die Amplitude bei einer 11 Bitkombination nicht so groß wird. Für die Bitwerte ist es da nur wichtig das Die Amplitude zur passenden Zeit klein ist.
Theoretisch schon. Praktisch ist das aber nicht so einfach, da durch schlechten Empfang das alles etwas verwaschen wird. Wenn der Empfänger immer so stark schwingt wie er kann ist der Störabstand größer, was die Zuverlässigkeit deutlich erhöht.
Für die Synchronisation ist dann ggf. schon das Muster 101 besser geeignet.
Warum? Wenn man 11 sendet sieht das Empfangssignal so aus: --_--_--
Bei 101: --_------_--
Sprich nur die Zeit zwischen den beiden Punkten mit kleiner Amplitude wird größer.
Wenn man die Synchronisation einmal hat kann man den Rest rein über die Zeit auswerten, etwa über die SPI Schnittstelle als Master oder ggf. auch die UART am µC. Wenn man will könnte man weitere "Nulldurchgänge" auch noch für die Zeitmessung nutzen - die können aber bei kurzer Bitzeit auch etwas verschoben sein.
Also bis jetzt ist es so, dass der µC via Timer die restlichen Bits über die Zeit auswertet. Immer wenn die Amplitude klein ist und zeitlich ungefähr passt wird der Timer nachjustiert.
Wenn der Empfangende µC nicht viel zu tun hat, sollte es auch reichen das Signal der Einhüllenden über den AD Wandler abzutasten. Bei 0,5 - 1 ms je Bit sollte ein Abtastung mit etwa 5-10 kHz eigentlich locker ausreichen, selbst um die Zeit für die Minima im Signal recht genau zu bestimmen.
Das wäre wohl auch eine Möglichkeit. Falls die Komparatorlösung Probleme macht werd ichs mit dem ADC versuchen. Zudem würde man sich zwei Komparatoren und einiges Analogzeug sparen. Eigentlich doch probierenswert, aber fällt erstmal unter Feintuning
Die Transducer sind eigentlich alle sowohl als Sender als auch Empfänger geeignet. So wirklich groß ist der Unterschied nicht. Einen anderen Typen könnte man ggf. Testen - der ist ggf. stärker gedämpft für ein schnellere Übertragung.
Besonders schnell müssen sie bei meiner Anwendung ja nicht sein. Man muss sowiso immer einige ms warten bis die Echos verschwunden sind. Wichtiger wäre, dass der Empfänger bei 40Khz möglichst empfindlich ist, damit man große Distanzen bewältigen kann.
Die Distanzmessung funktioniert inzwischen auch recht gut:
https://www.youtube.com/watch?v=gQTz4MpgGNA
Besserwessi
30.09.2014, 20:58
Zur Anpassung der Amplitude gibt es 2 relativ einfache Möglichkeiten: Das Sendesignal könnte über die PWM Einstellung angepasst werden - darüber könnte der µC weniger stark senden. Eine variable Verstärkung bekommt man über einen Transistorverstärker für das Signal hin - im RN_wissensbereich ist da ein Artikel über einen Selbstbau-US-Sensor.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.