I2C - Slave 从 Arduino UNO 接收资料

材料准备

范例说明

介绍
I2C里有两个角色,一个是Master,另一个是Slave。 Master的角色只能有一个,而Slave可以有很多个。每个Slave都有自己的位址(address)编号,所以当Master要与特定的Slave沟通时,就会使用这个位址。 I2C使用了两根接脚,一根是资料线 (SDA),另一根是时脉线 (SCL)。 Master藉由控制SCL让Slave知道有东西要传,而资料就可以在SDA上面传送。 I2C在Arduino的范例里被称呼为Wire。

流程
在前个例子 “I2C – 向 Arduino UNO 发送资料” 里, Ameba 是I2C master, 而Arduino UNO是I2C slave,并且让Ameba 送资料给Arduino UNO。
在这个范例里, Ameba 是I2C slave, Arduino UNO 是I2C master, 改成资料从Arudino UNO 传给Ameba。

  • 准备Arduino Uno为 I2C Master

首先我们先准备Arduino,先将Arduino IDE选成Arduino, “Tools” -> “Board” -> “Arduino/Genuino Uno”
接着打开 Master Writer 的范例,”Examples” -> “Wire” -> “master_writer”

per-5-1

然后点选 “Sketch” -> “Upload” 将程式编译并上传到 Arduino Uno。

  • 准备Ameba 为 I2C Slave

我们额外再开一个Arduino IDE,确定板子是 Ameba, “Tools” -> “Board” ->
然后打开 Master Reader 的范例, “File” -> “Examples” -> “AmebaWire” -> “SlaveReader”

per-5-3

然后点选 “Sketch” -> “Upload” 将程式编译并上传到 Ameba。

  • 接线

Arduino的范例里,使用A4当作I2C SDA, A5为I2C SCL。这些接脚与Ameba一样。
另外很重要的是,两块板子的GND要互接。

打开Arduino Uno的Arduino IDE并打开serial monitor(“Tools”->“Serial Monitor”)。
接下来,按下 Arduino Uno 上的重置按钮。现在 Arduino Uno(Master)正在与 Ameba(Slave)建立连接。在Serial Monitor中,您可以看到从 Arduino Uno 打印的讯息。
我们按下 Ameba 上的重置按钮开始接收来自 Arduino UNO 的讯息。然后观察Serial Monitor,您可以看到每 0.5 秒显示一次消息。

per-5-8

程式码说明

可以在 Arduino 的文档中找到此范例的详细资讯:
https://www.arduino.cc/en/Tutorial/MasterWriter
首先Wire.begin()会先设定address, 如果是Master可以不用设定address
https://www.arduino.cc/en/Reference/WireBegin
接下来,Master使用 Wire.beginTransmission(address) 开始传输数据给I2C slave:
https://www.arduino.cc/en/Reference/WireBeginTransmission
使用 Wire.write() 发送数据,最后使用 Wire.endTransmission() 来结束传输:
https://www.arduino.cc/en/Tutorial/WireEndTransmission
请先确认已安装QQ通讯软体