我尝试使用Android Things从Arduino-从属设备-RPi-主设备进行通信,读取和写入。
如果i R / W具有电平转换器,从RPi到Arduino 5v(16Mhz),一切正常。
所以我决定取消电平转换器,并使用3v3 Arduino mini pro(8Mhz)。
写入工作正常,但是当我尝试从Arduino读取时,信号停止。
5v_16Mhz
设置为9后,地址为0,并读取为9,信号仍为低电平并接收到数据。没问题。
3v3_8Mhz
设置为9、0地址并读取为9之后,信号变高,数据停止。
我为奴隶使用了相同的例子:
#include <Wire.h>
byte RFID[20] = {9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,1,2};
void setup() {
Wire.begin(8); // join i2c bus with address #8
Wire.onRequest(requestEvent); // register event
Wire.onReceive(receiveEvent); // register event
Serial.begin(115200); // start serial for output
pinMode(13, OUTPUT);
}
void loop() {
delay(100);
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Serial.println("Master ask");
digitalWrite(13, HIGH);
delay(250);
Wire.write(RFID, 20);
digitalWrite(13, LOW);
}
// function should be executes whenever data is received from master
// this function is registered as an event, but it's called every time the RPi
// call the Device.
void receiveEvent(int howMany) {
while (0 < Wire.available()) {
byte RTC_syn = Wire.read(); // receive byte
Serial.println(RTC_syn);
}
}
我真的不知道如何将信号推高...
有人可以帮助我吗?
答案 0 :(得分:0)
如果i R / W具有电平转换器,从RPi到Arduino 5v(16Mhz),一切正常。
所以我决定取消电平转换器,并使用3v3 Arduino mini pro(8Mhz)。
写入工作正常,但是当我尝试从Arduino读取时,信号停止。
这是因为您在5V / 3.3V版本中使用的电平转换器所做的不仅仅是改变电压。它还可以在两个设备之间充当良好的高阻抗缓冲器,从而有助于保持信号驱动并避免负载效应。
在没有缓冲区的情况下,您的总线可能正在经历一些加载。您可以尝试通过添加更强的上拉电阻来解决这一问题。 RPi3在I2C线路上具有1.8k上拉电阻,该电阻通常可以工作,但根据从设备的输入阻抗可能很小。 Arduino Mini具有安装I2C上拉电阻的垫,但默认情况下没有。
对于纯3.3V I2C总线,推荐的上拉电阻接近1k,因此您可能只需要在SCL / SDA和+ 3.3V之间增加一些更强的上拉电阻即可。您添加的任何内容都将与RPi3电阻并联,因此请在计算中考虑。例如,添加4.7k电阻器可使有效电阻降至1.3k左右。
如果无法通过上拉解决它,则可以通过使用线路驱动器IC(random example)来实现相同的缓冲效果而无需进行电平转换。
答案 1 :(得分:-1)
如果液位转换器正常工作,则应坚持使用它。
诸如I2C之类的通信协议将数据编码为一系列逻辑高和逻辑低信号。 HIGH / LOW是什么意思?这取决于设备。对于大多数嵌入式设备,逻辑低电平将接地,即0V。
对于Arduino和Raspberry Pi,其源电压是不同的(3.3V与5V)。这种差异可能导致几个潜在的问题。
5V信号太高而无法处理Arduino,从而导致Arduino停止工作或重新启动
3.3V信号的强度不足以解释为逻辑高电平。嵌入式设备的电路会将信号四舍五入为HIGH / LOW,并且阈值可能不完全相等。 5V输入只能接受4.5V或更高电压,将其他所有内容解释为LOW或处于不确定状态。