- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Abfrage Ultraschallsensor HC-SR04 unter BASCOM

  1. #11
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    19.05.2012
    Ort
    Sigmaringen
    Beiträge
    169
    Anzeige

    LiFePo4 Akku selber bauen - Video
    So... da ich dann gestern abend in der Wanne den kopf nicht frei bekommen hab
    bin ich noch dazu gekommen den Programmansatz von Searcher umzuwandeln in ein Laufendes Programm.

    Sieht jetzt so aus:
    Code:
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    'Programmname:    Sensorabfrage.bas
    'Letzte Änderung: 13.11.2012
    'Funktion:        Abfrage des Ultraschallsensor hc-sr04
    '                 und Ausgabe über "Print"
    'Mikrocontroller: Mega8
    '
    'Input:           D2 - Echosignal
    '
    'Output:          C0 - Triggersignal
    '
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    'Den Atmega mit den passenden Daten füttern.
    '-------------------------------------------------------------------------------
    $regfile = "m8def.dat"                                      'eingesetzter Mikrocontroller
    $crystal = 8000000                                          'eingestellte Taktfrequenz (8MHz)
    $hwstack = 100                                              'Standardwert
    $swstack = 100                                              'Standardwert
    $framesize = 100                                            'Standardwert
    '-------------------------------------------------------------------------------
    'Ports/Pins konfigurieren.
    '-------------------------------------------------------------------------------
    Config Portc.0 = Output                                     ' Trigger-Signal zum Sensor
    Config Pind.2 = Input                                       ' Echo-Signal vom Sensor
    
    '-------------------------------------------------------------------------------
    'Timer/OCR/PWM/INT usw. setzen
    '-------------------------------------------------------------------------------
    Config Timer1 = Timer , Prescale = 8                        ' ergibt 1.000.000 ticks/sekunde
    Config Int0 = Change                                        ' Interrupt bei wechselnder Flanke am Echosignal starten
    On Int0 Echowechsel                                         '
    Enable Int0                                                 ' Wenn auf Echo gewartet wird wechselt Echo-Signal auf High
    Enable Interrupts                                           '
    
    '-------------------------------------------------------------------------------
    'Variablen
    '-------------------------------------------------------------------------------
    Dim Messungstarten As Bit                                   ' Zeigt an, ob Messung gestartet werden soll
    Messungstarten = 1
    Dim Messergebniss As Long                                   ' Ergebniss der Messung in us
    Messergebniss = 0
    Dim Messungbeendet As Bit                                   ' Zeigt an, ob Messung beendet ist
    Messungbeendet = 0
    Dim Entfernung As Long                                      ' Entfernung in mm
    Entfernung = 0
    Dim Kalibrierwert As Integer                                ' Zum genauen einstellen
    Kalibrierwert = 0
    
    '-------------------------------------------------------------------------------
    'Hauptprogramm
    '-------------------------------------------------------------------------------
    Do
       If Messungstarten = 1 Then                               ' Abfrage, ob Messung gestartet werden soll
       Waitms 20
       Portc.0 = 1                                              ' Impuls von 10us an Triggerport senden
       Waitus 10
       Portc.0 = 0
       Messungbeendet = 0
       Messungstarten = 0
       End If
    
       If Messungbeendet = 1 Then                               ' Berechnung des Ergebniss, wenn Messung beendet ist
       Entfernung = Messergebniss + Kalibrierwert
       Entfernung = Entfernung * 172
       Entfernung = Entfernung / 1000                           ' Ergebniss in mm
    
       Print Entfernung                                         ' Ausgabe des Ergebniss
       Waitms 300                                               ' Pause zwischen Messungen (bessere lesbarkeit)
    
       Messungstarten = 1                                       ' neue Messung starten
       End If
    
    
    Loop
    
    End
    
    '-------------------------------------------------------------------------------
    'Interrupt
    '-------------------------------------------------------------------------------
    
    Echowechsel:                                                ' Interrupt startet bei Signalwechsel am Echopin
       If Pind.2 = 1 Then                                       ' Wenn Pin zu High wechselt soll Timer1 Zeit zu messen
          Timer1 = 0
          Start Timer1
        Else                                                    ' wenn Pin zu LOW wechselt, messung beendet und Wert in Variable speichern
          Messergebniss = Timer1                                '  Wert in Variable speichern
          Messungbeendet = 1                                    ' Anzeigen, das Messung beendet ist
       End If
    
    Return
    Direkt zum Ergebniss des Timers hab ich noch einen Kalibrierwert gesetzt und der scheint soweit auch schon zu passen.
    Ich hab 2 identische Sensoren hier und beide liefern mir exakt die selben werte.
    Wie es sich bei entfernungen grösser als 1m verhält muss ich noch testen.

    Und ja... der Atmega8 läuft jetzt mit 8MHz... und ich hab auch die fusebits so gestellt.

    Späther soll das ganze mal mit 2-3 Sensoren auf ein Fahr-Chassis kommen.
    Da werd ich vermutlich (um Pins zu sparen) die Sensoren abwechselnd messen lassen.
    Das sollte von der Geschwindigkeit gut ausreichen. Soll ja kein Rennwagen sein.

    Was mir in deinem Code aufgefallen ist:

    Der Timer wird nur auf 0 gesetzt... Startet der automatisch wieder ?
    und die Flags hab ich als normale Variablen gemacht... so kann ich sie schnell ändern und
    im Zweifelsfall mehrere verschiedene Zustände übergeben.

    Vielen Dank für eure Tips und Hilfestellung.

    Gruss,... JoeM
    Geändert von JoeM1978 (14.11.2012 um 20:35 Uhr)

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hi JoeM,
    Der Timer wird nur auf 0 gesetzt... Startet der automatisch wieder ?
    Der Timer wird mit "Config Timer", genauer mit der Angabe von Prescaler gestartet. Ich lasse den einfach immer durchlaufen und stoppe den nicht. Nur wenn die Messung beginnt, muß er natürlich initialisiert werden, weil man in dem Augenblick nicht weis, wo er gerade ist. Wenn dann die fallende Flanke kommt, wird einfach der augenblickliche Wert gesichert. Timer kann ruhig weiterlaufen. Um den auf 0 zu setzten muß er nicht stehen.

    Bei dem Sensor habe ich noch Unklarheiten. In dem von Dir verlinkten Datenblatt steht, daß wenn kein Objekt erkannt wurde, der Echoimpuls 200ms lang sein würde, man aber schon nach 20ms eine neue Messung starten kann. In anderen Datenblättern zum hc-sr04 findet man die Angabe von 38ms.
    Wie verhält er sich tatsächlich?

    Außerdem ist mir nicht klar, warum man nur 50 Messungen pro Sekunde machen können soll. Plausibler erscheint mir da, daß man nach Ende des Echoimpulses noch ca. 10µs warten soll, bevor man eine neue Messung starten kann.

    Also vor dem "perfekten" Programm sind noch ein paar Fragen zu klären. Zunächst aber erstmal überhaupt was sinnvolles, reproduzierbares messen. Falls Du was hast, poste mal ein paar Werte mit den dazugehörenden, per Zentimetermaß gemessenen Entfernungen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #13
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    19.05.2012
    Ort
    Sigmaringen
    Beiträge
    169
    Was diese Werte angeht hat mich das auch verwirrt was im Datenblatt steht... Scheint mir teilweise recht wiedersprüchlich zu sein.
    Ich hab mal Probemessungen gemacht mit
    Code:
    Do
       If Messungstarten = 1 Then                               ' Abfrage, ob Messung gestartet werden soll
       Waitms 20
       Portc.0 = 1                                              ' Impuls von 10us an Triggerport senden
       Waitus 10
       Portc.0 = 0
       Messungbeendet = 0
       Messungstarten = 0
       End If
    
       If Messungbeendet = 1 Then                               ' Berechnung des Ergebniss, wenn Messung beendet ist
    
       Entfernung = Messergebniss + Kalibrierwert
       Entfernung = Entfernung * 172
       Entfernung = Entfernung / 1000                           ' Ergebniss in mm
       Print Messergebniss ; "=" ; Entfernung                   ' Ausgabe des Ergebniss
    
       Messungstarten = 1                                       ' neue Messung starten
       End If
    
    
    Loop
    Also nur 20ms pause bis zum nächsten Triggerimpuls.
    Als Messtolleranz (Meterstab) würd ich mal 1-2mm angeben.
    (Timerwert = Entfernung in mm)

    Abstand 100cm:
    5996=1031
    5997=1031
    6019=1035
    5995=1031
    5995=1031
    6021=1035
    6018=1035
    5995=1031
    5994=1030
    5996=1031
    6019=1035
    5995=1031
    5994=1030
    5995=1031
    6018=1035
    6018=1035
    6018=1035
    5995=1031
    6020=1035
    6017=1034
    Abstand 50cm:
    3156=542
    2973=511
    2973=511
    2972=511
    2974=511
    2972=511
    2972=511
    2973=511
    2971=511
    2974=511
    2973=511
    2973=511
    2972=511
    2973=511
    2973=511
    2972=511
    2973=511
    2973=511
    2972=511
    2972=511
    Abstand 10cm:
    Code:
    736=126
    557=95
    557=95
    557=95
    556=95
    556=95
    556=95
    556=95
    557=95
    557=95
    556=95
    556=95
    557=95
    557=95
    557=95
    557=95
    557=95
    556=95
    557=95
    557=95
    Der Messbereich, den ich späther brauche wird vermutlich kleiner als 1m bleiben.

    Als nächstes stell ich das Objekt in 100cm und versuche mit unterschiedlichen Pausenzeiten (vor dem nächsten Triggersignal).
    Mal sehen, ob sich dabei überhaupt etwas verändert bzw. wo hier die schnellstmögliche Zeit liegt.

    Gruss,... JoeM

    - - - Aktualisiert - - -

    Ich hab vergessen zu erwähnen, das der "Kalibrierwert" dazu auf 0 steht.

    Bei den Tests ist mir aufgefallen, das unterhalb einer Pausenzeit von 20ms die Werte um etwa +- 5mm abweichen...
    (Beispiel 10ms)
    5871=1009
    5847=1005
    5875=1010
    5872=1009
    5872=1009
    5873=1010
    5849=1006
    5872=1009
    5871=1009
    5873=1010
    5873=1010
    5872=1009
    5826=1002
    5849=1006
    bei 20ms liegt sie extrem drüber. nämlich bei + 30mm (und zusätzlich viele Fehlmessungen)
    6025=1036
    6004=1032
    6027=1036
    6029=1036
    6003=1032
    6029=1036
    3589=617
    3592=617
    3846=661
    6028=1036
    6027=1036
    4490=772
    4683=805
    5095=876
    5024=864
    5313=913
    5540=952
    5790=995
    6031=1037
    6032=1037
    6024=1036
    5916=1017
    5938=1021
    5917=1017
    6030=1037
    6051=1040
    5941=1021
    6030=1037
    5918=1017
    5940=1021
    und bei über 20ms ist die Messdifferenzen sehr genau
    (Beispiel 25ms)
    5848=1005
    5848=1005
    5847=1005
    5848=1005
    5826=1002
    5848=1005
    5847=1005
    5848=1005
    5848=1005
    5848=1005
    5847=1005
    5848=1005
    5847=1005
    5849=1006
    5848=1005
    - - - Aktualisiert - - -

    Da man hier den Datenblättern wohl nicht ganz exakt vertrauen kann...
    vieleicht hat
    @ Chypsylon
    da schon etwas mehr Erfahrungen gesammelt.

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Danke für die Info - Interessant. Sieht aber doch sehr brauchbar aus?
    Hab selber keine praktische Erfahrung mit Ultraschallsensoren. Zu den festgestellten Testergebnissen fällt mir jetzt auch nichts weiter ein.

    Hatte nach den 200ms gefragt, da bei einer so langen Zeit der Timer doch wieder überlaufen würde.

    Werde weiterschauen und falls mir noch was auffällt, melde ich mich wieder.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #15
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    19.05.2012
    Ort
    Sigmaringen
    Beiträge
    169
    ...Sieht aber doch sehr brauchbar aus?
    Ja. Das würde ich auch sagen... was Abstände kleiner 1m angeht werd ich wohl in der Praxis
    mit Pausenzeiten von 25ms arbeiten. Das ist für eine Auswertung absolut genug.
    Alles an Entfernungen über 1m interessiert für mich momentan eh nicht. Ich möcht ja nicht die ganze Wohnung ausmessen.
    Jetzt werd ich mich weiter mit der umsetzung des Programms für 2 solcher Sensoren beschäftigen...
    und auch mit der Auswertung der verschiedenen Situationen/Zustände. (Und die To-Do-Liste ist sehr lang *lach)

    Ich denke fürs erste Kann man das jetzt so stehen lassen.
    Ist sicher auch interessant für andere, die mit diesem Sensor arbeiten möchten.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Ultraschallsensor selbst bauen (Bascom)
    Von Janigut im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 26.04.2011, 16:58
  2. Ultraschallsensor HC-SR04 Probleme ungenauigkeit
    Von anfaenger201 im Forum Sensoren / Sensorik
    Antworten: 4
    Letzter Beitrag: 04.08.2010, 15:06
  3. pin abfrage mit bascom
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 05.09.2008, 13:59
  4. UART Sendepuffer-Abfrage mit Bascom
    Von Heideltrudel im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 03.08.2007, 22:12
  5. wav out mit PWM unter bascom?
    Von sebastian.heyn im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 18
    Letzter Beitrag: 10.06.2005, 10:02

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress