首页 > 解决方案 > 从 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);
  }
}

我真的不知道如何驱动信号高......
有人可以帮助我吗?

标签: arduinoi2candroid-things

解决方案


如果我读/写,使用电平转换器,从 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(随机示例)来实现相同的缓冲效果而无需电平转换。


推荐阅读