I2C-Kommunikation – gut kommuniziert
Für die I2C-Kommunikation zwischen dem Raspberry Pi und MSP430 wird die WiringPi Library verwendet.
Die WiringPi Library wird über Git heruntergeladen und auf dem Raspberry Pi kompiliert.
sudo apt-get update sudo apt-get upgrade
sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
git pull origin
cd wiringPi
./build
Nach der Installation kann die Library verwendet werden. Es ist darauf zu achten, dass die jeweiligen Header, in unserem Fall
#include <wiringPiI2C.h>
eingebunden und beim Kompilieren die Library gelinkt wird.
gcc foo.c -o foo -l wiringPi
Der RaspberryPi kann mit WiringPi nur als I2C-Master eingesetzt werden. Die I2C GPIOs verwenden integrierte 1,8 kOhm Pull-Up-Widerstände. Pinbelegung und die jeweiligen Bezeichnungen können individuell, je nach Modell, mit
gpio readall
ermittelt werden.

Die SDA.1 und SCL.1 sind die Daten- und Clockleitung der I2C-Schnittstelle des RaspberryPi und haben in der wiringPi Library die GPIO Nummerierung 8 und 9.
Die Steuerung der Sensorik wird durch einen Mikrocontroller MSP430 übernommen. Der RaspberryPi steuert über die I2C-Schnittstelle die Messintervalle des Mikrocontrollers und fragt die Messwerte ab. Die zu übertragenen Datenpackete werden vom MSP430 in folgender Struktur bereitgestellt:
Kontrollbyte | Messwert | ||
6 CRC-Bits | Anzahl der folgenden Bytes pro Messwert (2 Bit) | MSB | LSB |
101010 | 10 | xxxxxxxx | xxxxxxxx |
Die Messwerte der Sensorik benötigen pro Messwert zwischen einem und drei Bytes. Die Packetübertragung startet mit einem Kontrollbyte aus 6 Bit Prüfsumme und 2 Bit, die die Länge des folgenden Messwerts in Bytes angibt. In der oben dargestellten Tabelle ist ein Datenpacketpaar für einen Messwert, bestehend aus zwei Bytes, dargestellt. Nach dem erläuterten Packetformat ist sichergestellt, dass sowohl der RaspberryPi , als auch die Bodenstation nach der Funkübertragung der Messdaten die Vollständigkeit und korrekte Übertragung prüfen kann.
Folgende Funktion prüft das Datenpacket
Prototyp
int i2c_check_data(uint8_t* raw_data);
Parameter
raw_data:
Erwartet einen uint8_t Pointer auf das Array des Datenpackets
Return Value
Bei korrekter Übertragung 0, sonst -1
Quellcode - Data Check I²C
Folgende Funktion rekonstruiert die Messdaten
Prototyp
int i2c_convert_data(uint8_t* raw_data);
Parameter
raw_data:
Erwartet einen uint8_t Pointer auf das Array des Datenpackets
Return Value
Gibt den Pointer auf das Array mit den konvertierten Daten zurück.
Quellcode - Pointer auf konvertierte Daten
Sicherung der Messwerte
SQLite – schlank und effektiv
Die lokale Speicherung der Daten wird mit SQLite erledigt. Umfassende Dokumentationen und Tutorials zur Verwendung mit C erleichtern den Einstieg. Als eine der standard, embedded Datenbanken kommt SQLite schlank und ohne Server daher und lässt sich als einzelne Datei pro Datenbank sehr leicht kopieren und sichern. Beim Einsatz der SQL Querys sind gängige Abfragen, wie
SELECT * FROM `foo`;
einsetzbar. Durch die Single-File Lösung sind jedoch nicht alle gewohnten MySQL-Schlüsselwörter verwendbar. Beispielsweise verfügt SQLite nicht über ‚TRUNCATE TABLE‘, so dass das Leeren einer Tabelle über alternative Wege, wie ‚DELETE‘ und ‚DROP‘ zu lösen ist.
Im konkreten Fall des Stratosphärenballonprojekts werden die Messdaten der Sensorik lokal auf der SD-Karte des RPi gespeichert, um Datenverlust zu vermeiden, falls die Funkübertragung ausfallen würde und in kleineren Intervallen loggen zu können, als per Funk zu senden, um den Energieverbrauch zu reduzieren und gleichzeitig nicht auf eine hohe, zeitliche Auflösung verzichten zu müssen.
Die aktuelle C Library für SQLite3 wird wie folgend installiert:
sudo apt-get install libsqlite3-dev
Eine effektives Konsolenverwaltungsprogramm für SQLite3 kann zusätzlich mit:
sudo apt-get install sqlite3
installiert werden.
Wer beim kompilieren noch an das Linken der Library denkt
gcc foo.c -o foo -l sqlite3
kommt mit dem folgenden, simpel gehaltenem Quellcode aus und loggt fröhlich Messwerte in die Datenbank.
Quellcode - Messdatenlogger