2016-02-22 3 views
1

Отправленный здесь мой код для моего хозяина RPi и проекта раба Arduino. У меня есть аналоговый датчик, подключенный к Arduino, и я читаю эти данные с помощью обработки на RPi. Я использую Обработку, потому что намерен генерировать график и форму волны с данными. Приведенный ниже код, похоже, работает, однако любое небольшое перемещение установки «отключает» подчиненное устройство, потому что я получаю следующее сообщение. «Устройство не ответило. Проверьте кабели и используете ли вы правильный адрес». Я сузил проблему и выяснил, что она всегда отключается при функции i2c.read();. Мой вопрос заключается в том, есть ли какой-либо тип функции break, чтобы, когда это происходит, обработка перемещается и снова пытается на следующей итерации? Или, если он застревает в цикле, он ждет какой-то сигнал от подчиненного устройства? Есть ли у кого-нибудь предложения о том, как подойти к этому?I2C между RPI и Arduino с использованием обработки

Обработка Код

import processing.io.*; 
I2C i2c; 
int val = 0; 
void setup() 
{ 
i2c = new I2C(I2C.list()[0]); 
} 
void draw() 
{ 
if (I2C.list() != null) 
{ 
i2c.beginTransmission(0x04); 
i2c.write(8); 
byte[] in = i2c.read(1); 
int accel = in[0]; 
println (accel); 
} 
} 

Arduino Код

#include <Wire.h> 
#define SLAVE_ADDRESS 0x04 
int number = 5; 
int state = 0; 
const int zInput = A0; 
int zRawMin = 493; 
int zRawMax = 530; 
float acceleration; 
int accel; 
void setup() { 
analogReference(EXTERNAL); 
pinMode(13,OUTPUT); 
Serial.begin(9600);   // start serial for output 
Wire.begin(SLAVE_ADDRESS);    // join i2c bus with address #8 
Wire.onReceive(receiveData); // register event 
Wire.onRequest(sendData); 
Serial.println ("Ready"); 
} 
void loop() { 
int zRaw = ReadAxis (zInput); 
acceleration = map (float(zRaw), float (zRawMin), float(zRawMax), -9.81, 9.81); 
accel = int(acceleration); 
//delay(100); 
} 
void receiveData(int byteCount) 
{ 
while (0 < Wire.available()) 
{ // loop through all but the last 
number = Wire.read(); // receive byte as a character 
//Serial.print("data received"); 
Serial.println(number);   // print the character 
if (number==1) 
{ 
if (state == 0) 
{ 
digitalWrite(13,HIGH); 
state = 1; 
} 
else 
{ 
digitalWrite(13,LOW); 
state = 0; 
} 
} 
} 
} 
void sendData() 
{ 
Wire.write(accel); 
} 
int ReadAxis(int axisPin) 
{ 
long reading = 0; 
int raw = analogRead(axisPin); 
return raw; 
} 
+0

Где вы можете получить это сообщение? Это исключение? Вы пробовали обернуть свой вызов 'read()' в блоке try/catch? –

+0

Кевин, я получаю его в консоли обработки. Не уверен, что это исключение, но я попробую блок try/catch, чтобы увидеть, работает ли он. –

+0

@KevinWorkman Я попробовал, и он, кажется, хорошо работает, посмотрите ниже. –

ответ

0

Похоже, решение может быть использование попробовать/поймать блок любезно @Kevin Workman. Он хорошо работает для того, что мне нужно для этого.

вот обновленный код обработки.

import processing.io.*; 
I2C i2c; 
int val = 0; 
void setup() 
{ 
i2c = new I2C(I2C.list()[0]); 
} 
void draw() 
{ 
if (I2C.list() != null) 
{ 
i2c.beginTransmission(0x04); 
i2c.write(8); 

try 
{ 
byte[] in = i2c.read(1); 
} 
catch(Exception e) 
{ 
    i2c.endTransmission(); 
} 
int accel = in[0]; 
println (accel); 
} 
} 
Смежные вопросы