Lautstärke steuern per Ultraschall

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

Fang mit der Lautstärkeregelung an.
Digitales Poti ist gut, speichert auch den letzten Wert (wenn man das möchte).

Oh, Doppelpost

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

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?

Welche Pegel haste denn nun zum Steuern?
Digitale Potis gibt's ne Menge, Tante Gugel hilft da sehr einfach weiter.

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?

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 :smiley:

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

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.

Ich habe bis her den SR04 nur bestellt (vor 3 Wochen) :blush:
Aber ich denke er wird nächste Woche kommen.
Ich werde wenn er da ist mal par Experimente starten und dann weiter sehen..

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

Erst einmal die ganze Audio Sache weglassen. Freunde dich erstmal damit ab, eine LED unterschiedlich schnell laufen zu lassen. :wink:

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[

	//* +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;
  }

Verpacke es in eine Funktion:

long getDistance(byte pingPin)
{ 
     ...

     return microsecondsToCentimeters(duration);
}

Ich habe noch kurz an dem hier gebastelt...geht das so auch?
(last euch nicht verwirren ich habe noch paar Sachen dazu geschrieben)

	//* +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

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.

 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);

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.

Hab ich das jetzt so richtig gemacht?

	//* +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;
  
 
}

Weiß jemand von euch wie man mit diesem Digitalen Potentiometer umgeht?
http://www.analog.com/static/imported-files/images/pin_diagrams/AD5263_pc1.gif

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:

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.