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 を使用していますが、説明が少し遅いかもしれません。
誰かがこれを機能させましたか?
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を検出するかどうかを確認します。