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:
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:
1 2 |
i2c-bcm2708 i2c-dev |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/* i2c-init.c */ #include <wiringPi.h> int main() { int resetPin = 23; // GPIO23 int sdaPin = 0; // GPIO0 /* 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; } |
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-initi2c-init
sudo ln -s /home/pi/RdSpi/rdspi rdspi
Im Anschluss solltest du von überall den Befehl aufrufen können.
33 Kommentare
cool was man alles machen kann!!
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?
Du kannst mal schauen, ob es mit amixer bzw. der raspi-config möglich ist:
https://www.raspberrypi.org/documentation/configuration/audio-config.md
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.
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?
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.
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…
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… 🙁
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
Hallo Johannes,
ich hatte das Tutorial damals auf einem Raspberry Pi 2 erstellt und kann dir daher auf die Schnelle keinen Rat geben. Du könntest allerdings mal beim Entwickler direkt fragen: https://github.com/achilikin/RdSpi/issues
LG, Felix
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?
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).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
Du musst die WiringPi Pin Belegung nehmen, nicht die normale GPIO Belegung
guten tag
sind die WiringPi an gegeben, ist das so ok?
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 */
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
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?
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 😉
Kennst du ein KODi Plugin für den SI4703?
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
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
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?
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?
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
Ahoi,
hatte auch den Communication Error. Was dann half war, alle Befehle nach der i2c-init OHNE „sudo“ auszuführen!
Grüße!
Hello again,
die Antwort auf den Communication Error findet sich wohl hier: https://github.com/achilikin/RdSpi/issues/4
Hab’s gerade ausprobiert, Zeile 97 auskommentiert und nochmal kompiliert.
Funktioniert genau wie es soll. 🙂 Auf RPI2 und RPI3.
Grüße!
Wird es von dir auch noch ein tutorial über ein car pi geben?
Ist ein Thema, das mich interessiert, aber kann ich im Moment nicht versprechen…
Ich habe folgendes Problem:
bei „sudo ./rdspi reset“ meldet er das er nicht mit dem SI4703 Board kommunizieren kann. (Wie bei vielen auch)
allerdings gibt bei mir „i2cdetect -y 1“ folgendes ausgegeben:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —
Im Beispiel steht dort ja eine 10. Dementsprechend würde ich vermuten das mein Radio Chip nicht erkannt wird.
Deshalb habe ich mir das Messgerät genommen um zu messen ob Strom am Chip anliegt. Das Ergebnis war das 3.3V zwischen VCC und GND liegen allerdings zwischen VCC und den anderen Ports eher so Beträge zwischen 0.7V und 1.5V. Hat jemand eine Idee woran es liegen könnte?
Schon weiter mit dem Problem? Habe das Selbe.
mfG
Hallo liebe Leute .
Warum in aller Welt kann man das Radio nach vorgegebenen Programm nicht zum Laufen bringen. Ich habe alle möglichen Versuche unternommen.
Da wird ein Programm angeboten und es funktioniert nicht.
Was sagt der Entwickler dazu?
Es grüsst Old George