2013-01-20 22 views
9

Bir Arduino UNO'dan Raspyberry Pi'ye python smbus modülü ile veri okumaya çalışıyorum. Smbus modülünde bulabildiğim tek doküman here idi. Modüldeki cmd'nin ne olduğundan emin değilim. Arduino'ya veri göndermek için yazıyı kullanabilirim. İki basit programlar yazmaI2C ile Raspberry Pi ile Arduino'dan veri okuma

için okuma diğeri

için bir okuma yazma

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

için bir yazdım

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

Arduino kodu

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

Okuma programını çalıştırdığımda, her seferinde "33" değerini döndürür. Arduino, sendData işlevinin çağrıldığını döndürür.

Data Level Shifter kullanıyorum ve açıklama biraz yavaş olduğunu söylüyor.

kimse bu işe aldı mı?

cevap

10

Arduino ve Raspberry Pi arasında bir iletişim kurmayı başardım. İki, iki 5k pullup direnç kullanarak bağlanır (bkz. Bu page). Arduino, her istek için i2c veriyolunda bir bayt yazar. Raspberry Pi'de, her saniye hello yazdırılır.

Arduino kodu: Ahududu Pi üzerinde

Python kodu

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

: my Ahududu Pi günü

#!/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); 

, i2c otobüsü senin Raspberry olmadığını doğrulamak için komut i2c-detect -y 0 veya i2c-detect -y 1 Kullanım 1'dir Pi, Arduino'nuzu tespit ediyor.