Lautstärkeregelung über Potentiometer: Software Ansatz mit Teensy, Triggerhappy und Sabrant USB Soundkarte

Motivation:

 

Benutzt man das Potentiometer direkt am Lautsprecher, so lässt sich nicht die Lautstärke der Kopfhörer beeinflussen. Das Potentiometer lässt sich nicht vor den Verstärker schalten (Also direkt hinter die Soundkarte). Tut man es dennoch so hat es kaum noch eine Wirkung auf die Lautstärke.

Mittels amixer lässt sich per Terminal leicht die Lautstärke einer Soundkarte regeln. Im Folgenden soll beschrieben werden, wie ich das Potentiometer über den Teensy als Eingabegerät nutze und dessen Eingaben mittels Triggerhappy in amixer-Konsolenbefehle umwandele.

 

Hardware:

 

Sabrant USB Soundkarte: http://www.amazon.de/Sabrent-External-Adapter-erforderlich-AU-MMSA/dp/B00IRVQ0F8

Teensy LC

 

Software:

Retropie 3.7

triggerhappy (bereits installiert)

 

  1. USB-Sound einrichten

 

1.1 Schließe die USB Soundkarte an!

1.2 Wenn Retropie hochgefahren ist, wechsel mit F4 ins Terminal oder benutze SSH.

1.3 Prüfe ob die Soundkarte erkannt wurde:

 

pi@retropie:~ $ lsusb

 

Die Ausgabe sieht dann in etwa so aus:

 

Bus 001 Device 007: ID 0d8c:0014 C-Media Electronics, Inc.

Bus 001 Device 004: ID 0424:2517 Standard Microsystems Corp. Hub

Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter

Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 

Der C-Media Electronics Eintrag ist deine USB Soundkarte.

 

1.4 Nun prüfe die Priorität deiner USB Soundkarte im System, da amixer standardmäßig die Soundkarte mit der höchsten Priorität regelt::

 

pi@retropie:~ $ cat /proc/asound/modules

 

 

Die Ausgabe sieht dann so aus:

 

0 snd_bcm2835

1 snd_usb_audio

 

Wie du siehst ist deine USB Soundkarte nicht an Position 0 (höchste Priorität).

1.5 Wir können das ändern und das System zwingen die Soundkarten in einer anderen Reihenfolge zu laden. indem wir eine Sound-Konfigurationsdatei erstellen. Erstelle die Datei mit folgendem Befehl:

 

pi@retropie:~ $ sudo nano /etc/modprobe.d/alsa-base.conf

 

 

Das wird den nano-Texteditor aufrufen. Kopiere folgenden Text in die Datei:

 

options snd_usb_audio index=0

options snd_bcm2835 index=1

options snd slots=snd-usb-audio,snd-bcm2835

 

Danach drücke Strg+X um den Editor zu schließen. Beantworte den Speicherdialog mit Yes um die Änderungen zu speichern.

 

1.6 Starte das System neu und wechsel erneut ins Terminal mit F4.

1.7 Wenn alles richtig gemacht wurde solltest du folgende Ausgabe erhalten, wenn du diesen Befehl eintippst:

pi@retropie:~ $ cat /proc/asound/modules

Ausgabe:

0 snd_usb_audio

1 snd_bcm2835

 

1.8 Jetzt hast du die Priorität der Soundkarten geändert. Aber ohne Änderungen am Quellcode von Emulationstation wird Retropie immer nach einem Mixer mit dem Namen “PCM” suchen.

Unsere USB Soundkarte wird aber unter einem anderen Namen geführt (“Speaker” in meinem Fall).

Wir können das leicht umgehen, indem wir eine virtuelle Soundkarte einrichten, welche auf die USB-Karte zeigt. Gebe dazu Folgendes ein:

 

pi@retropie:~ $ sudo nano /etc/asound.conf

 

Kopiere folgenden Text in die Datei:

 

pcm.card0 {

type hw card 0

}

 

ctl.card0 {

type hw card 0

}

 

pcm.!default card0

 

Danach drücke Strg+X um den Editor zu schließen. Beantworte den Speicherdialog mit Yes um die Änderungen zu speichern.

 

Nun gebe “sudo reboot” ins Terminal ein um den Pi zu rebooten.

Nachdem der Pi hochgefahren ist, solltest du schon in der Lage sein die Sounds in den Menüs und Emulatoren zu hören.

 

  1. Potentiometer an Teensy anschließen

 

Ich habe das GameBoy Potentiometer benutzt, aber jedes andere Potentiometer sollte funktionieren.

 

Teensy 3.3V an Pot Line-in

Teensy Pin 21 an Pot Line-out

beliebiger Teensy GND-Pin an Pot GND

 

Problembehebung: Falls du verrauschte Werte vom Pot bekommst liegt das vielleicht daran, dass du Line-in und Line-out vertauscht hast, oder eine falsche Spannung anlegst.

 

  1. Teensy LC programmieren

 

3.1 Hier ist der Codeschnipsel den ich für meinen Teensy nutze, um die Ausgabe des Potentiometers zu interpretieren:

 

char volumeLVLs[21];

 

//Hotkeys für Triggerhappy

void setupVolumeKeys() {

volumeLVLs[0] = KEY_MINUS;        // 0%

volumeLVLs[1] = KEY_EQUAL;        // 5%

volumeLVLs[2] = KEY_LEFT_BRACE;   // 10%

volumeLVLs[3] = KEY_RIGHT_BRACE;  // 15%

volumeLVLs[4] = KEY_BACKSLASH;    // 20%

volumeLVLs[5] = KEY_SEMICOLON;    // 25%

volumeLVLs[6] = KEY_QUOTE;        // 30%

volumeLVLs[7] = KEY_TILDE;        // 35%

volumeLVLs[8] = KEY_COMMA;        // 40%

volumeLVLs[9] = KEY_PERIOD;       // 45%

volumeLVLs[10] = KEY_SLASH;       // 50%

volumeLVLs[11] = KEY_CAPS_LOCK;   // 55%

volumeLVLs[12] = KEY_END;         // 60%

volumeLVLs[13] = KEY_INSERT;      // 65%

volumeLVLs[14] = KEY_V;           // 70%

volumeLVLs[15] = KEY_T;           // 75%

volumeLVLs[16] = KEY_P;           // 80%

volumeLVLs[17] = KEY_SCROLL_LOCK; // 85%

volumeLVLs[18] = KEY_PRINTSCREEN; // 90%

volumeLVLs[19] = KEY_PAUSE;       // 95%

volumeLVLs[20] = KEY_I;           // 100%

}

 

int volumeLVL;

int deltaVolume=0;

int volumeKey=0;

float volumeRel=0;

 

void loop() {

 

volumeLVL=analogRead(21);

if(volumeLVL<4)volumeLVL=0;

if(volumeLVL>1019)volumeLVL=1023;

 

volumeRel=0.0195503421309873*volumeLVL;

deltaVolume=volumeKey-(int)volumeRel;

volumeKey=(int)volumeRel;

 

//Hotkey nur dann senden wenn sich der Wert am Pot ändert

if(deltaVolume!=0){

Serial.print("Volume = ");

Serial.print(volumeKey*5);

Serial.println(" %");

Keyboard.set_key1(volumeLVLs[volumeKey]);

Keyboard.send_now();  // Hotkey senden

Keyboard.set_key1(0);

Keyboard.send_now();  // Senden beenden

}

 

}

 

  1. Triggerhappy einrichten

 

4.1 Wechsel wieder ins Terminal am Pi und gebe ein:

 

$sudo nano /etc/init.d/triggerhappy

 

Ersetze

DAEMON_ARGS="--daemon --triggers /etc/triggerhappy/triggers.d/ --socket /var/run/thd.socket --pidfile $PIDFILE --user nobody /dev/input/event*"

mit

DAEMON_ARGS="--daemon --triggers /etc/triggerhappy/triggers.d/ --socket /var/run/thd.socket --pidfile $PIDFILE --user pi /dev/input/event*"

 

4.2 Dann erstelle die Konfigurationsdatei:

 

$sudo nano /etc/triggerhappy/triggers.d/volumectrl.conf

 

mit folgendem Inhalt:

 

KEY_MINUS  1       /usr/bin/amixer set Speaker -- - 0%

KEY_EQUAL  1       /usr/bin/amixer set Speaker -- - 5%

KEY_LEFT_BRACE  1       /usr/bin/amixer set Speaker -- - 10%

KEY_RIGHT_BRACE  1       /usr/bin/amixer set Speaker -- - 15%

KEY_BACKSLASH  1       /usr/bin/amixer set Speaker -- - 20%

KEY_SEMICOLON  1       /usr/bin/amixer set Speaker -- - 25%

KEY_QUOTE  1       /usr/bin/amixer set Speaker -- - 30%

KEY_TILDE  1       /usr/bin/amixer set Speaker -- - 35%

KEY_COMMA  1       /usr/bin/amixer set Speaker -- - 40%

KEY_PERIOD  1       /usr/bin/amixer set Speaker -- - 45%

KEY_SLASH  1       /usr/bin/amixer set Speaker -- - 50%

KEY_CAPS_LOCK  1       /usr/bin/amixer set Speaker -- - 55%

KEY_END  1       /usr/bin/amixer set Speaker -- - 60%

KEY_INSERT  1       /usr/bin/amixer set Speaker -- - 65%

KEY_V  1       /usr/bin/amixer set Speaker -- - 70%

KEY_T  1       /usr/bin/amixer set Speaker -- - 75%

KEY_P  1       /usr/bin/amixer set Speaker -- - 80%

KEY_SCROLL_LOCK  1       /usr/bin/amixer set Speaker -- - 85%

KEY_PRINTSCREEN  1       /usr/bin/amixer set Speaker -- - 90%

KEY_PAUSE  1       /usr/bin/amixer set Speaker -- - 95%

KEY_I  1       /usr/bin/amixer set Speaker -- - 100%

 

4.3 Starte den triggerhappy Prozess neu mit:

 

$sudo invoke-rc.d triggerhappy restart

 

Du solltest jetzt in der Lage sein die Lautstärke mit dem Potentiometer zu regulieren.

 

Fehlerbehebung: Falls es nicht klappt, wird deine Soundkarte vielleicht nicht als “Speaker” gelistet. Um den Namen deiner Soundkarte herauszufinden wechsel ins Terminal und gib ein:

 

$sudo alsamixer

 

Notiere dir den Item-Namen und ersetze “Speaker” in der volumectrl.conf mit diesem.

 

Mögliche Verbesserungen:

 

Anstelle einer einzelnen Taste als Hotkey, wäre es sinnvoller Tastenkombis zu nutzen, so dass man beim normalen Tippen nicht zufällig die Lautstärke ändert.

Herzlichen Dank an Julio für dieses Tutorial!

This site uses cookies to offer you a better browsing experience. By browsing this website, you agree to our use of cookies.