arduino - 从 arduino 3v3 读取的 Android Things I2C
问题描述
我尝试使用 Android Things 从 Arduino - slave - 到 RPi - master - 进行通信、读取和写入。
如果我读/写,使用电平转换器,从 RPi 到 Arduino 5v (16Mhz),一切正常。
所以我决定取消电平转换器,并使用 3v3 Arduino mini pro (8Mhz)。
写入工作正常,但是当我尝试从 Arduino 读取时,信号停止。
5v_16Mhz
Setup 到 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);
}
}
我真的不知道如何驱动信号高......
有人可以帮助我吗?
解决方案
如果我读/写,使用电平转换器,从 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(随机示例)来实现相同的缓冲效果而无需电平转换。
推荐阅读
- node.js - 如何在 Nodejs 和 Mongodb 中实现基于角色的登录
- python - 将绑定事件添加到使用循环创建的条目字段
- java - 如何减少for循环的数量
- jgrowl - JGrowl 从 css 设置主题
- r - 如何在冲积/桑基图的流量项目上添加值标签(在 R ggalluvial 上)?
- jquery - 在jQuery函数中更改条件时ngClass不起作用
- reactjs - 反应钩子将 useState 元素记录为 null 时它不是
- php - RewriteRule 123456.js 为 js.php?arg=123456
- google-apps-script - 使用 Google Apps 脚本对行进行分组
- python - 检查python dict中的值