Отправленный здесь мой код для моего хозяина 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;
}
Где вы можете получить это сообщение? Это исключение? Вы пробовали обернуть свой вызов 'read()' в блоке try/catch? –
Кевин, я получаю его в консоли обработки. Не уверен, что это исключение, но я попробую блок try/catch, чтобы увидеть, работает ли он. –
@KevinWorkman Я попробовал, и он, кажется, хорошо работает, посмотрите ниже. –