Go Down

Topic: Lautstärke steuern per Ultraschall (Read 4682 times) previous topic - next topic

sschultewolter

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);
Keinen technischen Support über PN!

MaxNarr

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.

MaxNarr

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



MaxNarr

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

Serenifly

#19
Jan 01, 2014, 04:06 pm Last Edit: Jan 02, 2014, 03:43 am by Serenifly Reason: 1
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.

MaxNarr

#20
Jan 01, 2014, 09:18 pm Last Edit: Jan 01, 2014, 09:22 pm by MaxNarr Reason: 1
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

Serenifly

#21
Jan 01, 2014, 09:56 pm Last Edit: Jan 02, 2014, 03:10 am by Serenifly Reason: 1
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.


MaxNarr

#22
Jan 02, 2014, 02:13 am Last Edit: Jan 02, 2014, 02:22 am by MaxNarr Reason: 1
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

Serenifly

#23
Jan 02, 2014, 03:23 am Last Edit: Jan 02, 2014, 05:16 am by Serenifly Reason: 1
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.

MaxNarr

Wäre dann so(Anhang) die Verkabelung?

Klaus_ww

So nen großen Monitor hab ich nicht, mach mal bitte kleiner  :smiley-eek:

MaxNarr

#26
Jan 02, 2014, 05:24 pm Last Edit: Jan 02, 2014, 05:27 pm by MaxNarr Reason: 1
Hier die Kleinere Version.
Wenn ihr die Datei downloadet gehts besser.

Klaus_ww

Sieht insgesamt schlüssig aus, hab's aber nicht auf's Pinout geprüft.

MaxNarr

#28
Jan 04, 2014, 12:53 am Last Edit: Jan 04, 2014, 02:55 am by MaxNarr Reason: 1
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;
            
  }}}}}

uwefed

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

Go Up