Arduino Forum

International => Deutsch => Topic started by: MaxNarr on Dec 22, 2013, 12:24 am

Title: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 22, 2013, 12:24 am
Hallo

Ich habe vor einen Lautsprecher zu bauen bei dem ich die Lautstärke mit der Hand steuern kann indem ich über einem Ultraschallsensor meine Hand strecke und je nach Höhe (5- 50cm) die Lautstärke sich ändert .Ich habe dabei schon gedacht man könnte doch das Signal (von dem Klinkenkabel) mit einem digitalen Potentiometer steuern. Allerdings weiß ich noch nicht wie ich die daten von dem Sensor richtig an das Poti weitergeben soll. Kennt sich da jemand vielleicht aus?

Ein anderes Problem...:
Ich werde zwei Ultraschallsensoren Verbauen, zum einen um die Lautstärke zu regeln und zum anderen um am Handy das nächste bzw vorherige Lied abspielen zu lassen. Dabei soll die Hand über die Sensoren (in max. Höhe von 40cm) "wischen" und dann eben das Lied wechseln. Meine frage ist hierzu wie sage ich dem Arduino was rückwärts und was vorwärts ist? Es weiß ja welcher Sensor zu erst einen Niedrigeren Wert bekommen hat und welcher zu letzt. Wichtig ist allerdings dass man die Hand auch drüber Halten darf ohne dass das Lied wechselt also nur bei einer Kompletten "Wischbewegung" darf es wechseln. Ich weiß noch nicht genau wie das arduino dann zwischen wischen und Lautstärkeregelung unterscheiden soll. Hat Jemand eine Idee?

MFG Max
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Dec 22, 2013, 12:30 am
Fang mit der Lautstärkeregelung an.
Digitales Poti ist gut, speichert auch den letzten Wert (wenn man das möchte).
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Dec 22, 2013, 12:31 am
Oh, Doppelpost
Title: Re: Lautstärke steuern per Ultraschall
Post by: uwefed on Dec 22, 2013, 12:35 am
Kontrolliere ob das digitale Potentiometer die Spannung am Verstärker verträgt. Die meisten schaffen nur 5V.
Ein Ultraschallsensor mißt den Abstand eines Objekts. Er kann keine seitlichen Bewegungen erkennen.
Grüße Uwe
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 22, 2013, 12:50 am
Das mit dem doppelpost war ausersehen... Das ist mein erstes mal dass ich etwas poste und mir ist erst nach dem ersten post in international aufgefallen dass es auch eine deutsche Abteilung gibt.

Ich glaube ich habe mich zu unklar ausgedrückt...
Ich möchte 2 Ultraschall Sensoren parallel im Abstand hin ca 7cm platzieren und das wischen mit der Hand lässt dann die Sensoren einen niedrigeren wert anzeigen bzw es schwankt kurz. Da es ja einen Sensor gibt der zu erst schwankt und einen der zuletzt schwankt soll dadurch die Bewegung erkannt werden.

Ich kenne mich ehrlich gesagt nicht aus ...was für ein digitales Poti eignet sich für die Kontrolle eines stereo signals ? Und wie Wandel ich das signal des Ultraschallsensors so um das es das Poti eignet richtig regelt?
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Dec 22, 2013, 04:11 pm
Welche Pegel haste denn nun zum Steuern?
Digitale Potis gibt's ne Menge, Tante Gugel hilft da sehr einfach weiter.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 22, 2013, 06:45 pm
Ich dachte da an ca. bis 10 k ohm poti (muss einfach nur das klinke signal regulieren) mit ungefähr 250 Schritten. Vielleicht lass ich dann auch einfach zwei parallel laufen (für je einen Kanal). Doch wie sage ich dem Arduino dass bei der Entfernung von z.B. 15 cm das eine Lautstärke von 20% ausmachen soll?
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Dec 23, 2013, 10:06 am
Die Umwandlung von Entfernung in Stellgröße ist einfach.

Ausgangssituation: Sensor misst "unendlich", sollte man sicherlich begrenzen auf >1m oder so
In der Loop läuft die Distanzmessung:
Distanz für Dauer > x im Bereich y dann stelle Poti auf Wert z

Das alles in einem vernünftigen Timing, damit nicht jede vorbeisausende Mücke die Lautstärke ändert  :D
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 23, 2013, 05:15 pm
so weit bin ich auch schon gekommen allerdings weis ich nicht wie man das im code realisieren soll.
Ich bin Anfänger mit Arduino  :smiley-eek:
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Dec 23, 2013, 07:25 pm
Welchen Sensor hast Du denn?
Wenn's z.B. ein SR04 sein sollte dann nimm doch erstmal den Beispielsketch und fange an zu messen. Den Basiscode passen wir dann an.
Was Du hier (meist) nicht finden wirst: jemanden, der Dir Dein Programm schreibt.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 26, 2013, 12:54 am
Ich habe bis her den SR04 nur bestellt (vor 3 Wochen) :smiley-red:
Aber ich denke er wird nächste Woche kommen.
Ich werde wenn er da ist mal par Experimente starten und dann weiter sehen..
Title: Re: Lautstärke steuern per Ultraschall
Post by: sschultewolter on Dec 26, 2013, 10:22 am

so weit bin ich auch schon gekommen allerdings weis ich nicht wie man das im code realisieren soll.
Ich bin Anfänger mit Arduino  :smiley-eek:


Erst einmal die ganze Audio Sache weglassen. Freunde dich erstmal damit ab, eine LED unterschiedlich schnell laufen zu lassen. ;)
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 30, 2013, 02:51 am
Ok Leute ich habe mich jetzt mal probiert bisschen rein zu arbeiten...
die erste Version bezieht sich größtenteils nur auf die Regelung mit einem Sensor. Hab ich das soweit logisch und richtig gemacht?

Meine 2. Frage: Wie wende ich das auf 2 Sensoren an? Kann ich einfach den code kopieren und statt pingPin, pingPin2 einfügen?
MFG Max[

Code: [Select]


//* +V connection of the Sensor attached to +5V
//* GND connection of the Sensor attached to ground
//* SIG connection of the Sensor attached to digital pin 7
        //* SIG connection of the Sensor2 attached to digital pin 8
        //* Relais SIG on digital pin 9
        //* Poti SIG on digital pin 10
        
#include <Wire.h> // DigitalPoti       
int ug = 5; // UNTERGRENZE in cm
int og = 30; // OBERGRENZE in cm

const int potiPin = 10;
const int pingPin = 7;
const int pingPin2= 8;
const int relais = 9;
int protzentsensor = 0;
int schrittepoti = 0;
boolean pause = false;
boolean next = false;
boolean last = false;
boolean play = false;
boolean isplaying = true;

void setup() {
pinMode(relais,OUTPUT);
Wire.begin(); //DigitalPoti

}
byte val = 50; //DigitalPoti
void loop()
{
  // DigitalPoti
  Wire.beginTransmission(44); // transmit to device #44 (0x2c)---> Datasheet
  Wire.write(byte(0x00));           
  Wire.write(val);             
  Wire.endTransmission();   

  //SonarSensor1
  long duration, cm;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);
  cm = microsecondsToCentimeters(duration);
 
  // Reaktion auf Entfernung: Lautstärkeregulierung
   if ( cm > ug && cm < og ){
     protzentsensor = 100/(og-ug)*(cm-ug);
     }
   
     schrittepoti = 2,56*protzentsensor; // insgesamt gibt es 256 Schritte
     val = schrittepoti;
     
  // Pause / Play Steuerung
  if (cm < ug && isplaying == true){
    pause = true;
   }
  if (cm > ug && isplaying == false){
    play = true;
   }
   
// Relais Befehle zur Klinkenschaltung
 if (pause == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause = false;
   isplaying = false;
   }
    if (play == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play = false;
   isplaying = true;
   }
   if (next == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   next = false;
   }if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   last = false;
   }
 
 // Vorwärts/Rückwärts -Steuerung und Erkennung
if (cm > og){
  // Lücke
  }
   delay(100);
}
long microsecondsToCentimeters(long microseconds)
{
  return microseconds / 29 / 2;
  }



Title: Re: Lautstärke steuern per Ultraschall
Post by: Serenifly on Dec 30, 2013, 03:01 am
Verpacke es in eine Funktion:

Code: [Select]

long getDistance(byte pingPin)
{
     ...

     return microsecondsToCentimeters(duration);
}
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 30, 2013, 03:25 am
Ich habe noch kurz an dem hier gebastelt...geht das so auch?
(last euch nicht verwirren ich habe noch paar Sachen dazu geschrieben)
Code: [Select]


//* +V connection of the Sensor attached to +5V
//* GND connection of the Sensor attached to ground
//* SIG connection of the Sensor attached to digital pin 7
        //* SIG connection of the Sensor2 attached to digital pin 8
        //* Relais SIG on digital pin 9
        //* Poti SIG on digital pin 10
       
#include <Wire.h> // DigitalPoti       
int ug = 5; // UNTERGRENZE in cm
int og = 30; // OBERGRENZE in cm

const int potiPin = 10;
const int pingPin = 7;
const int pingPin2= 8;
const int relais = 9;
int protzentsensor = 0;
int schrittepoti = 0;
boolean pause = false;
boolean next = false;
boolean last = false;
boolean play = false;
boolean isplaying = true;
boolean sensor1hand = false;
boolean sensor2hand = false;
int maxhoehe;
int maxhoehe2;
void setup() {
pinMode(relais,OUTPUT);
Wire.begin(); //DigitalPoti

//Kalibrierung am Start zur Ermittlung der Maximalen höhe
//(falls man direkt unter der Decke ist oder so, schließlich sind viele Decken keine 4m hoch ;D )
 
  long duration3, cm3;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  pinMode(pingPin, INPUT);
  duration3 = pulseIn(pingPin, HIGH);
  cm3 = microsecondsToCentimeters(duration3);
 
  long duration4, cm4;
  pinMode(pingPin2, OUTPUT);
  digitalWrite(pingPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin2, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin2, LOW);
  pinMode(pingPin2, INPUT);
  duration4 = pulseIn(pingPin2, HIGH);
  cm4 = microsecondsToCentimeters(duration4);
 
  maxhoehe = cm3-10;
  maxhoehe2 = cm4-10;
 
}
byte val = 50; //DigitalPoti
void loop()
{
  // DigitalPoti
  Wire.beginTransmission(44); // transmit to device #44 (0x2c)---> Datasheet
  Wire.write(byte(0x00));           
  Wire.write(val);             
  Wire.endTransmission();   

  //SonarSensor1
  long duration, cm;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);
  cm = microsecondsToCentimeters(duration);
 
  //SonarSensor2
  long duration2, cm2;
  pinMode(pingPin2, OUTPUT);
  digitalWrite(pingPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin2, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin2, LOW);
  pinMode(pingPin2, INPUT);
  duration2 = pulseIn(pingPin2, HIGH);
  cm2 = microsecondsToCentimeters(duration2);


  // Reaktion auf Entfernung: Lautstärkeregulierung
   if ( cm||cm2 > ug && cm||cm2 < og ){
     int protzentsensor1 = 100/(og-ug)*(cm-ug);
     int protzentsensor2 = 100/(og-ug)*(cm2-ug);
         protzentsensor  = protzentsensor1/protzentsensor2*2 ;// Durschnitt der beiden Sensoren
     }
   
     schrittepoti = 2,56*protzentsensor;
     val = schrittepoti;
     
  // Pause / Play Steuerung
  if (cm||cm2 < ug && isplaying == true){
    pause = true;
   }
  if (cm||cm2 > ug && isplaying == false){
    play = true;
   }
   
// Relais Befehle zur Klinkenschaltung
if (pause == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause = false;
   isplaying = false;
   }
    if (play == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play = false;
   isplaying = true;
   }
   if (next == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   next = false;
   }if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   last = false;
   }

// Vorwärts/Rückwärts -Steuerung und Erkennung
if (cm && cm2 > og){
  if (cm < maxhoehe)
  sensor1hand = true;
  delay(100);
  sensor1hand = false;
 
  }
  if (cm2 < maxhoehe2){
   sensor2hand = true;
   delay(100);
   sensor2hand = false;
  }

}

  //Bearbeitung....
// if ... sensor 1 zuerst und dann sensor 2, dann next = true
// if ... sensor 2 zuerst und dann sensor 1, dann last = true








long microsecondsToCentimeters(long microseconds)
{

  return microseconds / 29 / 2;
 

}



Wie ihr in dem Komentar der letzten Zeilen seht habe ich ein "neues" Problem wozu ich bisher noch keine Idee habe...ihr?
Danke!
LG Max
Title: Re: Lautstärke steuern per Ultraschall
Post by: sschultewolter on Dec 30, 2013, 03:38 am
Meinst du dieses Problem?
  //Bearbeitung....
// if ... sensor 1 zuerst und dann sensor 2, dann next = true
// if ... sensor 2 zuerst und dann sensor 1, dann last = true

Das kannst machen in dem du den Status abfragst innerhalb einer Interval.

Wenn Sensor1 oder Sensor2 einen Wert erfasst, setzt du die verangene Zeit der Interval auf 0 und speicherst den Wert des entsprechenden Sensors als true. Kommt nun innerhalb der Interval auch ein Signal des anderen Sensors, wertest du aus, ob es eine Wischgeste von Rechts nach Links oder Links nach Rechts war.

Aber eine andere Sache, was macht dieser Code, bzw. was willst du damit machen? Du schaltest das Relais 20mal ein/aus innerhalb einer Sekunde. Das bekommt dem Relais auf Dauer nicht.

Code: [Select]
digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   next = false;
   }if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 30, 2013, 12:04 pm
Zum Thema Relais...:
Die Relais schalten den Kontakt eines 4 poligen klinken Kabels. Verbunden wird dadurch gnd mit aux (von Klinke) . Auf dem Handy hab ich dazu eine APP die pro anaus eine Funktion (play,pause,last,next)hat.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Dec 30, 2013, 11:09 pm
Hab ich das jetzt so richtig gemacht?

Code: [Select]


//* +V connection of the Sensor attached to +5V
//* GND connection of the Sensor attached to ground
//* SIG connection of the Sensor attached to digital pin 7
        //* SIG connection of the Sensor2 attached to digital pin 8
        //* Relais SIG on digital pin 9
        //* Poti SIG on digital pin 10
        
#include <Wire.h> // DigitalPoti       
int ug = 5; // UNTERGRENZE in cm
int og = 30; // OBERGRENZE in cm

const int potiPin = 10;
const int pingPin = 7;
const int pingPin2= 8;
const int relais = 9;
int protzentsensor = 0;
int schrittepoti = 0;
boolean pause = false;
boolean next = false;
boolean last = false;
boolean play = false;
boolean isplaying = true;
boolean sensor1hand = false;
boolean sensor2hand = false;
int maxhoehe;
int maxhoehe2;
void setup() {
pinMode(relais,OUTPUT);
Wire.begin(); //DigitalPoti
 
 //Kalibrierung am Start zur Ermittlung der Maximalen höhe
 //(falls man direkt unter der Decke ist oder so, schließlich sind viele Decken keine 4m hoch ;D )
  
  long duration3, cm3;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  pinMode(pingPin, INPUT);
  duration3 = pulseIn(pingPin, HIGH);
  cm3 = microsecondsToCentimeters(duration3);
  
  long duration4, cm4;
  pinMode(pingPin2, OUTPUT);
  digitalWrite(pingPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin2, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin2, LOW);
  pinMode(pingPin2, INPUT);
  duration4 = pulseIn(pingPin2, HIGH);
  cm4 = microsecondsToCentimeters(duration4);
  
  maxhoehe = cm3-10;
  maxhoehe2 = cm4-10;
  
}
byte val = 50; //DigitalPoti
void loop()
{
  // DigitalPoti
  Wire.beginTransmission(44); // transmit to device #44 (0x2c)---> Datasheet
  Wire.write(byte(0x00));           
  Wire.write(val);             
  Wire.endTransmission();   

  //SonarSensor1
  long duration, cm;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);
  cm = microsecondsToCentimeters(duration);
  
  //SonarSensor2
  long duration2, cm2;
  pinMode(pingPin2, OUTPUT);
  digitalWrite(pingPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin2, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin2, LOW);
  pinMode(pingPin2, INPUT);
  duration2 = pulseIn(pingPin2, HIGH);
  cm2 = microsecondsToCentimeters(duration2);
 
 
  // Reaktion auf Entfernung: Lautstärkeregulierung
   if ( cm||cm2 > ug && cm||cm2 < og ){
     int protzentsensor1 = 100/(og-ug)*(cm-ug);
     int protzentsensor2 = 100/(og-ug)*(cm2-ug);
         protzentsensor  = protzentsensor1/protzentsensor2*2 ;// Durschnitt der beiden Sensoren
     }
   
     schrittepoti = 2,56*protzentsensor;
     val = schrittepoti;
     
  // Pause / Play Steuerung
  if (cm||cm2 < ug && isplaying == true){
    pause = true;
   }
  if (cm||cm2 > ug && isplaying == false){
    play = true;
   }
   
// Relais Befehle zur Klinkenschaltung
 if (pause == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause = false;
   isplaying = false;
   }
    if (play == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play = false;
   isplaying = true;
   }
   if (next == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   next = false;
   }if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   last = false;
   }
 
 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung
if (cm && cm2 > og){
  if (cm < maxhoehe)
  sensor1hand = true;
  delay(10);
  sensor1hand = false;
  
  }
  if (cm2 < maxhoehe2){
   sensor2hand = true;
   delay(10);
   sensor2hand = false;
  }
  // Bewegung von links nach rechts
 if (sensor1hand == true){
    delay(10);
   if (sensor2hand == true && sensor1hand == false ){
     delay(10);
     if(sensor1hand == false && sensor2hand == false){
     next = true;
     }
     
  }  
  // Bewegung von rechts nach links
  if (sensor2hand == true){
    delay(10);
   if (sensor2hand == false && sensor1hand == true ){
     delay(10);
     if(sensor1hand == false && sensor2hand == false){
     last = true;
     }
  }  
 }
 }
 }








long microsecondsToCentimeters(long microseconds)
{

  return microseconds / 29 / 2;
  
 
}


Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 01, 2014, 03:38 pm
Weiß jemand von euch wie man mit diesem Digitalen Potentiometer umgeht?
http://www.analog.com/static/imported-files/images/pin_diagrams/AD5263_pc1.gif
Title: Re: Lautstärke steuern per Ultraschall
Post by: Serenifly on Jan 01, 2014, 04:06 pm
Du musst bei ICs generall erst mal ins Datenblatt schauen.

AD5263 Datenblatt:
http://www.analog.com/static/imported-files/data_sheets/AD5263.pdf

Ansteuerung erfolgt über I2C oder SPI. SPI will da aber 10 Bit und Arduino macht nur 8 Bit. Also bleibt I2C. Das geht mit den üblichen 8 Bit Adressen + 8 Bit Daten.

RTC Libs sind da ein guter Anhaltspunkt. Sind aber immer nur ein paar Zeilen für Senden und Lesen. Um die ganzen Timing Diagramme und Start/Stop Conditions brauchst die du dich da NIE zu kümmern. Die schickst immer nur Adressen und/oder Daten und die Lib setzt das für dich um.

Das Datenformat ist auf Seite 16 erklärt. Da muss man sich dann erst mal entsprechend die Bytes zusammenbasteln. Man schickt drei Bytes: Address + Instruction + Data

Address wird an den Pins außen eingestellt. Kann bei einem Device immer 0 sein. Dann muss man da ein Bit für Read/Write setzen
Instruction enthält ein paar Status Bits. Hier wird auch eingestellt welches der 4 Potis man beschreibt
Das Data Byte enthält dann den Widerstandswert von 0-255

Sieht nicht so extrem kompliziert aus.


Ich würde dir da aber empfehlen was in DIP zu nehmen. Nicht SMD wie das hier. Die Dinger gibt es in DIP8. Oder willst du das weil es 15V macht? Die meisten können nämlich nur 5V.

EDIT:
Hier ist Code für Senden:
Code: [Select]

void write(byte addr, byte instruction, byte data)
{
     Wire.beginTransmission(addr)
     Wire.write(instruction);
     Wire.write(data);
     Wire.endTransmission();
}


Das kannst du dann so machen, dass du da z.B. die Nummer des Potis übergibst (jedes IC hat 4) und dann intern das Instruction Byte daraus erzeugst. Man kann auch das Adress-Byte intern festlegen und braucht es nicht als Parameter.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 01, 2014, 09:18 pm
Leider ist mir das mit dem SMD etwas zu spät gekommen und ich habe die Dinger einfach so gekauft...bis ich dann gestern die große Überraschung  :smiley-eek-blue: hatte dass ich die Dinger so nicht benutzen kann  :0 . Ich würde die Potis liebend gern zurückschicken und mir größere und handlichere kaufen. Wo gibt es die DIP8? Ich habe noch nirgends solche gefunden.
Eigentlich würde mir auch ein einfacheres 2 kanal (Stereo) poti tun. Habt ihr eine Idee was sich da zur Audio Lautstärke steuerung gut eignet und auch leicht zu bedienen ist?Bestens eins mit über 64 Schritte Auflösung. Aber 64 ist eigentlich auch i.O. oder?
Welcher widerstand ist für Die Lautstärkeregelung ( Signal von einem Klinkekabel)  am besten geeignet?
5v ist völlig in Ordnung
Danke für deinen Beitrag!
MFG Max
Title: Re: Lautstärke steuern per Ultraschall
Post by: Serenifly on Jan 01, 2014, 09:56 pm
Jetzt wo du es hast wäre ein SSOP/DIP Adapter noch gut:
http://www.ebay.de/itm/SOIC24-SOIC-24-SSOP24-SSOP-24-Adapter-PCB-SMD-Convert-DIP-US-/150976619402?pt=LH_DefaultDomain_0&hash=item2326e8638a

Ist halt ne Frage des Lötens. Wie man bei der Platine sieht, ist SSOP viel, viel kleiner als SOIC. Aber mit Flussmittel geht das auch per Hand. Man muss nicht jeden Pin einzeln anlöten. Dazu gibt es Anleitungen und Videos wenn du es dir zutraust.

Wegen DIP musst du nur bei Standard-Elektronik-Versendern suchen:
http://www.reichelt.de/ICs-MCP-3-5-/2/index.html?&ACTION=2&LA=2&GROUPID=5472;SID=11UdZ-eH8AAAIAABbXhRM787fd1022a781af0bf1a78c4ae8d6857
(rechts oben auf Potis eingrenzen)

Achte da auch darauf ob du eins willst, dass einen Wert in einem EEPROM behält. Das haben nicht alle. In dem Datenblatt ist auch ne Liste was die Unterschiede genau sind:
http://www.reichelt.de/index.html?&ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=A200%252FMCP4151_MIC.pdf


Wenn du nach "Arduino digital potentiometer" suchst, gibt es massig Hits. Die sind halt oft etwas verschieden. Microchip ist da eine Ausnahme. Für das MCP4151 gibt es hier fertigen Code:
http://playground.arduino.cc//Code/Mcp4261

Da ist unten eine Liste mit was das alles damit grob kompatibel ist. Da würde ich was aus der Serie nehmen. Die sollten alles abdecken.

Reichelt hat halt Mindestbestellwert. Aber die Dinger gibts auch woanders :)

Oder hier ist was mit einem MCP41100:
http://www.instructables.com/id/Digital-Potentiometer-MCP41100-and-Arduino/
Das könnte dann wieder ähnlich zu anderen in der Serie sein. Ab wie du da siehst ist da nicht viel Code. Zwei Bytes mit SPI senden.

Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 02, 2014, 02:13 am
Ich habe mich für die erste Variante entschieden...die Platine hab ich sofort bestellt.  :D
Mit dem Löten wird es eher weniger Probleme geben da meine Tante paar Jahre als Löterin gearbeitet hat werde ich sie einfach ganz nett darum fragen ;)

Kann ich diesen Code auch für meinen Verwenden ???:    http://arduino.cc/en/Tutorial/SPIDigitalPot
Die Potis sind im Prinzip (bis auf die Kanäle) doch die Selben?
Danke für deine Hilfe! Ich war heute schon den ganzen Tag beschäftigt das Layout für so ein Adapter zu erstellen und die Ätz-Utensilien zu organisieren  :smiley-red:
Der Adapter kommt gerade richtig! Außerdem ist er im Verhältnis gesehen viel Billiger als wenn man es selber machen würde.

MFG
Title: Re: Lautstärke steuern per Ultraschall
Post by: Serenifly on Jan 02, 2014, 03:23 am
Ich muss mich da auch erst einlesen. Ich habe vor Jahren einmal damit was gemacht. Und das was ich hatte war weder I2C noch SPI. Das hatte glaube ich nur zwei Eingänge wo man mit Impulsen inkrementiert und dekrementiert hat.

Wenn man ins Datenblatt schaut, sieht man das das Datenformat der zwei ICs in der Tat genau gleich ist :)
Seite 15 beim AD5263 und Seite 8 beim AD5204/06

Ich glaube ich habe jetzt vielleicht auch verstanden wieso das mit 10 Bit geht wenn man wirklich 16 Bit sendet. Das Schieben erfolgt MSB first. Wenn also der Puffer im IC 10 Bit hat, heißt dass man schiebt die ersten 6 Bit aus dem anderen Ende heraus und es bleiben nur die letzten 10 Bit drin. Diese werden mit der steigenden Flanke von CS übernommen.

Wenn es da steht kann man es mal so probieren :)

SPI.bitOrder(MSBFIRST); schadet auch nichts.



Und wenn das nicht geht gibt es wie gesagt noch I2C als Alternative. SPI und I2C wird mit Pin 9 ausgewählt. Da muss man dann mehr mit einzelnen Bits rumfummeln, aber es steht alles da (Seite 16 und 19). Man muss z.B. im Adress Byte die obersten 5 Bits auf 01011 setzen und das unterste Bit auf 0. Bits 1 und 2 sind die Adresse des ICs per Pins 13 und 14. Du hast nur eins. Also setzt man die auch auf Low. Somit musst du da immer 0x58 als Adresse schicken.

Im Instruction Byte sind Bits 5 und 6 die Kanal Auswahl. Der Rest kann Low sein. Man macht also das:
byte instruction = channel << 6;

Oder ausgeschrieben:
Code: [Select]
void write(byte channel, byte value)
{
     Wire.beginTransmission(0x58)
     byte instruction = channel << 6
     Wire.write(instruction);
     Wire.write(value);
     Wire.endTransmission();
}


Aber denke mal selbst drüber nach. Kann auch sein, dass da noch ein Fehler drin ist.

Eigentlich ganz einfach.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 02, 2014, 01:28 pm
Wäre dann so(Anhang) die Verkabelung?
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Jan 02, 2014, 02:37 pm
So nen großen Monitor hab ich nicht, mach mal bitte kleiner  :smiley-eek:
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 02, 2014, 05:24 pm
Hier die Kleinere Version.
Wenn ihr die Datei downloadet gehts besser.
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Jan 02, 2014, 07:06 pm
Sieht insgesamt schlüssig aus, hab's aber nicht auf's Pinout geprüft.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 04, 2014, 12:53 am
Heute sind meine Sensoren gekommen ...ich habe den code noch an paar Stellen optimiert. Nur diese eine Stelle tut nicht...
Ich bin ehrlich gesagt auch selber von diesem code nicht überzeugt :D
Code: [Select]
// Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung
if (cm > og && cm2 > og){
 if (cm < maxhoehe)
 boolean sensor1hand = true;
 delay(99);
sensor1hand = false;
 
 }
 if (cm2 < maxhoehe2){
  boolean sensor2hand = true;
  delay(99);
 sensor2hand = false;
 }
 // Bewegung von links nach rechts
if (sensor1hand == true){
   delay(100);
  if (sensor2hand == true && sensor1hand == false ){
    delay(100);
    if(sensor1hand == false && sensor2hand == false){
    next = true;
    }
   
 }  
 // Bewegung von rechts nach links
 if (sensor2hand == true){
   delay(100);
  if (sensor2hand == false && sensor1hand == true ){
    delay(100);
    if(sensor1hand == false && sensor2hand == false){
    last = true;
       
    }
 }  
}
}


hier noch eine Andere Idee...allerdings funktioniert diese genau so wenig :/
Code: [Select]

 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung

  if (cm < maxhoehe && cm > og){
  sensor1hand = true;
  }
   else{
     sensor1hand = false;
     }
   if (cm2 < maxhoehe2 && cm2 > og){
   sensor2hand = true;
   }
   else{
     sensor2hand = false;
      }
    
     if (sensor2hand == true ){
      previousmillis2=millis();
      if (millis() < previousmillis2 + interval && sensor1hand == true) {
         previousmillis2 = millis();
        if (millis() < previousmillis2 + interval && sensor1hand == true && sensor2hand == false){
           previousmillis2 = millis();
          if (millis() < previousmillis2 + interval && sensor1hand == false && sensor2hand == false ) {
            next = true;
            
  }}}}}
Title: Re: Lautstärke steuern per Ultraschall
Post by: uwefed on Jan 04, 2014, 10:55 am
Code: [Select]
if (cm > og && cm2 > og){
  if (cm < maxhoehe)
  boolean sensor1hand = true;
  delay(99);
sensor1hand = false; 
  }

Was willst Du machen?
Der Code kontrolliert ob cm und cm2 größer als og sind.
Wenn cm kleiner als maxhoehe ist geht sensor1hand für 99 mS auf TRUE und dann wieder auf FALSE ansonsten wartet der Code 99 mS und setzt  sensor1hand auf FALSE.
Ich würde sagen da feht eine geschwungene Klammer.

Grüße Uwe
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 04, 2014, 11:32 am
Ich möchte die 2 Sensoren parallel anordnen und wenn man nun die Hand von links nach rechts über den Sensoren bewegt soll next true sein. Anders rum soll last true werden
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 04, 2014, 08:58 pm
Hat niemand eine Idee wie man den Code umschreiben kann dass er tut? Oder einen anderen Weg um das  (mit den Sensoren) zu schaffen?
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 06, 2014, 01:10 pm
Bitte. Ich muss das für die Schule machen und muss es bald abgeben.
Title: Re: Lautstärke steuern per Ultraschall
Post by: Serenifly on Jan 06, 2014, 01:18 pm
Kannst du nicht einfach wenn ein Sensor auslöst schauen ob innerhalb einer bestimmten Zeit der andere ausgelöst wird? Das kann man mit booleans gegeneinander verriegeln und die Zeit mit millis() messen.

Das ist ja auch glaube was du willst, aber bei sowas ist es sehr schwer Code zu schreiben ohne die Hardware zu haben und das zu testen. Man kann es vielleicht mit Tastern simulieren.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 06, 2014, 09:07 pm
Das mit den Millis usw.(ganz unten in meinem Code ab "  // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung")habe ich schon probiert aber es funktioniert nicht. Irgend was klappt nicht...Die "Play/Pause" Funktion klappt soweit.
Code: [Select]


//* +V connection of the Sensor attached to +5V
//* GND connection of the Sensor attached to ground
        //* triggeer2 connection of the Sensor attached to digital pin 5
        //* echo2 connection of the Sensor attached to digital pin 6
//* trigger1 connection of the Sensor2 attached to digital pin 7
        //* echo1 connection of the Sensor2 attached to digital pin 8
        //* Relais SIG on digital pin 9
        //* Poti SIG on digital pin 10
        
#include <Wire.h> // DigitalPoti       
const int ug = 10; // UNTERGRENZE in cm
const int og = 11; // OBERGRENZE in cm
const int potiPin = 10;
unsigned long interval = 1000;
unsigned long previousmillis = 0;
unsigned long previousmillis2 = 0;
// Sensor 2
const int trigger2 = 5;
const int echo2 = 6;
//sensor 1
const int trigger1 = 7;
const int echo1= 8;

long duration, cm;
long duration2, cm2;
long duration3, cm3;
long duration4, cm4;
const int relais = 9;
int protzentsensor = 0;
int schrittepoti = 0;
boolean sensor1hand = false;
boolean sensor2hand = false;
boolean pause = false;
boolean pause2 = false;
boolean play = false;
boolean play2 = false;
boolean next = false;
boolean last = false;
boolean isplaying = false;
boolean isplaying2 = false;

int maxhoehe;
int maxhoehe2;
byte val = 50; //DigitalPoti

void setup() {
  pinMode(trigger1, OUTPUT);
  pinMode(echo1, INPUT);
  pinMode(trigger2, OUTPUT);
  pinMode(echo2, INPUT);

pinMode(relais,OUTPUT);
Wire.begin(); //DigitalPoti
 
 //Kalibrierung am Start zur Ermittlung der Maximalen höhe
 //(falls man direkt unter der Decke ist oder so, schließlich sind viele Decken keine 4m hoch ;D )
  Serial.begin(9600);
  
  
  digitalWrite(trigger1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger1, LOW);
  duration3 = pulseIn(echo1, HIGH);
  cm3 = duration3/58.2;
  
  digitalWrite(trigger2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger2, LOW);
  duration4 = pulseIn(echo2, HIGH);
  cm4 = duration4/58.2;
  
  maxhoehe = cm3-20;
  maxhoehe2 = cm4-20;
  
}
void loop()
{
  // DigitalPoti
  Wire.beginTransmission(44); // transmit to device #44 (0x2c)---> Datasheet
  Wire.write(byte(0x00));           
  Wire.write(val);             
  Wire.endTransmission();   

  //SonarSensor1
  digitalWrite(trigger1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger1, LOW);
  duration = pulseIn(echo1, HIGH);
  cm = duration/58.2;
  
  //SonarSensor2
  digitalWrite(trigger2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger2, LOW);
  duration2 = pulseIn(echo2, HIGH);
  cm2 = duration2/58.2;
  
// Serial.println(cm2);
  Serial.println(maxhoehe);
   Serial.println(maxhoehe2);

  // Reaktion auf Entfernung: Lautstärkeregulierung
   if ( cm||cm2 > ug && cm||cm2 < og ){
     int protzentsensor1 = 100/(og-ug)*(cm-ug);
     int protzentsensor2 = 100/(og-ug)*(cm2-ug);
  
  //  Die Kleinere Entfernung wird genommen.
       if (protzentsensor1 < protzentsensor2){
        protzentsensor = protzentsensor1;
      }
       if (protzentsensor2 < protzentsensor1){
        protzentsensor = protzentsensor2;
      }
     }
   
     schrittepoti = 2,56*protzentsensor;
     val = schrittepoti;
     
  // Pause / Play Steuerung
  if (cm < ug && isplaying == true){
    pause = true;
   }
    if (cm2 < ug && isplaying2 == true){
    pause2 = true;
   }
  if (cm2 > ug && isplaying2 == false){
    play2 = true;
   }
     if (cm > ug && isplaying == false){
    play = true;
   }
   
// Relais Befehle zur Klinkenschaltung
 if (pause == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause = false;
   isplaying = false;
   delay(100);
   }
    if (play == true ) {
   delay(1000);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play = false;
   isplaying = true;
   
   }
   if (pause2 == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause2 = false;
   isplaying2 = false;
   delay(100);
   }
    if (play2 == true ) {
   delay(1000);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play2 = false;
   isplaying2 = true;
  

   }
   if (next == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   next = false;
  }
  if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   last = false;
   }
 



 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung

  if (cm < maxhoehe && cm > og){
  sensor1hand = true;
  }
  else{
     sensor1hand = false;
     }
  
  if (cm2 < maxhoehe2 && cm2 > og){
   sensor2hand = true;
   }
   else{
     sensor2hand = false;
     
    }
    
    
    
    
 if (sensor2hand == true ){
      previousmillis2=millis();
      if (millis() < previousmillis2 + interval && sensor1hand == true) {
         previousmillis2 = millis();
        if (millis() < previousmillis2 + interval && sensor1hand == true && sensor2hand == false){
           previousmillis2 = millis();
          if (millis() < previousmillis2 + interval && sensor1hand == false && sensor2hand == false ) {
            next = true;
            }
             }}
 }
 }

Title: Re: Lautstärke steuern per Ultraschall
Post by: Serenifly on Jan 06, 2014, 09:20 pm
Versuche mal das nacheinander abzufragen statt es ineinander zu verschachteln.

z.B. hier:
Code: [Select]

  if (millis() < previousmillis2 + interval && sensor1hand == true && sensor2hand == false){
           previousmillis2 = millis();
          if (millis() < previousmillis2 + interval && sensor1hand == false && sensor2hand == false ) {

Ich blick da nicht ganz durch, aber du fragst erst auf sensor1hand == true ab und dann eine Schleife darunter auf false. Das kann glaube ich nicht gehen.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 06, 2014, 10:41 pm
Das mit der Schleife verstehe ich jetzt auch...desshalb bin ich jetzt umgestiegen auf die boolean variante die du mir empfohlen hast. wäre das ein Ansatz? leider tut es so aber in der Praxis auch noch nicht  :~
Code: [Select]
// Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung

 if (cm < maxhoehe && cm > og){
 sensor1hand = true;
 }
if (cm >= maxhoehe && cm <= og){
    sensor1hand = false;
    }
 
 if (cm2 < maxhoehe2 && cm2 > og){
  sensor2hand = true;
  }
  if (cm2 >= maxhoehe2 && cm2 <= og){
    sensor2hand = false;
   
   }
   
   
   
   
 if (sensor2hand == true ){
     previousmillis2=millis();
     }
 if (millis() < previousmillis2 + interval && sensor1hand == true) {
        previousmillis2 = millis();
        voraussetzung1 = true;
        previousmillis4 = millis();
        }
 if ( millis() >  previousmillis4 + interval2){
    voraussetzung1 = false;
    }
 if (millis() < previousmillis2 + interval && sensor1hand == true && sensor2hand == false){
          previousmillis2 = millis();
          voraussetzung2 = true;
          previousmillis3 = millis();
          }
  if ( millis() >  previousmillis3 + interval2){
    voraussetzung2 = false;
    }
 if (millis() < previousmillis2 + interval && sensor1hand == false && sensor2hand == false && voraussetzung2 == true && voraussetzung1 == true ) {
           next = true;
           voraussetzung2 = false;
           voraussetzung1 = false;

}

}
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 07, 2014, 09:14 pm
Ist das schon realisierbar, oder?
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 08, 2014, 11:08 pm
Hat nicht irgendjemand eine Lösung? Ich muss das so schnell wie möglich haben da ich es am Wochenende fertig haben muss und dieser arduino Bereich nur ein teil meines Projektes ist der aber die meiste Zeit bisher gefordert hat jedoch ohne das erhoffte Ergebniss...
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Jan 09, 2014, 10:37 am

Hat nicht irgendjemand eine Lösung? Ich muss das so schnell wie möglich haben da ich es am Wochenende fertig haben muss und dieser arduino Bereich nur ein teil meines Projektes ist der aber die meiste Zeit bisher gefordert hat jedoch ohne das erhoffte Ergebniss...


Nein, keine Lösung. Ich habe diesen Thread nicht besonders mitverfolgt, aber mir ist folgendes in dem geposteten Quellcode aufgefallen:

Du pingst einen Ultraschallsensor an.
Du wartest auf das Echo vom ersten Ultraschallsensor.
Du pingst unmittelbar darauf den zweiten Ultraschallsensor an.
Du wartest auf das Echo vom zweiten Ultraschallsensor.

Das kann im allgemeinen Fall so nicht funktionieren, weil der Ping-Schall des ersten Ultraschallsensors sich nicht einfach in Luft auflöst, nachdem Du das erste Echo von der nächstgelegenen Reflektionsfläche empfangen hast.

D.h. Du sendest auf diese Weise am zweiten Ultraschallsensor ein Ping los, während noch Ultraschall vom ersten Sensor  im Raum unterwegs ist. Falls es Flächen, Wände, Fußboden, Decke gibt, ist zu dem Zeitpunkt der Schall vom ersten Ping noch unterwegs, und wenn der zweite Sensor auf Empfang eines Echos abgefragt wird, kannst Du doch überhaupt nicht unterscheiden, ob das als zweites empfangene Echo ein Echo aufgrund des als zweites gesendeten Pings ist, oder ob es vielleicht noch ein Echo aufgrund des ersten gesendeten Pings ist, das nur aufgrund einer Reflektion an einer weiter entfernten Fläche etwas länger unterwegs war.

Du kannst im selben Raum nicht zwei Ultraschallsensoren gleichzeitig nebeneinander betreiben. Das funktioniert nur, wenn der Betrieb der beiden Sensoren genau synchronisiert wird, angepaßt an die Nachhallbedingungen im Raum.

D.h. wenn der erste Sensor sein Ping gesendet und sein Echo empfangen hat, muß erstmal so lange gewartet werden, bis das Echo dieses Pings im Raum verhallt und so weit abgeschwächt ist, dass keine Echo mehr im Raum unterwegs ist. Erst dann darf der zweiten Sensor sein Ping raussenden und auf ein Echo lauschen.

So rein vom Gefühl her würde ich sagen, dass das zweite Ping bei normalen Räumen nicht früher als 100 Millisekunden nach dem ersten Ping kommen darf, sonst besteht eine hohe Gefahr, dass die Messung des zweiten Sensors vom Echo des ersten Sensors gestört wird.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 09, 2014, 05:01 pm
Das ist eine gute verbesserungs Idee ...allerdings habe ich bei Messungen mit den 2 Sensoren (über seriellen port) immer wahre korrekte Ergebnisse bekommen. Mein Programm code hört sich doch Logisch an? Ich verstehe nicht wo der Haken ist
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 10, 2014, 08:00 pm
Ich habe jetzt noch das Wochenende Zeit und dann muss ich das Ding abgeben...solangsam bin ich hier am verzweifeln!
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 11, 2014, 12:06 am
Ok ich habe es soweit jetzt hin bekommen! mit diesem Code
Code: [Select]

        //* +V connection of the Sensor attached to +5V
//* GND connection of the Sensor attached to ground
        //* triggeer2 connection of the Sensor attached to digital pin 5
        //* echo2 connection of the Sensor attached to digital pin 6
//* trigger1 connection of the Sensor2 attached to digital pin 7
        //* echo1 connection of the Sensor2 attached to digital pin 8
        //* Relais SIG on digital pin 9
        //* Poti SIG on digital pin 10
        
#include <Wire.h> // DigitalPoti       
const int ug = 5; // UNTERGRENZE in cm
const int og = 6; // OBERGRENZE in cm
const int potiPin = 10;
unsigned long interval = 1000;
unsigned long interval2 = 1000;
unsigned long intervalping = 15;
unsigned long intervalping2 = 15;
unsigned long previousmillis1 = 0;
unsigned long previousmillis2 = 0;
unsigned long previousmillis3 = 0;
unsigned long previousmillis4 = 0;
unsigned long previousmillis5 = 0;
unsigned long previousmillis6 = 0;
unsigned long previousmillis7 = 0;
unsigned long previousmillis8 = 0;
unsigned long previousmillis9 = 0;
unsigned long previousmillisping1 = 15;
unsigned long previousmillisping2 = 15;
// Sensor 2
const int trigger2 = 5;
const int echo2 = 6;
//sensor 1
const int trigger1 = 7;
const int echo1= 8;

long duration, cm;
long duration2, cm2;
long duration3, cm3;
long duration4, cm4;
const int relais = 9;
int protzentsensor = 0;
int schrittepoti = 0;
boolean sensor1hand = false;
boolean sensor2hand = false;
boolean pause = false;
boolean pause2 = false;
boolean play = false;
boolean play2 = false;
boolean next = false;
boolean last = false;
boolean isplaying = false;
boolean isplaying2 = false;
boolean voraussetzung1 = false;
boolean voraussetzung2 = false;
boolean voraussetzung3 = false;
boolean voraussetzung4 = false;
boolean start1 = false;
boolean wert1 = false;
boolean wert2 = false;
boolean wert3 = false;
boolean wert4 = false;
boolean wert5 = false;
int maxhoehe;
int maxhoehe2;
byte val = 50; //DigitalPoti

void setup() {
  pinMode(trigger1, OUTPUT);
  pinMode(echo1, INPUT);
  pinMode(trigger2, OUTPUT);
  pinMode(echo2, INPUT);

pinMode(relais,OUTPUT);
Wire.begin(); //DigitalPoti
 
 //Kalibrierung am Start zur Ermittlung der Maximalen höhe
 //(falls man direkt unter der Decke ist oder so, schließlich sind viele Decken keine 4m hoch ;D )
  Serial.begin(9600);
  previousmillisping1 = millis();
  previousmillisping2 = millis();
  maxhoehe = 60;
  maxhoehe2 = 60;
  
}
void loop()
{
  /* DigitalPoti
  Wire.beginTransmission(44); // transmit to device #44 (0x2c)---> Datasheet
  Wire.write(byte(0x00));           
  Wire.write(val);             
  Wire.endTransmission();    
  */
  
  //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;
  }


  // Reaktion auf Entfernung: Lautstärkeregulierung
   if ( cm||cm2 > ug && cm||cm2 < og ){
     int protzentsensor1 = 100/(og-ug)*(cm-ug);
     int protzentsensor2 = 100/(og-ug)*(cm2-ug);
  
  //  Die Kleinere Entfernung wird genommen.
       if (protzentsensor1 < protzentsensor2){
        protzentsensor = protzentsensor1;
      }
       if (protzentsensor2 < protzentsensor1){
        protzentsensor = protzentsensor2;
      }
     }
   
     schrittepoti = 2,56*protzentsensor;
     val = schrittepoti;
     
  // Pause / Play Steuerung
  if (cm < ug && isplaying == true){
    pause = true;
   }
    if (cm2 < ug && isplaying2 == true){
    pause2 = true;
   }
  if (cm2 > ug && isplaying2 == false){
    play2 = true;
   }
     if (cm > ug && isplaying == false){
    play = true;
   }
   
// Relais Befehle zur Klinkenschaltung
 if (pause == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause = false;
   isplaying = false;
   delay(100);
   }
    if (play == true ) {
   delay(1000);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play = false;
   isplaying = true;
   
   }
   if (pause2 == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause2 = false;
   isplaying2 = false;
   delay(100);
   }
    if (play2 == true ) {
   delay(1000);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play2 = false;
   isplaying2 = true;
  

   }
   if (next == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(600);
   next = false;
   delay(100);
   stop
  }
  if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(600);
   last = false;
   delay(100);

   }
 


 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung

  if (cm < maxhoehe && cm > og){
  sensor1hand = true;
  }
  else{
     sensor1hand = false;
     }
  
  if (cm2 < maxhoehe2 && cm2 > og){
   sensor2hand = true;
   }
   else{
     sensor2hand = false;
     
    }
    
   
  
  
    // links nach rechts
  if (sensor2hand == true && wert1 == false){
      previousmillis2=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert1 = true;

      }
      
  if ( millis() > previousmillis2 + interval + 2 ){
    wert1 = false;
    }
    
  if (millis() < previousmillis2 + interval && sensor1hand == true) {
         previousmillis5 = millis();
         voraussetzung1 = true;
         previousmillis4 = millis();
         }
  if ( millis() >  previousmillis4 + interval2 && voraussetzung1 == true){
     voraussetzung1 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == true && sensor2hand == false && voraussetzung1 == true){
           
           voraussetzung2 = true;
           previousmillis3 = millis();
           }
   if ( millis() >  previousmillis3 + interval2 && voraussetzung2 == true){
     voraussetzung2 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == false && sensor2hand == false && voraussetzung2 == true && next == false ) {
            next = true;
            voraussetzung2 = false;
            voraussetzung1 = false;

}
 //rechts nach links
 if (sensor1hand == true && wert2 == false){
      previousmillis6=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert2 = true;

      }
      
  if ( millis() > previousmillis6 + interval + 2 ){
    wert2 = false;
    }
    
  if (millis() < previousmillis6 + interval && sensor2hand == true) {
         previousmillis7 = millis();
         voraussetzung3 = true;
         previousmillis8 = millis();
         }
  if ( millis() >  previousmillis8 + interval2 && voraussetzung3 == true){
     voraussetzung3 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == true && sensor1hand == false && voraussetzung3 == true){
           
           voraussetzung4 = true;
           previousmillis9 = millis();
           }
   if ( millis() >  previousmillis9 + interval2 && voraussetzung4 == true){
     voraussetzung4 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == false && sensor1hand == false && voraussetzung4 == true && next == false ) {
            last = true;
            voraussetzung4 = false;
            voraussetzung3 = false;
}}
 


Es läuft nur noch nicht ganz flüssig... aber das wird irgendwann noch verbessert.
Mal sehen was mich noch mit dem Poti erwartet wenn die Adapterplatine denn endlich mal da ist... :/
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 11, 2014, 02:19 pm
So Jetzt wirds spannend! Meine Platinen sind endlich angekommen und die Potis sind auch schon aufgelötet...
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 11, 2014, 10:10 pm
Also...ich habe jetzt den Größten Teil geschafft... XD
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 23, 2014, 10:25 pm
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... :( es klappt nicht
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Jan 24, 2014, 06:45 am
Fehler in der Verdrahtung oder Problem mit der Spannungsversorgung?
Hast Du Abblockkondensatoren verbaut?
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 27, 2014, 02:49 pm
Die Verdrahtung ist richtig und die Spannungsversorgung auch...kondensatoren hab ich keine verbaut. Vielleicht hat es was damit zutun dass es 2  Sensoren Sind?
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Jan 27, 2014, 05:25 pm

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?
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 27, 2014, 09:24 pm
Ja mich hat das auch verwundert mit den Werten...das Problem trat eigentlich erst nach dem ich sie reingeklebt habe auf :( .
Ich habe auch schon probiert einen Code passend zu programmieren aber es hat den Effekt nicht ansatzweise beeinflusst :(
Ich habe es mit intervallen von 0 bis 5000 probiert aber es hat nichts verändert...
Code: [Select]
//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;
  }

Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Jan 27, 2014, 09:51 pm

das Problem trat eigentlich erst nach dem ich sie reingeklebt habe auf :( .


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.
Title: Re: Lautstärke steuern per Ultraschall
Post by: Klaus_ww on Jan 28, 2014, 12:06 pm
Und "kleb" sicherheitshalber ein paar 100nF Keramikkondensatoren noch dazu. Vorzugsweise möglichst nahe an die Stromversorgungspins.
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Jan 28, 2014, 03:28 pm

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: [Select]

/*
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.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 28, 2014, 08:20 pm
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.
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Jan 29, 2014, 01:29 pm

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: [Select]
/*
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.



Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Jan 29, 2014, 02:53 pm
WOW!Danke! Du bist echt gut! Ich muss mich da erst mal bisschen rein lesen...
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Feb 06, 2014, 08:30 pm
ALSO ich habs jetzt getested und leider kommt nur so was an (siehe anhang)
Ich habe die eingänge verändert sonst nichts
Code: [Select]

#define TRIGGERPIN 7    // beide Trigger-Pins verbunden
#define ECHOPIN1 8      // Echo Pin Sensor 1
#define ECHOPIN2 6     // Echo Pin Sensor 2
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Feb 06, 2014, 08:33 pm

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


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

Guckst Du in Deinem Seriellen Monitor, steht da: 9600.
Stell mal Deinen Seriellen Monitor auf 57600!
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Feb 06, 2014, 08:34 pm
ohhh man ...ich bin einfach zu müde :/ Danke!
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Feb 06, 2014, 08:58 pm
Ok die Werte sehen realistisch aus....ich probiere es einzubauen
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Feb 07, 2014, 10:38 am

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


Ich muss mich gerade selbst mal loben, wegen meiner genialen Idee, wie die beiden Sensoren gemeinsam getriggert und getrennt ausgewertet werden können.

OK, dann bekommst Du jetzt fünfzig mal pro Sekunde einwandfreie Entfernungsmesswerte beider Sensoren. Das ist mehr als bisher und auch bereits mehr als die halbe Miete.

Nun müßtest Du im zeitlichen Verlauf der Signale die Muster erkennen, für die von Dir gewünschten Funktionen:
- drüberwischen von links nach rechts ==> Umschalten Rechts
- drüberwischen von rechts nach links ==> Umschalten Links
- drüberhalten und Hand hoch und runter bewegen ==> Lautstärke ändern

Immer dran denken: Du darfst KEIN DELAY verwenden, sonst kannst Du nicht mehr die fünfzig Messungen pro Sekunde ausführen. Du mußt rein aufgrund des Timings und der Messwerte den Status so auswerten, dass Du die gewünschten Informationen herausbekommst und dann damit die Hardware steuern kannst.

Sag Bescheid, wenn es dabei Probleme bei Dir gibt, dann komplettiere ich Dir auch noch die Auswertelogik!
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Feb 08, 2014, 03:46 pm
Quote
Du darfst KEIN DELAY verwenden, sonst kannst Du nicht mehr die fünfzig Messungen pro Sekunde ausführen. Du mußt rein aufgrund des Timings und der Messwerte den Status so auswerten, dass Du die gewünschten Informationen herausbekommst und dann damit die Hardware steuern kannst.


Heißt das dass ich es mit z.b.
Code: [Select]
millis() machen kann?
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Feb 08, 2014, 08:57 pm

Heißt das dass ich es mit z.b.
Code: [Select]
millis() machen kann?


Ja, mit millis() und Statusvariablen, die sich je nach Messwerten und Timing ändern.
Es kommt aber auf eine einwandfreie Logik bei den Statusübergängen an, und auf ein vernünftiges Timing beim Erkennen von Statusübergängen.

Die Statusübergänge beim Drüberwischen wären:
- beide Sensoren zeigen >100cm
- ein Sensor springt auf Werte <100cm
- beide Sensoren zeigen Werte <100cm
- der Sensor, der zuerst <100cm anzeigte, zeigt wieder >100cm an
- beide Sensoren zeigen >100cm

Die Statusübergänge bei der Lautstärkeregelung wären:
- beide Sensoren zeigen >100cm
- ein Sensor springt auf Werte <100cm
- beide Sensoren zeigen Werte <100cm
- einer der beiden Sensoren zeigt wieder >100cm an
- beide Sensoren zeigen >100cm

Tricky wird das ganze dadurch, dass die drei ersten Zustände identisch sind, egal ob gewischt oder die Lautstärke geändert wird und genau der dritte Zustand "beide Sensoren zeigen Werte <100cm" ist der Knackpunkt.

Hier muß das Timing entscheiden: Wenn beide Sensoren nur sehr kurzfristig Werte <100 cm anzeigen, dann ist von einer Wischbewegung auszugehen. Und wenn beide Sensoren für längere Zeit Werte <100cm anzeigen, dann kann es keine Wischbewegung sein, also muß dann die Lautstärkeregelung anspringen und der gemessene Abstand regelt die Lautstärke.
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Feb 11, 2014, 05:48 pm
Diesen teil habe ich ja schon in meinem Alten Code fertig gehabt...dort habe ich einfach gesagt dass die Wischbewegung erst in einer Höhe X auch als diese angenommen wird und darunter als Lautstärke regelung ;)
Code: [Select]

 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung

  if (cm < maxhoehe && cm > og){
  sensor1hand = true;
  }
  else{
     sensor1hand = false;
     }
 
  if (cm2 < maxhoehe2 && cm2 > og){
   sensor2hand = true;
   }
   else{
     sensor2hand = false;
     
    }
   
   
 
 
    // links nach rechts
  if (sensor2hand == true && wert1 == false ){
      previousmillis2=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert1 = true;

      }
     
  if ( millis() > previousmillis2 + interval + 2 ){
    wert1 = false;
    }
   
  if (millis() < previousmillis2 + interval && sensor1hand == true) {
         previousmillis5 = millis();
         voraussetzung1 = true;
         previousmillis4 = millis();
         }
  if ( millis() >  previousmillis4 + interval2 && voraussetzung1 == true){
     voraussetzung1 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == true && sensor2hand == false && voraussetzung1 == true){
           
           voraussetzung2 = true;
           previousmillis3 = millis();
           }
   if ( millis() >  previousmillis3 + interval2 && voraussetzung2 == true){
     voraussetzung2 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == false && sensor2hand == false && voraussetzung2 == true && next == false ) {
            next = true;
            voraussetzung2 = false;
            voraussetzung1 = false;
}


//rechts nach links
if (sensor1hand == true && wert2 == false){
      previousmillis6=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert2 = true;

      }
     
  if ( millis() > previousmillis6 + interval + 2 ){
    wert2 = false;
    }
   
  if (millis() < previousmillis6 + interval && sensor2hand == true) {
         previousmillis7 = millis();
         voraussetzung3 = true;
         previousmillis8 = millis();
         }
  if ( millis() >  previousmillis8 + interval2 && voraussetzung3 == true){
     voraussetzung3 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == true && sensor1hand == false && voraussetzung3 == true){
           
           voraussetzung4 = true;
           previousmillis9 = millis();
           }
   if ( millis() >  previousmillis9 + interval2 && voraussetzung4 == true){
     voraussetzung4 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == false && sensor1hand == false && voraussetzung4 == true && next == false ) {
            last = true;
            voraussetzung4 = false;
            voraussetzung3 = false;
}
}

Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Feb 11, 2014, 06:24 pm
So....ich habe es nun mal mit dem Rest zusammen gewürfelt ;)
Hier das (hoffentlich) finale Ergebnis
Code: [Select]

/*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
          Relais SIG on digital pin 9
          Poti SIG on digital pin 10
        */
#include <SPI.h>      
#include <Wire.h> // DigitalPoti        
const int ug = 10; // UNTERGRENZE in cm
const int og = 30; // OBERGRENZE in cm
const int ugog = og-ug;
int ss = 10;
unsigned long interval = 1000;
unsigned long interval2 = 1000;
unsigned long intervalvalue = 1000;
unsigned long intervalping = 15;
unsigned long intervalping2 = 15;
unsigned long previousmillis1 = 0;
unsigned long previousmillis2 = 0;
unsigned long previousmillis3 = 0;
unsigned long previousmillis4 = 0;
unsigned long previousmillis5 = 0;
unsigned long previousmillis6 = 0;
unsigned long previousmillis7 = 0;
unsigned long previousmillis8 = 0;
unsigned long previousmillis9 = 0;
unsigned long previousmillis10 = 0;
unsigned long previousmillis11 = 0;
unsigned long previousmillisvalue = 0;
unsigned long previousmillisping1 = 15;
unsigned long previousmillisping2 = 15;
#define TRIGGERPIN 7    // beide Trigger-Pins verbunden
#define ECHOPIN1 8      // Echo Pin Sensor 1
#define ECHOPIN2 6     // 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
const int relais = 9;
int protzentsensor = 100;
int protzentsensor1 = 100;
int protzentsensor2 = 100;
int schrittepoti = 0;
boolean sensor1hand = false;
boolean sensor2hand = false;
boolean pause = false;
boolean pause2 = false;
boolean play = false;
boolean play2 = false;
boolean next = false;
boolean last = false;
boolean isplaying = false;
boolean isplaying2 = false;
boolean voraussetzung1 = false;
boolean voraussetzung2 = false;
boolean voraussetzung3 = false;
boolean voraussetzung4 = false;
boolean start1 = false;
boolean wert1 = false;
boolean wert2 = false;
int maxhoehe;
int maxhoehe2;
int value ; //DigitalPoti
int value2 ;
int valuezwischen;
int cm, cm2;
void setup() {
 
 Serial.begin (57600);
pinMode(relais,OUTPUT);
pinMode(ss, OUTPUT);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
pinMode(TRIGGERPIN, OUTPUT);
pinMode(ECHOPIN1, INPUT);
pinMode(ECHOPIN2, INPUT);
pinMode(LEDPIN, OUTPUT); // LED, falls verwendet
previousmillisping1 = millis();
previousmillisping2 = millis();
previousmillisvalue = millis();
maxhoehe = 60;
maxhoehe2 = 60;

}

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
  cm=MAXRANGE;  // Annahme, dass wir ausser Reichweite sind
  cm2=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???
  {
    cm=-1;
    cm2=-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) cm = duration1*V_SCHALL/2000000L;
 if (duration2>0) cm2 = duration2*V_SCHALL/2000000L;
 Serial.println(cm):
  Serial.println(cm2):

}





void Lautstaerke()
  {
   if ( cm > ug && cm < og ){
     int x1 = cm-ug;
     protzentsensor = 100/ugog*x1;  
    
     
  }
    if ( cm2 > ug && cm2 < og ){
      int x2 = cm2-ug;
      protzentsensor = 100/ugog*x2;   
    
      }
   if ( protzentsensor < 101){
     valuezwischen = 2.55*protzentsensor;
     delay(2);
   if ( millis() > previousmillisvalue + intervalvalue){
    value2 = valuezwischen;
    previousmillisvalue = millis();
    }
   
    if (valuezwischen < value2){
   value = valuezwischen + 1;
  } 
     if (valuezwischen > value2){
   value = valuezwischen - 1;
  } 
     
      digitalWrite(ss, LOW);
  SPI.transfer(0);
  SPI.transfer(value);
  digitalWrite(ss, HIGH);
  delay(10);
      digitalWrite(ss, LOW);
  SPI.transfer(2);
  SPI.transfer(value);
  digitalWrite(ss, HIGH);
  delay(10);
  }

     }
     

Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Feb 11, 2014, 06:24 pm
Muss es 2 Teilig posten da es zu groß ist...
Code: [Select]
   void Handysteuerung()
   {
  if (cm < ug && isplaying == true){
    pause = true;
   }
    if (cm2 < ug && isplaying2 == true){
    pause2 = true;
   }
  if (cm2 > ug && isplaying2 == false){
    play2 = true;
   }
     if (cm > ug && isplaying == false){
    play = true;
   }
   
// Relais Befehle zur Klinkenschaltung
 if (pause == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause = false;
   isplaying = false;
   delay(100);
   }
    if (play == true ) {
   delay(1000);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play = false;
   isplaying = true;
   
   }
   if (pause2 == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause2 = false;
   isplaying2 = false;
   delay(100);
   }
    if (play2 == true ) {
   delay(1000);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play2 = false;
   isplaying2 = true;
  

   }
   if (next == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(200);
   next = false;
   delay(600);

  }
 
  if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(200);
   last = false;
   delay(600);
   }
    


 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung

  if (cm < maxhoehe && cm > og){
  sensor1hand = true;
  }
  else{
     sensor1hand = false;
     }
  
  if (cm2 < maxhoehe2 && cm2 > og){
   sensor2hand = true;
   }
   else{
     sensor2hand = false;
     
    }
    
   
  
  
    // links nach rechts
  if (sensor2hand == true && wert1 == false ){
      previousmillis2=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert1 = true;

      }
      
  if ( millis() > previousmillis2 + interval + 2 ){
    wert1 = false;
    }
    
  if (millis() < previousmillis2 + interval && sensor1hand == true) {
         previousmillis5 = millis();
         voraussetzung1 = true;
         previousmillis4 = millis();
         }
  if ( millis() >  previousmillis4 + interval2 && voraussetzung1 == true){
     voraussetzung1 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == true && sensor2hand == false && voraussetzung1 == true){
           
           voraussetzung2 = true;
           previousmillis3 = millis();
           }
   if ( millis() >  previousmillis3 + interval2 && voraussetzung2 == true){
     voraussetzung2 = false;
     }
  if (millis() < previousmillis5 + interval && sensor1hand == false && sensor2hand == false && voraussetzung2 == true && next == false ) {
            next = true;
            voraussetzung2 = false;
            voraussetzung1 = false;
}
 
 
 //rechts nach links
 if (sensor1hand == true && wert2 == false){
      previousmillis6=millis();  // wiederholt sich andauernd ---> man kommt nicht über previousmillis2 + Intervall
               wert2 = true;

      }
      
  if ( millis() > previousmillis6 + interval + 2 ){
    wert2 = false;
    }
    
  if (millis() < previousmillis6 + interval && sensor2hand == true) {
         previousmillis7 = millis();
         voraussetzung3 = true;
         previousmillis8 = millis();
         }
  if ( millis() >  previousmillis8 + interval2 && voraussetzung3 == true){
     voraussetzung3 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == true && sensor1hand == false && voraussetzung3 == true){
           
           voraussetzung4 = true;
           previousmillis9 = millis();
           }
   if ( millis() >  previousmillis9 + interval2 && voraussetzung4 == true){
     voraussetzung4 = false;
     }
  if (millis() < previousmillis7 + interval && sensor2hand == false && sensor1hand == false && voraussetzung4 == true && next == false ) {
            last = true;
            voraussetzung4 = false;
            voraussetzung3 = false;
}
 }
 

void loop()
{
unsigned long loopstart=micros();
Eingabe();
Lautstaerke()  ;
Handysteuerung() ;
while(micros()-loopstart<20000);
}
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Feb 11, 2014, 06:53 pm

Muss es 2 Teilig posten da es zu groß ist...


Eigentlich nicht, denn Du kannst längere Dateien immer als "Dateianhang" zu einem Posting posten statt direkt im Text. Um Dateianhänge an ein Posting dranzuhängen, beim Schreiben der Message auf "Additional Options..." klicken.

Meinen Glückwunsch, wenn es nun wunschgemäß funktioniert, mit Vor- und Rückwärtsschalten und Lautstärkeregelung!
Title: Re: Lautstärke steuern per Ultraschall
Post by: MaxNarr on Feb 11, 2014, 10:58 pm
Quote
Meinen Glückwunsch, wenn es nun wunschgemäß funktioniert, mit Vor- und Rückwärtsschalten und Lautstärkeregelung!


Leider noch nicht ganz... ich probiere weiter
Title: Re: Lautstärke steuern per Ultraschall
Post by: jurs on Feb 12, 2014, 09:35 pm

Leider noch nicht ganz... ich probiere weiter


Dann habe ich wohl etwas beim "finalen Ergebnis" falsch verstanden.

Ich habe jetzt heute nochmal meine beiden Ultraschallsensoren angeschlossen und eine Schaltlogik gebastelt.
Code: [Select]

/*
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 6
Echo2 Pin vom Sensor an Arduino Pin 8
*/

#define TRIGGERPIN 7    // beide Trigger-Pins verbunden
#define ECHOPIN1 6      // Echo Pin Sensor 1
#define ECHOPIN2 8      // 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, sWIPELEFT, sWIPERIGHT, sLOUD};
int state=sDEFAULT;  // state enthält den aktuell ausgewerteten Status
int distance1, distance2;  // Berechneter Abstand
int loudValueRaw, loudValue; // berechnete Lautstärke

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) // Sensor-2 misst zuerst kleinere Werte
  {
    if (state==sDEFAULT)
    {
      state=sLEFT;
      timer=millis();
    }
  }
  else if (distance2>100 && distance1<=100) // Sensor-1 misst zuerst kleinere Werte
  {
    if (state==sDEFAULT)
    {
      state=sRIGHT;
      timer=millis();
    }
  }
  else if (distance1>100 && distance2>100)
  {
    if (state==sRIGHT) state=sWIPERIGHT;
    else if (state==sLEFT) state=sWIPELEFT;
    else if (millis()-timer>333) state=sDEFAULT;
  }
  else if (distance1<=100 && distance2<=100 && millis()-timer>1000)
  {
     state=sLOUD;
     // Der kleinere gemessene Abstand bestimmt die Lautstärke
     if (distance1<distance2) loudValueRaw=distance1;
     else loudValueRaw=distance2;
     // den Wert aktualisieren mit exponentieller Glättung
     loudValue=(loudValue*7+map(loudValueRaw,10,74,0,32))/8; // Wert von 10...74cm mappen auf 0..32 Lautstärkewert
  }
}


void Ausgabe()
{
  Serial.print(distance1);
  Serial.print('\t');
  Serial.print(distance2);
  Serial.print('\t');
  switch (state)
  {
    case sLEFT     : Serial.print("Left");break;
    case sWIPELEFT : Serial.print("Wipe LEFT");break;
    case sRIGHT    : Serial.print("Right");break;
    case sWIPERIGHT: Serial.print("Wipe RIGHT");break;
    case sLOUD     : Serial.print("Loud ");Serial.print(loudValue);break;
  }
  Serial.println();
}

void Schalten()
{
  static unsigned int lastState;
  static unsigned int lastLoud;
  if (state==sWIPELEFT && lastState!=sWIPELEFT)
  {
    Serial.println("Wischen LINKS");
  }
  else if (state==sWIPERIGHT && lastState!=sWIPERIGHT)
  {
    Serial.println("Wischen RECHTS");
  }
  else if (state==sLOUD && loudValue!=lastLoud)
  {
    lastLoud=loudValue;
    Serial.print("Einstellung aendern auf Lautstaerke ");
    Serial.println(loudValue);
  }
  lastState=state;
}

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


Bedienung:
Bei einer schnellen Bewegung über den Sensoren entscheidet der zuerst einen Wert unter 100 messende Sensor darüber, ob "Wischen links" oder "Wischen rechts" erkannt wird. Die Wischbewegung kann im Prinzip in einer beliebigen Höhe bis maximal 100cm über den Sensoren erfolgen, sie muß jedoch so schnell ausgeführt werden, dass die Wischbewegung spätestens 1 Sekunde danach beendet ist und beide Sensoren wieder einen Abstand von >100cm messen. Um eine Wischbewegung zu erkennen, müssen nicht einmal beide Sensoren die Hand erkennen, es reicht aus, wenn eine Hand im Erfassungsbereich von einem Sensor erkannt und wieder zurückgezogen wird. Natürlich kann man die Hand aber auch komplett über beide Sensoren hinweg führen.

Wenn auf beiden Sensoren mindestens 1 Sekunde lang ein Abstand unter 100cm gemessen wird, springt die Lautstärkeregelung an. Die Lautstärke wird von einem Abstand von 10cm bis 74cm auf eine Lautstärkenskala von 0 bis 32 gemappt, mittels des Codes
map(loudValueRaw,10,74,0,32)
Falls sich die Regelung in einem anderen Abstandsbereich abspielen sollen, die 10 und 74 entsprechend anpassen.
Falls die Lautstärkeskala anders als von 0 bis 32 laufen soll, die 0 und die 32 entsprechend anpassen.

Damit sich bei bei der hohen Messrate die Lautstärke nicht schnell und sprunghaft ändert, sondern eher langsam und gleitend, wird der Wert noch einer exponentiellen Glättung unterworfen.

Bitte nicht wundern, wenn Du die Hand zum Lautstärkeregeln über den Sensor hältst und scheinbar kein Lautstärkewert gesetzt wird: Überfüssige Einstellvorgänge sind wegoptimiert, d.h. nur wenn die Lautstärke sich tatsächlich ändert, wird auch eine Lautstärkeänderung geschaltet.

Die ursprüngliche Funktion mit den vielen Debug-Daten habe ich auskommentiert, wenn Du diese Daten wieder sehen möchtest, dann die Kommentarstriche vor der Zeile "//  Ausgabe();" entfernen

Die eigentlichen Steuer- und Schaltvorgänge müßtest Du in die Funktion "Schalten()" einbauen, dort wo jetzt die Texte ausgegeben werden.

Um die Messrate konstant hoch zu halten, wäre es natürlich sinnvoll, auch beim Steuern und Schalten auf Blockierungen des Programms mit "delay" möglichst zu verzichten.