Lautstärkeregelung für Hifi Verstärker

Ich bin ganz neu im bereich Arduino, besitze jedoch ein paar Grundkenntnisse was den Bereich Elektrotechnik betrifft.
Mein Problem ist folgendes.

Ich besitze einen Onkyo A-9911 (Onkyo A-9911 | Hifi-Wiki) und möchte eine Lautstärke und Eingangswahl per Infrarotfernbedineung realisieren.

Für die Lautstärkeregelung reicht ein kleiner Getriebemotor, welchen ich in beiden Drehrichtungen ein und ausschalten kann. Für die Eingangswahl käme ein Schrittmotor in frage. Er sollte auf Knopfdruck in beiden Drehrichtungen immer um einen vordefinierten Winkel weiterdrehen. Da Rutschkupplungen verbaut werden sind Endschalter nicht erforderlich. Nun liegt mein Problem darin, das geeignete Arduinoboard zu wählen, wenn möglich die Spannungsquelle des Verstärkers zu verwenden und ein geeignetes Programm dafür zu schreiben. Und natürlich das ganze mit einer IR Fernbedienung zu betreiben.

Könnt ihr mir weiterhelfen? :grinning:

thewavemaster:
Könnt ihr mir weiterhelfen? :grinning:

Wie sollen wir dir weiterhelfen, wenn wir außer einer Datenaufstellung deines "Oldfeshion" Verstärkers keinerlei Daten haben?

Vorschlag:

Zeige uns die Teile (Motoren, Fernbedienung) die du verwenden möchtest.

Lerne Arduino zu programmieren und zeige uns deinen Sketch.

Dann können wir sicher auch helfen.
Ach und zum experimentieren empfehle ich den Arduino UNO.

hi,

schönes ding, ich verstehe, daß Du es nicht aufgeben willst.

erst dachte ich, 1996, da muß es doch eine fernbedienung haben...
aber es stimmt schon, bei hifi-anlagen kam das erst viel später, einen fernseher ohne FB hätte schon lang keiner mehr gekauft.

gruß stefan

Für die Lautstärkeregelung reicht ein kleiner Getriebemotor, welchen ich in beiden Drehrichtungen ein und ausschalten kann.

google:("Alps Motorpoti")

Für die Lautstärkeregelung kannst du ebentuell auch Motorpotis z.B. von Alps einsetzen. Da brauchst du dir zumindest über die Mechanik keine Gedanken machen.
Wie wird den beim Verstärker die Quellenumschaltung gemacht? Das wird ja kaum ein mechanisch rastender Tastensatz sein. Bei den kleinen Kurzhubtasten sind dahinter entweder kleine mechanische Taster oder Leitgummimatten, die auf einer Leiterplatte vergoldete Kontaktkämme überbrücken, ähnlich wie bei einem Taschenrechner. in diesem Fall kannst du entweder Optokoppler oder Reed-Relais einsetzen.

So
habe Nächte verbracht, mich mit der Programmierung und der Hardware auseinander zu setzen.

Habe mich nun bei den Antrieben für DC Getriebemotoren entschieden, da ich somit bei meine Doppelte H-Brücke mit 12V betreiben kann und diese meinen Arduino mit 5V versorgt. Ich hab mir gedacht, ich schlachte einfach ein altes 12V Netzteil mit ausreichender Leistung und häng es direkt nach den EIN-Schalter im Verstärker.

nix_mehr_frei:
Für die Lautstärkeregelung kannst du ebentuell auch Motorpotis z.B. von Alps einsetzen. Da brauchst du dir zumindest über die Mechanik keine Gedanken machen.
Wie wird den beim Verstärker die Quellenumschaltung gemacht? Das wird ja kaum ein mechanisch rastender Tastensatz sein. Bei den kleinen Kurzhubtasten sind dahinter entweder kleine mechanische Taster oder Leitgummimatten, die auf einer Leiterplatte vergoldete Kontaktkämme überbrücken, ähnlich wie bei einem Taschenrechner. in diesem Fall kannst du entweder Optokoppler oder Reed-Relais einsetzen.

Es handelt sich um einen Mechanischen Schleifer/Taster (Bilder im Anhang) Ist ja ein eher älteres Modell (daher ja auch keine Fernbedienung)

Die Position, an der der Eingangswahlschalter gerade steht, messe ich mit einem 50k Poti. Beim Eingangswahlschalter ist bereits eine Rutschkupplung integriert und das ganze wird mit einer mini Schneckenwelle vom Motor angetrieben. Bei der Lautstärkeregelung bekam ich ein wenig platzprobleme, da ich das Originale Poti unbedingt unberührt lassen wollte. mir blieb nur die möglichkeit das ganze direkt hinter dem Drehknopf für die Lautstärkeregelung unterzubringen. Schlussendlich hat auch das geklappt mit 2 Zahnrädern (Modul 0,5 20z auf 60z Stahl) und etlichen Dreh- und Fräsarbeiten. Vor den Motor habe ich noch eine einstellbare Rutschkupplung gesetzt um mir die Endschalter zu ersparen und das drehen per Hand noch zu ermöglichen. Die Teile habe ich bis auf die Motoren alle zusammen. Die müssten auch bald ankommen.
Soweit so gut. Die Hardware war auch kein großes Problem, da ich bald meinen Abschluss an der HTL Salzburg im Bereich Maschinenbau absolviert habe. Bilder der Hardware werde ich Anhängen. Habe alles sehr Massiv :smiley: ausgeführt. Hab mir dann ein Modell aus Lego :smiley: gebastelt um das Programm zu entwickeln und auch vor dem endgültigen Einbau ausgiebig zu testen.
Nun zur Programmierung.
Ich habe mich mit Infrarot-Codierung beschäftigt, und bin zum Entschluss gekommen, das RC5 Protokoll zu verwenden, da es eher einfach ist und ich sowiso keine komplizierten Befehle senden muss. Als Fernbedienung verwende ich mein Galaxy S6 mit Rcoid.
Ich habe mich anfangs mit der Entwicklerumgebung beschäftigt, hab dann, als es Umfangreicher wurde schnell auf Ardublock umgeschwenkt. Aber auch Ardublock hat seine Grenzen. Es Funktioniert soweit ganz gut und nach langem herantasten hatte ich dann schließlich den Dreh fast raus. Ich konnte die Hex Codes der verschiedenen Tasten auslesen. Ich hab dann auch mit dem eigentlichen Programm begonnen und hab den 1. (meiner Meinung nach) aufwendigeren Teil des Programms programmiert, das für den Eingangsschalter. Ich habe mir das so vorgestellt und es auch dann so umgesetzt:

  1. Beim Einschalten soll die Position des Potis gemessen werden
  2. Falls währen eines Eingangswechsels der Strom ausgefallen ist und der Schalter nicht genau auf einer Eingangsposition steht, soll er die nächstgelegene anfahren. Die Anfahrt soll mit einer Sinus-funktion erfolgen um die Stelle nicht zu überfahren. Zur Sicherheit, falls überfahren, wird nochmal in die andere Richtung justiert.
  3. Der Arduino soll in Loop gehen
  4. Er soll beim jeweiligen IR-Code die entsprechende Position Anfahren (Also auf der Fernbedienung Auf Line drücken → Eingang schaltet auf Line um) usw
    bis hier hin habe ich alles geschafft.
    allerdings musste ich die Infrarot befehle manuell in den Programmcode eintippen, da ich es mit Ardublock nicht hinbekommen habe.
    Bis hier hin habe ich soweit alles zum laufen gebracht und es funktioniert auch hervorragend.
  5. Die Lautstärke soll so lange verstellt werden, solange die jeweilige Taste gedrückt ist.
    ich habe es soweit hinbekommen, dass sich entweder bei einem Tastendruck der Motor einschaltet und bei einem anderen Tastendruck wieder ausschalten lässt oder bei jedem Tastendruck der Motor für eine kurze zeit in die entsprechende Richtung eingeschaltet wird. Die Reaktionszeit des Motors liegt bei beiden Varianten bei beinahe 1 Sekunde, was mir viel zu lange ist.

meine 2 Fragen wären also:

  1. Wie kann ich Infrarotbefehle in Ardublock verwenden?
  2. Wie muss ich meinen Programmcode umschreiben um zu meinem gewünschten Ergebnis zu kommen?

Eing_nge_IR_Beta_1.0.ino (10.5 KB)

ArdublockProgramm.zip (12.1 KB)

Erstmal großen Respekt von meiner Seite, das sieht verdammt gut aus! Die Mechanik ist super umgesetzt und vor allem haltbar. Auch der Onkyo selbst ist in einem tadellosen Zustand, so sauber sind die Geräte normalerweise nicht. Freut mich immer wenn es Menschen gibt die Geld und Zeit investieren um ältere Geräte in Schuss zu halten. Super! :grin:

Gruß

Scherheinz:
Erstmal großen Respekt von meiner Seite, das sieht verdammt gut aus! Die Mechanik ist super umgesetzt und vor allem haltbar. Auch der Onkyo selbst ist in einem tadellosen Zustand, so sauber sind die Geräte normalerweise nicht. Freut mich immer wenn es Menschen gibt die Geld und Zeit investieren um ältere Geräte in Schuss zu halten. Super! :grin:

Gruß

Danke

Ich bin sehr bemüht meine Sachen in Schuss zu halten. Und wie hier auch, entstehen meine Projekte immer nur aus einem Grund. Mich hat etwas genervt. In diesem Fall wars immer aufstehen zu müssen um die Sachen am Verstärker einzustellen. Und ich will das Teil noch eine lange Zeit betreiben ;D

kann mir jemand sagen was ich an meinem code ändern muss ?

schöne Grüße
Dave

void Lautstaerke_einstellen(){
  if (irrecv.decode(&results)) {
  if (results.value==0x40A)
  {
    delay( 10 );
    Serial.print("lauter");
    Serial.println();
    digitalWrite(3 , HIGH);
    delay( 50);
    digitalWrite(3, LOW);
  }
  else
  {
    digitalWrite( 3 , LOW );
  }
  if (results.value==0x40B)
  {
    delay( 10 );
    Serial.print("leiser");
    Serial.println();
    digitalWrite(5 , HIGH);
    delay( 50);
    digitalWrite(5, LOW);
  }
  else
  {
    digitalWrite( 5 , LOW );
  }}
  
 
}

Ich verstehe das jetzt so dass wenn du die Taste drückst der Motor für 50 Millisekunden laufen soll und dann wieder abgestellt wird, richtig? Das heißt er wird zyklisch für 50 Millisekunden angesteuert, das ergibt doch nicht viel Sinn.

Besser wäre es den Motor beim Empfangen des Signals zu starten und erst wieder auf LOW zu setzen wenn der Tastencode nicht mehr gesendet wird.
Wird denn "results.value" nach dem loslassen der Taste wieder zurückgesetzt oder bleibt der letzte Wert drin stehen? Dann könntest du den Wert erst in eine andere Variable übertragen die du nach dem Ausführen der Schleife wieder nullst.

Gruß

Scherheinz:

void Lautstaerke_einstellen(){

if (irrecv.decode(&results)) {
  if (results.value==0x40A)
  {
    delay( 10 );
    Serial.print("lauter");
    Serial.println();
    digitalWrite(3 , HIGH);
    delay( 50);
    digitalWrite(3, LOW);
  }
  else
  {
    digitalWrite( 3 , LOW );
  }
  if (results.value==0x40B)
  {
    delay( 10 );
    Serial.print("leiser");
    Serial.println();
    digitalWrite(5 , HIGH);
    delay( 50);
    digitalWrite(5, LOW);
  }
  else
  {
    digitalWrite( 5 , LOW );
  }}

}




Ich verstehe das jetzt so dass wenn du die Taste drückst der Motor für 50 Millisekunden laufen soll und dann wieder abgestellt wird, richtig? Das heißt er wird zyklisch für 50 Millisekunden angesteuert, das ergibt doch nicht viel Sinn.


Besser wäre es den Motor beim Empfangen des Signals zu starten und erst wieder auf LOW zu setzen wenn der Tastencode nicht mehr gesendet wird. 
Wird denn "results.value" nach dem loslassen der Taste wieder zurückgesetzt oder bleibt der letzte Wert drin stehen? Dann könntest du den Wert erst in eine andere Variable übertragen die du nach dem Ausführen der Schleife wieder nullst.

Gruß

Das mit den 50 ms war nur ein Versuch mich heranzutasten aber keine Endlösung.

Ich hätte es gerne genauso wie du es beschrieben hast. Taste gedrückt => Motor ein, Taste losgelassen=> Motor aus

Es hat bei mir nicht wirklich funktioniert, als ich irrecv.resume() 2 mal im code hatte (für die Lautstärke und für die Eingänge) wo genau müsste ich dies platzieren um es zum lauen zu bringen oder wie müsste ich den Befehl mit der Variable einbauen?

Und wird die Reaktionszeit dadurch verbessert?

Gruß

Dave

Da ich deine verwendeten Libs nicht kenne kann ich dir dazu nichts sagen. Du musst es hinkriegen das results.value Null hat nachdem Loslassen der Taste oder halt die If Bedingung nicht mehr wahr wird.
Gib dir results.value mal seriell aus und schau ob sich der Wert beim Loslassen ändert.

Jedes Delay verschlechtert deine Reaktionszeit, auch viele Kleine können sich schnell aufsummieren.

Es gibt verschiedene Möglichkeiten, was eine Fernbedienungen bei einer länger gedrückten Taste macht. Beispiele:

  • der Tastencode wird wiederholt
  • der Tastencode kommt ein Mal, gefolgt von einem Wiederholungscode
  • der Tastencode kommt genau ein Mal (dann ist es mit der Wiederholung Essig)

Wenn Du das herausgefunden hast, kann man Deinen Sketch entsprechend anpassen.

agmue:
Es gibt verschiedene Möglichkeiten, was eine Fernbedienungen bei einer länger gedrückten Taste macht. Beispiele:

  • der Tastencode wird wiederholt
  • der Tastencode kommt ein Mal, gefolgt von einem Wiederholungscode
  • der Tastencode kommt genau ein Mal (dann ist es mit der Wiederholung Essig)

Wenn Du das herausgefunden hast, kann man Deinen Sketch entsprechend anpassen.

Also da hab ich freie Wahl mit RCoid

Ich habe jetzt mal einfaches Dauerfeuer des codes bei gedrückter taste gewählt, lässt sich natürlich jederzeit ändern. Mit welchem Modus wäre es deiner Meinung nach am einfachsten? Und wie müsste dann das Programm aussehen.

Gruß

Dave

Ich würde mal behaupten Dauerfeuer mit einem Code wäre für deine Anwendung die richtige Wahl wenn es um die Lautstärke geht.

Scherheinz:
Ich würde mal behaupten Dauerfeuer mit einem Code wäre für deine Anwendung die richtige Wahl wenn es um die Lautstärke geht.

Sehe ich auch so. Meine Grundig-Fernbedienung macht das so, daher konnte ich meine Vorstellung probieren:

#include <IRremote.h>
const byte RECV_PIN = 2, ledPin = 13, intervall = 100;
unsigned long wert, irMillis, aktMillis;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  aktMillis = millis();
  if (irrecv.decode(&results)) {
    wert = results.value;
//    Serial.println(wert, DEC);
    irMillis = aktMillis;
    irrecv.resume(); // Receive the next value
  }
  if (wert == 3169) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
  if (aktMillis - irMillis >= intervall) {
    wert = 0;
  }
}

Die Fernbedienung sendet den Code nur ca. alle 100 ms, weshalb ich diese Zeit eingebaut habe. Daher dreht der Motor in 100 ms Schritten. Wie das bei Dir aussieht, mußt Du probieren.

@agmue

werde den sketch bei der nächsten gelegenheit testen.
danke dafür :wink:

hatte zur zeit noch sehr viel mit der hardware zu tun und werde morgen ein paar fotos hochladen.

Der Code von agmue macht genau das was ich auch gemeint hatte, das funktioniert bestimmt.
Also wenn die Anlage fertig ist machst du am besten mal ein Video bei geöffnetem Deckel 8)

Gruß

So, hatte noch mit ein paar kleinen Kabelproblemen zu kämpfen.

Nun ist das ganze fertig verpackt und einsatzbereit :smiley:

Den IR-Sensor hab ich dann extern verpackt um ein bisschen flexibler zu sein. Er wird mit einem 3.5 mm Klinkenstecker angeschlossen.

Als Spannungsquelle hab ich einfach ein 12V Netzteil geschlachtet und es mit in den Schaltkreis hinter den Ein-Schalter gepackt.

Als kleines Feature hab ich noch ein Relais eingebaut, mit dem man die Steckdose hinten am Verstärker schalten kann um irgendwelche Beleuchtungen oder sonstiges bequem per Fernbedienung steuern zu können.

Die Mechanik funktioniert bis auf ein paar Kleinigkeiten zu meiner vollsten Zufriedenheit.

Die Position am Eingang werden sauber angefahren und alles klappt genauso wie geplant.

@agmue

nochmal Danke für den Code, hat super geklappt

Ein Anliegen habe ich noch…

In Zukunft möchte ich die Möglichkeit besitzten, auch andere Fernbedienungen für den Verstärker zu verwenden. Ich habe ein paar ausprobiert, die ich Zuhause herumliegen hatte und die meisten senden den Code mit Repeat Code also zb.

3CC342BD …Taste 1 mal drücken

3CC342BD …Taste gedrückt halten
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF

Wie muss ich den Code noch ändern um sowas einbauen zu können?

NUR IM TEIL FÜR DIE LAUTSTÄRKE

Für die anderen genügt das 1. Signal

Gruß

Dave

Videos kommen bald

Schaltplan.pdf (659 KB)

final_version_aktuelle_werte.ino (10.8 KB)

Wird das Relais tatsächlich direkt am Microcontroller-Pin betrieben? Ich würde eher einen Transistor benutzen und auch noch eine Löschdiode einsetzen, soll ja eine dauerhafte Lösung sein.
Nutzt du nach wie vor Ardublock zur Programmierung?

sth77:
Wird das Relais tatsächlich direkt am Microcontroller-Pin betrieben? Ich würde eher einen Transistor benutzen und auch noch eine Löschdiode einsetzen, soll ja eine dauerhafte Lösung sein.
Nutzt du nach wie vor Ardublock zur Programmierung?

Dieses Relais Hängt direkt am
Arduino Nano Microcontrollerpin.

Wo liegt da das Problem?

Ich verwende soweit es geht Ardublock....den Rest mit den IR-Codes musste ich dann mit der Hand ergänzen. Ich finde Ardublock sehr toll, da es das Programm sehr übersichtlich darstellt.