# Allgemein, Technik

Raspberry Pi mit einem Arduino per I2C verbinden

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.

 

Arduino_I2C_Raspberry_PI

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

Arduino_I2C_Raspberry_PI

 

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/