Eine einfache aber effektive Möglichkeit zwei Geräte, wie das Raspberry Pi und einen Arduino (ATmega), zu verbinden bietet das I2C (TWI). Dies ist ein so genanntes Two-Wire-Interface (TWI), welches seriell Daten überträgt.
Vorbereiten des Rasperry Pi’s zur komunikation per I2C
Im machen Rasperry Pi Linux Distributionen werden bestimmte Kernel-Module unterdrück um möglichst viele Ressourcen zur Verfügung zu haben. Im ersten schritt sollte man deshalb prüfen ob i2c-bcm2708 und spi-bcm2708 nicht blockiert sind. In Distributionenwie z.B. Raspbmc ist die raspi-blacklist.conf nicht zu finden, hier gibt es evtl andere blacklist-Dateien! Ein durchsuchen der „/etc/modprobe.d“ kann also nicht schaden!
$ cat /etc/modprobe.d/raspi-blacklist.conf # Hier sollte das # vor beiden Argumenten hinzugefügt werden #blacklist spi-bcm2708 #blacklist i2c-bcm2708
Als nächstes das Modul hinzufügen ( Neustadt erforderlich! )
# An das Ende von /etc/modules einfügen i2c-dev
Das Paket mit I2C-Tools installieren
$ sudo apt-get install i2c-tools
Nach einem Neustart sollte nun das I2C-Interface verfügbar sein
# Prüfen per Ausgabe: pi@raspberrypi ~ $ ls /dev/i2c* crw-rw---T 1 root i2c 89, 0 May 25 11:56 /dev/i2c-0 crw-rw---T 1 root i2c 89, 1 May 25 11:56 /dev/i2c-1
Nun kann ein Scan nach möglichen Geräten am I2C-Bus erflogen ( beim Rasperry Pi Rev 1 sollte „i2cdetect -y 0“ benutzt werden).
pi@raspberrypi ~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Für den weiteren Aufbau der Programme sollte auf dem Raspberry Pi die I2C-Zusatzpakete für Python installiert werden.
sudo apt-get install python-smbus
Arduino als I2C-Slave vorbereiten
#include <Wire.h>
#define SLAVE_ADDRESS 0x04
int number = 0;
int state = 0;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600); // start serial for output
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);
// define callbacks for i2c communication
Wire.onReceive(receiveData);
Wire.onRequest(sendData);
Serial.println("Ready!");
}
void loop() {
delay(100);
}
// callback for received data
void receiveData(int byteCount){
while(Wire.available()) {
number = Wire.read();
Serial.print("data received: ");
Serial.println(number);
if (number == 1){
if (state == 0){
digitalWrite(13, HIGH); // set the LED on
state = 1;
}
else{
digitalWrite(13, LOW); // set the LED off
state = 0;
}
}
}
}
// callback for sending data
void sendData(){
Wire.write(number);
}
Raspberry Pi’s als Master konfigurieren
Nun muss das Raspberry Pi als Master fungieren, dafür muss ein neuer Pyhton-Script angelegt werden, dieser muss dann ausführbar gemacht werde („chmod +x“).
import smbus
import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)
# This is the address we setup in the Arduino Program
address = 0x04
def writeNumber(value):
bus.write_byte(address, value)
# bus.write_byte_data(address, 0, value)
return -1
def readNumber():
number = bus.read_byte(address)
# number = bus.read_byte_data(address, 1)
return number
while True:
var = input("Enter 1 - 9: ")
if not var:
continue
writeNumber(var)
print "RPI: Hi Arduino, I sent you ", var
# sleep one second
time.sleep(1)
number = readNumber()
print "Arduino: Hey RPI, I received a digit ", number
print
Raspberry Pi mit dem Arduino verbinden
RPI Arduino ------------------------- GPIO 0 (SDA) <--> Pin 4 (SDA) (Analog 4) GPIO 1 (SCL) <--> Pin 5 (SCL) (Analog 5) Masse <--> Masse
Kommunikation zwischen beiden herstellen
Artikel im Aufbau
Quellen:
[1] = http://blog.oscarliang.net/raspberry-pi-arduino-connected-i2c/

Schreibe einen Kommentar