Go Down

Topic: Sharp 2D120X, Piezo-Lautsprecher, Parkassistent (Read 1 time) previous topic - next topic

Schleckig

Sep 09, 2012, 06:32 pm Last Edit: Sep 09, 2012, 11:16 pm by Schleckig Reason: 1
Erst einmal "Hallo" an alle.

Ich arbeite im Rahmen meiner Techniker-Facharbeit unter anderem an einem Projekt, welches mir den Abstand zu einem Sharp Infrarot-Sensor akkustisch durch immer kleiner werdende Intervalle wiedergeben soll.

Der Sketch steht auch soweit, ich habe nur das Problem, dass die Logik genau umgekehrt funktioniert. Das heißt, je weiter ich von dem Sensor entfernt bin, desto kleiner werden die Intervalle.

Ich sitze jetzt seit 3 Stunden an dem Skech und experimentiere, jedoch finde ich keine Lösung.

Ich wäre euch sehr dankbar, könntet ihr mir helfen.

Viele Grüße.



const int SensorPin = 0; //SensorPin als 0 gesetzt
int Piezo = 2;          //Piezo als 2 gesetzt
long ZeitletzteMessung = 0;  //ZeitletzteMessung als 0 gesetzt
void setup()
{
 pinMode(Piezo, OUTPUT);  //Piezo als Output gesetzt
 Serial.begin(9600);    //Initalisiert den seriellen Port mit der geforderten Übertragungsrate  
}                      

void loop()
{
 
 pinMode(SensorPin, INPUT);    //SensorPin als Eingang gesetzt
 int SensorWert=analogRead(0);  //der Wert des analogen Eingangs wird der Variablen SensorWert übergeben
 Serial.println(SensorWert);  //Ausgabe des empfangenen Wertes an die serielle Schnittstelle
 int Dauer = map(SensorWert, 0, 1023, 0, 5000); //Messwertskalierung/-umrechnung
 unsigned long ZeitaktuelleMessung = millis(); //Zeit seit Start des Programms wird in der Variablen ZeitaktuelleMessung gespeichert

 if(ZeitaktuelleMessung - ZeitletzteMessung > Dauer)
 {
  ZeitletzteMessung = ZeitaktuelleMessung;  
 if (Dauer!=0)
 {
   if (Dauer<2000)
   {
   for (int i=0; i<500; i++)
   {
     digitalWrite(Piezo, HIGH);
     delayMicroseconds(150);
     digitalWrite(Piezo, LOW);
     delayMicroseconds(150);
   }
   }
 }
}
 delay(100);
}

KlausR

Hallo,

probier doch mal das folgende aus.

  int Dauer = map(SensorWert,  0, 1023, 5000,0); //Messwertskalierung/-umrechnung

damit müste deine Umrechung Sensorwert -> Zeit genau andersrum sein.

Mfg.

Klaus
< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >

Schleckig

Hallo Klaus,

danke für den Vorschlag.

Die Idee hatte ich auch schon, aber es hat leider nichts bewirkt.

Viele Grüße

uwefed

was ist der zweck dieser bedingung?
Quote
if(ZeitaktuelleMessung - ZeitletzteMessung > (Dauer/2) )

Grüße Uwe

Schleckig

#4
Sep 09, 2012, 11:03 pm Last Edit: Sep 09, 2012, 11:12 pm by Schleckig Reason: 1
Ich muss gestehen, dass ich genau diesen Teil auch noch nicht komplett durchdrungen habe.

Ich habe diesen Teil mit Hilfe eines Buches und eines anderen Sketches erstellt - es ist eine Intervallsteuerung.

int interval = 2000; //2 Sekunden
unsigned long prev;
void setup()
{
.
.
.
prev = millis();
}
void loop()
{
if((millis() - prev) > interval)
{
prev = millis();
.
.
.
}
}


Grüße.

KlausR

#5
Sep 10, 2012, 04:22 am Last Edit: Sep 10, 2012, 07:18 am by KlausR Reason: 1
Hallo,

schade, währe schön gewesen.

Aber habe mir mal 5 Minuten genommen und dein Programm mal etwas vereinfacht.

Wie währe es denn so???
---------------schnipp------------schnapp

const int SensorPin = 0; //SensorPin als 0 gesetzt
int Piezo = 2;          //Piezo als 2 gesetzt
long ZeitletzteMessung = 0;  //ZeitletzteMessung als 0 gesetzt
void setup()
{
 pinMode(Piezo, OUTPUT);  //Piezo als Output gesetzt
 Serial.begin(9600);    //Initalisiert den seriellen Port mit der geforderten Übertragungsrate  
}                      

void loop()
{
 
 int SensorWert=analogRead(SensorPin);  //der Wert des analogen Eingangs wird der Variablen SensorWert übergeben
 Serial.println(SensorWert);  //Ausgabe des empfangenen Wertes an die serielle Schnittstelle
 int Dauer = map(SensorWert, 0, 1023, 0, 500); //Messwertskalierung/-umrechnung
     digitalWrite(Piezo, HIGH);
     delayMicroseconds(150);
     digitalWrite(Piezo, LOW);
     delayMicroseconds(150);
  delay(Dauer);
}


------------------schnipp ---------------schnapp------------------
Wenn dein Sensorwert groß ist, dann würde auch die Pause (Interval) auch groß und wenn dein Sensorwert klein ist dann ist auch die Pause klein.

Probiere ich aber mal aus wenn ich zuhause bin.

Mfg.

Klaus

PS: Bin zuhause und habe es ausprobiert. PASST!!!
PPS: Auch mal mit den getauschten Werten in dem Map Befehl probiert, passt auch andersrum. 
< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >

Schleckig

#6
Sep 10, 2012, 09:44 am Last Edit: Sep 10, 2012, 03:06 pm by Schleckig Reason: 1
Vielen Dank, Klaus.

Sehr guter Gedankengang, ich hatte mich zu sehr auf die Intervallsteuerung versteift.

Schade, würde es am liebsten auch sofort ausprobieren.

Danke nochmal.

---------------------------------------------------------------------------------------------------------------------

Edit: Ich habe den geänderten Sketch jetzt ausprobiert und es hat leider nicht funktioniert.

Wie hast du es denn getestet?

Grüße.

KlausR

Ola,

Also ich habe einen Poti an den A0 Eingang geklemmt (um deinen Sensor zu siemulieren).
Ferner habe ich deinen Piezo Pin auf 13 geändert, sodas ich dein "Piep" als Blinken der LED sehe.

Als ich an dem Poti gedreht habe, hat sich die Blinkfrequenz geändert. Ferner habe ich auf dem Seriel Monitor mir noch den Wert von Dauer ausgeben lassen.

Was man noch sieht ist ja das, bedingt durch die Delay Funktion am Ende, auch die serielle Ausgabe nur in dem Takt des "Piep" erfolgt.

Habe eben noch damit gespielt (mit Piezo zusätzlich an Pin 13), und hat prima auf dem Uno gefunzt.

Mfg.

Klaus
PS: Letzte Version von meinem:

< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >

Schleckig

Komisch, weder mit meiner Hardware noch mit VirtualBreadboard funktioniert dein Sketch bei mir  :~ .
Vereinzelt kommt mal ein piepen aus dem Piezo.

Ich melde mich, erstmal probiere ich weiter.

KlausR

#9
Sep 10, 2012, 08:04 pm Last Edit: Sep 10, 2012, 08:10 pm by KlausR Reason: 1
Was bekommst du den auf dem Seriellen Monitor zu sehen?
Spiegel den Augang 2 doch auch mal auf den Pin13, sodas du SIEHST ob das Sinal kommt.
Vieleicht zieht dein Piezo auch zu viel strom, oder muss länger mit einem HIGH Pegel versorgt werden.

Der Piezo bei mir hat auch nur sehr leise gepiept.

Mfg.

Klaus

PS: Fällt mir gerade noch ein. Wenn du eine Ausgabe auf dem seriellen Monitor bekommst, dann muss auch das Signal auf dem Pin 2, bzw.13, kommen, da ja der Loop durchlaufen wird. Und wie schon mal geschrieben, das Intervall in dem die serielle Ausgabe aktualiesiert wird ist auch das Intervall in dem der Ausgang HIGH und LOW gesetzt wird.

Keep on trying. Ich versuche es auf meinem MEGA und Duemillanove heute Nacht.
< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >

Schleckig

Klaus, danke, aber mach dir bitte nicht zu viel Aufwand.

Ich habe schon eine (peinliche) Vorahnung, warum der Sketch generell "invertiert" abläuft.

KlausR

Ist doch kein Problem.

Ich habe das ganze mal mit einem Ultraschall Entfernungsmesser gebastelt, da ist es dann mit der Entfernungsangabe etwas kniffliger gewesen wg. der Echoauswertung.

Melde dann mal volzug wenn ich die Tests gemacht habe.

Mfg.
Klaus
< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >

KlausR

Ola,

also der Test mit den beiden anderen Arduinos war auch erfolgreich.

Und bei dir?

Mfg.

Klaus
< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >

Schleckig

Ich habe deinen ersten Vorschlag mit der Invertierung nochmal beherzigt und die Werte in der map-Funktion gedreht. Ist ja auch vollkommen logisch, wenn mein Sensor falschrum arbeitet.

Zusätzlich habe ich den obersten Wert meines Einganges in der map-Funktion halbiert und die Einschaltgrenze in der if-Anweisung herabgesetzt.

Siehe da, es funktioniert.

Danke nochmal.

KlausR

< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >

Go Up