1. Übersicht
Die Idee ist eine modulare Plattform zu haben, welche nach und nach beliebig erweitert werden kann. Die Basis bilden der Raspberry Pi und der von diesem gesteuerte FM-Tuner Si4703. Normalerweise hat ein Autoradio z.B. an der Front ein Display eingelassen. Dieses Konzept erlaubt mir aber auch ein Smartphone oder Tablet als Display zu nutzen. Unterstützung für GPS, Bluetooth, WiFi, etc. lassen sich vergleichsweise einfach nachrüsten. Der RPi kann auch auf beliebige Arten online gehen, womit sich dann unter anderem Verkehrs- und Wetterdaten abrufen lassen. Interessant ist auch die Anbindung des Fahrzeugdiagnosesystems (OBD). Desweiteren ist auch eine Musiksammlung, gespeichert auf einem internen Massenspeicher, fest eingeplant. Diese soll sich mit einem passenden Endgerät (Smartphone, Laptop, etc.) synchronisieren lassen.
Raspberry Pi Rev.2 (www.raspberrypi.org) |
Zunächst einmal braucht man ein Gehäuse, in diesem Fall ein leeres ISO 7736 Gehäuse ohne Frontabdeckung, jedoch mit rückseitiger Anschlussleiste. Das Herzstück ist ein Raspberry Pi (Modell B, 512 MB) mit Raspbian "Wheezy" an dem das FM-Tuner Board Si4703 von SparkFun (Silicon Labs) angeschlossen ist.
FM-Tuner Board Si4703 (www.sparkfun.com) |
Einen DC/DC-Wandler um aus der 12V Boardspannung 3.3V und 5V für Tuner und RPi zu erzeugen. Weiters wird auch ein Leistungsverstärker für das Audiosignal vom Tuner zu den Lautsprechern benötigt. Die Frontabdeckung wird wohl eine besondere Herausforderung werden, da ich diese mittels 3D-Druck erstellen möchte.
Der erste Schwerpunkt wird die Ansteuerung des FM-Tuners sein.
2. Ansteuerung des FM-Tuners
Laut Datenblatt kann man mit dem Chip via 2-Wire und 3-Wire kommunizieren. Wir verwenden 2-Wire, was im Prinzip I²C ist.
Unter Raspbian muss man zunächst das I²C-Subsystem zum laufen bringen. Dafür wird zunächst folgender Befehl ausgeführt:
sudo nano /etc/modulesAnschließend fügt man folgende zwei Zeilen hinzu:
i2c-bcm2708 i2c-devDamit werden beide Module beim Booten automatisch geladen.
sudo modprobe i2c-bcm2708 sudo modprobe i2c-dev sudo apt-get install i2c-toolsNun werden die Module sofort geladen und der wichtige Befehl i2cdetect installiert.
Wenn man sich ein wenig mit I²C beschäftigt fliegen einem ein paar weitere Begriffe wie 2-Wire/TWI und SMBus um die Ohren. I²C, TWI (Two Wire Interface) und SMBus (Service Message Bus) sind 2-Draht-Protokolle, welche untereinander weitgehend, für Taktfrequenzen bis 100 kHz, kompatibel sind.
Der FM-Tuner muss zuerst auf 2-Wire initialisiert werden, damit wir mit ihm sprechen können. Dies lässt sich einfach via GPIO bit-banging realisieren, und müssen dabei auch nicht schnell sein. Die Installation von wiringPi wird hier beschrieben.
/* 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; }Die Datei i2c-init.c wird nun kompiliert und ausgeführt:
gcc -o i2c-init i2c-init.c -lwiringPi sudo ./i2c-initDie Ausgabe von i2cdetect muss nun wie folgt aussehen:
$ 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: -- -- -- -- -- -- -- --Der Wert 0x10 stellt die Adresse des FM-Tuners dar und kann nicht geändert werden. Wir können ab jetzt auf die Register zugreifen, also den Chip steuern.
Ich habe dafür die Arduino Bibliothek von SparkFun für den RPi portiert, siehe hier.
Lässt man das Testprogramm "Radio" laufen, so sollte man in ausgezeichneter Qualität den Radiosender FM4 (104,0 Mhz) empfangen können =)
Welche 2-Wire-Funktionen der Chip wirklich unterstützt verrät uns folgender Befehl:
$ i2cdetect -F -y 1 Functionalities implemented by /dev/i2c-1: I2C yes SMBus Quick Command yes SMBus Send Byte yes SMBus Receive Byte yes SMBus Write Byte yes SMBus Read Byte yes SMBus Write Word yes SMBus Read Word yes SMBus Process Call yes SMBus Block Write yes SMBus Block Read no SMBus Block Process Call no SMBus PEC yes I2C Block Write yes I2C Block Read yesDies ist nur interessant, falls man selber Funktionen zum Zugriff auf die Register schreiben möchte.
to be continued ...
4 Kommentare:
Hallo :)
Ich finde das Projekt super. Hast du schon weiter gemacht oder liegt es auf Eis?
LG
Angelo
Hallo Angelo,
ich denke ich werde erst wieder im August/September damit weitermachen können, da mir mein Studium bis dahin wohl keine Zeit dafür lässt.
lg, Christoph
Würde mich interessieren ob das Projekt noch weiter geht? Denn ich finde es sehr interessant und leider findet man wenig dazu im Netz
pi@raspberrypi:~$ sudo 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
Hi, I followed your step, but I got the different result like that above.
Have you met this problem and how you solved it?
Kommentar veröffentlichen