Pages: 1 2 3 [4] 5   Go Down
Author Topic: Lautstärke steuern per Ultraschall  (Read 2340 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja...ich habe jetzt alles eingebaut und morgen ist Abgabe... Allerdings spinnen die Sensoren bei jeder bewegung rum und geben werte zwischen 4 bis 3500 aus... smiley-sad es klappt nicht
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 432
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fehler in der Verdrahtung oder Problem mit der Spannungsversorgung?
Hast Du Abblockkondensatoren verbaut?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Verdrahtung ist richtig und die Spannungsversorgung auch...kondensatoren hab ich keine verbaut. Vielleicht hat es was damit zutun dass es 2  Sensoren Sind?
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielleicht hat es was damit zutun dass es 2  Sensoren Sind?

Auf meinen Einwand in Reply 39 hast Du doch kategorisch ausgeschlossen, dass Raumechos der verschiedenen Sensoren sich bei Deiner Art der Ansteuerung gegenseitig stören könnten. Du hast in Reply #40 doch geschrieben "immer wahre korrekte Ergebnisse bekommen" zu haben.

Was ist zwischen Reply #40  ("immer wahre korrekte Ergebnisse bekommen") und Reply #45 ("spinnen die Sensoren bei jeder bewegung rum") denn passiert?

Falls es Dich auch nach dem Abgabetermin noch interessiert, wie es gehen könnte: Ich habe am Wochenende selbst zwei Ultraschall-Sensormodule "HC-SR04" aus China erhalten und bei Bedarf könnte ich Dir einen kurzen Democode erstellen. Wenn ich mich richtig erinnere, wolltest Du zwei Schaltvorgänge unterscheiden (Wischbewegung von links nach rechts, Wischbewegung von rechts nach links) und zusätzlich eine Einstellmöglichkeit für die Lautstärke haben (Hand über dem Sensor auf- und abbewegen).

Den Versuchsaufbau habe ich nicht mehr genau im Kopf, aber das war wohl ungefähr so:
Zwei Ultraschallsensoren  "HC-SR04" liegen in ca. 10 cm Entfernung nebeneinander auf dem Tisch und senden ihr Signal beide an die Zimmerdecke. So ungefähr?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja mich hat das auch verwundert mit den Werten...das Problem trat eigentlich erst nach dem ich sie reingeklebt habe auf smiley-sad .
Ich habe auch schon probiert einen Code passend zu programmieren aber es hat den Effekt nicht ansatzweise beeinflusst smiley-sad
Ich habe es mit intervallen von 0 bis 5000 probiert aber es hat nichts verändert...
Code:
//SonarSensor1
  if(millis() > intervalping + previousmillisping2 && start1== false){
  digitalWrite(trigger1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger1, LOW);
  duration = pulseIn(echo1, HIGH);
  cm = duration/58.2;
  previousmillisping1= millis();
  start1 = true;
  }
  //SonarSensor2
  if(millis() > intervalping2 + previousmillisping1 && start1== true){
  digitalWrite(trigger2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger2, LOW);
  duration2 = pulseIn(echo2, HIGH);
  cm2 = duration2/58.2;
  previousmillisping2= millis();
  start1 = false;
  }
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

das Problem trat eigentlich erst nach dem ich sie reingeklebt habe auf smiley-sad .

Was bedeutet "reingeklebt"? Ich glaube, mit den kleinen Metallkapseln darfst Du keine "akustisch leitfähigen Verbindungen" herstellen. Sonst kommt das Signal nicht über den Luftweg (Sender - Luft - Reflektion - Luft - Empfänger) am Empfänger an, sondern wird per direkter Akustikleitung vom Sender zum Empfänger übertragen. Die aus der Signallaufzeit ermittelte Entfernung dürfte dann die Entfernung zwischen der Sender- und der Empfängerkapsel sein. Diese beiden Kapseln müssen "akustisch isoliert" bleiben.

Wegen eines Codes schaue ich morgen mal, was ich hinbekommen kann.
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 432
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Und "kleb" sicherheitshalber ein paar 100nF Keramikkondensatoren noch dazu. Vorzugsweise möglichst nahe an die Stromversorgungspins.
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wegen eines Codes schaue ich morgen mal, was ich hinbekommen kann.

So, heute nun etwas vom versprochenen Code und einen ersten Test-Sketch mit Sensor-Funktionstest, wie ich ihn basteln würde.

Als erstes mal bekommt der Sketch von mir eine Struktur, indem ich ganz klassisch trenne in:
- Eingabe der Daten
- Verarbeitung der Daten
- Ausgabe der Ergebnisse

Das nennt sich "EVA-Prinzip" wegen (E)ingabe, (V)erarbeitung, (A)usgabe.

Die Eingabe der Daten bei diesem Sketch erfolgt durch zwei Ultraschall-Entfernungssensoren. Und die steuere ich als erstes mal schon komplett anders an als Du und ich werte sie auch anders aus.

Ansteuerung des Pling:
Ich triggere beide Sensoren GLEICHZEITIG und das mache ich, indem der Sketch nur einen einzigen Trigger-Pin kennt! D.h. bei der Hardware sind die Trigger-Pins beider Sensoren miteinander verbunden und an einen einzigen Arduino-Ausgang angeschlossen. Wenn getriggert wird, passiert das gleichzeitig. Und - mal vorausgesetzt, dass es sich um baugleiche Sensoren derselben Charge mit derselben Firmware drauf handelt - senden die Sensoren ihr Pling gleichzeitig und im Gleichtakt aus!

Auswertung des Echos:
Beim Design der Funktion "pulseIn" haben die Arduino-Macher total verkackt, das ist eine für geschätzte 99% aller Fälle völlig unbrauchbare Funktion. Unbrauchbar, weil die Funktion ein Standard-Timeout von 1 Sekunde hat und während der Messdauer bis entweder der Impuls oder das Timeout auftritt, das Programm vollkommen blockiert wird, so dass kein anderer Code ausgeführt werden kann. Insbesondere kann damit auch nur auf ein Ereignis an einem Eingang gewartet werden, also hier unbrauchbar, denn ich will gleichzeitig auf Ereignisse an zwei Eingängen warten: Kommt das Echo erst an Pin1 an? Oder zuerst an Pin2? Mit welchen Timings?

Dafür habe ich zunächst mal einen Sensor-Testsketch gemacht.
Pins kannst Du beliebig ändern, die serielle Baudrate auf 57600 setzen.

Code:
/*
 Verkabelung von zwei HC-SR04 Ultraschall-Entfernungssensoren
 VCC vom Sensor jeweils an Arduino 5v
 GND vom Sensor an Arduino GND
 beide Trigger Pins vom Sensor an Arduino Pin 7
 Echo1 Pin vom Sensor an Arduino Pin 8
 Echo2 Pin vom Sensor an Arduino Pin 9
 */

#define TRIGGERPIN 7    // beide Trigger-Pins verbunden
#define ECHOPIN1 8      // Echo Pin Sensor 1
#define ECHOPIN2 9      // Echo Pin Sensor 2
#define LEDPIN 13       // Onboard LED
#define V_SCHALL 34300L // Schallgeschwindigkeit in cm/s

#define MAXRANGE 200    // Maximale Entfernung in cm, über die nicht gemessen werden braucht

long duration1, duration2; // Dauer bis zum Eintreffen des Echos
int distance1, distance2;  // Berechneter Abstand

void setup() {
 Serial.begin (57600);  // Baudrate des Seriellen Monitors
 pinMode(TRIGGERPIN, OUTPUT);
 pinMode(ECHOPIN1, INPUT);
 pinMode(ECHOPIN2, INPUT);
 pinMode(LEDPIN, OUTPUT); // LED, falls verwendet
 Serial.println("Programm gestartet...");
}


void Eingabe()
{
  distance1=MAXRANGE;  // Annahme, dass wir ausser Reichweite sind
  distance2=MAXRANGE;  // Annahme, dass wir ausser Reichweite sind
  duration1=0;         // Zeit auf Null setzen
  duration2=0;
  digitalWrite(TRIGGERPIN, LOW); // Beide Sensoren mit demselben Pin triggern
  delayMicroseconds(2);
  digitalWrite(TRIGGERPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGERPIN, LOW);
  unsigned long start=micros();
  while ((digitalRead(ECHOPIN1)==LOW || digitalRead(ECHOPIN2)==LOW)&& micros()-start<1000);
  if (micros()-start>=1000) // Falls ein Fehler beim Triggern vorkommen kann???
  {
    distance1=-1;
    distance2=-1;
    return;
  } 
  do  // Messschleife starten
  {
     if (duration1==0 && digitalRead(ECHOPIN1)==LOW) // Stop Messung Sensor1
     {
       duration1=micros()-start;
     }
     else if (duration2==0 && digitalRead(ECHOPIN2)==LOW) // Stop Messung Sensor 2
     {
       duration2=micros()-start;
     }
     else if (duration1!=0 && duration2!=0) break; // Beide Messungen beendet
     if (micros()-start> 2*MAXRANGE*1000000L/V_SCHALL) break; // Timeout beim Messen
 } 
 while (1);
 
 // Abstand der Sensoren auf Basis der Schallgeschwindigkeit berechnen
 if (duration1>0) distance1 = duration1*V_SCHALL/2000000L;
 if (duration2>0) distance2 = duration2*V_SCHALL/2000000L;
}

void Verarbeitung()
{
}

void Ausgabe()
{
  Serial.print(distance1);
  Serial.print('\t');
  Serial.print(distance2);
  Serial.println();
}

void loop() {
  unsigned long loopstart=micros(); // Zeit beim Start der loop merken
  Eingabe();
  Verarbeitung();
  Ausgabe();
  while(micros()-loopstart<20000); // mindestens 20 ms bis zur nächsten Messung warten
}

Bekommst Du mit diesem Sketch die Entfernungen mit Deinen beiden Sensoren gemessen?

Die Funktion "Verarbeitung()" ist hier noch gar nicht ausgefüllt, und die Funktion "Ausgabe()" besteht einfach darin, die gemessenen Entfernungen auf dem seriellen Monitor auszugeben. Erstmal nur für den Funktionstest von zwei gleichzeitig angesteuerten Sensoren. Bevor Du weitermachen kannst, müßte das perfekt funktionieren. Ohne eine vernünftige Eingabe von Daten, braucht man nämlich mit einer Verarbeitung gar nicht erst anzufangen.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank! Ich werde das bei der Nächsten Möglichkeit testen...zum Thema direkte Schallübertragung über z.B. den Kleber:
Der Sensor spinnt erst Sobald man die Hand über den Sensor hält. Wenn eine direkte Schallverbindung da wär ,würde der Sensor doch dauerspinnen ? Außerdem zeigt der Sensor anfangs sogar den korrekten abstand zur decke an.
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank! Ich werde das bei der Nächsten Möglichkeit testen...

Na dann: Auf guten Erfolg dabei!

zum Thema direkte Schallübertragung über z.B. den Kleber:
Der Sensor spinnt erst Sobald man die Hand über den Sensor hält. Wenn eine direkte Schallverbindung da wär ,würde der Sensor doch dauerspinnen ?

Ja, das sehe ich auch so. So hatte ich Deine Fehlerbeschreibung auch verstanden.

Also liegt entweder ein Echo-Problem vor: Schall wird zwischen Hand und Arduino mehrfach hin und her reflektiert. Und wenn Du den zweiten Sensor unmittelbar nach dem ersten Sensor triggerst, dann empfängt er möglicherweise nicht das Echo von seinem selbst getriggerten Signal, sondern ein späteres Mehrfach-Echo, das noch von der Triggerung des anderen Sensors herrührt.

Oder ein Problem mit der Auswertelogik in Deinem Sketch.
Oder beides zusammen.

Außerdem zeigt der Sensor anfangs sogar den korrekten abstand zur decke an.

Das ist gut! Bekommst Du das mit dem von mir geposteten Sketch auch hin?
Zeigen sich dann damit vernünftige Anzeigewerte?

Wenn ja, kannst Du zum nächsten Schritt übergehen: Eine Auswertung schreiben.

Im Prinzip musst Du für die beabsichtigten Schaltvorgänge die richtigen Muster in den gemessenen Distanzwerten und im zeitlichen Verlauf erkennen. Anbei eine erste ganz einfache Verarbeitung, die darauf basiert, dass der Abstand zur Decke deutlich über 100 cm beträgt und alle Handbewegungen über den Sensoren mit einem Abstand von weniger als 100 cm zu den Sensoren erfolgen.

Von der Logik her wird eine "status" Variable gesetzt, je nach erkannter Aktion:
1. Falls beide Sensoren mehr als 333 ms lang den Deckenabstand erkennen, wird die Auswertung zurückgesetzt
2. Wenn Sensor2 zuerst einen Abstand unter 100cm misst, wird eine Wischbewegung nach links erkannt
3. Wenn Sensor1 zuerst einen Abstand unter 100cm misst, wird eine Wischbewegung nach rechts erkannt

Das bedeutet: Eine komplette Wischbewegung muß innerhalb 333 ms abgeschlossen sein, sonst wird am Ende einer sehr langsam ausgeführten Wischbewegung fälschlicherweise eine Bewegung in Gegenrichtung erkannt. Das könnte man durch eine mehrstufige Mustererkennung verhindern, aber zunächst mal wollte ich die erste Auswertung simpel halten:

Code:
/*
 Verkabelung von zwei HC-SR04 Ultraschall-Entfernungssensoren
 VCC vom Sensor jeweils an Arduino 5v
 GND vom Sensor an Arduino GND
 beide Trigger Pins vom Sensor an Arduino Pin 7
 Echo1 Pin vom Sensor an Arduino Pin 8
 Echo2 Pin vom Sensor an Arduino Pin 9
 */

#define TRIGGERPIN 7    // beide Trigger-Pins verbunden
#define ECHOPIN1 8      // Echo Pin Sensor 1
#define ECHOPIN2 9      // Echo Pin Sensor 2
#define LEDPIN 13       // Onboard LED
#define V_SCHALL 34300L // Schallgeschwindigkeit in cm/s
#define MAXRANGE 200    // Maximale Entfernung in cm, über die nicht gemessen werden braucht

enum states {sDEFAULT,sLEFT, sRIGHT};
int state=sDEFAULT;  // state enthält den aktuell ausgewerteten Status
int distance1, distance2;  // Berechneter Abstand

void setup() {
 Serial.begin (57600);  // Baudrate des Seriellen Monitors
 pinMode(TRIGGERPIN, OUTPUT);
 pinMode(ECHOPIN1, INPUT);
 pinMode(ECHOPIN2, INPUT);
 pinMode(LEDPIN, OUTPUT); // LED, falls verwendet
 Serial.println("Programm gestartet...");
}


void Eingabe()
{
  unsigned long duration1=0; // Dauer bis zum Eintreffen des Echos auf Null setzen
  unsigned long duration2=0; // Dauer bis zum Eintreffen des Echos auf Null setzen
  distance1=MAXRANGE;  // Annahme, dass wir ausser Reichweite sind
  distance2=MAXRANGE;  // Annahme, dass wir ausser Reichweite sind
  digitalWrite(TRIGGERPIN, LOW); // Beide Sensoren mit demselben Pin triggern
  delayMicroseconds(2);
  digitalWrite(TRIGGERPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGERPIN, LOW);
  unsigned long start=micros();
  while ((digitalRead(ECHOPIN1)==LOW || digitalRead(ECHOPIN2)==LOW)&& micros()-start<1000);
  if (micros()-start>=1000) // Falls ein Fehler beim Triggern vorkommen kann???
  {
    distance1=-1;
    distance2=-1;
    return;
  } 
  do  // Messschleife starten
  {
     if (duration1==0 && digitalRead(ECHOPIN1)==LOW) // Stop Messung Sensor1
     {
       duration1=micros()-start;
     }
     else if (duration2==0 && digitalRead(ECHOPIN2)==LOW) // Stop Messung Sensor 2
     {
       duration2=micros()-start;
     }
     else if (duration1!=0 && duration2!=0) break; // Beide Messungen beendet
     if (micros()-start> 2*MAXRANGE*1000000L/V_SCHALL) break; // Timeout beim Messen
 } 
 while (1);
 
 // Abstand der Sensoren auf Basis der Schallgeschwindigkeit berechnen
 if (duration1>0) distance1 = duration1*V_SCHALL/2000000L;
 if (duration2>0) distance2 = duration2*V_SCHALL/2000000L;
}

void Verarbeitung()
{
  static unsigned long timer;
  if (distance1>100 && distance2>100)
  {
    if (millis()-timer>333) state=sDEFAULT;
  }
  else if (distance1>100 && distance2<=100)
  {
    if (state==sDEFAULT)
    {
      state=sLEFT;
      timer=millis();
    }
  }
  else if (distance1<=100 && distance2>100)
  {
    if (state==sDEFAULT)
    {
      state=sRIGHT;
      timer=millis();
    }
  }
}

void Ausgabe()
{
  Serial.print(distance1);
  Serial.print('\t');
  Serial.print(distance2);
  Serial.print('\t');
  switch (state)
  {
    case sLEFT : Serial.print("Left");break;
    case sRIGHT: Serial.print("Right");break;
  }
  Serial.println();
}

void loop() {
  unsigned long loopstart=micros(); // Zeit beim Start der loop merken
  Eingabe();
  Verarbeitung();
  Ausgabe();
  while(micros()-loopstart<20000); // mindestens 20 ms bis zur nächsten Messung warten
}

Im Prinzip könnte man diesen Code dann schon leicht so abändern, dass tatsächlicher links/rechts Schaltvorgänge ausgeführt werden.



Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

WOW!Danke! Du bist echt gut! Ich muss mich da erst mal bisschen rein lesen...
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ALSO ich habs jetzt getested und leider kommt nur so was an (siehe anhang)
Ich habe die eingänge verändert sonst nichts
Code:
#define TRIGGERPIN 7    // beide Trigger-Pins verbunden
#define ECHOPIN1 8      // Echo Pin Sensor 1
#define ECHOPIN2 6     // Echo Pin Sensor 2


* test.PNG (31.35 KB, 763x362 - viewed 14 times.)
« Last Edit: February 06, 2014, 02:33:37 pm by MaxNarr » Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ALSO ich habs jetzt getested und leider kommt nur so was an (siehe anhang)

Steht im Quellcode des Sketches:
Code:
Serial.begin (57600);  // Baudrate des Seriellen Monitors

Guckst Du in Deinem Seriellen Monitor, steht da: 9600.
Stell mal Deinen Seriellen Monitor auf 57600!
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ohhh man ...ich bin einfach zu müde :/ Danke!
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok die Werte sehen realistisch aus....ich probiere es einzubauen
Logged

Pages: 1 2 3 [4] 5   Go Up
Jump to: