PC Lautstärkeregler mit Arduino und C++

Hallo liebe Community,

wer kennt es nicht: Man ist mitten in einem Spiel, kann es nicht schnell schließen oder ist einfach auf den Vollbildmodus angewiesen, aber der Sound ist zu leise (oder Mama ruft, man soll ihn leiser machen). Was nun?

Genau für dieses Problem wollte ich eine Lösung finden und da es im Internet bisher wenig dazu zu finden gibt, habe ich mir gedacht ich versuch daraus mal mein erstes Tutorial für die Code&Design Community zu machen.

Was ist das Ziel?
Ich möchte mit Hilfe eines Potentiometers (Poti) an einem Arduino meine Systemlautstärke verändern

Was brauche ich dafür?

  1. Hardware:
    Ich nutze einen BQ Zum Core (danke Nils :wink: ) und einen dort mitgelieferten Poti, allgemein sollte es aber jeder Arduino tun.
  2. Software und Skills:
    Ich habe den Arduino über die bitbloq Webseite (https://bitbloq.bq.com/), jedoch nicht mit den Blöcken, sondern mit „richtigem“ Code programmiert. Auf dem PC habe ich mich für C++ und Visual Studio entschieden, da ich dies auch in der Uni nutze und somit gleich dafür noch mitlerne.

Meine Herangehensweise

Grundsätzlich hatte ich erstmal zwei Probleme:

  1. Wie ändere ich in C++ die Systemlautstärke?
  2. Wie kann ich Werte vom Arduino aus dem seriellen Monitor in mein C++ Programm bekommen?

1. Problem: Lautstärke ändern in C++

Wie schon gesagt kenne ich aus der Uni bereits C++ Grundlagen, aber am Sound wollte ich noch nie etwas ändern. Also erstmal schnell eine Funktion „int get_input_percent()“ welche mir es ermöglicht in der Konsole Werte zwischen 0 und 100 einzugeben und diese oder einen Fehler bei größeren oder kleineren Werten zurückgibt. Diese in der main() aufgerufen und schon haben wir den gewünschten Soundwert in Prozent. Jetzt fangen die Probleme aber erst an: Wie ändere ich den Sound jetzt?

Meine Lösung dieses Problems war #include <Endpointvolume.h>. Dort gibt es die Funktion SetMasterVolumeLevelScalar, welche im Prinzip genau das tut, was wir wollen. Ca. eine Stunde Dokumentation lesen und Copy-Pasten später funktionierte auch dies.

Gute Links zu diesem Thema:

Zu beachten ist noch, dass ihr nicht nur den Sound der Anwendung, sondern tatsächlich das Master Volume ändert, zu dem ersten findet man nämlich deutlich mehr.

2. Problem: Verbindung mit Arduino herstellen

Dies war auch schwieriger als gedacht, zumal es bereits nach Mitternacht war (deswegen übernehme ich auch keine Haftung für ineffizienten und hässlichen Code, es tut mir leid!).

Zuerst habe ich schnell auf meinen Arduino ein Programm gezogen, welches mit die Werte meines Potis auf dem Seriellen Monitor ausgibt. da diese zwischen 0 und 1023 liegen, habe ich noch durch 10,23 geteilt und gerundet, sodass ich wieder Prozentwerte (von 0 - 100) bekomme. Soweit so gut, aber jetzt müssen im C++ Programm diese Werte ausgelesen werden.
Zu der Uhrzeit war mir alles recht, was den Job macht und ich habe auf Github folgende Dateien gefunden. Nach dem anpassen von char *port = " \ \ \ \ .\ \COM3" zu char port [.] = „COM3“ (ohne den Punkt in den eckigen Klammern) hat auch alles Funktioniert. Natürlich müsst ihr hier den Port eures Arduinos einfügen, bei mir war es halt COM3.

Links hierzu:

3. Problem: Beides verbinden

Der letzte Schritt war dann die beiden Programme zu verbinden. Ich habe mir eine kleine Funktion geschrieben, welche mir den char output in eine int konvertiert, diese habe ich dann in die void change_volume(int new_volume) Funktion aus 1. gehauen und das Programm lief :+1:.

Jetzt nur noch eine kurze Abfrage einstellen, dass er das Volume nur ändert, wenn der Poti auch wirklich einen anderen Wert als vorher ausgibt und fertig.

Ein kleiner Ausblick in die Zukunft

Ich denke aus diesem Grundgerüst kann noch einiges entstehen. Zum Beispiel:

  • Mit einem Button könnte man den Sound muten
  • Mit einer LED den aktuellen Zustand (muted oder nicht) ausgeben
  • Mit anderen Potis könnten auch andere Dinge angesteuert werden (Lautstärke einzelner Programme / Bass o.ä.)

Wenn ihr Fragen / Anregungen o.ä. habt, dann lasst es mich gerne wissen!
Sehr gerne kann ich den Code auf Wunsch auch veröffentlichen (Warnung, er ist momentan noch nicht wirklich schön, aber funktioniert), oder euch beim Nachprogrammieren oder Weiterführen meiner Idee helfen.
Vielleicht sehen wir uns ja auch in Stuttgart!

Lieben Gruß
Bastian

2 Like