Hallo,
ich habe einen Bluetooth Empfänger mit Aux Ausgang und einen Fernseher
ebenfalls mit AUX Ausgang welche ich beide abwechselnd an die
Stereoanlage hänge. Jetzt musste ich immer die Klinkenstecker wechseln
zwischen TV & Bluetooth Empfänger da die Stereoanlage nur einen
AUX-Eingang hat.
So dachte ich mir ich programmiere mir den Arduino einfach so dass er
sobald an einem der beiden Kabel eine Spannung anliegt dieses einfach
direkt zur Stereoanlage durchschaltet. Ein weitere Vorteil währe, dass
die Stereoanlage dann via IR-Diode automatisch ein & aus geschaltet
werden kann wenn (k)eine Spannung mehr ankommt.
Jetzt stehe ich jedoch vor dem Problem dass der Arduino für die
Musikumwandlung von analog auf digital aufgrund der zu langsamen
Abtastrate oft 0 Volt anzeigt, obwohl die Musik gespielt wird. Wie
bringe ich den Arduino jetzt dazu nicht ständig hin und herzuschalten?
HIer mein bisheriger Code
1
intcontrolled=12;
2
intaudioeingang=0;
3
inttime=0;
4
intpruefer1=0;
5
intstereopruefer1=0;
6
intstereopruefer2=0;
7
intledaus=9;
8
intledan=8;
9
10
11
voidsetup(){
12
Serial.begin(9600);
13
pinMode(controlled,OUTPUT);
14
pinMode(ledaus,OUTPUT);
15
pinMode(ledan,OUTPUT);
16
17
}
18
19
voidloop(){
20
21
22
intaudioeingang=analogRead(A0);
23
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
Max E. schrieb:> Jetzt stehe ich jedoch vor dem Problem dass der Arduino für die> Musikumwandlung von analog auf digital aufgrund der zu langsamen> Abtastrate oft 0 Volt anzeigt, obwohl die Musik gespielt wird.
Äh, bitte was? Was willst Du machen?
> Wie> bringe ich den Arduino jetzt dazu nicht ständig hin und herzuschalten?
Analog-Switch.
harun al raschid schrieb:> Äh, bitte was? Was willst Du machen?
Ich habe mein Iphone mit dem Klinkenkabel mit dem Arduino verbunden,
dieser soll die Analoge Spannung der Musikübertragung erkennen und die
Stereoanlage einschalten und das Signal weiter zur Stereoanlage leiten.
Weiteres möchte ich das selbe mit dem Fernseher machen um mir ständiges
umstecken der Kabel zu ersparen.
>> bringe ich den Arduino jetzt dazu nicht ständig hin und herzuschalten?> Analog-Switch.
Wurde das gerne mit den Arduino machen, da die Stereoanlage via IR
eingeschaltet werden soll.
@ Max E. (eizi)
>Jetzt stehe ich jedoch vor dem Problem dass der Arduino für die>Musikumwandlung von analog auf digital aufgrund der zu langsamen>Abtastrate oft 0 Volt anzeigt, obwohl die Musik gespielt wird. Wie>bringe ich den Arduino jetzt dazu nicht ständig hin und herzuschalten?
Was bringt dich auf die kühne Idee, dein Arduino könnte sinnvollerweise
das Audiosignal abtasten und direkt auswerten? Das geht so nicht, aus
vielen Gründen.
Du brauchst eine Pegelerkennung in Form eines Spitzenwertgleichrichters.
Die kann man u.a. mit einem Präzisionsgleichrichter machen, das ist ein
einfacher OPV + bissel Gemüse. Das Ausgangssignal dieses
Spitzenwertgleichrichters kann man dann in aller ruhe messen und
auswerten. Wobei ein Arduion da mordsmäßig überdimentsioniert ist, eine
logische Verknüpfung über ein Gatter oder nur ein paar Dioden reicht
hier locker.
Damit schaltet man dann ein Relais mit zwei Wechslerkontakten.
Hmm, genau genommen braucht es nur EINEN Spitzwertdetektor mit EINEM
Ausgang. Den klemmt man an den Kanal, der Vorrang haben soll.
-> Pegel auf Kanal A erkannt, Relais zieht an, Musik von Kanal A wird
weitergeleitet (Vorrang)
-> Pegel auf Kanal A nicht erkannt, Relais fällt ab, Musik von Kanal B
wird weitergeleitet (kein Vorrang)
Einen Spitzenwertdetektor (peak detektor) mit OPV findet man hier.
http://sound.westhost.com/appnotes/an001.htm
Es reicht die einfachste Version im Halbwellenbetrieb mit einem OPV.
Einen 2. OPV schaltet man dahinter als Komparator, fast fertig. Das
Relais braucht meist einen kleinen Transistor zur Ansteuerung.
Relais mit Logik ansteuern
Falk Brunner schrieb:> Was bringt dich auf die kühne Idee, dein Arduino könnte sinnvollerweise> das Audiosignal abtasten und direkt auswerten? Das geht so nicht, aus> vielen Gründen.
Versteh ich jetzt nicht dass mi dem Signal funktioniert ja schon.
Er soll ja nur erkennen ob eine Spannung anliegt oder nicht und das
klappt. Dabei fällt mir gerade auf das der Titel falsch gewählt ist, da
er ja nichts digital umwandelt..
@ Max E. (eizi)
>Versteh ich jetzt nicht dass mi dem Signal funktioniert ja schon.
Ach so? Wo ist dann das Problem?
>Er soll ja nur erkennen ob eine Spannung anliegt oder nicht
Was bei einen NF-WECHSELSPANNUNG nicht ganz so einfach ist, schon gar
nicht, wenn die im Bereich 0-1V liegt.
Ja, man kann es auch mit dem Ardino direkt machen, muss dann aber etwas
mehr Logik einbauen. Denn was soll deine Schaltung machen, wenn die
Musik plötzlich leise wird? Umschalten? Oder doch erstmal ein paar
Sekunden warten, bis sie vielleicht wieder lauter wird?
Ausserdem kann man ein Audiosignal nicht direkt an den Arduino anlegen,
da braucht man mindestens eine Koppelkondensator und zwei Widerstände
als Spannungsteile für den Offset.
Naja, ist ja nicht zeitkritisch ist es nicht, der kann auch schon mal
ein paar Minuten warten, und wenn nichts mehr kommt die Stereoanlage
abschalten..
Warum kann man das nicht?^^ Funktioniert ja :p
Das der µC nicht so schnell ist stört eigentlich nicht. Damit Musik oder
ein ähnliches Signal erkannt wird, muss mehrmals gemessen werden - wenn
dann über etwa 10-20 sekunden keine nennenswerte Spannung erkannt wurde
(also immer ein sehr kleiner Wert) hat man wohl kein Signal. Dafür ist
der AVR im Ardiuno allemal schnell genug. Egal wie man es macht, kann
man nicht erwarten, das die erkennung schnell geht, denn die Musik macht
auch mal Pause.
Du brauchst mehr Zeit Schalte erst aus sobald insgesamt 10 Sekunden lang
der ADC 0 anzeigt.
Es dauert zwar eine Weile bis dann ausgeschalten wird, aber ich denke
bei Pausen zwischen den Liedern muss das sein, und stören wird es nicht
so sehr
Das analog Signal wirst wohl eh mit einem Relais oder Analogschalter
umschalten - direkt geht das mit dem Ardo nicht.
Erkennen ob ein Signal da ist geht schon, einfach richtig filtern...
Ein und Ausfilter.... mit Priorität für einen Kanal.
ASCII schrieb:> wo ist dann bitte dein problem?
Mein Problem ist dass die Spannung der Musikübertragung immer zwischen 0
& einigen Millivolt schwankt. Wenn der Arduino jetzt aber genau in dem
Moment die Spannung abfragt wenn diese bei 0 ist schaltet der Arduino
die Stereoanlage ab.
Ich würde gerne Wissen wie ich dem Arduino beibringe auf weitere +
Spannungswerte zu warten..
Schleife hoch zählen lassen, und bei einem ADC wert größer 0 rücksetzen.
Wenn der Zähler einen wert erreicht, der mehr als 10 Sekunden
entspricht, ausschalten.
Ich will ja eigentlich nicht über Ardunio schimpfen und es hat auch
nicht direkt was mit dem Problem zu tun aber:
1
int controlled=12;
2
int audioeingang=0;
3
int time=0;
4
int pruefer1=0;
5
int stereopruefer1=0;
6
int stereopruefer2=0;
7
int ledaus=9;
8
int ledan=8;
Müssen das hier wirklich überall 16Bit signed Werte sein?
Tut da nicht uint8_t?
So wirst du wenn es mal wirklich auf Geschwindigkeit ankommt nie
Glücklich werden...
Dein Problem ist nicht, daß der ADC zu langsam ist, sondern Deine
Programmlogik.
Wie schon gesagt wurde, Du mußt ständig ADC wandeln und erst abschalten,
wenn eine Zeit lang eine Signalschwelle unterschritten wurde.
Am besten benutzt man den ADC-Interrupt. Der setzt einen Variable z.B.
auf 10 und ein Timerinterrupt alle 1s zählt diese runter.
Man muß auch nicht mit Gewalt seine Programme in den Schneckenmodus
setzen:
1
delay(time);
Da würde nichtmal ein 4GHz PC diese Aufgabe schaffen.
Mike schrieb:> wobei mir die Sinnhaftigkeit dieses Codefragmentes sowieso eher> schleierhaft erscheint, wenn man den Initialisierungswert von "time"> betrachtet.
Es sollen halt 0 sek, gewartet werden, ist doch total logisch :P
duck und weg
Max E. schrieb:> Mein Problem ist dass die Spannung der Musikübertragung immer zwischen 0> & einigen Millivolt schwankt. Wenn der Arduino jetzt aber genau in dem> Moment die Spannung abfragt wenn diese bei 0 ist schaltet der Arduino> die Stereoanlage ab.>> Ich würde gerne Wissen wie ich dem Arduino beibringe auf weitere +> Spannungswerte zu warten..
Also zunächst mal koppelst Du den Arduino offenbar falsch an Dein
Audiosignal an.
Ich bin zwar nicht der Audio-Freak, aber wenn ich mich nicht täusche,
müßtest Du am Arduino aus zwei hochohmige Widerständen erstmal einen
Spannungsteiler aufbauen und das Audiosignal mit einem Kondensator am
Mittelabgriff einspeisen.
Also 2 Widerstände 100K in Reihe geschaltet,
ein Ende an Arduino 5V, ein Ende an Arduino GND, den Mittelabgriff an
den Analog-Pin.
GND Lautsprecherausgang an GND Arduino.
Und das Lautsprechersignal über einen Kondensator 1µF an den
Mittelabgriff des Spannungsteilers. Dann mißt der Arduino ohne Signal
512.
Und das Signal ändert sich nicht von 0 auf ein paar Millivolt.
Sondern es ändert sich von 512 minus ein paar Millivolt auf 512 plus ein
paar Millivolt.
Und dann brauchst Du nur noch den Effektivwert des Signals im
Zeitverlauf ausrechnen. Der Effektivwert einer Wechselspannung ist die
Wurzel aus der Summe der Quadrate. Also ungefähr sowas
Und da sich das "signal" von Messung zu Messung schnell ändert und oft
auch nahe null ist, machst Du für das Signal eine "Exponentielle
Glättung". Je nach Glättungsfaktor steigt der geglättete Wert dann
schneller oder langsamer an, wenn ein Signal anliegt. Oder der
geglättete Wert fällt schneller oder langsamer ab, wenn kein Signal
anliegt.
Schaltlogik:
Bei Überschreiten eines Grenzwerts+Delta schaltest Du an.
Bei Unterschreiten eines Grenzwertes-Delta schaltest Du ab.
Der gesamte funktionierende Code dafür ist nicht länger als der von Dir
eingangs gepostete nicht funktionierende Code.
Sag Bescheid, wenn Du mehr Hinweise oder fertigen Code brauchst!
Kaj schrieb:> Es sollen halt 0 sek, gewartet werden, ist doch total logisch :P> duck und weg
Das war ja nur zu Testzwecken um die Serielle Ausgabe in Ruhe lesen zu
können.
@Jürgen S
Danke für die Ausführliche Anleitung, hab nun alles so aufgebaut und
gemacht wie du gesagt hast bis auf eine Ausnahme denn ich hatte nur
einen 10 Microfarad Elko,
NUn habe ich trotz googelei keinen Plan wie ich eine Exponentielle
Glättung mache, wäre toll wenn du mir da helfen könntest..?
mfg
Max
Max E. schrieb:> NUn habe ich trotz googelei keinen Plan wie ich eine Exponentielle> Glättung mache, wäre toll wenn du mir da helfen könntest..?
Die exponentielle Glättung ist quasi ein im Zeitverlauf gleitender
Mittelwert, bei dem "neuere Werte" stärker gewichtet sind und "ältere
Werte" immer weiter an Gewichtung verlieren, je älter sie sind.
Tiefpassfilter könnte man auch sagen. Code für "filteredValue" und
"signal" als Gleitkommazahlen:
1
#define N 36
2
filteredValue=(filteredValue*(N-1)+signal)/N;
Je größer N ist, desto langsamer folgt der gefilterte Wert den aktuellen
Schwankungen, und je kleiner N gewählt wird, desto schneller folgt der
gefilterte Wert den laufenden Schwankungen.
N müßtest Du dann danach wählen, wie schnell die Schaltung auf ein
vorhandenes oder nicht vorhandenes Audiosignal reagieren soll. Wenn Du N
zu klein wählst, könnte in Audiopausen ohne Ton "kein Signal" erkannt
und abgeschaltet werden. Und wenn Du N zu groß wählst, dann mußt Du zu
lange warten, bis ein Signal erkannt wird.
Falk Brunner schrieb:> Was bringt dich auf die kühne Idee, dein Arduino könnte sinnvollerweise> das Audiosignal abtasten und direkt auswerten? Das geht so nicht, aus> vielen Gründen.
Wieso sollte das nicht gehen? Keine Ahnung, ob es Gründe bezüglich der
Arduino-Softwareumgebung gibt, die das verhindern, aber die Hardware
kann das sicher und man kann auf Arduino-Hardware ja auch komplett
eigene Software laufen lassen.
> Du brauchst eine Pegelerkennung in Form eines Spitzenwertgleichrichters.
Welchen man natürlich genausogut auch in Software bauen kann.
> Hmm, genau genommen braucht es nur EINEN Spitzwertdetektor mit EINEM> Ausgang.
Nicht, wenn auch die beschriebene Zusatzfunktion der
Verstärkerabschaltung bei Inaktivität auf beiden Kanälen realisiert
werden soll...
c-hater schrieb:> Wieso sollte das nicht gehen? Keine Ahnung, ob es Gründe bezüglich der> Arduino-Softwareumgebung gibt, die das verhindern, aber die Hardware> kann das sicher und man kann auf Arduino-Hardware ja auch komplett> eigene Software laufen lassen.>>> Du brauchst eine Pegelerkennung in Form eines Spitzenwertgleichrichters.>> Welchen man natürlich genausogut auch in Software bauen kann.
Ah, Spitzenwerterkennung in Software - Danke für den Denkanstoß!
Das mit der Spitzenwerterkennung habe ich irgendwie überlesen.
Oder bin nicht selbst auf die Idee gekommen, das in Software zu machen.
Der TO und ich sind auf dem Trip "Effektivwertermittlung".
Ich baue es mir mal kurz auf dem Breadboard auf und mache dann einen
Arduino-Sketch mit Spitzenwerterkennung statt Effektivwertermittlung.
Mit Effektivwertermittlung funktioniert die Pegelerkennung auf dem
Arduino jedenfalls problemlos, wenn auch nicht bei sehr niedrigen
Pegeln, das hatte ich letztes Jahr selbst mal ausprobiert.
Mal schauen, ob man mit Spitzenwerterkennung auch niedrigere Audiopegel
gut erkennen kann. Ich teste mal und poste dann einen Sketch.
Zurueck zum originalfrage :
> Jetzt musste ich immer die Klinkenstecker wechseln> zwischen TV & Bluetooth Empfänger da die Stereoanlage nur einen> AUX-Eingang hat.
Ist es keine Loesung um ein extra AUX Eingang zu machen ? 2
Serienwiederstaende dazwischen und dann einfach beide Signalen am
gleichen AUX anschliessen
Vielleicht zu einfach gedacht...
Jürgen S. schrieb:> Der TO und ich sind auf dem Trip "Effektivwertermittlung".
Warum so umständlich?
Einfach den ADC-Wert mit einem Schwellwert vergleichen und gut is.
Um Störungen (Einschaltknacksen) zu unterdrücken, kann man z.B. erst
nach 3 Überschreitungen einschalten.
Und wenn der Schwellwert xx Sekunden unterschritten wird, abschalten.
Wichtig:
xx Sekunden lang, nicht nach xx Sekunden.
Liegt auf beiden Eingängen ein Signal, gewinnt der wichtigere oder der
erste, ganz wie man will.
Den ADC über eine CR-Kopplung anschließen, falls auf den Signalen
Gleichstrom ist. Es wird nur die positive Halbwelle gemessen, das macht
nix.
Peter Dannegger schrieb:> Jürgen S. schrieb:>> Der TO und ich sind auf dem Trip "Effektivwertermittlung".>>> Warum so umständlich?
Weil der Typ, wie in der wunderbaren Welt des Arduino so üblich,
ungefähr die Programmierkenntnisse einer halbverdorrten Amöbe hat. Nur
noch unterboten von seinen Elektronikkenntnissen. Darum wird ein an sich
triviales Problem, hier zu einer Mischung aus Marsmission und Heiligem
Grahl stilisiert. Warum das überhaupt toleriert wird, ist mir
schleierhaft. Einem Fachforum einfach unwürdig.
Und dabei hat er das wichtigste, die Spannungsteiler am Eingang und evt.
die Anpassung/Einstellung der Referenzspannung (evt. auf die interne)
noch gar nicht bedacht. Einige AVRs haben auch ne schöne
GAIN-Einstellung für die ADCs.
gruß cyblord
cyblord ---- schrieb:> Einem Fachforum einfach unwürdig.
Warum schaust du denn in diesen Thread hier rein? Der TO hat doch das
Keyword "Arduino" im Titel eingefügt.
Natürlich ist es so, dass ich bei einem Problem, das offenbar schon
marktreif gelöst wurde, einfach mal bei anderen spicke, wie die das
gelöst haben. Man muss ja nicht jedes Rad neu erfinden.
Und dann muss man nur überlegen, wie man eine Hardwarelösung in Software
abbilden kann. Und am Besten denkt man da selber mal ein paar TAGE
drüber nach. Es bringt nichts, wenn man nach dem zweiten Versuch und
einer viertel Stunde gleich mal die Publikumsfrage lostritt...
Fazit: das Konzept "Arduino" ist nicht so schlecht, Nachdenken muss man
trotzdem selber.
cyblord ---- schrieb:> Und dabei hat er das wichtigste, die Spannungsteiler am Eingang und evt.> die Anpassung/Einstellung der Referenzspannung (evt. auf die interne)> noch gar nicht bedacht. Einige AVRs haben auch ne schöne> GAIN-Einstellung für die ADCs.
Spannungsteilerschaltung für den Eingang habe ich dem TO mit Posting vom
Datum: 14.06.2014 23:43 Uhr gepostet.
Und mit Spitzenwerterkennung funktioniert die Detektierung des
Audiosignals tatsächlich auch bei kleineren Pegeln als mit
Effektivwertermittlung.
Arduino-Sketch für die Spitzenwerterkennung in
Viertelsekundenintervallen und exponentieller Glättung, einschließlich
Schaltfunktion am Arduino-Pin 13 (Board-LED) und Debugausgabe auf Serial
anbei:
1
voidsetup(){
2
Serial.begin(9600);// Für serielle Debug-Ausgaben
3
}
4
5
#define LEDPIN 13 // zu schaltender Pin "Board LED"
6
#define INTERVALL 250 // Millisekunden-Intervall für Spitzenpegelmessung
7
#define N 10 // Faktor für exponentielle Glättung
8
floatspitzenPegel=0;
9
intspitzenPegelHigh=0;
10
intspitzenPegelLow=1023;
11
#define EINSCHALTPEGEL 4.0 // Einschaltpegel größer als Ausschaltpegel definieren
12
#define AUSSCHALTPEGEL 3.5 // Ausschaltpegel größer als Rauschen des Pegels
Für eine noch bessere Eingangsempfindlichkeit wäre die Umstellung der
ADC-Spannungsreferenz tatsächlich noch eine Option, die man auch noch
einbauen könnte - Danke für den Hinweis!
Jürgen S. schrieb:> Arduino-Sketch für die Spitzenwerterkennung in> Viertelsekundenintervallen und exponentieller Glättung
Es geht ja nur um das Einschalten eines Verstärkers bei vorliegendem
Audiosignal. Ich würde wie Peter einfach laufend Wandeln und jedesmal
wenn der Wert groß genug ist, den Verstärker einschalten und einen
Timeout hochsetzen. Wenn der Timout dann mal abläuft, wird der
Verstärker ausgeschaltet.