Offline
Newbie
Karma: 0
Posts: 12
|
 |
« on: September 09, 2012, 11:32:58 am » |
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
Newbie
Karma: 0
Posts: 37
|
 |
« Reply #1 on: September 09, 2012, 02:14:46 pm » |
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
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #2 on: September 09, 2012, 02:19:20 pm » |
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)
Online
Brattain Member
Karma: 172
Posts: 16138
+39 349 2158303
|
 |
« Reply #3 on: September 09, 2012, 03:09:39 pm » |
was ist der zweck dieser bedingung? if(ZeitaktuelleMessung - ZeitletzteMessung > (Dauer/2) ) Grüße Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #4 on: September 09, 2012, 04:03:13 pm » |
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
Newbie
Karma: 0
Posts: 37
|
 |
« Reply #5 on: September 09, 2012, 09:22:26 pm » |
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
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #6 on: September 10, 2012, 02:44:55 am » |
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
Newbie
Karma: 0
Posts: 37
|
 |
« Reply #7 on: September 10, 2012, 08:39:00 am » |
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:
|
|
|
|
|
Logged
|
< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #8 on: September 10, 2012, 12:20:16 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Offline
Newbie
Karma: 0
Posts: 37
|
 |
« Reply #9 on: September 10, 2012, 01:04:28 pm » |
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
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #10 on: September 10, 2012, 01:21:22 pm » |
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
Newbie
Karma: 0
Posts: 37
|
 |
« Reply #11 on: September 10, 2012, 01:24:54 pm » |
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
Newbie
Karma: 0
Posts: 37
|
 |
« Reply #12 on: September 11, 2012, 05:54:31 am » |
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
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #13 on: September 11, 2012, 10:42:04 am » |
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
Newbie
Karma: 0
Posts: 37
|
 |
« Reply #14 on: September 11, 2012, 01:00:22 pm » |
Immer gerne.
Mfg.
Klaus
|
|
|
|
|
Logged
|
< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >
|
|
|
|
|