[英]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.