繁体   English   中英

I2C通信Raspberry Pi 3和Arduino

[英]I2C communication Raspberry Pi 3 and Arduino

(抱歉英语不好,我是德国人)

你好程序员,

我正在尝试(没有成功)将数据从Raspberry Pi 3(主服务器)发送到Arduino(从服务器):

这是我更新的 Arduino代码:

#include <Wire.h>
volatile bool flag = false;
void wireHandler(int numBytes)
{
  flag = true;
}
void setup()
{
  pinMode(13, OUTPUT);
  Wire.begin(0x23);
  Wire.onReceive(wireHandler);
}
void loop()
{
  delay(100);
  digitalWrite(13, flag);
}

我的Raspy代码(C ++,g ++ main.cpp -lwiringPi):

#include <iostream>
#include <wiringPi.h>
#include <wiringPiI2C.h>
int main(void)
{
    if(wiringPiSetup() == -1)
    {
        std::cerr << "wiringPiSetup() == -1\n";
        return 1;
    }
    if(wiringPiI2CSetup(0x39) == -1) //is 0x39 correct?
    {
        std::cerr << "wiringPiI2CSetup(int) == -1\n";
        return 1;
    }
    while(true)
    {
        wiringPiI2CWrite(0x23, 0x23);
        delay(100);
    }
}

从理论上讲,这应该使Arduino Led(引脚13)闪烁。 然而,领导保持黑暗。

如果有人能解释我为什么这个程序不起作用以及如何解决它,我将感激不尽。

是的,在Raspi-Config中激活了I2C。

Wire.onReceive()处理程序是从ISR处理程序调用的,因此所有其他ISR都被阻止。 包括一个计数millis ,没有它, delay()不能工作,因为它依赖于millis

例如,一些volatile变量应该由此事件更新并在loop()处理,因为ISR处理程序必须尽可能短。

例如,如果接收到的字节LSB为1,则该指示灯将点亮。

#include <Wire.h>

volatile byte recv = 0;

void setup() {
  Wire.begin(0x23);               // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  //Serial.begin(57600);          // start serial for output
  pinMode(13,OUTPUT);
}

void loop() {
  delay(10);
  digitalWrite(13, recv);
}

void receiveEvent(int howMany) {
  while (Wire.available()) { 
    byte c = Wire.read();
    recv = c & 1; // just last character and its LSB will be used
  }
}

另一方面是另一个arduino(因为我没有RPi)发送递增字节序列。 每500毫秒一个值。 这使得第一个arduino眨眼:

#include <Wire.h>

void setup() {
  Serial.begin(57600);
  Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 0;

void loop() {
  Wire.beginTransmission(0x23); // transmit to device #8
  Wire.write(x);              // sends one byte
  byte error = Wire.endTransmission();     // stop transmitting

  Serial.print("Sent: ");
  Serial.print(x,DEC);
  Serial.print(" ");
  Serial.println(error, DEC);

  x++;
  delay(500);
}

但基本上只能发送0或1值来关闭或打开LED。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM