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

7. April 2017
3160 Views
20 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 PiSI470x
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 “8. Advanced Options” gibt es den Eintrag “A7 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.

20 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
  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

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!