web-dev-qa-db-ja.com

I2CでRaspberryPiを使用してArduinoからデータを読み取る方法

python smbusモジュールを使用してArduinoUNOからRaspberryPiにデータを読み取ろうとしています。smbusモジュールで見つけた唯一のドキュメントは ここ です。私はモジュール内でcmdが何を意味するのかわからない。書き込みを使用してArduinoにデータを送信できます。読み取り用と書き込み用の2つの簡単なプログラムを作成しました。

書き込み用のもの

import smbus
b = smbus.SMBus(0)
while (0==0):
    var = input("Value to Write:")
    b.write_byte_data(0x10,0x00,int(var))

読むためのもの

import smbus
bus = smbus.SMBus(0)
var = bus.read_byte_data(0x10,0x00)
print(var)

Arduinoコードは

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(8,9,4,5,6,7);

int a = 7;

void setup() 
{ 
  Serial.begin(9600);
  lcd.begin(16,2);
  // define slave address (0x2A = 42)
  #define SLAVE_ADDRESS 0x10

  // initialize i2c as slave
  Wire.begin(SLAVE_ADDRESS);

  // define callbacks for i2c communication
  Wire.onReceive(receiveData);
  Wire.onRequest(sendData); 
}
void loop(){
}

// callback for received data
void receiveData(int byteCount) 
{
 Serial.println(byteCount);
  for (int i=0;i <= byteCount;i++){
  char c = Wire.read();
  Serial.println(c);
 }
}

// callback for sending data
void sendData()
{ 
  Wire.write(67);
  lcd.println("Send Data");
}

読み取りプログラムを実行すると、毎回「33」が返されます。 Arduinoは、sendData関数が呼び出されたことを返します。

Data Level Shifter を使用していますが、説明が少し遅いかもしれません。

誰かがこれを機能させましたか?

10
TheGreenToaster

ArduinoとRaspberryPiの間の通信を開始することができました。 2つは2つの5kプルアップ抵抗を使用して接続されます(これを参照 ページ )。 arduinoは、リクエストごとにi2cバスにバイトを書き込みます。 Raspberry Piでは、helloが毎秒出力されます。

Arduinoコード:

#include <Wire.h>
#define SLAVE_ADDRESS 0x2A

void setup() {
    // initialize i2c as slave
    Wire.begin(SLAVE_ADDRESS);
    Wire.onRequest(sendData); 
}

void loop() {
}

char data[] = "hello";
int index = 0;

// callback for sending data
void sendData() { 
    Wire.write(data[index]);
    ++index;
    if (index >= 5) {
         index = 0;
    }
 }

Raspberry PiのPythonコード:

#!/usr/bin/python

import smbus
import time
bus = smbus.SMBus(1)
address = 0x2a

while True:
    data = ""
    for i in range(0, 5):
            data += chr(bus.read_byte(address));
    print data
    time.sleep(1);

私のRaspberryPiでは、i2cバスは1です。コマンドi2c-detect -y 0またはi2c-detect -y 1を使用して、RaspberryPiがArduinoを検出するかどうかを確認します。

11
StebQC