Pages: [1] 2 3 ... 5   Go Down
Author Topic: Lautstärke steuern per Ultraschall  (Read 3710 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 3
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 593
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 12
Posts: 593
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oh, Doppelpost
Logged

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

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
« Last Edit: December 22, 2013, 02:45:14 pm by uwefed » Logged

Offline Offline
Jr. Member
**
Karma: 3
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 12
Posts: 593
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 3
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 12
Posts: 593
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 3
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 593
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 3
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Online Online
Faraday Member
**
Karma: 43
Posts: 2575
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Keinen technischen Support über PN!
Hat dir meine Antwort gefallen, nicht sparsam mit dem Karma sein smiley-wink

Offline Offline
Jr. Member
**
Karma: 3
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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



Logged

Offline Offline
Faraday Member
**
Karma: 120
Posts: 3979
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Verpacke es in eine Funktion:

Code:
long getDistance(byte pingPin)
{
     ...

     return microsecondsToCentimeters(duration);
}
Logged

Offline Offline
Jr. Member
**
Karma: 3
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Pages: [1] 2 3 ... 5   Go Up
Jump to: