i2c mit Raspberry

Hallo,

ich versuche seit zwei Tagen eine funktionierende i2c Komunikation
zwischen einen Raspberry und einen Arduino UNO zum Laufen zu bringen.

Die Beispiele mit der LED an und aus funktionieren bei mir schon.

Ab ich brauche was mit dem ich echte Messwerte zum Raspberry übertragen kann.

Hat jemand so was am laufen, nicht nur theoretisch oder als Link (hab ich bestimmt schon alle durch).

Dann zeig mal, was du auf beiden Seiten gemacht hast

hi,

was macht der raspberry genau? seine funktion. sag’ es einfach, ohne zu fragen: was hat das damit zu tun?

gruß stefan

Hallo sschultewolter, hallo Eisbaer,

meine Frage war.

“Hat jemand so was am laufen?”

Aber bitte hier ist die letzte Version meiner Versuche.

/******************************************************************
 Created with PROGRAMINO IDE for Arduino - 10.10.2016 21:09:11
 Project     :
 Libraries   :
 Author      :
 Description :
******************************************************************/
#include <Wire.h>

#define SLAVE_ADDRESS 0x04
int number = 0;
int dataindex = 0;
char daten[8] = {23, 51, 88, 127, 128, 180, 221, 230};

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(receiveEvent);
    Wire.onRequest(sendData);

    Serial.println("Ready!");
}

void loop() 
{
    delay(100);
}

void receiveEvent(int howMany) {
  while (Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
    index = 0;
  }
  index++;
  Serial.println("empfangen");         // print the integer
}

// callback for sending data
void sendData()
{
    Wire.write(daten[index]);
    Serial.print(index);
    Serial.print("--");
    Serial.print(daten[index]);
    Serial.println(" senden");
}

Python auf dem Raspberry:

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

while True:    
    vTimeDate = time.localtime()
    data = [vTimeDate[0]-2000, vTimeDate[1], vTimeDate[2], vTimeDate[3], vTimeDate[4], vTimeDate[5]]
    try:
        bus.write_i2c_block_data(address,0,data)
    except IOError:
        print("Schreibfehler ")
        time.sleep(1)
    print ("Nachricht an Aduino ", data)
    time.sleep(1)
    x = 0
    while x <= 7: 
        dataread = bus.read_byte_data(address,0)
        print(dataread)
        x += 1

Ausgabe vom Terminal am Arduino:
8empfangen
empfangen Die empfangenen Daten kann man in der ASCII-Einstellung nicht lesen
1–3 senden werden aber korrekt empfangen
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden

:empfangen
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden
empfangen
1–3 senden

und von der Python Shell:
Nachricht an Aduino [16, 10, 13, 9, 13, 31]
51
51
51
51
51
51
51
51
Nachricht an Aduino [16, 10, 13, 9, 13, 32]
51
51
51
51
51
51
51
51
Nachricht an Aduino [16, 10, 13, 9, 13, 33]

hi,

leider. python. deshalb meine frage.

ich hab' einen webserver(node.js) auf dem raspberry laufen, dort funkt die I2C-kommunikation problemlos. aber eben nicht mit python, sondern javascript.

hast Du dran gedacht, in der systemsteuerung des raspi bei schnittstellen I2C zu aktivieren/deaktivieren? probier' beides, ich weiß jetzt nicht auswendig, was nötig ist. neustart nach der änderung ist klar...

gruß stefan

Hallo Stefan,
I2C aktivieren/deaktivieren bzw. umgekehrt hat nichts gebracht.

Das mit Java hört sich gut an.
Hast du da ein Beispiel (evt. auch die RP-Konfiguration wenn nötig).
Ich habe mit Java bis jetzt noch nicht gearbeitet.

Gruß Sepp

ar182:
meine Frage war.

"Hat jemand so was am laufen?"

Sollte es Dich möglicherweise dennoch interessieren, so vermute ich an dieser Stelle einen Fehler:

    index = 0;
  }
  index++;

Das Ergebnis ist immer index=1, weshalb auch daten[1]=51 gesendet wird. Wobei 51="3" ist.

hi,

agmue scheint Dein problem gelöst zu haben.

bei mir ist's nicht java, sondern javascript, hat nix miteinander zu tun. falls es Dich interessiert, ich hab' eine kleine doku dazu geschrieben.

http://playground.arduino.cc/PmWiki/Haustechnik-Eisebaer

ist mit serieller verbindung, aber ich hab' vorher mit I2C getestet und es hat funktioniert.

gruß stefan

Hallo,
jetzt geht’s.

Aber das ist doch nicht normal,dass ich den Index für sendData in receiveEvent hoch zähle.

Normalerweise müsste das so gehen.

Wire.write(daten,8); // 8 ist die Anzahl der Array-Elemente

Es wird aber 8 mal das erste Element übertragen.

#include <Wire.h>

#define SLAVE_ADDRESS 0x04
int number = 0;
int dataindex = 0;
char daten[8] = {23, 51, 88, 127, 128, 180, 221, 230};
int index = -2;

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(receiveEvent);
    Wire.onRequest(sendData);

    Serial.println("Ready!");
}

void loop() 
{
    delay(100);
}

void receiveEvent(int howMany) {
  while (Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  index++;
  Serial.println("empfangen");         // print the integer
}

// callback for sending data
void sendData()
{
    if (index > 7){
        index = 0;
    }
    Wire.write(daten[index]);
    Serial.print(index);
    Serial.print("--");
    Serial.print(daten[index]);
    Serial.println(" senden");
    
}

Hallo,
jetzt geht es!

Man nehme Python 2.7.9

und die Lib smbus2 smbus2 · PyPI

Die gesendeten und Empfangene Bytes müssen uint8_t sein.