[German] Drehencoder KY-040

  • Hallo Forum,

    ich bin absolut neu hier und habe auch überhaupt keine Ahnung vom Programmieren.

    Aber ich habe immer mal wieder so Ideen, die ich dann gerne verwirklichen möchte.

    So habe ich LE in der aktuellsten Version auf meinem RPI3B+ installiert und möchte meinen beiden Söhnen (2 & 4 Jahre) gerne einen MP3-Player mit 9 Tasten und einem Lautstärkeregler zu Weihnachten bauen.

    Die Tasten habe ich angeschlossen und über das Addon "GPIO-Monitor" programmiert. 8x Playlist (1-8) start, 1x alles stopp. Läuft und funktioniert.

    Nur die Sache mit dem VC macht mir Kopfzerbrechen. Ich habe den Drehencoder KY-040 gekauft und habe ihn wohl soweit verstanden, als dass bei Drehung der Achse steigende und fallende Flanken auf den PINs CLK und DT entstehen. Außerdem sind die Impulse zeitlich versetzt und je nach Drehrichtung erst bei CLK ansteigend und anschließend bei DT ansteigend oder bei entgegengesetzter Drehrichtung erst bei DT ansteigend und anschließend bei CLK. Somit müssen die Impulse beobachtet werden und können die Drehrichtung vermitteln.

    Außerdem habe ich im Netz diese Anleitung gefunden, die aber auf Raspbian basiert: KY040 Drehregler als Lautstärkeregler für den Raspberry Pi

    Jetzt zu meiner Frage:

    Möchte mir jemand helfen, eine Datei zu schreiben, die in LE die Lautstärke regelt? Oder gibt es dass schon? Ich habe einiges gelesen, aber nichts zum nachbauen gefunden.

    Ggf. kann ja das Script aus dem oberen Tutorial so angepasst werden, dass der Befehl: SetVolume(percent)von hier: "https://kodi.wiki/view/List_of_built-in_functions" benutzt werden kann.

    Würde mich echt riesig freuen!

  • Das ist eigentlich ein Englisches Forum und du wirst sicherlich mehr erfolg haben wenn du das ganze in englisch "beschreibst" :)

    also der Befehl um das ganze in Kodi selber zu machen via shell/bash ist

    kodi-send --action='SetVolume(50,showVolumeBar)' (statt 50 -> 1-100)

    für das Python script (ohne das irgendwie getestet zu haben)

    Python
    def rotaryChange(direction):
        volume_step = 5
        volume = readVolume()
        if direction == 1:
            os.system("sudo amixer set PCM -- "+str(min(100,max(0,volume + volume_step)))+"%")
        else:
            os.system("sudo amixer set PCM -- "+str(min(100,max(0,volume - volume_step)))+"%")

    zu

    Python
    def rotaryChange(direction):
        volume_step = 5
        volume = readVolume()
        if direction == 1:
            os.system("kodi-send --action='SetVolume(%,showVolumeBar)'")
        else:
            os.system("kodi-send --action='SetVolume(%,showVolumeBar)'")

    ich bezweifel stark das das direkt geht durch ' und "

    Minimum wäre

    Python
    os.system("kodi-send --action="SetVolume(%)"")
  • Vielen Dank für Deine Hilfe!

    Ja, dass mit dem englischen Forum ist mir bewußt. Hat doch geklappt ;)

    Wenn ich meine Unwissenheit in englisch hätte formulieren wollen, wäre ich total aufgeschmissen gewesen.


    Was ist hiermit?

    Wird in LE der amixer benutzt?

    Code
    def readVolume():
        value = os.popen("amixer get PCM|grep -o [0-9]*%|sed 's/%//'").read()
        return int(value)
  • Hallo Da Flex,

    ich denke, ich habe DvH verstanden.

    Zur Erklärung: Meine Idee war, aus obigem Link, folgendes Script auf LE optimiert zu bekommen:

    So wie ich das verstehe, wir in Zeilen 8 - 10 beim Start des Scriptes die aktuelle Position der Lautstärke des amixer ausgelesen.

    Jetzt zu meinem vorherigen Post: Wie muss dieser Ausdruck formuliert werden, um in LE die aktuelle Lautstärke auszulesen? Oder muss man das überhaupt auslesen? Kann man komplett darauf verzichten?

    Vielen Dank für die Hilfe!

  • Alles klar. Danke für deine deutlichen Worte Da Flex .

    So besser?

    Wie ist das mit Zeile 9-11 ?

  • Wie ist das mit Zeile 9-11 ?

    Das Kommando zum Setzen der Lautstärke erwartet eine Angabe in Prozent (relevant für Code-Zeilen 18 und 20).

    Beispiel: Lautstärke auf 80% mit Bildschirm-Ausgabe zur visuellen Bestätigung (Option "true"):

    Code
    kodi-send --action='SetVolume(80, true)'

    Es muss also vorher die bereits eingestellte Lautstärke in Prozent ermittelt werden. Das geht per JSON-Anfrage:

    Code
    curl  -H "Content-Type: application/json"  -d "{\"jsonrpc\": \"2.0\", \"method\": \"Application.GetProperties\", \"params\" : { \"properties\" : [ \"volume\", \"muted\" ] }, \"id\" : 1 }" http://libre-elec:8080/jsonrpc

    Ergebnis der JSON-Anfrage:

    Code
    {"id":1,"jsonrpc":"2.0","result":{"muted":false,"volume":80}}

    Problem: Das Ergebnis muss noch geparsed werden, um nur die Zahl 80 (%) zu bekommen.

    Verwende also statt Zeile 9-11 das genannte Kommando, und eine Regular Expression, mit der Du vom JSON-Ergebnis zum Prozentwert konvertierst. Dann den Step-Wert vom Regler addieren oder subtrahieren. Das Ergebnis wie gezeigt per kodi-send übergeben.

    Probiere die Kommandos im SSH-Terminal aus, bevor Du sie in Dein Python-Script übernimmst.

  • der Befehl für Volume +- ist

    kodi-send --action="VolumeUp"

    kodi-send --action="VolumeDown"

    Das macht es einfacher. Dann fällt die umständliche Abfrage der bisherigen Lautstärke weg.

    Der Code müsste dann so aussehen (mit extra Button-Definition des Reglers zum Stumm schalten):

    Installation:

    - Ordner für das Python-Script anlegen: mkdir /storage/scripts

    - Script-Datei erstellen: > /storage/scripts/volume_regulator.py

    - Code einfügen und speichern

    - Python-Bibliothek KY040.py aus dem Start-Posting in den gleichen Ordner kopieren

    - Script beim Start von LE ausführen, dazu Inhalt von /storage/.config/autostart.sh wie folgt:

    Bash
    #!/bin/sh
    
    python /storage/scripts/volume_regulator.py
  • PS: Ich weiss nicht, welche add-ons Du schon installiert hast. Für die verwendete Python-GPIO-Bibliothek braucht man das add-on "Raspberry Pi Tools".

    Evtl. kann es sein, dass autostart.sh und/oder volume_regulator.py mit chmod +x <Dateiname> ausführbar gemacht werden müssen.

    Du kannst autostart.sh testen, indem Du es direkt vom SSH-Terminal mit /storage/.config/autostart.sh aufrufst.

  • Alles klar. Oder auch nicht!

    ich habe jetzt folgendes Script angelegt:

    und ist in der autostart.sh eingetragen.

    Doch sobald ich das Script ausführe, erhalte ich folgende Meldung:

    Quote

    Traceback (most recent call last):

    File "/storage/volume_control/volume_control.py", line 4, in <module>

    import RPi.GPIO as GPIO

    ImportError: No module named RPi.GPIO

    Allerdings hatte ich schon im Vorfeld das addon "Raspberry Pi Tools" installiert und ich habe eben nochmal kontrolliert, dass es auch aktiv ist.

    Noch eine Anmerkung:

    Wenn ich

    Python
    #!/usr/bin/python3

    geschrieben habe, konnte das Script nicht ausgeführt werden.

    Wenn ich

    Python
    #!/usr/bin/python

    schreibe, erzeugt das Script obigen Fehler.

    Übrigens vielen herzlichen Dank für Eure Hilfe Da Flex und CvH !

    Ps.:

    Bestimmt hilft folgender Beitrag aus dem Deutschen Raspberry Forum:

    Libre + GPIO Steuerung funktioniert nicht - OpenELEC/ LibreELEC - Deutsches Raspberry Pi Forum


    Aber wo muss der Code hin?

  • Ja. :) habe ich tatsächlich.

    Im Post von 2016 im deutschen Raspberry Forum steht geschrieben dass es sich wohl um einen bug im add-on handelt.

    Jetzt geht es tatsächlich !!! :thumbup::)

    Vielen herzlichen Dank !!!