I2C - 向 Arduino UNO 发送资料

材料准备

  • Arduino UNOx 1

范例说明

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

流程

这个范例里,我们将Ameba当作I2C Master Writer, 而Arduino为I2C Slave Receiver。
I2C Master会传字串到I2C Slave,并且I2C Slave将字串印出来。

  • 准备 Arduino Uno 为 I2C Slave

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

4-1

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

  • 准备Ameba 为 I2C Master

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

4-3

  • 接线

Arduino的范例里,使用A4当作I2C SDA, A5为I2C SCL。这些接脚与Ameba一样。

另外很重要的是,两块板子的GND要互接。

打开包含Arduino Uno的Arduino IDE,开启Serial Monitor, “Tools” -> “Serial Monitor”, 会出现Serial Monitor的视窗,这个视窗可以让你看到Arduino Uno印出来的讯息。

接着按下Arduino Uno的Reset按钮,让Arduino Uno等待I2C master连接。

再按下Ameba的Reset按钮,让Ameba开始传讯息。这时候会看到Serial Monitor每隔0.5秒出现新的讯息,这样就代表成功了。

4-6

程式码说明

Ameba使用同样的Arduino范例,Arduino官方网站的范例说明可以参考这里:
https://www.arduino.cc/en/Tutorial/MasterWriter

首先Wire.begin()会先设定address, 如果是Master可以不用设定address:
https://www.arduino.cc/en/Reference/WireBegin

接着Master使用Wire.beginTransmission()来设定要传到哪一个Slave:
https://www.arduino.cc/en/Reference/WireBeginTransmission

使用Wire.write()送资料, 并且最后使用Wire.endTransmission()将所有资料传出去:
https://www.arduino.cc/en/Reference/WireEndTransmission

请先确认已安装QQ通讯软体