2012-12-14 5 views
4

Я пытаюсь отправить данные через интерфейс I²C с Arduino Uno на Raspberry Pi с использованием I²C. Это был код, который я использовал.Как подключить Arduino Uno с помощью малины Pi с использованием I²C

В Arduino:

#include <Wire.h> 
unsigned int watt; 
unsigned int watt1; 
byte watt2; 
byte watt3; 
void setup() 
{ 
    Wire.begin(30); 
    Wire.onRequest(requestEvent); 
    Serial.begin(9600); 
} 

void loop() { 
    delay(100); 
    int sensorValue = analogRead(A0); 
    int sensorValue1 = analogRead(A1); 
    watt = sensorValue * (5/1023) * 2857; 
    watt1 = sensorValue1 * (5/1023) * 2857; 
    watt2 = map(watt, 0, 4294967295, 0, 255); 
    watt3 = map(watt1, 0, 4294967295, 0, 255); 
    Serial.println(watt2); 
    Serial.println(watt3); 
} 

void requestEvent() 
{ 
    Wire.write(watt2); 
    delay(30); 
    Wire.write(watt3); 
} 

И в Raspberry Pi:

import smbus 
import time 
bus = smbus.SMBus(0) 
address = 0x1e 
while (1): 
    watt=bus.read_byte_data(address,1) 
    watt2=bus.read_byte_data(address,2) 

я получил следующее сообщение об ошибке.

Traceback (most recent call last):
File "/home/pi/i2ctest.py" , line 8, in <module>
watt = bus.read_byte_data(address,1)
IOError: [Errno 5] Input/Output error

Как исправить это? Кроме того, есть ли альтернативы для использования I²C в малине Pi, кроме библиотеки SMBus?

ответ

4

Если у вас есть малина Pi с платой ревизии 2.0, вам нужно использовать шину I²C 1, а не шину 0, поэтому вам нужно будет изменить используемый номер шины. В этом случае линия

bus = smbus.SMBus(0) 

станет

bus = smbus.SMBus(1) 

Вы можете проверить, что устройство присутствует на шине с помощью программы i2cdetect из пакета i2ctools. Попробуйте

i2cdetect 0 -y 

искать Arduino на шине 0. Run

i2cdetect 1 -y 

искать его на автобусе 1. Конечно, программа Arduino должна быть запущена для того, чтобы работать. Это также подтвердит, что Arduino присутствует по ожидаемому адресу.

Вам также необходимо убедиться, что у вас есть соответствующие права на использование I²C, поэтому запустите программу Python из учетной записи, входящей в группу i2c.

+0

Я запускаю ревизию 1, и я проверил ее с i2cdetect 0 -y и показал правильный адрес. Я нашел проблему с этим (это было то, что arduino ожидал сигнала от rpi, но он так и не появился. Я удалил эту строку), но теперь у меня другая проблема, вход i2c rpi постоянно 0, независимо от того, что я передайте от arduino – user17151

+0

На Arduino, если вы умножаете свое значение на 5/1023, я считаю, что это всегда будет оценено в 0. Попробуйте 5.0/1023. –

+1

@ user17151: используете ли вы резисторы подтягивания? I2C являются линиями «открытого стока» и не могут тянуть сигнал вверх, поэтому вам нужно подтягивать резисторы, чтобы добраться до + V. (См. Любой учебник I2C, если вы еще не используете его.) – tom10