Hoe lees ik gegevens van Arduino met Raspberry Pi via I2C?

Ik heb een Raspberry Pi 2 model B verbonden met een Arduino Uno via een Bi-Directional Level-shifter, van deze BLOG :

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

Ik hoop dat mijn I2C-verbinding correct is.

En mijn Arduino is verbonden met een 8-kanaals relaisbord.

Nu heb ik een code geschreven waarin ik het relaisbord met de Raspberry Pi kan besturen. Als ik bijvoorbeeld op '1' druk, wordt relais 1 hoog.

Nu wil ik gegevens terugsturen van de Arduino naar de Raspberry Pi om te controleren of relais 1 hoog is of niet. Als relais 1 hoog is, moet het wat gegevens terugsturen naar de Raspberry Pi.

Mijn Raspberry Pi-code is:

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()

Mijn Arduino-code:

#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);
}

Als ik nu type 1 gebruik en relais 1 vanwege een losse verbinding niet hoog wordt, wil ik dat de Arduino data van het relaisbord neemt en het elke keer naar de Raspberry Pi stuurt.

Het zal geweldig zijn als iemand ook kan uitleggen hoe het werkt.

Ik hoop dat ik het probleem heb kunnen verklaren. Ik heb veel onderzoek gedaan maar kon geen antwoord vinden.

Ik ben een beginner in Python dus help me alsjeblieft.

Bij voorbaat dank.

2
Zie mijn antwoord hier over het aansluiten van I2C tussen een 3,3V-apparaat en een 5V-apparaat.
toegevoegd de auteur Nick Gammon, de bron
Teken '1' is geen nummer 1. Probeer 'nummer ==' 1 '.
toegevoegd de auteur Mikael Patel, de bron
Dat is niet de vraag, de vraag is hoe je de waarde van digitale pen van Arduino doorgeeft aan Rapsberry Pi.
toegevoegd de auteur another 'Homo sapien', de bron

2 antwoord

Misschien wil je naar de pigpio-bibliotheek voor de Pi-kant hiervan.

Hier vindt u voorbeelden van hoe het werkt.

hier is een leuke die lijkt op Wireshark - laat je het I2C-verkeer zien:

https://github.com/joan2937/pigpio/tree/master/ VOORBEELDEN/C/I2C_SNIFFER

Here is the FAQ about I2C

1
toegevoegd

Teken '1' is geen nummer 1. Probeer 'number ==' 1 '. - Mikael Patel 9 '16 om 11:34 uur

0
toegevoegd