INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ultraschallsensor Ausgabe verbessern
11.12.2014, 18:17
Beitrag #1
Ultraschallsensor Ausgabe verbessern
Hallo zusammen,

ich habe eine kurze Frage. Über diesen Sketch steuere ich meinen HC-SR04 Ultraschallsensor an.

Code:
#define trigPin 8
#define echoPin 9

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  long distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  distance = pulseIn(echoPin, HIGH);

  if (distance <= 200){
    Serial.print("1");
  }
  else {
    Serial.print("0");
  }
  delay(500);
}

Ich nutze diesen Code für einen Processing-Sketch, der ein Video abspielt, sofern der Wert "1" ausgegeben wird (also wenn ein Gegenstand nahe am Ultraschallsensor ist).
Nun hat diese Messung ab und zu gewissen Ungenauigkeiten, soll heißen das Video wird manchmal kurz unterbrochen, weil zwischen den Messungen ein oder zwei Mal "0" statt "1" ausgegeben wird.
Meine Überlegung war, das ich lediglich wenn "0" oder "1" drei Mal hintereinander ausgegeben wird einen Wert schicke. Aber ich komme nicht dahinter, wie ich den Code in der Hinsicht anpassen könnte. Habt ihr eine Idee wie ich den Code fixen könnte, damit es zu weniger Unterbrechungen kommt?

Vielen Dank schon für eure Hilfe!

Viele Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2014, 21:16 (Dieser Beitrag wurde zuletzt bearbeitet: 12.12.2014 07:25 von marcus.)
Beitrag #2
RE: Ultraschallsensor Ausgabe verbessern
Hallo Semi,

zum einen könntest Du die NewPing Library verwenden, zum anderen kannst du einfach den Abstand z.B. fünf mal abfragen und dann durch fünf teilen -> Durchschnittswert.

Viel Erfolg

Gruß
Marcus

PHP-Code:
//ganz tolles Beispiel anhand analogRead, quick and dirty 

int bla()    {
        
delay(1000); 
        return 
analogRead A0 );


void setup()     {
            
Serial.begin(9600);
}

void loop() {
        
Serial.println( (bla()+bla()+bla()+bla())/);
    

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2014, 11:00
Beitrag #3
RE: Ultraschallsensor Ausgabe verbessern
Hallo,

ich habe jetzt eine Libary names NewPing hinzugefügt und auch versucht deinen tipp zu beherzigen. Ich bin mir aber nicht sicher ob es damit wirklich besser geworden ist. Habe ich irgendwas falsch gemacht oder sollte das schon so stimmen?

Code:
#include <NewPing.h>
#define trigPin 8
#define echoPin 9
int sensor;
void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  long distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  distance = pulseIn(echoPin, HIGH);
  if (distance > 0) sensor = (distance + distance + distance)/3;
  if (sensor <= 200){
    Serial.print("1");
  }
  else {
    Serial.print("0");
  }
  delay(500);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2014, 11:12 (Dieser Beitrag wurde zuletzt bearbeitet: 12.12.2014 11:15 von marcus.)
Beitrag #4
RE: Ultraschallsensor Ausgabe verbessern
Hallo Semi,

du bindest zwar die newPing-Bibliothek ein, machst aber deine Sensorabfrage noch wie gehabt. Schau dir mal das newPing Beispiel auf der Arduinoseite an.

Außerdem misst Du den Abstand einmal, und rechnest das dann mal drei geteilt durch drei. Da kann ja nichts neues bei rauskommen. Du musst mehrfach messen um einen Mittelwert zu erhalten.

So sollte das aussehen:

-Messen
-Messen
-Messen

-Die verschiedenen Werte zusammenrechnen

-Teilen



und nicht:

-Messen
-Drei mal Zusammenrechnen
-Teilen



Du kannst es ruhig auch mit deinem Ping-Programm machen, aber anstatt das jetzt dreimal hintereinander zu kopieren, sind Funktionen nützlich


int abstand(){ ....Ping funktion mit return distance();... }

Funktionen ausserhalb von Setup/Loop deklarieren.

loop(){ ...mittelwert = ( abstand()+abstand()+abstand() ) / 3 ; .... }


Sauberer wäre es natürlich mit Variablen und im Falle der newPing-Bibliothek mehr zeitlicher Abstand, also
messwertA=abstand(); delay(40); messwertB=abstand(); delay(40); messwertC=abstand();
mittelwert=(messwertA+messwertB+messwertC)/3; .


Wenn Du das nicht verstehst kann ich das gerne später zuhause mal komplett ausschreiben. Aber damit lernt man es ja nicht :-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2014, 11:16
Beitrag #5
RE: Ultraschallsensor Ausgabe verbessern
Code:
sensor = (distance + distance + distance)/3;
Made my day, sorry for that.
Während des Zugriffs auf eine Variable ändert sich diese nicht. D.h. sensor wird immer gleich distance sein.
Das ist was gaaaanz anderes als
Code:
sensor = (pulseIn(echoPin, HIGH) + pulseIn(echoPin, HIGH) + pulseIn(echoPin, HIGH))/3;
...da das tatsächlich dreimal den Sensor abfragt.
Verwirrenderweise kann man auch das machen:
Code:
#define distance pulseIn(echoPin, HIGH)
sensor = (distance + distance + distance)/3;
Das dürfte dann wieder funktionieren, da dann "distance" schon vom Compiler durch "pulseIn(echoPin, HIGH)" ersetzt wird.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2014, 12:19
Beitrag #6
RE: Ultraschallsensor Ausgabe verbessern
Ja, der Tipp von Thorsten hat schon funktioniert. Nur reagiert (verständlicherweise) der Sensor jetzt langsamer, was natürlich auch nicht so toll ist.
Also marcus, wenn du dir die Zeit nehmen könntest mal über den Code zu gehen und das zu verbessre bzw zu optimieren wäre ich dir sehr dankbar!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2014, 13:28
Beitrag #7
RE: Ultraschallsensor Ausgabe verbessern
Hi,
kann es sein, dass der Sensor gar keinen Puls liefert, wenn kein Objekt in der Nähe ist? Dann wartet der pulseIn glaube ich eine Sekunde (siehe http://arduino.cc/en/pmwiki.php?n=Reference/PulseIn). Außerdem kann nur ein Puls zurück kommen, wenn Du vorher schon einen geschickt hast, oder? D.h. das dreimal pulseIn() wird mindestens 2 Sekunden dauern. Dazu noch Dein delay(500), macht mindestens 2,5 Sekunden. Wenn nichts in der Nähe ist, dann sogar 3 Sekunden.
Ich würde erstmal zwei Sachen ändern:
1. Verwende den Timeout-Parameter vom pulseIn. Ich weiß nicht, wie lange es maximal dauert, bis so ein Impuls "fertig" ist, aber bestimmt nicht mehr als ein paar Millisekunden. Also sowas wie pulseIn(pin,HIGH,10000).
2. Wie Marcus schon gesagt hat, mach' Dir eine eigene Funktion, die den Ping schickt, den Impuls empfängt und dann "distance" zurückgibt. (Vielleicht brauchst Du das hier: http://arduino.cc/en/pmwiki.php?n=Refere...eclaration.) Diese Funktion rufst Du dann statt dem pulseIn auf.

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2014, 13:35 (Dieser Beitrag wurde zuletzt bearbeitet: 12.12.2014 13:37 von marcus.)
Beitrag #8
RE: Ultraschallsensor Ausgabe verbessern
Auf die schnelle...

Code:
#define trigPin 8
#define echoPin 9

long a,b,c,mittelwert; // Nützliche Variablen die wir variabel nutzen

long abstand(){ //Eine tolle Funktion. Man könnte aber auch die newping Bibliothek nehmen, denn irgend einer hat sich die Mühe gemacht sie zu schreiben.
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  return pulseIn(echoPin, HIGH); //Wird die Funktion aufgerufen, gibt sie mit Return den Wert zurück. Total nett von der Funktion.

  } //Bitte nicht zu weit über die geschweiften Klammer lehnen, oder sie könnten aus der Funktion fallen.

void setup() { //Zucker und Salz, Butter und Schmalz
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.print("Safran");
}

void loop() { //Jetzt gehts los

  a=abstand(); //Prüfe einmal...
   delay(40);  //Päuschchen
   b=abstand(); //Prüfe nochmal...
   delay(40);  // zZzZz
   c=abstand(); //Und alle guten Dinge sind drei.
  
   mittelwert=( a+b+c  )/3; //Die Katze läuft im Schnee. Und wird gedrittelt.
  
Serial.print("Durchschnitt von: "); //Total wichtige Ansage
Serial.print( a );
Serial.print(" + ");
Serial.print( b );
Serial.print(" +  ");
Serial.print( c );

Serial.print(" = ");
Serial.println( mittelwert ); //Tada!

delay(1000); //Damit uns bei der Serial-Ausgabe nicht schwindlig wird...

  } //Ende. Also eigentlich Loop.

Man könnte stattdessen auch zwei Werte nehmen, aber das wird ungenauer. Dafür könnte man sie vom einen aufs andere mal mitteln, geht schneller.

Code:
#define trigPin 8
#define echoPin 9

long alt=0,neu=0; // Nützliche Variablen die wir variabel nutzen

long abstand(){ //Eine tolle Funktion. Man könnte aber auch die newping Bibliothek nehmen, denn irgend einer hat sich die Mühe gemacht sie zu schreiben.
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  return pulseIn(echoPin, HIGH); //Wird die Funktion aufgerufen, gibt sie mit Return den Wert zurück. Total nett von der Funktion.

  } //Bitte nicht zu weit über die geschweiften Klammer lehnen, oder sie könnten aus der Funktion fallen.

void setup() { //Zucker und Salz, Butter und Schmalz
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.print("Safran");
}

void loop() { //Jetzt gehts los

neu=abstand();
Serial.print("Durchschnitt aus neu(");
Serial.print(neu);
Serial.print(") und alt (");
Serial.print(alt);

Serial.print(") ist: ");
Serial.println( (neu+alt)/2 ); //Tada!

alt=neu; //Ryder heisst jetzt Twix, sonst ändert sich nix.

delay(1000); //Damit uns bei der Serial-Ausgabe nicht schwindlig wird...

  } //Ende. Also eigentlich Loop.

Statt der eigens definierten abstand() Funktion ginge es eben auch mit newPing.Bei Fehler oder zu großem Abstand gibt die aber auch 0 aus, muss man dann bei der Abfrage entsprechend ausschließen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 97 12.11.2016 20:29
Letzter Beitrag: Hannes
  Ausgabe auf WIFI Console vom UNO WIFI MZ-Lurre 0 92 17.10.2016 11:33
Letzter Beitrag: MZ-Lurre
  Ausgabe druckt immer 2 Werte anstatt nur einen. Finde den Fehler nicht TimeMen 24 740 02.07.2016 14:18
Letzter Beitrag: hotsystems
  Servo und PWM Ausgabe F2Ingo 4 493 17.06.2016 14:53
Letzter Beitrag: F2Ingo
  Serielle Ausgabe, Reset ? Mathias 1 599 12.11.2015 18:12
Letzter Beitrag: hotsystems
  Ausgabe entweder 0 oder 3 Wampo 12 1.241 20.09.2015 13:57
Letzter Beitrag: Wampo
  Ausgabe von softwareSerial.print auf LCD an anderem Arduino umleiten - wie geht das? Gelegenheitsbastler 18 2.630 18.05.2015 07:02
Letzter Beitrag: Gelegenheitsbastler
  Problem GPS Modul - Ausgabe der Anzahl von Sateliten ArduPI 6 1.010 14.01.2015 12:20
Letzter Beitrag: Scherheinz
  Ultraschallsensor am I2C Bitte um Hilfe Zerebrator 16 3.180 27.08.2014 17:27
Letzter Beitrag: rkuehle
  Hilfe bei Schleife für Serial.read -> Ausgabe itsy 6 2.938 01.05.2014 16:38
Letzter Beitrag: itsy

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste