Link zur Hauptseite des Forums

LotharGehlhaar - Teichbauforum

DAS informative Forum der Koi-Szene
Link zur Enzyklopaedie
Aktuelle Zeit: Sa 27.Apr 2024 19:40

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 225 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5, 6 ... 23  Nächste
Autor Nachricht
BeitragVerfasst: Mo 30.Mär 2015 14:26 
Offline
Anonymer User
Benutzeravatar

Registriert: Do 03.Jan 2013 13:07
Cash on hand:
3.339,23 Taler

Beiträge: 646
Hallo Pfiffikus,

danke für deine Antwort. :)

Pfiffikus hat geschrieben:
schnuffi hat geschrieben:
Mich würde hier echt interessieren, wie du dies programmiert hast :). Gerne auch per PN. Leider bin ich PHP :hammer3: (Muss mich da erst einmal rein lesen)

Kannst Du jederzeit nachlesen in /var/www/steuerung/quellen/sensoren/cPegelHCSR04Sensor.php derzeit in den Zeilen 48 bis 80.

Jetzt wo ich die Stelle gefunden habe wird es klarer. :hallo:

Ich habe nur ein paar Fragen dazu:(Aus reinem Interesse :D )
1. Warum machst du das Schiebregister bis 11m (Im Code steht übrigens 12m :?: ) -> Der Sensor kann doch nur bis max. 3m messen
2. Wenn mehr als die hälfte der Werte einen Wert hat nimmst du diesen als Mittelwert an, korrekt?
3. Die Schleife würde ja bis zum Ende durchlaufen (alle 12000), wenn Punkt 2 nicht erfüllt wird
4. Warum addierst du am Ende noch einmal 3mm auf den Mittelwert drauf?

Code:
   /** ********************
   *   cPegelHCSR04Sensor::GetGenau
      Liest die Entfernung des Sensors oefters aus
   **********************/
   function GetGenau($iAnz   =   20) {

      for($i=0;$i<$iAnz;$i++) {
         $wert[$i]   =   $this->Messen();
      }

      //   Schiebe das Intervall von 0 bis 11000 mm
      $maxtreffer   =   0;   $Mittelwert   =   0;
      for ( $i=0 ; $i<12000 ; $i++) {
         $treffer   =   0;   //   Zaehle die Treffer
         foreach ($wert AS $Pkt) {
            if (($Pkt > $i-4) AND ($Pkt < $i+4))   $treffer++;
         }

         //   Wenn mehr Treffer als $maxtreffer, dann aktualisiere $Mittelwert und $maxtreffer
         if ($treffer > $maxtreffer) {
            $maxtreffer   =   $treffer;
            $Mittelwert   =   $i;
         }

         //   Wenn ueber $iAnz/2 Treffer vorzeitiger Abbruch des Schiebens
         if ($treffer > $iAnz / 2) break;
      }

      //   Bei defektem Sensor
      if ($Mittelwert < 1) return 0;
      //   Das ist etwa die Mitte des Intervalls, liefert die in PHPUnit vorgegebenen Messwerte
      return $Mittelwert+3;
   }



Pfiffikus hat geschrieben:
Das Interesse ist groß. Nicht nur für die Enzyklopädie, sondern auch für die Hilfedatei, die ich direkt in die Software integrieren möchte.

Pfiffikus.
der diesen Schaltplan zusätzlich noch direkt in die Hilfedatei der Software integrieren würde


Ich werde einen erstellen und dir hier zukommen lassen.
Bitte noch einmal daran erinnern, falls ich es vergesse. ;)

_________________
____________________
Viele Grüße
Dennis
____________________


Nach oben
 Profil userposition on geomap  
 
BeitragVerfasst: Mo 30.Mär 2015 16:34 
Offline
Anonymer User
Benutzeravatar

Registriert: Do 03.Jan 2013 13:07
Cash on hand:
3.339,23 Taler

Beiträge: 646
Pfiffikus hat geschrieben:
Code:
sudo /var/www/steuerung/quellen/sensoren/echolot.py 18 17
sudo /var/www/steuerung/quellen/sensoren/echolot.py 18 21
sudo /var/www/steuerung/quellen/sensoren/echolot.py 18 22


Code:
pi@Teich /var/www/steuerung/quellen/sensoren $ sudo python echolot.py 18 17
165 mm


Hat funktioniert: Den Rest kann ich leider erst nachher probieren. Muss erst mal zum training :)

_________________
____________________
Viele Grüße
Dennis
____________________


Nach oben
 Profil userposition on geomap  
 
BeitragVerfasst: Di 31.Mär 2015 1:00 
Offline
Realer User
Realer User
Benutzeravatar

Registriert: Mo 14.Nov 2005 20:39
Cash on hand:
5.718,34 Taler

Beiträge: 14513
Wohnort: 07548 Gera
Hallo Dennis,

schnuffi hat geschrieben:
Ich habe nur ein paar Fragen dazu:(Aus reinem Interesse :D )
1. Warum machst du das Schiebregister bis 11m (Im Code steht übrigens 12m :?: ) -> Der Sensor kann doch nur bis max. 3m messen

Die maximale Reichweite des Sensors hatte ich gerade nicht auf dem Schirm, als ich diese Messwertkorrektur programmiert hatte. Ist aber nicht weiter relevant, weil die Schleife praktisch fast immer wegen Deines Punktes 2 abgebrochen wird.
Den Kommentar hab ich dann nicht korrigiert, als ich den Endwert aus irgendeinem Grund noch einmal geändert hatte. Der Grund, warum ich den Wert noch einmal hoch gesetzt hatte, ist mir nicht mehr in Erinnerung.

schnuffi hat geschrieben:
2. Wenn mehr als die hälfte der Werte einen Wert hat nimmst du diesen als Mittelwert an, korrekt?

Nicht ganz. Es wird abgebrochen, wenn sich mehr als die Hälfte der Messwerte im Intervall häufen.
Code:
if (($Pkt > $i-4) AND ($Pkt < $i+4))   $treffer++;

Logischerweise können sich woanders nicht noch mehr Messwerte häufen. Deshalb kann abgebrochen werden.

schnuffi hat geschrieben:
3. Die Schleife würde ja bis zum Ende durchlaufen (alle 12000), wenn Punkt 2 nicht erfüllt wird

Richtig. Kommt aber in der Praxis selten vor. Und wenn doch, dann ist die Schleife schnell abgearbeitet, so dass ich das in Kauf genommen hatte.


schnuffi hat geschrieben:
4. Warum addierst du am Ende noch einmal 3mm auf den Mittelwert drauf?

Praktisch ist diese Zahl bzw. diese Addition gar nicht für unsere Zwecke relevant. Vor der Nutzung der Sensoren werden die bekanntlich kalibriert und dann zählt nur noch der Differenzwert zum kalibrierten Wert.
Hier mussten 3mm scheinbar sinnfrei addiert werden, damit die von mir eingesetzten Testroutinen aus PHPUnit korrekt funktionieren.


Pfiffikus,
der die beiden Stellen noch einmal genau durchdenken wird, wenn im Frühjahr noch ein paar mehr Sensoren dieser Sorte angeschlossen werden


Nach oben
 Profil userposition on geomap  
 
BeitragVerfasst: Di 31.Mär 2015 18:06 
Offline
Anonymer User
Benutzeravatar

Registriert: Do 03.Jan 2013 13:07
Cash on hand:
3.339,23 Taler

Beiträge: 646
Hallo Pfiffikus,

hier die Schaltpläne. Igendwie habe ich gerde kein Programm zum zuschneiden :)

Mit Spannungsteiler
Dateianhang:
Raspberry.png
Raspberry.png [ 15.52 KiB | 4032-mal betrachtet ]


Mit 1k Widerstand
Dateianhang:
Raspberry1.png
Raspberry1.png [ 14.78 KiB | 4032-mal betrachtet ]


Pfiffikus hat geschrieben:
Das Interesse ist groß. Nicht nur für die Enzyklopädie, sondern auch für die Hilfedatei, die ich direkt in die Software integrieren möchte.

Pfiffikus,
der diesen Schaltplan zusätzlich noch direkt in die Hilfedatei der Software integrieren würde

_________________
____________________
Viele Grüße
Dennis
____________________


Nach oben
 Profil userposition on geomap  
 
BeitragVerfasst: Mi 01.Apr 2015 7:16 
Offline
Anonymer User
Benutzeravatar

Registriert: Do 03.Jan 2013 13:07
Cash on hand:
3.339,23 Taler

Beiträge: 646
Hallo Pfiffikus,

hier die Bilder noch einmal zugeschnitten auf 350*1000 Pixel.
Dateianhang:
PI1.png
PI1.png [ 28.73 KiB | 4158-mal betrachtet ]

Dateianhang:
PI2.png
PI2.png [ 26.94 KiB | 4158-mal betrachtet ]


Sorry die Zeichnung von einem Sensor hatte ich vergessen :oops: , wenn ich es schaffe reiche ich es heute Abend nach.

:hallo:

_________________
____________________
Viele Grüße
Dennis
____________________


Nach oben
 Profil userposition on geomap  
 
BeitragVerfasst: Mi 01.Apr 2015 7:35 
Offline
Realer User
Realer User
Benutzeravatar

Registriert: Mo 14.Nov 2005 20:39
Cash on hand:
5.718,34 Taler

Beiträge: 14513
Wohnort: 07548 Gera
Hallo Dennis,

danke für die Zeichnungen. Ich habe diese Pläne bereits in die Software integriert. Der einfache Plan mit einem Sensor ist für alle wichtig, die nur mal erste Übungen mit einem einzelnen Sensor durchführen wollen.


Nur das Foto eines Sensors muss ich selber noch einmal machen. Für das bisher eingebaute Foto habe ich die nötigen Rechte zur Verwendung nicht bekommen können.


Pfiffikus,
der die neue Revision heute noch nicht allgemein verfügbar machen kann


Nach oben
 Profil userposition on geomap  
 
BeitragVerfasst: Mi 01.Apr 2015 13:47 
Offline
Anonymer User
Benutzeravatar

Registriert: Do 03.Jan 2013 13:07
Cash on hand:
3.339,23 Taler

Beiträge: 646
Hallo Pfiffikus,

Thema HC-SR04.

Ich habe einen Fehler in der gefunden. Durch das setzen des Pins zu Output haben wir eine fallende Flanke auf dem Trigger Pin, somit wird schon die Messung gestartet wie man auf dem Oszilloskope erkennen kann. Somit erfassen wir nicht immer die volle Impulslänge des HC-SR04 und bekommen eine ungenaue Messung. :cry:

Code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# import required modules
import time
import RPi.GPIO as GPIO
import sys

# Schreibe eingegebene GPIO pins in die Variablen
GPIOTrigger = int(sys.argv[1])
GPIOEcho    = int(sys.argv[2])
GPIO.setwarnings(False)

# function to measure the distance
def MeasureDistance():
  # set trigger to high
  GPIO.output(GPIOTrigger, True)

  # set trigger after 10B5s to low
  time.sleep(0.00001)
  GPIO.output(GPIOTrigger, False)

  # store initial start time
  StartTime = time.time()
  # Endzeit festlegen
  EndTime = StartTime + 1

  # store start time
  while ((GPIO.input(GPIOEcho) == 0) & (StartTime < EndTime)):
    StartTime = time.time()

  # store stop time - aber vordefinieren
  StopTime = time.time()
  while ((GPIO.input(GPIOEcho) == 1) & (StartTime < EndTime)):
    StopTime = time.time()

  if StopTime - StartTime < 0.0001:
    StopTime =  StartTime

  # calculate distance
  TimeElapsed = StopTime - StartTime
  Distance = (TimeElapsed * 343000) / 2

  return Distance

# use GPIO pin numbering convention
GPIO.setmode(GPIO.BCM)

# set up GPIO pins
GPIO.setup(GPIOTrigger, GPIO.OUT)
GPIO.setup(GPIOEcho, GPIO.IN)

# set trigger to false
GPIO.output(GPIOTrigger, False)

Millimeter = MeasureDistance()
print("%.0f mm" % Millimeter)
GPIO.cleanup()



Im Bild kann man erkennen das es nicht passt.

Vom Raspi ausgegebener Wert: 1910mm
Reale Pulsweite: 1974mm
Dateianhang:
HCSR04_Oszi.png
HCSR04_Oszi.png [ 177.6 KiB | 4113-mal betrachtet ]


Ich habe es in meinem Code korrigiert, dass am Anfang nur einmal eine deklaration der GPIOs ausgeführt wird. Dann zyklisch gemessenen
Dann konnte man deutlich erkennen, das die gemessenen Werte besser zur Pulsweite gepasst haben :hugg:
Dateianhang:
tek00005.png
tek00005.png [ 16.52 KiB | 4113-mal betrachtet ]

Dateianhang:
tek00006.png
tek00006.png [ 14.91 KiB | 4113-mal betrachtet ]


Hier sieht man auch deutlich weniger Fehler mit höherer Genauigkeit:
Dateianhang:
Liste.png
Liste.png [ 13.23 KiB | 4113-mal betrachtet ]

_________________
____________________
Viele Grüße
Dennis
____________________


Nach oben
 Profil userposition on geomap  
 
 Betreff des Beitrags: Werbung, um Taler einzunehmen
Verfasst: Sa 27.Apr 2024 19:40 
Online
Expertin
Benutzeravatar

Registriert: Mo 05.Dez 2005 19:01
Cash on hand:
immer zu wenige Taler

Beiträge: nur ein paar
Wohnort: Koi-Schnack
Anzeige:

_________________
Wenn du einen Monat lang ein werbefreies Forum willst, klicke hier und überweise mir 100 Taler!
Wenn du mich im Koi-Schnack etwas fragen möchtest, klicke hier!


Nach oben
 Profil Private Nachricht senden  
 
BeitragVerfasst: Mi 01.Apr 2015 19:49 
Offline
Anonymer User
Benutzeravatar

Registriert: Do 03.Jan 2013 13:07
Cash on hand:
3.339,23 Taler

Beiträge: 646
Hallo Pfiffikus,

hier der Schaltplan.
Dateianhang:
Raspberry3.png
Raspberry3.png [ 12.15 KiB | 4078-mal betrachtet ]

_________________
____________________
Viele Grüße
Dennis
____________________


Nach oben
 Profil userposition on geomap  
 
BeitragVerfasst: Do 02.Apr 2015 9:06 
Offline
Anonymer User
Benutzeravatar

Registriert: Do 03.Jan 2013 13:07
Cash on hand:
3.339,23 Taler

Beiträge: 646
Hallo Zusammen,

Thema HC-SR04
Vielleicht nervt es :?: Aber ich habe neue Erkenntnisse die ich euch nicht Vorenthalten möchte. Wenn dies hier nicht gewünscht ist, dann würde ich es per PN mit Pfiffikus machen.
Einfach mal ein Feedback dazu geben :!:

Ich habe die Pulslänge des positvien Impulses am Triggerpin verändert und konnte bei einer zyklischen Messung von 1000 Werten deutliche Unterschiede feststellen.
Bei allen Messungen war der Hardwareaufbau der gleiche :!:

Ich denke den Trigger Pin für 10ms auf High zu lassen ist die beste Variante zwischen Geschwindigkeit und Genauigkeit. Alle 1000 Messungen haben einen korrekten Wert zurück geliefert

Hier mit 10µs:
Dateianhang:
10mikrosec.png
10mikrosec.png [ 16.23 KiB | 4030-mal betrachtet ]


Hier mit 100µs:
Dateianhang:
100mikrosec.png
100mikrosec.png [ 16.35 KiB | 4030-mal betrachtet ]


Hier mit 1ms:
Dateianhang:
1ms.png
1ms.png [ 15.82 KiB | 4030-mal betrachtet ]


Hier mit 10ms:
Dateianhang:
10ms.png
10ms.png [ 10.44 KiB | 4030-mal betrachtet ]


Hier mit 100ms:
Dateianhang:
100ms.png
100ms.png [ 10.56 KiB | 4030-mal betrachtet ]


Hier der Sourcecode den ich dazu verwendet habe mit 10ms High Pegel:
Code:
#----------------------#
# Author: Pfiffikus und Dennis#
#----------------------#
import time
import RPi.GPIO as GPIO
import sys

# Schreibe eingegebene GPIO pins in die Variablen
GPIOTrigger1 = int(18)
GPIOEcho1    = int(17)
GPIOEcho2   = int(27)
GPIOEcho3   = int(22)

# GPIO Pins als GPIO referenzieren
GPIO.setmode(GPIO.BCM)

# set up GPIO pins
GPIO.setup(GPIOTrigger1, GPIO.OUT)
GPIO.setup(GPIOEcho1, GPIO.IN)
GPIO.setup(GPIOEcho2, GPIO.IN)
GPIO.setup(GPIOEcho3, GPIO.IN)

# set trigger to false
GPIO.output(GPIOTrigger1, False)

# Wait 100ms, damit eine korrekte Messung der länge durchgeführt werden kann, erste Messung des HC-SR04 wird verworfen
print "wait 100ms"
time.sleep(0.1)

def MeasureDistance(GPIOTrigger, GPIOEcho):
    # set trigger to high
  GPIO.output(GPIOTrigger, True)

    # set trigger after 10msec to low, mit laengerer Wartezeit als 10mikrosec ist die Genauigkeit hoeher
  time.sleep(0.01)
  GPIO.output(GPIOTrigger, False)

    # store initial start time
  StartTime = time.time()
    # Endzeit festlegen
  EndTime = StartTime + 1

    # store start time
  while ((GPIO.input(GPIOEcho) == 0) & (StartTime < EndTime)):
    StartTime = time.time()

    # store stop time - aber vordefinieren
  StopTime = time.time()
  while ((GPIO.input(GPIOEcho) == 1) & (StartTime < EndTime)):
    StopTime = time.time()


    # Wenn keine Antwort vom Sensor empfangen wird, wird 0 mm  ausgegeben
  if StopTime - StartTime < 0.0001:
    StopTime =  StartTime

    # calculate distance
  TimeElapsed = StopTime - StartTime
  Distance = (TimeElapsed * 343000) / 2

  return Distance

 
#------------------------------------------------#
#-------------Start Program----------------------#
#------------------------------------------------#

#Wieviel Messungen sollen durchgefuehrt werden
Counter = 1000

while Counter > 0:
  #Messe Sensor 1
  Millimeter1 = MeasureDistance(GPIOTrigger1, GPIOEcho1)

  #Messe Sensor 2
  #GPIO.output(GPIOTrigger1, False)
  #Millimeter2 = MeasureDistance(GPIOTrigger1, GPIOEcho2)

  #Messe Sensor 3
  #GPIO.output(GPIOTrigger1, False)
  #Millimeter3 = MeasureDistance(GPIOTrigger1, GPIOEcho3)

  #Gebe alle drei Messungen aus
  #print("%.0f" % Millimeter1 +", " + "%.0f" % Millimeter2 +", " + "%.0f" % Millimeter3)
  print "%.2f" % Millimeter1

  #dekrementiere Zaehler
  Counter = Counter - 1

#Outputs wieder auf undefinierten Zustand setzen
GPIO.cleanup()

_________________
____________________
Viele Grüße
Dennis
____________________


Nach oben
 Profil userposition on geomap  
 
BeitragVerfasst: Do 02.Apr 2015 9:52 
Offline
Realer User
Realer User
Benutzeravatar

Registriert: Fr 02.Jan 2009 9:47
Cash on hand:
1.406,90 Taler

Beiträge: 6046
Wohnort: Lappersdorf
Hallo Dennis,

nervt natürlich nicht. Hier ist jeder dazu eingeladen, seinen Beitrag zu diesem Projekt mit einzubringen. Das nervt nicht, sondern bringt ja alle weiter, wo diesen Sensor einmal verwenden möchten profitieren dann von deinen Erkenntnissen.

Also ganz klar weiter machen!

_________________
Gruß Robert

www.koifutterhandel.de


Nach oben
 Profil userposition on geomap  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 225 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5, 6 ... 23  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de