Raspberry Pi als Radioempfänger benutzen (Autoradio, Car PC)

6. Januar 2016
25 Comments

Wer schon mal an einen Car PC gedacht hat, wird sich sicherlich auch mit Radio-Empfang beschäftigt haben. Nun gibt es nicht all zu viele Möglichkeiten den Pi als FM Empfänger zu nutzen, eine ist allerdings das Si4703 Modul, welches hier verwendet wird.

In einem vorherigen Tutorial habe ich bereits gezeigt, wie man den Raspberry Pi ohne weiteres als Radiosender benutzen kann. In diesem Teil soll es darum gehen, wie man Funkfrequenzen empfangen und wiedergeben kann.

 

Zubehör

Um dein Raspberry Pi als Radioempfänger zu nutzen, brauchst du folgendes:

 

 

Aufbau

Der Anschluss des Si470x Moduls ist wie folgt:

si4703_Steckplatine

Raspberry Pi SI470x
3.3V (Pin 1) 3.3V
GND (Pin 6) GND
SDA (Pin 3) SDIO
SCL (Pin 5) SCLK
GPIO23 (Pin 16) RST

Auf dem schematischen Bild habe ich GND an Raspberry Pi Pin 25 angeschlossen, was auch ein Masse Anschluss ist.

 

Vorbereitung

(Damit die Software kompiliert werden kann, muss wiringPi installiert sein. Falls du das noch nicht getan hast, kannst du hier nachlesen wie das geht)

Als erstes aktivieren wir SPI und I2C. Falls du das bereits in einem vorherigen Tutorial gemacht hast, kannst du diesen Schritt überspringen.

sudo raspi-config

Unter “Interfacing Options” gibt es den Eintrag “I2C”, welchen wir aktivieren. Bei älteren Raspbian Versionen müssen die Einträge in der Datei /etc/modprobe.d/raspi-blacklist.conf auskommentiert (mit #) werden.

Anschließend bearbeiten wir die modules-Datei:

sudo nano /etc/modules

Am Ende der Datei fügen wir noch folgende zwei Zeilen ein:

Zuletzt installieren wir noch die benötigten Tools, falls sie noch nicht vorhanden sind.

sudo apt-get update
sudo apt-get install i2c-tools

 

 

Software

 

git clone https://github.com/achilikin/RdSpi && cd RdSpi

Anschließend kompilieren wir:

make

Bevor wir aber starten, muss das Modul über I2C erst aktiviert werden. Dazu erstellen wir ein weiteres Skript in diesem Ordner:

sudo nano i2c-init.c

Nach dem Speichern (STRG+O, STRG+X) kompilieren wir es.

gcc -o i2c-init i2c-init.c -lwiringPi

 

Dieses Skript initialisiert das Modul, sodass es verwendet werden kann (es muss nach jedem Neustart muss neu initialisiert werden, es würde also Sinn machen das Programm in den Autostart zu setzen).

sudo ./i2c-init

Um zu testen, ob es erkannt wurde, kannst du i2cdetect -y 1 eingeben, was eine solche Ausgabe erzeugen sollte:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: 10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

 

 

Test

Nachdem das Modul initialisiert wurde, können wir über das Aux Kabel unsere Lautsprecher / Kopfhörer verbinden (welche als Antenne dienen) und nach Sendern suchen.

Zu erst müssen wir dafür den Empfänger resetten:

sudo ./rdspi reset

Eine Frequenz einstellen und die Lautstärke (0-30) kannst du folgendermaßen:

sudo ./rdspi tune 95.00
sudo ./rdspi volume 10

Alle weiteren Befehle kannst du auf der Github Projektseite einsehen.

 

 

PS: Wenn du die kompilierten Dateien direkt und ohne ./ aufrufen willst, kannst du folgende Rechte verteilen:

chmod +x i2c-init
chmod +x rdspi

Dann muss nur noch die Pfadvariable ergänzt und eine Verknüpfung angelegt werden (den Pfad des aktuellen Verzeichnisses bekommst du mit pwd):

export PATH=$PATH:/home/pi/RdiSpi
cd /usr/bin
sudo ln -s /home/pi/RdSpi/i2c-init i2c-init
sudo ln -s /home/pi/RdSpi/rdspi rdspi

Im Anschluss solltest du von überall den Befehl aufrufen können.

25 Kommentare

  1. Hallo, vielen Dank für das tolle Tutorial! Ich würde jedoch gern den Klinkenausgang des Raspis zum Übertragen des Audiosignals nutzen. Ist das auch möglich? Also, ein Aux-Kabel am Si4703 als Antenne und eine weiteres am Raspi, um das Radio-Audiosignal weiterzugeben?

    Antworten
      • Hi,
        ich denke AlMudy will das Audio Signal von der Karte nicht über die Kopfhörer/Antennen-Klinke des SI470x ausgeben sondern über den Audio-Ausgang (Klinke und/oder HDMI) des Raspi.

        Dazu muss doch wohl erstmal aus dem Audio-Signal der FmKarte ein digitaler stream gemacht werden, dieser in den Raspi gelangen, um dann von dort ausgegeben zu werden.

        Wenn ich mir das Blockdiagram SI4703 ansehe, sehe ich gar keine Möglichkeit die Audiodaten in dem Pi zu bekommen.
        Dazu bedarf es weiterer Hardware.

  2. Hallo, mein Ausgang sieht anders aus.:

    pi@raspberrypi:~/RdSpi $ i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: — — — — — — — — — — — — —
    10: — — — — — — — — — — — — — — — —
    20: — — — — — — — — — — — — — — — —
    30: — — — — — — — — — — — UU — — — —
    40: — — — — — — — — — — — — — — — —
    50: — — — — — — — — — — — — — — — —
    60: — — — — — — — — — — — — — — — —
    70: — — — — — — — —

    pi@raspberrypi:~/RdSpi $ sudo ./rdspi reset
    Unable to read Si4703!
    Communication error

    was muss ich machen?

    Antworten
    • Aus der Dokumentation:
      „UU“. Probing was skipped, because this address is currently in use by a driver. This strongly suggests that there is a chip at this address.
      Scheint also, dass du schon ein I2C Gerät mit der Adresse benutzt.

      Antworten
  3. Hallo Felix,
    also das „UU“ war von der Wolfson Audio Card gekommen. Das gerät wird nun von I2C erkannt. Dennoch bekomme ich bei der Eingabe von sudo ./rdspi reset den gleichen fehler…

    pi@raspberrypi:~/RdSpi $ sudo ./i2c-init
    pi@raspberrypi:~/RdSpi $ i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: — — — — — — — — — — — — —
    10: 10 — — — — — — — — — — — — — — —
    20: — — — — — — — — — — — — — — — —
    30: — — — — — — — — — — — — — — — —
    40: — — — — — — — — — — — — — — — —
    50: — — — — — — — — — — — — — — — —
    60: — — — — — — — — — — — — — — — —
    70: — — — — — — — —
    pi@raspberrypi:~/RdSpi $ sudo ./rdspi reset
    Unable to read Si4703!
    Communication error
    Antworten
    • Nunja der Fehler besagt nur, dass dein Modul nicht erkannt wurde. Solange i2cdetect es nicht erkennt, wird das nicht funktionieren und das kann verschiedene Grüne haben… 🙁

      Antworten
  4. Hallo Felix,

    ich benutze einen Pi 3 Model B V1.2. Ich habe es alles soweit gemacht, wie von Dir beschrieben. Der Chip wird auch mit dem i2cdetect -y 1 erkannt:
    root@raspberrypi:/home/pi/wiringPi/RdSpi# i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: — — — — — — — — — — — — —
    10: 10 — — — — — — — — — — — — — — —
    20: — — — — — — — — — — — — — — — —
    30: — — — — — — — — — — — — — — — —
    40: — — — — — — — — — — — — — — — —
    50: — — — — — — — — — — — — — — — —
    60: — — — — — — — — — — — — — — — —
    70: — — — — — — — —

    Versuche ich nun den Chip mit „./rdspi reset“zurückzusetzten, bekomme ich die folgende Fehlermeldung.
    root@raspberrypi:/home/pi/wiringPi/RdSpi# ./rdspi reset
    Unable to read Si4703!
    Communication error

    Weißt Du woran es liegen kann bzw. wo ich ansetzen könnte?

    Danke vorab

    Antworten
  5. ich dieses problem.
    pi@raspberrypi:~/wiringPi $ i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: — — — — — — — — — — — — —
    10: 10 — — — — — — — — — — — — — — —
    20: — — — — — — — — — — — — — — — —
    30: — — — — — — — — — — — — — — — —
    40: — — — — — — — — — — — — — — — —
    50: — — — — — — — — — — — — — — — —
    60: — — — — — — — — — — — — — — — —
    70: — — — — — — — —
    pi@raspberrypi:~/wiringPi $ sudo ./rdspi reset
    sudo: ./rdspi: command not found

    und wie tut man fmsi4703 Dieses Skript in das Programm in den Autostart zu setzen?

    Antworten
    • Du hast hier gleich zwei Probleme: Zum einen wird das Modul gar nicht erkannt (Verkabelung überprüfen) und zum zweiten bist du wohl im falschen Ordner (ls zum anzeigen der Dateien darin).

      Antworten
  6. hallo Felix
    ok. das modul si4703 ist wie hier beschrieben am raspberry pi2 b an geschlossen.
    habe jetzt das problem.

    pi@raspberrypi:~/wiringPi/RdSpi $ i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: — — — — — — — — — — — — —
    10: 10 — — — — — — — — — — — — — — —
    20: — — — — — — — — — — — — — — — —
    30: — — — — — — — — — — — — — — — —
    40: — — — — — — — — — — — — — — — —
    50: — — — — — — — — — — — — — — — —
    60: — — — — — — — — — — — — — — — —
    70: — — — — — — — —
    pi@raspberrypi:~/wiringPi/RdSpi $ sudo ./rdspi reset
    Unable to read Si4703!
    Communication error
    pi@raspberrypi:~/wiringPi/RdSpi $

    änder ich inder zeile die werte. 0 auf 2
    /* i2c-init.c */
    #include

    int main() {
    int resetPin = 23; // GPIO23
    int sdaPin = 2; // GPIO2
    dan zeigt es das an
    pi@raspberrypi:~/wiringPi/RdSpi $ i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
    10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
    20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
    30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
    40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
    50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
    60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
    70: 70 71 72 73 74 75 76 77

    Antworten
  7. guten tag
    sind die WiringPi an gegeben, ist das so ok?

    /* i2c-init.c */
    #include 
     
    int main() {
        int resetPin = 4; // GPIO23
        int sdaPin = 8; // GPIO2
     
        /* Setup GPIO access in BCM mode */
        wiringPiSetupGpio();
     
        /* Set pins as output */
        pinMode(resetPin, OUTPUT);
        pinMode(sdaPin, OUTPUT);
     
        /* A low SDA indicates a 2-wire interface */
        digitalWrite(sdaPin, LOW);
        /* Put chip into reset */
        digitalWrite(resetPin, LOW);
        /* 1ms delay to allow pins to settle */
        delay(1);
        /* Bring chip out of reset with SDIO set low
        and SEN pulled high (with pull-up resistor) */
        digitalWrite(resetPin, HIGH);
     
        return 0;
    }
    Antworten
  8. oder muss es so aus sehen?

    /* i2c-init.c */
    #include

    int main() {
    int resetPin = 4; // GPIO4
    int sdaPin = 8; // GPIO8

    /* Setup GPIO access in BCM mode */
    wiringPiSetupGpio();

    /* Set pins as output */

    oder

    /* i2c-init.c */
    #include

    int main() {
    int resetPin = 4; // WPIO4
    int sdaPin = 8; // WPIO8

    /* Setup GPIO access in BCM mode */
    wiringPiSetupGpio();

    /* Set pins as output */

    Antworten
  9. Hallo,

    beim Kompilieren des i2c-init Skripts (gcc…) bekomme ich einen Fehler

    undefined reference to `main`

    i2cdetect liefert somit auch keine Erkennung.

    Ich benutze eine RPi 3 mit Raspi Pixel

    Antworten
  10. habe immer noch das mit den fm modul si4703
    pi@raspberrypi:~/wiringPi/RdSpi $ i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: — — — — — — — — — — — — —
    10: 10 — — — — — — — — — — — — — — —
    20: — — — — — — — — — — — — — — — —
    30: — — — — — — — — — — — — — — — —
    40: — — — — — — — — — — — — — — — —
    50: — — — — — — — — — — — — — — — —
    60: — — — — — — — — — — — — — — — —
    70: — — — — — — — —
    pi@raspberrypi:~/wiringPi/RdSpi $ sudo ./rdspi reset
    Unable to read Si4703!
    Communication error
    pi@raspberrypi:~/wiringPi/RdSpi $

    habe das si4703 modul am arduino uno getestet und es ging.

    wer kann mir helfen?

    Antworten
  11. Hallo,
    wenn man das i2c-init-Skript benutzt, dann sorgt das dafür, dass die SDA/SCL-Leitungen nur noch als „normale“ I/O-Ports konfiguriert werden. Man muss die Ports also nachher wieder als SDA/SCL konfigurieren. Außerdem sind die Delays zu kurz.
    Werft mal einen Blick in
    https://github.com/bboyandru/carpc-controller
    bzw. dort in die si4703.cpp. Die Funktion si_power() macht, was sie soll.
    Die SW drumherum muss man sich dann antürlich selbst bauen, außer man benutzt Kodi 😉

    Antworten
  12. Hallo zusammen,

    wie auch der Sven habe ich das Problem, dass die Kommunikation mit dem Si4703 nicht funktioniert. Ich erhalte dieselbe Fehlermeldung. Übrigens nutze ich auch einen Pi 3.

    pi@raspberrypi:~/wiringPi/RdSpi $ i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: — — — — — — — — — — — — —
    10: 10 — — — — — — — — — — — — — — —
    20: — — — — — — — — — — — — — — — —
    30: — — — — — — — — — — — — — — — —
    40: — — — — — — — — — — — — — — — —
    50: — — — — — — — — — — — — — — — —
    60: — — — — — — — — — — — — — — — —
    70: — — — — — — — —
    pi@raspberrypi:~/wiringPi/RdSpi $ sudo ./rdspi reset
    Unable to read Si4703!
    Communication error

    Hat jemand von Euch zwischenzeitlich eine Lösung gefunden?

    Viele Grüße und Danke im Voraus,
    Marcus

    Antworten
  13. Da sich einige raspberry Pi3 wundern, dass nichts geht, sprich Communication error … angezeigt wird (und hier die Antwort nicht wirklich gegeben wurde) hier eine Info, welche ggf. zum Erfolg führt.
    Verkabelung ändern: si470x-RST auf GPIO4 (natürlich muss auch i2c-init entsprechend geändert werden), si470x-GPIO1 auf GPIO25 (zusätzlich) verbinden.
    Viel Glück

    Antworten
    • Hallo kwyn,

      genau dein beschriebenes Problem habe ich.

      Es wäre nett, wenn du die Lösung etwas ausführlicher erklären könntest.

      Ich bin leider Anfänger und vielen Anderen hier geht es bestimmt ähnlich.

      Was muss z.B. bei der i2c-init geändert werden?

      Antworten
  14. Hallo,
    nach dem Lesen aller Kommentare, bin ich reichlich verwirrt.
    @Felix – du schreibst in der i2c-init folgendes:

    int resetPin = 23; // GPIO23
    int sdaPin = 0; // GPIO0
    /* Setup GPIO access in BCM mode */
    wiringPiSetupGpio();

    Welches ist der sdaPin0 ?
    du setzt mit “ wiringPiSetupGpio();“ den Adressmodus für die GPIOs auf das wiringPi pin numbering scheme. Das passt aber nicht mit den Wertzuweisungen an resetPin und sdaPin zusammen.
    Da du in deinem fritzing aber eine Belegung vorgibst, haben viele angefangen die Werte für resetPin und sdaPin zu verändern.

    Das Ergebnis kann man oben bewundern!
    So sieht meine i2c-init aus:
    /* i2c-init.c */
    #include

    int main() {
    int resetPin = 7; // GPIO07
    int sdaPin = 8; // GPIO08

    /* Setup GPIO access in BCM mode */
    wiringPiSetupGpio();

    /* Set pins as output */
    pinMode(resetPin, OUTPUT);
    pinMode(sdaPin, OUTPUT);

    /* A low SDA indicates a 2-wire interface */
    digitalWrite(sdaPin, LOW);
    /* Put chip into reset */
    digitalWrite(resetPin, LOW);
    /* 1ms delay to allow pins to settle */
    delay(1);
    /* Bring chip out of reset with SDIO set low
    and SEN pulled high (with pull-up resistor) */
    digitalWrite(resetPin, HIGH);

    return 0;
    }
    Dieses Script bezieht sich auf meine Verkabelung:
    3.3V (Pin 1) 3.3V
    GND (Pin 6) GND
    SDA/GPIO8 (Pin 3) SDIO
    SCL/GPIO9 (Pin 5) SCLK
    GPIO7 (Pin 7) RST

    Damit komme ich bei „sudo ./rdspi reset“ schon mal ohne Communication-Error weiter.

    @kwyn
    welchen Grund gibt es für deinen Vorschlag GPIO1 des SI470x Bords mit BMC-GPIO25 Stift22 des Pi zu verbinden?

    Antworten
  15. Hallo
    zur Lösung des Fehlers

    pi@raspberrypi:~/wiringPi/RdSpi $ sudo ./rdspi reset
    Unable to read Si4703!
    Communication error

    habe ich an den RST Anschluß GPIO23 (Pin 16) einen PullUp Widerstand (4,7kOhm an + 3,3V) angeschlossen. Danach funktionierte alles.

    Kann auch hier unter README.md nachgelesen werden.
    https://github.com/achilikin/RdSpi

    Gruß Jürgen

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Raspberry Pi Tutorials, um kein Tutorial mehr zu verpassen!