I2C経由でArduinoのデータをRaspberry Piで読み込む方法は?

私は、このブログ

Raspberry pi    GND    ----------   GND     Arduino
                3.3v   ----------   5v
                SCL    ----------   A5
                SDA    ----------   A4

私は私のI2C接続が正しいことを願っています。

そして私のArduinoは8チャンネルの中継ボードに接続されています。

今、私はラズベリーパイでリレーボードを制御できるコードを書いています。例えば、「1」を押すと、リレー1がハイになります。

リレー1が高いかどうかをクロスチェックするために、ArduinoからRaspberry Piにデータを戻したいと思います。リレー1が高い場合は、いくつかのデータをRaspberry Piに送り返す必要があります。

私のラズベリーPiコードです:

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("")
    if not var:
        continue
    writeNumber(var)
    number = readNumber()

私のArduinoコード:

#include 

#define SLAVE_ADDRESS 0x04
#define RELAY1 9

int number = 0;
int state = 0;

void setup() {
    pinMode(RELAY1, 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(RELAY1, HIGH);//set the LED on
                state = 1;
            } else {
                digitalWrite(RELAY1, LOW);//set the LED off
                state = 0;
            }
        }
    }
}

// callback for sending data
void sendData(){
    Wire.write(number);
}

今私が1を入力し、いくつかの緩やかな接続リレー1が高くならないので、私はArduinoがリレーボードからデータを取り出し、毎回ラズベリーパイに送るようにします。

誰かがそれがどのように機能するかを説明することができれば素晴らしいことでしょう。

私は問題を説明することができたと思う。私は多くの研究をしましたが、何らかの答えを見つけることができませんでした。

私はPythonの初心者ですので、私を助けてください。

前もって感謝します。

2
私の答えを見るここをクリックして、3.3Vデバイスと5Vデバイス間でI2Cを接続する方法について説明します。
追加された 著者 Nick Gammon,
文字 '1'は数字1ではありません。 "数字== '1'を試してください。
追加された 著者 Mikael Patel,
それは質問ではありません、問題はArduinoのデジタルピンからrapsberry piに値を渡す方法です。
追加された 著者 another 'Homo sapien',

2 答え

あなたはこれのPi側のために豚のライブラリに卒業したいかもしれません。

ここでは、どのように動作するかの例を見つけることができます。

Wiresharkのような楽しいものがあります - あなたにI2Cトラフィックを表示します:

https://github.com/joan2937/pigpio/tree/master/使用例/ C/I2C_SNIFFER

Here is the FAQ about I2C

1
追加された

文字 '1'は数字1ではありません。 "number == '1'を試してください。 - Mikael Patel Mar 9 '16 at 11:34

0
追加された