|
本帖最后由 Super169 于 2016-5-8 02:11 编辑
一直有兴趣用不同的方式把细小的 arduino 系统组成一个大系统, 刚刚看了 幻生幻灭 大大 的 世界最小的Arduino——ATTiny13上手全攻略1A简介, 心思思想买回来试试.
初步的目标, 是用 ATTiny13 把 一般舵机改成 总线舵机. 虽然已有 PCA9685 之顃 经 i2c 通讯的控制板, 但每个舵机还是直接连到控制板上, 接线相对比较长而且混乱. 如果可以做出总线舵机的效果, 每个舵机之间以三根线连上, 可以一个一个连开去, 又可以中途分开几个, 又或者直接连到主板. 变化比较大, 而且方便很多. 所以, 还是值得尝试的.
很久没发帖了, 在未有 ATTiny13 之前, 先研究一下 arduino 之间的 I2C 通讯, 就来一个有间 Arduino 之间的 I2C 通讯 的分享吧.
在网上不难找到教学, 但很多都只是以一个 byte 通讯, 不足以满足我的要求, 所以尝试自己做一些简单的应用例子, 将来或许用得着, 希望对大家有帮助.
由於网上有不少资源, 太深入的未必人人有兴趣, 而且我自己也不慬, 所以, 尝试用简单的例子把一些重点拿出来讨论. 如果说错了什麽, 还望大家帮忙指证.
I2C 通讯的特性
首先 要了解 I2C 跟其他通讯(例如串口) 的分别
- I2C 是 master & slave 的设计
- 整个线路上只有一个 master, 其他的都是 slave
- 只有 master 可以 向 slave 进行通讯
- slave 与 slave 之间是不可以通讯的
- 只有 master 可以主动向 slave 发送资料或提出请求
- slave 只可因应 master 的请求而回传资料, 不可以主动发送资料给 master
I2C 通讯有什麽好处?
- 可以同时以 1 master 连接多个 slave 设备
- 速度快
- 不需另外购买通讯模块, 可以说是完全免费的
- 只需三根线连通就可以, 不用复杂的连线
I2C 通讯有什麽缺点?
- 由於 I2C 是 master 主导, 所有 slave 板子都不能主动提出通讯要求, 亦不能跟其他 slave 通讯. 程式设定上, 就要有一个主控制板, 其他都只是分工.
- slave 板子不能用来连接其他 i2c 设备 (除非大神们另外写一个 Wire 库, 用其他接口吧)
因此, 分工的时间, slave 只可以分担非 i2c 的设备, 对於 i2c 的设备, 还是要靠 master 自己负责.
所以 master 除了要管理 slave 的分工外, 还要处理 i2c 设备.
准备功夫:
要做的 I2C 通讯, 只需要 Wire 库就可以了 (当然, 对於大神来说, Wire 库也可以不需要, 自己完全做出来也可以.), 所以基本上不需要再找什麽库.
当然, 如果配合 I2Cdev 之顃的库, 一定程度上可以简单一点. 但为了方便大家了解, 还是用最基本的 Wire 指令. 将来大家想用什麽库也没限制.
我尝试做一个 I2C 通讯系统的例子, 由简单的一步步建立, 每一个段落的例子都可以独立进行测试, 希望大家可以一步步了解.
由於是通讯系统, 最少要准备 两块 arduino 板子, 不需要是相同的, 任何组合也可以 (UNO, Nano, Mini, Mega 也没关系).
三根杜邦线, 把 GND, A4, A5 都连上. 连接方法就是 相同的连起来. GND-GND, A4-A4, A5-A5, 有多少块都是接在一起就可以了.
为了方便之後的讨论, 请选定一个作为 master, 其他都是 slave. 以後会用 master 板子, 及 slave 板子作称呼.
暂定会有以下的题目, 将会一步一步发布. 完成後, 希望大家都可以做出一个简单的 i2c 通讯系统.
(1) I2C 地址设定 及 I2C 地址扫瞄
(2) 由 master 向 slave 发送资料/发出指令 [slave 直接处理]
(3) 由 master 向 slave 发送资料/发出指令 [slave 延迟处理]
(4) 由 master 向 slave 要求资料回传
(5) master 向 slave 要求不同资料
(6) 由 master 提供参数, 再由 slave 作出相应的回复
(7) 单片机有效传送数据的选择 (未完...待續...)
(8) I2C 通讯实例(一) 简单传感数据收集 (把非 i2c 传感变成 i2c)
(9) I2C 通讯实例(二) PM2.5 数据收集 (把较长时间的收集由 slave 完成)
(10) I2C 通讯实例(三) 总线舵机 (由 master 向 slave 发送指令)
注意: (4)-(7) 是在 Google 的 Blog 中, 沒轉發過來. 可能有需要用自己的方法去看.
以上只耍 (1) - (4) 就可以了作出基本通讯, 而 (5), (6) 是加入一些简单通讯协定, 让 slave 有更多功能, 之後是一些实例, 用来演示 i2c 通讯的应用.
相关程式只在演示通讯的功能, 对 Wire 回传的错误完是没有处理的, 有兴趣可自己加入错误处理的程序.
|
|