Pages: [1]   Go Down
Author Topic: Sharp 2D120X, Piezo-Lautsprecher, Parkassistent  (Read 1394 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
}
« Last Edit: September 09, 2012, 04:16:58 pm by Schleckig » Logged

Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Klaus,

danke für den Vorschlag.

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

Viele Grüße
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21656
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

was ist der zweck dieser bedingung?
Quote
if(ZeitaktuelleMessung - ZeitletzteMessung > (Dauer/2) )
Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: September 09, 2012, 04:12:25 pm by Schleckig » Logged

Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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. 
« Last Edit: September 10, 2012, 12:18:04 am by KlausR » Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: September 10, 2012, 08:06:41 am by Schleckig » Logged

Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:


* Piezo_Beep.ino (0.97 KB - downloaded 23 times.)
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ich melde mich, erstmal probiere ich weiter.
Logged

Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: September 10, 2012, 01:10:31 pm by KlausR » Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ola,

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

Und bei dir?

Mfg.

Klaus
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Immer gerne.

Mfg.

Klaus
Logged

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

Pages: [1]   Go Up
Jump to: