Arduino-Uno通过I2C从

时间:2015-10-22 23:02:34

标签: c++ raspberry-pi arduino-uno i2c

我需要通过I2C将我的Raspberry Pi中的一些数据发送到我的Arduino Uno。我希望Arduino用pwm转动一些电机并从Raspi接收数据(电机有多快)。

我把它连接起来,编码了一下然后就可以了。但是如果我提高传输速度,因为我需要电机每隔ms改变一次速度,所以arduino会把所有东西搞砸。

在我的Pi上,我得到了以cpp(简称)运行的测试代码:

file = open(deviceName, O_RDWR);
uint8_t command[2] = {motorNum, pwm};
while(1) {
  write(file, command, 2);
  usleep(someTime);
}

Arduino上的代码:

#include <Wire.h>
#define SLAVE_ADDRESS 0x04

byte pwm[] = {3, 9, 10, 11};

void setup() {
  Serial.begin(9600); // start serial for output
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveData);
  Serial.println("Ready!");
}

void loop() {
  delay(10);
}

void receiveData(int byteCount) {
  byte motor = Wire.read(); //should be between 0 and 4
  byte freq = Wire.read(); //should be between 150 and 220

  if(motor == 4) { //all motors same speed
    Serial.print("All Motors with pwm: ");
    Serial.println(freq);
    for(byte i=0; i<4; i++) analogWrite(pwm[i], freq);
  } else {
    Serial.print("Motor: ");
    Serial.print(motor);
    Serial.print(" with pwm: ");
    Serial.println(freq);
    analogWrite(pwm[motor], freq);
  }

  if(Wire.available())
    Serial.println("...more than 2 bytes received");

}

如果我将raspi代码中的'someTime'设置为50000(= 50ms),一切正常,我在arduino上得到了这个输出:

Ready!
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100

现在看来是不必要的,但它只是用于测试。问题出现了,如果我提高速度,意味着将我的pi上的'someTime'减少到1000(= 1ms),我明白了:

Ready!
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 0 with pwm: 100
Motor: 8 with pwm: 0
...more than 2 bytes received

我不知道这里有什么问题,显然导致arduino无法处理速度。我已经尝试用:增加pi和arduino上的i2c-baudrate:

 sudo nano /etc/modprobe.d/i2c.conf
 ->  options i2c_bcm2708 baudrate=400000

Wire.begin(SLAVE_ADDRESS);
TWBR = 12; //should be 400khz

甚至将twi.h更改为:

#define TWI_FREQ 400000L
到目前为止没有任何工作。我尝试了每个速度低于50毫秒,但几乎每次失败。如果没有Wire lib,有没有办法做到这一点,因为我读到它很慢。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我想我找到了一个解决方案:

Serial.begin();
Serial.print(...);

需要花费很多时间,或者让arduino保持忙碌,以至于他没有足够快地从i2c收集数据。我评论了所有的连续着作,我能够放弃一些时间&#39;低至1,所以非常整洁。