PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lautstärkeregelung über Relais.


tsaG
2012-07-10, 00:40:31
Hallo!

Ich möchte eine Lautstärkeregelung via Arduino (atmega168) und Relais realisieren. Das ganze wird in Stereo ausgeführt, jedoch immer ein Relais pro Kanal sodass man (später) auch die Balance einprogrammieren kann.

Die Relais sollen Binär gesteuert werden, so sind auch die Widerstände gerechnet.
Relais K8 ist ein Multipole Relais, dieses wird genutzt um die ganze Schaltung zu Muten.

Digital 0 und 1 bleibt für I2C frei. Pin 3 bräuchte ich auch noch. Pin 2 ist Mute.
Digital 4 bis 10 sind die Relais auf der linken Seite. Digital 11-17 ( also Analog 0 bis 3 als DigitalOut geflagged) sind Rechts.

So, ich habe mir schon den Kopf darüber zerbrochen wie ich das ganze anstelle :-/
Es Gibt 2^7 also 128 verschiedene Stellungen. Mit welchem Alghoritmus kann ich das (1 bis 128?) alles durch schalten? Oder sollte ich die Anschlüsse der Relais lieber anders legen sodass man sie einfacher Binär schalten kann? Ausgang 0 und 1 brauche ich aber unbedingt noch, diese müssen frei bleiben. Wo das Mute Relais angeschlossen ist, ist erst einmal egal.


-tsaG

EDIT: Hier das überarbeitete Schaltbild, das im Anhang ist veraltet.
klick (http://666kb.com/i/c5dyitsso95u70f6h.png)

Gast
2012-07-10, 08:52:51
for (i=0;i<7;i++){
DigitalOut(i+4, (volumeLeft >>i) & 0x01);
DigitalOut(i+11, (volumeRight>>i) & 0x01);
}

Oder so ähnlich, ich hab keine Ahnung, was für Befehle es beim Arduino gibt...

tsaG
2012-07-10, 08:56:35
Ah, Danke, werde da mal ansetzen. :)
Arduino arbeitet mit ganz normalem Java.

Hab das ganze Schaltbild noch einmal überarbeitet und den Atmega (jetzt 168) aufgesplittet.

klick (http://666kb.com/i/c5dyitsso95u70f6h.png)

Gast
2012-07-10, 10:03:27
Ähh nein, so viel weiß ich vom Arduino dann doch, Java läuft ganz sicher nicht auf dem Ding. Processing läuft auf Java, aber das ist ja ne ganz andere Geschichte.
Und selbst wenn, der DigitalOut Befehl ist in keiner Programmiersprache standardisiert. Und genau darum ging es mir, ich hab keine Ahnung, wie man die Peripherie im Arduino anspricht. DigitalOut hab ich irgendwo noch im Kopf gehabt, wie die Argumente sind weiß ich garnicht.

Andere Frage: Die Widerstände haben dann auch 2er Potenzen als Werte oder?

tsaG
2012-07-10, 11:36:59
Okay, ich hab mich dann wohl falsch ausgedrückt :D In der Arduino IDE schreibt man mit Java, dieser übersetzt das dann. Habe gerade mal Testweise etwas getestet, Händisch geschaltet funktioniert es. ich muss es nun nur von 1-128 auf Binär übersetzen.

Stufe 1: 0000001
Stufe 2: 0000010
Stufe 3: 0000011
Stufe 4: 0000100
Stufe 5: 0000101
Stufe 6: 0000110
Stufe 7: 0000111
usw.

Wobei Stufe 1 min. und Stufe 128 max. Lautstärke ist.

Die Widerstandswerte sind wie folgt.
R110,210 | 110k
R111,211 | 53k6
R112,212 | 24k3
R113,213 | 10k
R114,214 | 3k32
R115,215 | 665R
R116,216 | 40,2R
R117,217 | 10k
R100,200 | 825R
R101,201 | 1k58
R102,202 | 2k94
R103,203 | 4k99
R104,204 | 7k5
R105,205 | 9k1
R106,206 | 10k

Gast
2012-07-10, 18:10:04
Tatsächlich lese ich gerade in der Wikipedia "Processing hat den Charakter einer stark vereinfachten Version der Programmiersprache Java".
In den Arduino artikeln steht aber nichts mehr davon, da steht aber "Programmier*sprache : C und C++".
Tatsächlich sind sich die Sprachen vom Schreibstil so ähnlich, dass ich in dem Bereich nicht genau wüsste, wo genau es Unterschiedegibt.
Dennoch: Programmiert wird in C

RuteniuM
2012-07-12, 11:15:26
Wenn ich das richtig sehe, benutzt du Port D für die bits 1-7. Am einfachsten kannst du alle Kombinationen von 1 bis 127 mit dem folgenen Code durchgehen:

DDRD = 0xFF // Pins PD0-PD7 as output
for( uint_8 i = 1; i < 128; i++)
PORTD = i; // write number to port

Das ist C wie man es mit AVR Studio verwendet, die Macros sind aber auch in der Arduiono IDE valid.