Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ein Drehencoder am Pi zur Programmumschaltung bei VLC
#1
Hallo zusammen, 

ich hatte vor einigen Tagen schon mal eine  eMail bekommen mit der Frage wie man mit einem Drehencoder von Sunfounder (https://www.sunfounder.com/learn/Super_K...rrypi.html
eine Programmumschaltung bei unserem Internetradio machen kann. Ob ich nicht die Demo von obig verlinkten Programm abändern könnte. Nun das will ich hiermit nachholen, vielleicht stellt sich ja jemand anderes auch diese Frage.

@Jupp: Wie bereits per PN besprochen, kannst Du deinen Tiny-Controller damit ebenfalls ersetzen. 

Nun erstmal zum Drehencoder und wie er am Raspberry angeschlossen wird:

   

Raspberry Pi                       Rotary Encoder Module
3.3V                                          ‘+’
GND                                         GND
GPIO0                                       DT
GPIO1                                       CLK

Angeschlossen sieht das so aus: 

   

Nun noch kurz das Programm angepasst, ich passe aber nur den C-Code an, denn nur dieser läuft auch auf den Ur-Raspberrys schnell.

Code:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>

#define  RoAPin    0
#define  RoBPin    1

unsigned char flag;
unsigned char Last_RoB_Status;
unsigned char Current_RoB_Status;

void rotaryDeal(void)
{
    Last_RoB_Status = digitalRead(RoBPin);

    while(!digitalRead(RoAPin)){
        Current_RoB_Status = digitalRead(RoBPin);
        flag = 1;
    }

    if(flag == 1){
        flag = 0;
        if((Last_RoB_Status == 0)&&(Current_RoB_Status == 1)){
            system("echo \"next\" | nc 127.0.0.1 9294 -N");
        }
        if((Last_RoB_Status == 1)&&(Current_RoB_Status == 0)){
            system("echo \"prev\" | nc 127.0.0.1 9294 -N");
        }

    }
}


int main(void)
{
    if(wiringPiSetup() < 0){
        fprintf(stderr, "Unable to setup wiringPi:%s\n",strerror(errno));
        return 1;
    }

    pinMode(RoAPin, INPUT);
    pinMode(RoBPin, INPUT);

    while(1){
        rotaryDeal();
    }

    return 0;
}

Wie Ihr seht wurden nur die Befehle zum Umschalten auf die nächste Station  system("echo \"next\" | nc 127.0.0.1 9294 -N");
und auf die vorherige Station eingefügt: system("echo \"prev\" | nc 127.0.0.1 9294 -N");

Die Ausgaben des Demoprogramms von Sunfounder habe ich entfernt, wir bauchen diese hier nicht.

Wie übersetzt man das Programm? Nachdem der modifizierte Democode in einer Textdatei zum Beispiel rotary.c abgespeichert wurde, öffnet man eine Konsole und wechselt in das Verzeichnis in dem die Datei rotary.c liegt.
Zum Kompilieren gibt man dann ein:

gcc rotary.c -o rotary -lwiringPi

Das fertige Programm kann über den Befehl: sudo ./rotary & ausgeführt werden. Nach dem Programmstart schaltet man dann mit dem Drehencoder durch die Senderliste von VLC.


Kopiert man zum Beispiel das Programm rotary nach /usr/bin und fügt den oben genannten Befehl inklusive Dateipfad in die Datei /etc/rc.local ein (bitte vor exit 0 einfügen), dann wird das Programm bei jedem Systemstart automatisch ausgeführt. Jetzt kann man noch ein zweites Programm für das holen der Senderinfos und deren Ausgabe auf einem Display schreiben, es ebenso wie rotary beim Systemstart automatisch ausführen lassen und das ganze Internetradio läuft modular und jede Aufgabe ist für sich gut getrennt.

Gar nicht so schwer oder? 

Gruß Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#2
Also ich hab es hinbekommen. Und das obwohl ich wegen DSL-Ausfall im offline Betrieb mit mp3 Dateien hantieren muss und hier mit dem Handy mit gprs schreiben muss. Gegenüber der Anleitung von gestern hat sich ja inzwischen einiges geändert. So liegen DT und CLK jetzt auf GPIO17 und 18. Das must du im Text noch korrigieren, Bernhard. Mit dem Keyes-Modul funktioniert die Umschaltung. Mit einem Einzel-Encoder ohne pullup's hingegen nicht. Die werde ich dann wohl noch dazusetzen müssen. Oder im Quellcode aktivieren.

PS: ja es sind die pullup's. Zweimal 10K eingebaut dann funktioniert auch der Einzelencoder.
Gruß,
Jupp
-----------------------------
"Ich bin privat überhaupt nicht komisch" (Bjarne Mädel)
Zitieren
#3
Nein Jupp, bezüglich der Pinbelegung hat sich seit gestern nichts geändert, es ist nach wie vor folgende:

Raspberry Pi                       Rotary Encoder Module
3.3V                                          ‘+’
GND                                         GND
GPIO0                                       DT
GPIO1                                       CLK

Auch im Quellcode hier und im iRadio sind es die gleichen:

#define  RoAPin    0
#define  RoBPin    1

Ich hatte ja schon erklärt das jede Bibliothek da eine andere Nummerierung vornimmt.

   

Da das oben ein Programm ist was die Bibliothek wiringPi als Basis hat, hängt der Encoder an GPIO0 und GPIO1 (im Bild oben: GPIO_GEN0 und GPIO_GEN1, im Bild unten GPIO0 und GPIO1).
Würde man das Programm mit der 2835 umsetzen, hätten die gleichen Pins die Nummer 11 und 12 im Quellcode. In der  GPIO-Nummerierung die Raspberry für sein
Anschlußschema benutzt, lautet die Bezeichnung GPIO17 und GPIO18.  Es sind aber immer die beiden gleichen Pins! Man muss also immer schauen welche Bibliothek das Progamm benutzt
und wie die Nummerierung des Headers nach der verwendeten Bibliothek erfolgt. Nur dann findet man die passenden Anschlüsse zu den im Quellcode genannten Nummern.


.png   gpio1.png (Größe: 157,91 KB / Downloads: 108)

Und je nach Bordrevision können die Bezeichnungen dann auch noch mal unterschiedlich sein. Nimmt man dann noch Raspberry-Derviate wird die Sache zum Teil ganz verrückt!
Frage mich nicht warum man eine unterschiedliche Nummerierung betreibt, ich verwende jedenfalls im Text die Nummerierung die zur jeweiligen Bibliothek gehört und welche im entsprechenden Steuerprogramm dafür
genutzt werden muss. Nur so hat man meiner Meinung nach schnell einen Überblick wo etwas im Quelltext geändert werden muss, um Anschlüsse mal umlegen zu können.

Gruß 
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#4
das ist wirklich kompliziert. Danke für die Aufklärung, Bernhard.
Gruß,
Jupp
-----------------------------
"Ich bin privat überhaupt nicht komisch" (Bjarne Mädel)
Zitieren
#5
Hast Du vielleicht eine Ahnung wie man das in einer Anleitung (als pdf oder jpeg) im iRadio Paket am Besten erklärt das es da so ein Durcheinander gibt? Vielleicht noch eine Liste welches mitgelieferte Programm welche Bibliothek benutzt, obwohl das erkennt man ja am inkludierten Header. Anderseits wird nicht jeder wissen welcher Quellcode zu welcher Komponente gehört und oftmals den Quellcode auch gar nicht verstehen, gerade als Neuling. Ich bin da mit meiner Didaktik am Ende, muss ja jedesmal selbst minutenlang in den Plänen nachschauen, welchen Pin ich mit welcher Bibliothek wie anspreche.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren


Gehe zu: