Themabewertung:
  • 1 Bewertung(en) - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ein minimales Internetradio für alte und neue Raspberrys
#1
Hallo, 

ich habe jetzt mal ein Installationspaket zusammengestellt das uns von den "Lasten" des Pimoroni-Installers befreit und auch auf neuen Kerneln und Raspbian-Versionen performanter laufen sollte. Dies war notwendig, da sich sehr alte Raspberrys an den Python-Sachen und dem VU-Meterplugin von Pimoroni "verschlucken".

Das Installationsarchiv habe ich angeheftet: 
.zip   iRadio.zip (Größe: 603,65 KB / Downloads: 56)    Update 26.10.2018: normale Konsole wieder erreichbar

Es enthält den Ordner "iRadio" der bitte bei allen Versionen nach der Extraktion im Homeverzeichnis des Default-Nutzers "pi", also unter /home/pi zu liegen kommt. Das Projektverzeichnis ist also /home/pi/iRadio

Folgende Sachen sind in iRadio vorhanden:

   

- der Ordner bcm2835-xxx : dieser Ordner erhält eine Bibliothek mit der wir die Anschlüsse des Raspberrys abfragen können 
- default.m3u : eine Standardplaylist für vlc
- gpiod : einen kleinen Daemon den ich für die Abfrage von Tastern und zur Ansteuerung des vlc-Prozesses geschrieben habe
- gpiod.c : der C-Quellcode für den gpiod-Daemonen. Hier kann der Nutzer selbst die Pins für Taster hinzufuegen oder eine Drehencoderabfrage realisieren
- install.sh : Das komplette Installerscript für ein minimales Internetradio auf vlc-Basis
- rc.local : Mit dieser Datei werden alle nötigen Prozesse beim Systemstart gestartet
- vlcd : das Script das dafür sorgt, das vlc als Deamon im Hintergrund läuft, was nach neuen WiFi-Zugangsdaten oder Senderlisten auf /boot schaut 


INSTALLATION:
1. Wir kopieren ein nacktes Raspbian-Image auf SD-Karte
2. Wir booten den Pi mit dieser SD-Karte und legen mit raspi-config fest wo der Sound ausgegeben werden soll (hdmi/3.5 Klinke), gleichzeitig aktivieren
wir mit dem raspi-config Tool einen SSH-Zugang damit wir keinen Monitor/Tastatur an den Pi hängen müssen
3. Wir laden uns oben die zip-Datei runter und kopieren des so auf den Pi, das das Verzeichnis iRadio unter /home/pi zu liegen kommt. 
4. Nach dem das Projekt also unter /home/pi/iRadio zuliegen kommt, öffnen wir eine Konsole und wechseln in das Verzeichnis "iRadio"
5. Wir rufen den Installer mit: sudo ./install.sh auf
6. Nachdem der Installer durchgelaufen ist, starten wir den Pi mit sudo reboot neu.

Das minimale Internetradio ist damit installiert, auf /boot können wie bei Pimoroni Wifi-Daten und eine Playlist abgelegt werden. Das Radio lauscht auf den in gpiod.c festgelegten Pins auf Tasteneingaben. Wird eine solche Tasteneingabe (Taster gegen Masse wie auf dem Pimoronibausatz) entdeckt, dann schaltet das Programm vlc per nc (Netcat) über das Netzwerkinterface um.

Code:
// gpiod.c
//
// Beispielprogramm fuer bcm2835 lib
// Schaltet per GPIO-Taster nach Masse einen laufenden VLC-Prozess (next, prev, ...)
//
// After installing bcm2835, you can build this
// with something like:
// gcc  gpiod.c -o gpiod -lbcm2835
// sudo ./gpiod
//
// Author: Bernhard45 (mbernhard1945@gmail.com)

#include <bcm2835.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

//#define DEBUG

// Tasteranschluesse
#define PIN_PRG_HOCH RPI_GPIO_P1_11
#define PIN_PRG_RUNTER RPI_GPIO_P1_12
#define PIN_PRG_HALT RPI_GPIO_P1_08
#define PIN_PRG_WEITER RPI_GPIO_P1_10

int main(int argc, char **argv)
{
   if (!bcm2835_init())
    return 1;

   // Pin als Eingang setzen , mit Pull-Up
   bcm2835_gpio_fsel(PIN_PRG_HOCH, BCM2835_GPIO_FSEL_INPT);
   bcm2835_gpio_set_pud(PIN_PRG_HOCH,BCM2835_GPIO_PUD_UP);

   bcm2835_gpio_fsel(PIN_PRG_RUNTER, BCM2835_GPIO_FSEL_INPT);
   bcm2835_gpio_set_pud(PIN_PRG_RUNTER,BCM2835_GPIO_PUD_UP);

   bcm2835_gpio_fsel(PIN_PRG_HALT, BCM2835_GPIO_FSEL_INPT);
   bcm2835_gpio_set_pud(PIN_PRG_HALT,BCM2835_GPIO_PUD_UP);

   bcm2835_gpio_fsel(PIN_PRG_WEITER, BCM2835_GPIO_FSEL_INPT);
   bcm2835_gpio_set_pud(PIN_PRG_WEITER,BCM2835_GPIO_PUD_UP);

   // Endlosschleife, da Daemonbetrieb
   while (1)
   {
    // Zustand am Pin einlesen
    uint8_t val_prg_hoch   = bcm2835_gpio_lev(PIN_PRG_HOCH);
    uint8_t val_prg_runter = bcm2835_gpio_lev(PIN_PRG_RUNTER);
       uint8_t val_prg_halt   = bcm2835_gpio_lev(PIN_PRG_HALT);
       uint8_t val_prg_weiter = bcm2835_gpio_lev(PIN_PRG_WEITER);

    #ifdef DEBUG
        printf("Tastenwert PIN_HOCH: %d\n", val_prg_hoch);
        printf("Tastenwert PIN_RUNTER: %d\n", val_prg_runter);
        printf("Tastenwert PIN_HALT: %d\n", val_prg_halt);
        printf("Tastenwert PIN_WEITER: %d\n", val_prg_weiter);
    #endif

    if (val_prg_hoch == 0)
          system("echo \"next\" | nc 127.0.0.1 9294 -N");

       if (val_prg_runter == 0)
               system("echo \"prev\" | nc 127.0.0.1 9294 -N");

       if (val_prg_halt == 0)
               system("echo \"stop\" | nc 127.0.0.1 9294 -N");

       if (val_prg_weiter == 0)
               system("echo \"play\" | nc 127.0.0.1 9294 -N");

    delay(500);
   }

   return 0;
}


Dadurch das wir hier C und kein Python benutzen, das VU-Meterplugin von Pimoroni nicht läuft und auch das Logging von vlc deaktiviert ist, haben wir im Spielbetrieb nur noch eine relativ geringe Systemauslastung.

   

Viel Spaß beim Bauen von Internetradios
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
vielen Dank Bernhard, damit komm ich wieder ein gutes Stück weiter. Ich werde demnächst berichten wie performant das Radio mit deiner Installation arbeitet. Ein "Ur"-Raspi 1 Modell B ist bei mir grad frei geworden, einen weiteren hab ich bestellt.
Gruß,
Jupp
-----------------------------
wenn man nur den Hammer kennt, sieht jedes Problem aus wie ein Nagel
--------
Zensur findet im Endgerät statt (CCC)
Zitieren
#3
mal kurz erzählen wie weit ich heute noch gekommen bin, hab mit rot ein paar Unklarheiten markiert:

- aktuelles Raspbian aufgespielt

- am PC iRadio entzippt und auf /boot kopiert (auf /home komm ich ja vom PC aus nicht)

- raspi gestartet, per raspi-config Tonausgabe kontrolliert, dort die WLAN Daten eingetragen und SSH aktiviert

- per putty verbunden, den Ordner /boot/iRadio nach /home/pi/ verschoben mit mv
  (das hat zwar funktioniert, er war nachher aber immer noch in /boot existent)

- install.sh ausgeführt (warum wird das mit ./ aufgerufen, obwohl ich mich in /home/pi befinde?)

- playlist.m3u und wpa_supplicant.conf.bak nach /boot kopiert (letztere wurde aber nicht gelöscht, wird vermutlich ohne .bak geschrieben? WLAN hatte ich trotzdem, vermutlich weil ich es in raspi-config schon eingetragen hatte)

das Radio auf dem UR-Raspi läuft! Interessant ist wenn das Ur-Raspi und das xircon B+ gleichzeitig laufen fällt auf daß der Ton am xircon beim gleichen Sender ca. 2 Sekunden später ausgegeben wird.

dann hab ich noch eine htop Ausgabe dokumentiert:

   

sieht wirklich gut aus. Im Vergleich zur pimoroni Installation wo die CPU 100% ausgelastet war.

auf der Raspi-Konsole ist mir noch aufgefallen daß es Fehler gab, und auch jetzt, nachdem er schon eine halbe Stunde läuft, ist er noch nicht am Anmeldeprompt angekommen:

   

das webinterface funktioniert bestens. Die Sender schalten mit nur wenig Verzögerung und ohne Gestottere um.

das Schalten an der Steckerleiste funktioniert nicht. GPIO8 und 11 sind auf der 26pol Leiste erreichbar, zeigen aber keine Reaktion. 10 und 12 liegen ausserhalb der Leiste.
Gruß,
Jupp
-----------------------------
wenn man nur den Hammer kennt, sieht jedes Problem aus wie ein Nagel
--------
Zensur findet im Endgerät statt (CCC)
Zitieren
#4
(25.10.2018, 22:13)saarfranzose schrieb: - install.sh ausgeführt (warum wird das mit ./ aufgerufen, obwohl ich mich in /home/pi befinde?)

Eigentlich solltest Du dich beim Aufruf in /home/pi/iRadio befinden, denn in /home/pi gibt es auf einem Raspbian kein install.sh!
./datei_xyz sagt nur das die Datei im aktuellen Verzeichnis liegt, das Rootverzeichnis des Systems heißt ja / und nicht ./ oder was hast Du bei ./ gedacht wo Du dich im System befindest?
./ = aktuelles Arbeitsverzeichnis
../ = Parent-Verzeichnis
/ = root-Verzeichnis.


- playlist.m3u und wpa_supplicant.conf.bak nach /boot kopiert (letztere wurde aber nicht gelöscht, wird vermutlich ohne .bak geschrieben? WLAN hatte ich trotzdem, vermutlich weil ich es in raspi-config schon eingetragen hatte)

Richtig, die Datei heißt wpa_supplicant.conf und diese wird auch verschoben und ist danach nicht mehr unter /boot


das Schalten an der Steckerleiste funktioniert nicht. GPIO8 und 11 sind auf der 26pol Leiste erreichbar, zeigen aber keine Reaktion. 10 und 12 liegen ausserhalb der Leiste.

Nein Jupp. Es handelt sich NICHT um GPIO Nummer 8 und 11 oder 10 und 12 sondern um GPIO-Pin (!) 8, 10, 11, 12 des Headers. GPIO-Pin 12 wäre zum Beispiel GPIO1! Die BCM2835-Bibliothek nummeriert die Pins einfach durch und macht nicht 
die "durcheinandergeratene" GPIO-Nummerierung von WiringPi.  Da hast Du also einfach die falschen Pins auf Masse gezogen!

Siehe hier : [Bild: j8header-3b.png]


Zu deiner Bootmeldung (Timeout beim Serialdevice und dem Bluetooth-Modem) kann ich nichts sagen. Hast Du irgendetwas in dieser Richtung gesteckt oder im raspi-config eingestellt?

Preisfrage an die angehenden Linuxprogrammierer! Das Pimoroni-Radio hat noch zwei Taster für Lauter und Leiser! Wie muss der Programmcode von gpiod.c erweitert werden damit diese Funktion auch hier gegeben wäre?
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
#5
sorry, Schreibfehler, natürlich bin ich in /home/pi/iRadio

PIN8,10,11,12 funktioniert!

ich hab natürlich nichts am Raspi verstellt oder gesteckt wozu ich keine Anweisung habe. Die Start-Geschichte ist noch unklar. Ohne über SSH zu gehen komme ich gar nicht mehr auf die Konsole.
Gruß,
Jupp
-----------------------------
wenn man nur den Hammer kennt, sieht jedes Problem aus wie ein Nagel
--------
Zensur findet im Endgerät statt (CCC)
Zitieren
#6
Steckt vielleicht irgendein Dongle für eine Funktastatur oder Maus im USB Port? Durch den Autostart ist er ja durchgekommen, vlcd und gpiod für Tastersteuerung läuft ...  
Kannst Du auf eine andere  Konsole umschalten und dich anmelden?

Andererseits Pin 8/10 wo die Taster dran sind, ist auch der UART. Eventuell denkt ein Prozess das dort über den UART eine Kommunikation stattfinden soll. Da ich nur über SSH gearbeitet habe ist mir das vielleicht gar nicht aufgefallen. Kannst du die Pins in gpiod.c unbelegten (vielleicht 16 und 18), eine neue Version von gpiod compilieren? Die neue kompilierte Version dann nach /usr/bin kopieren und das System neu starten?
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
#7
moin Bernhard,

nichts dergleichen gesteckt.

Ich bin aus der Konsole des raspi ausgesperrt und kann auch keine neue öffnen. Ich kann nur per SSH mit dem raspi kommunizieren.

Ich hab die Datei gpiod.c im iRadio-Ordner geändert, install.sh neu ausgeführt und gpiod nach /usr/bin kopiert. Vorher mussste ich gpiod killen. Ich hoffe das war richtig. Die Änderung der Tastenbelegung hat jedenfalls gegriffen. Lediglich die Auswirkung auf das Startverhalten ist leider gleich geblieben.
Gruß,
Jupp
-----------------------------
wenn man nur den Hammer kennt, sieht jedes Problem aus wie ein Nagel
--------
Zensur findet im Endgerät statt (CCC)
Zitieren
#8
Habe oben in Post #1 das Archiv geupdated. 
Jetzt sollte auch der normale Konsolenzugang wieder erreichbar sein. 
Die GPIOs dürfen weiterhin auch auf dem UART liegen, das macht nun keine Probleme.
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
#9
(26.10.2018, 10:36)saarfranzose schrieb: Ich hab die Datei gpiod.c im iRadio-Ordner geändert, install.sh neu ausgeführt und gpiod nach /usr/bin kopiert. Vorher mussste ich gpiod killen.

Das ganze Installerscript muss nicht nochmal durchlaufen werden. Wie man nur den Daemon gpiod compiliert steht eigentlich bereits im Quellcode
ganz oben.

gcc gpiod.c -o gpiod -lbcm2835

gcc = ist der Kompiler
gpiod.c = klar unsere Sourcecodedatei
gpiod = Name des fertigen Programms
-lbcm2835 = nutze zum Übersetzen des Programms die bcm2835-Bibliothek die wird ja für die Ansteuerung/Abfrage der GPIOs benötigen

Kopieren nach /usr/bin/

1. alten Prozess killen: sudo killall gpiod
2. kopieren: sudo cp gpiod /usr/bin/

Ein Neustart des Pi ist nicht nötig, es reicht wenn man einfach das Programm gpiod neu startet: sudo ./gpiod (wenn wir uns noch im Verzeichnis befinden wo gpiod liegt)
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
#10
Hallo Bernhard,

ich hatte die SD-Card gelöscht und wieder ganz von vorne angefangen mit der aktuellen iRadio.zip, noch bevor dein letzter post kam.

Jetzt geht wieder alles!

   

vielen Dank für deinen guten support!!
Gruß,
Jupp
-----------------------------
wenn man nur den Hammer kennt, sieht jedes Problem aus wie ein Nagel
--------
Zensur findet im Endgerät statt (CCC)
Zitieren
#11
Super das alles geht Jupp, ich freue mich. Dann sind wir endlich die "Fesseln von Pimoroni los" und können hier im Forum unser eigenes Ding machen.
Ich denke Du bist jetzt auch schon so gut in Linux drin und kannst das was Du damals auf dem Arduino programmiert hast (Drehencoder, FM-Radio-ICs) auch direkt auf dem Pi umsetzen. Und wenn es Fragen zu einem Konzept oder zur Programmierung gibt dann immer raus damit. In iRadio im bcm2835-Ordner gibt es noch einen Ordner examples. Dort sind praktisch viele Basisexperimente aus dem Raspberry-Bastelbüchern drin, man kann sehen wie man GPIOs mit der BCM2835-Bibliothek liest und schreibt, wie damit das I2C und SPI Protokoll funktioniert. Damit bekommt man jeden digitalen UKW-Tuner oder jedes DAB+ Modul an den Pi.

Viele Grüße (leider sehen wir uns nicht in Mainz da ich schon anderweitige Verpflichtungen habe)
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
#12
ich habe das Xiron-Raspberry-Internetradio jetzt auch auf die "Bernhard-Software" umgestellt. Hab noch eine selbstgestrickte Fehlerquelle entdeckt. Wenn der Installer läuft braucht man eine stabile Internetverbindung. Bei einem Abriss macht er einfach weiter und es fehlen nachher irgendwelche Programmteile. Wegen dem HDMI Anschluß war ich zu dicht in meiner PC-Ecke, und WLAN zickt dort etwas rum.
Das Xiron läuft aber jetzt super und ich kann mir wieder ein neues Bastelobjekt suchen.
Gruß,
Jupp
-----------------------------
wenn man nur den Hammer kennt, sieht jedes Problem aus wie ein Nagel
--------
Zensur findet im Endgerät statt (CCC)
Zitieren
#13
(26.10.2018, 17:43)saarfranzose schrieb: ich habe das Xiron-Raspberry-Internetradio jetzt auch auf die "Bernhard-Software" umgestellt. Hab noch eine selbstgestrickte Fehlerquelle entdeckt. Wenn der Installer läuft braucht man eine stabile Internetverbindung. Bei einem Abriss macht er einfach weiter und es fehlen nachher irgendwelche Programmteile.

Da muss ich mal schauen, der Installer holt sein einziges Programmpaket (nämlich vlc-nox) eigentlich mit dem Betriebssystem-eigenen Paketmanager, der sollte auf soetwas (kurze Internetunterbrechung) denke ich richtig reagieren, da ist von meiner Seite nichts selbstgestrickt, die restlichen Programmteile liegen ja bereits in iRadio drin, die werden nur an andere Orte kopiert oder im Compiler übersetzt und dann kopiert, da sollte also nichts fehlen können wenn die Internetverbindung weg klappt! Allerdings kann ich in das Script noch eine Überprüfung einfügen und schauen ob vlc im System wirklich richtig installiert wurde, das geht.
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
#14
es gibt Zugriffe auf eine IP die mit 98.98. beginnt. Die Meldungen sind zu kurz damit sie ganz lesen könnte. Vielleicht ist es auch nur ein Versionsabgleich bevor bestimmte Pakete installiert werden. Bei einer fehlerhaften Installation huschen Meldungen durch "keine Internetverbindung" o.ä.
Gruß,
Jupp
-----------------------------
wenn man nur den Hammer kennt, sieht jedes Problem aus wie ein Nagel
--------
Zensur findet im Endgerät statt (CCC)
Zitieren
#15
(26.10.2018, 19:28)saarfranzose schrieb: Die Meldungen sind zu kurz damit sie ganz lesen könnte. Vielleicht ist es auch nur ein Versionsabgleich bevor bestimmte Pakete installiert werden. Bei einer fehlerhaften Installation huschen Meldungen durch "keine Internetverbindung" o.ä.

Ja die interne Paketdatenbank wird vor dem Download des vlc-Pakets automatisch überprüft und auf den neusten Stand gebracht.
Übrigens kannst Du die Meldungen aller Programme in der Konsole in eine Datei schreiben lassen, das geht durch den Operator >

Beispiel:

sudo ./install.sh > meldungen.txt

Hier werden alle Konsolenmeldungen umgeleitet und in die Datei meldungen.txt geschrieben. Das funktioniert mit jedem Konsolenprogramm so, nur zur Info. Ich habe jetzt das Installerscript abgeändert, wenn der Paketmanager eine Unterbrechung feststellt, dann wird eine Meldung angezeigt und das Skript beendet. Im nächsten Archiv ist dann das neue Installerscript mit dabei.
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
#16
(25.10.2018, 13:28)Bernhard45 schrieb:
Code:
// gpiod.c
//
// Beispielprogramm fuer bcm2835 lib
// Schaltet per GPIO-Taster nach Masse einen laufenden VLC-Prozess (next, prev, ...)
//
// After installing bcm2835, you can build this
// with something like:
// gcc  gpiod.c -o gpiod -lbcm2835
// sudo ./gpiod
//
// Author: Bernhard45 (mbernhard1945@gmail.com)

#include <bcm2835.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

//#define DEBUG

// Tasteranschluesse
#define PIN_PRG_HOCH RPI_GPIO_P1_11
#define PIN_PRG_RUNTER RPI_GPIO_P1_12
#define PIN_PRG_HALT RPI_GPIO_P1_08
#define PIN_PRG_WEITER RPI_GPIO_P1_10

int main(int argc, char **argv)
{
   if (!bcm2835_init())
    return 1;

   // Pin als Eingang setzen , mit Pull-Up
   bcm2835_gpio_fsel(PIN_PRG_HOCH, BCM2835_GPIO_FSEL_INPT);
   bcm2835_gpio_set_pud(PIN_PRG_HOCH,BCM2835_GPIO_PUD_UP);

   bcm2835_gpio_fsel(PIN_PRG_RUNTER, BCM2835_GPIO_FSEL_INPT);
   bcm2835_gpio_set_pud(PIN_PRG_RUNTER,BCM2835_GPIO_PUD_UP);

   bcm2835_gpio_fsel(PIN_PRG_HALT, BCM2835_GPIO_FSEL_INPT);
   bcm2835_gpio_set_pud(PIN_PRG_HALT,BCM2835_GPIO_PUD_UP);

   bcm2835_gpio_fsel(PIN_PRG_WEITER, BCM2835_GPIO_FSEL_INPT);
   bcm2835_gpio_set_pud(PIN_PRG_WEITER,BCM2835_GPIO_PUD_UP);

   // Endlosschleife, da Daemonbetrieb
   while (1)
   {
    // Zustand am Pin einlesen
    uint8_t val_prg_hoch   = bcm2835_gpio_lev(PIN_PRG_HOCH);
    uint8_t val_prg_runter = bcm2835_gpio_lev(PIN_PRG_RUNTER);
       uint8_t val_prg_halt   = bcm2835_gpio_lev(PIN_PRG_HALT);
       uint8_t val_prg_weiter = bcm2835_gpio_lev(PIN_PRG_WEITER);

    #ifdef DEBUG
        printf("Tastenwert PIN_HOCH: %d\n", val_prg_hoch);
        printf("Tastenwert PIN_RUNTER: %d\n", val_prg_runter);
        printf("Tastenwert PIN_HALT: %d\n", val_prg_halt);
        printf("Tastenwert PIN_WEITER: %d\n", val_prg_weiter);
    #endif

    if (val_prg_hoch == 0)
          system("echo \"next\" | nc 127.0.0.1 9294 -N");

       if (val_prg_runter == 0)
               system("echo \"prev\" | nc 127.0.0.1 9294 -N");

       if (val_prg_halt == 0)
               system("echo \"stop\" | nc 127.0.0.1 9294 -N");

       if (val_prg_weiter == 0)
               system("echo \"play\" | nc 127.0.0.1 9294 -N");

    delay(500);
   }

   return 0;
}


Dadurch das wir hier C und kein Python benutzen, das VU-Meterplugin von Pimoroni nicht läuft und auch das Logging von vlc deaktiviert ist, haben wir im Spielbetrieb nur noch eine relativ geringe Systemauslastung.

Wie kommt es das die Bausatzsoftware bei der Tastaturabfrage allein 40% Auslastung produziert während bei deinen Programm die Auslastung kaum messbar ist? Die Tastatur wird doch hier sogar doppelt so oft abgefragt wie beim Bausatz! Warum ist die eine Sprache soviel effizienter als die andere? Die Programmteile sind doch fast gleichlang.

Otto.
Zitieren
#17
Hallo Otto,

ich denke, dass das daran liegt dass Python eine Interpretersprache ist, während C direkt ausführbaren Code erzeugt und zur Ausführung keine Laufzeitumgebung mehr benötigt.


Grüße

Martin
Zitieren
#18
Hallo zusammen, 

Martin hat es schon erwähnt. Python ist eine Sprache bei der das Programm nicht in Maschinencode für den Prozessor des Raspberry übersetzt wird, sondern in einen Zwischencode, der dann von dem Interpreter - eine Art virtueller Prozessor - ausgeführt wird. Diesen virtuellen Prozessor gibt es für viele unterschiedliche Prozessorarchitekturen und da der virtuelle Prozessor immer den gleichen Zwischencode versteht, egal auf welcher Prozessorachitektur er läuft, braucht man das Programm nicht jedesmal für jeden CPU-Typ kompilieren, es läuft einfach.  

Bei der Sprache C jedoch wird durch den Compiler direkt der Maschinencode erzeugt, der von der jeweiligen "Hardware" verstanden wird. Man braucht also zwischen dem "Hardwareprozessor" und dem Programm keinen virtuellen Prozessor als Dolmetscher. Da der Dolmetscher fehlt, der einiges an Ressourcen auf dem Rechner braucht, wird das Programm deutlich kleiner - braucht also weniger Speicher und Rechenleistung. Es gibt Zahlen die sagen das ein Python-Programm das ungefähr 300 - 500fache an Ressourcen braucht, als ein vergleichbares C-Programm! Nachteil des C-Programms ist es aber, das es für jeden Prozessortyp neu kompiliert werden muß. Hier auf den Raspberrys, vor allem den Ur-Raspberrys, gibt es aber nichts zu verschenken! 

Pimoroni hat sich im Bausatz für Python (Tastaturabfrage und Programmumschaltung) und C/C++ (VU-Meter) entschieden, der im Bausatz mitgelieferte Pi Zero hat damit "noch" keine Probleme was die Auslastung angeht. Möchte man aber noch mehr auf dem Raspberry erledigen, zum Beispiel eine grafische Benutzeroberfläche an einem Display darstellen und/oder DAB/DAB+ Empfang realisieren, dann wird es knapp weil die Ressourcen zum großen Teil schon vom vituellen "Python-Prozessor" belegt wird. Ausweg: Man erledigt alles in einer Compilersprache wie C oder C++.

Pimoroni sagt auf der Internetseite sogar das man für ihre Lösung nur die Minimalversion von Raspbian nehmen soll. Sie sagen auch, das auf der Raspbian-Version bei der eine grafische Benutzeroberfläche für das Betriebssystem dabei ist, das Internetradio deutlich langsamer reagiert. Der Grund ist oben genannter, also der Ressourcenverbrauch des Python-Dolmetschers. Dieser muss sich dann den kleinen Prozessor noch mit einer Benutzeroberfläche teilen. Aus diesem Grund habe ich oben beim "iRadio" komplett auf Python verzichtet. Ich glaube den merkbaren Unterschied von C zu Python hat Jupp hier schon gut gezeigt und erfahren. Das "iRadio" bietet im Gegensatz zur Pimoroni-Lösung also nun die Möglichkeit noch eine GUI oder andere Signalverarbeitungen zu machen. Würde man zum Beispiel den ganzen Signalweg eines DAB+ Radios in einer Interpretersprache realisieren (ja das wurde schon gemacht!) braucht man natürlich wahnsinnig viel Rechenleistung, typischerweise viele CPU-Kerne mit Taktfrequenzen im GHz-Bereich. Für die Signalverarbeitung in C/C++ hingegen reicht, wenn effizient programmiert, schon ein Controller mit ungefähr 150 - 200 MHz Taktfrequenz aus. Ich selbst habe mich für mein nächstes Projekt sogar für ein ganz ganz kleines Linux mit nur den nötigsten Komponenten und Bibliotheken beschränkt. Selbst mit GUI und sämtlicher Signalverarbeitung hat der Prozessor noch genügend Freiraum um schnell auf Benutzereingaben antworten zu können. 

   

Im Hintergrund läuft dann auch keine "dicke" Benutzeroberfläche und für die Grafikprogrammierung setze ich immer sehr schmale Toolkits wie FLTK ( http://www.fltk.org/index.php ) ein. QT wäre meiner Meinung nach schon zu "fett" für solche Zwecke. 

   

Nur mein Programm läuft auf den Displayserver der dann direkt von der Konsole aus gestartet wird und ich setzte komplett auf Compilersprachen wie C/C++. 

Ich hoffe den Unterschied und die Auswirkungen einer Interpretersprache im Vergleich zu einer Compilersprache verständlich dargelegt zu haben, aber wenn es weitere Fragen gibt, dann natürlich raus damit.

Viele Grüße
B45
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
#19
Hallo zusammen,

Bernhard macht hier echt Lust auf mehr!

Nun werde ich mich endlich mal mit C/C++ beschäftigen müssen.
Mein einziger diesbezüglicher Berührungspunkt war bisher der Arduino, allerdings weiß ich nicht, wie nahe die Arduino-IDE an dem ist, was der Linux-eigene Compiler GCC 'versteht'.
Für Arduino habe ich nämlich in einem Buch eine Routine, um Texte nach gesuchten Informationen zu 'durchpflügen', was dann bei der Senderabfrage an VLC zum tragen kommen würde.

Als erstes werde ich versuchen, ein textbasiertes Frontend für die Konsole zu basteln, um das Radio testen zu können.

Mein 'Bedienkonzept' sieht ja vor, dass ich bei den Nachrüstlösungen die Senderwahl mittels Poti an den Skalenantrieb ankoppeln will.
Die Potiposition wird dann über einen I²C-ADC an den Raspi übertragen.
Ein Poti hat den Vorteil, dass ich nach dem wiedereinschalten eines Gerätes hinreichend genau weiß, wo der Skalenzeiger momentan steht.
Dazu muss ich nur noch beim VLC nachsehen, ob es dort ein Kommando gibt, welches mir z.B. den 5. Sender aus der Playliste spielt.


Grüße und viel Spaß mit Internetradio

Martin
Zitieren
#20
Hallo zusammen,


Zitat:Preisfrage an die angehenden Linuxprogrammierer! Das Pimoroni-Radio hat noch zwei Taster für Lauter und Leiser! Wie muss der Programmcode von gpiod.c erweitert werden damit diese Funktion auch hier gegeben wäre?

Es müssen noch die vlc-Kommandos 'volup[x]' und 'voldown[x]' eingefügt werden.
Dabei steht 'x' in eckiger Klammer für den Wert, um welchen die Lautstärke erhöht bzw. erniedrigt werden soll.
Natürlich dazu noch die Abfrage der betreffenden Tasten.

Also z.B.:
if (val_prg_leiser == 0)

                system("echo \"voldown [10]\" | nc 127.0.0.1 9294 -N");

Tastendefinition für leiser bzw. lauter wie weiter oben im Quellcode beschrieben.


Grüße

Martin
Zitieren


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Ein Internetradio Bausatz von PIMORONI Bernhard45 191 14.642 02.09.2019, 11:19
Letzter Beitrag: Bernhard45
Brick noch ein Internetradio norbert_w 21 1.705 12.03.2019, 21:00
Letzter Beitrag: norbert_w
  DAB+, FM, AM, Internetradio ... eine Bauanleitung Bernhard45 6 955 09.03.2019, 19:58
Letzter Beitrag: vision-eyes
  Metz Baby Internetradio saarfranzose 37 2.575 07.03.2019, 23:31
Letzter Beitrag: Bernhard45
  iTV -Ein minimales Internetfernsehen für alte und neue Raspberrys Bernhard45 14 1.347 07.02.2019, 23:16
Letzter Beitrag: Bernhard45

Gehe zu: