极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 77989|回复: 28

Arduino 之间的 I2C 通讯 (序) 简单介绍

[复制链接]
发表于 2015-8-1 21:01:49 | 显示全部楼层 |阅读模式
本帖最后由 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 回传的错误完是没有处理的, 有兴趣可自己加入错误处理的程序.
回复

使用道具 举报

发表于 2015-10-4 17:20:44 | 显示全部楼层
为什么只更新到第三啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-12 12:05:48 | 显示全部楼层
八爪鱼 发表于 2015-10-4 17:20
为什么只更新到第三啊

其實 (4) (5) 都寫好了, 並在別處發佈了.  

(4) 由 master 向 slave 要求資料回傳

(5) master 向 slave 要求不同資料

只是這裡大家好像不感興趣, 所以沒發過來.  
因為這裡的格式有點分別, 發過來要改動不少的, 自己有點懶.
回复 支持 反对

使用道具 举报

发表于 2015-10-13 19:17:11 | 显示全部楼层
这是对我
最有用的资料,但是iic太小众51等其他都没有,我想在51用io口模拟他,但一直沒好䅁
回复 支持 反对

使用道具 举报

发表于 2015-10-13 19:29:50 | 显示全部楼层
7-10没看见,最感兴趣的是7
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-14 14:28:03 | 显示全部楼层
本帖最后由 Super169 于 2015-10-14 14:29 编辑
openmmoo 发表于 2015-10-13 19:29
7-10没看见,最感兴趣的是7


只是初步做了程式, 沒整理出來.  簡單說說吧.

7) 主要想討論不同數據的傳送方法 (例如浮點的傳送, 用文字或數值傳送的分別), 以及自行設定通訊協定的簡單例子

8-10) 只是把之前的做個應用, 同樣需要多一塊 arduino (或晶片) 作橋樑.
8) 用一片簡單的 arduino (板子或單晶片) 負責接 傳感, 再以 i2c 把數據送回主板.
9) 同 8, 只是收集數據方式不同, 每次收到主板的請求是, 回傳最後一次收集到的數據, 主板就不用每次等待了.
10) 同 8,9, 只是多了點控制部份.  來想做到回傳當時的角度, 但發覺有點問題, 因為一般舵機, 並沒有加入偵測角度的電路, 只能靠最後一次執行的指令記下來.  但如果執行上有阻礙, 回傀的角度就非真實角度了.

只要明白了 master 跟 slave 的溝通方法, 8-10 也沒什麼特別.
回复 支持 反对

使用道具 举报

发表于 2015-10-14 19:04:00 | 显示全部楼层
其实我就想看看你是么样应用iic的、
我用5个arduino通讯,一个作主,其他的作从,有两各方法:
1、主要得到数据,就轮法查询每个从。
2、主不动,只接收数据 ,从有数据是就上传到主。
第一种方法,要不停的查询,很耗资源。
第二种方法,因为从较多,可能同时上传,这样可能会有数据丢失。
不知道,你有没有什么方案。
还有一点,就是我想换用c51,但c51都没有iic,有什么解决方法吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-15 16:58:41 | 显示全部楼层
openmmoo 发表于 2015-10-14 19:04
其实我就想看看你是么样应用iic的、
我用5个arduino通讯,一个作主,其他的作从,有两各方法:
1、主要得 ...

由於 IIC 的通訊模式中, 只有 master 可以發起通訊, 所以你 (2) 的方案未必可以單靠 i2c 去實行.
當然, 也不是絕對不可行, 如果從機不多, 可以用 interrupt 的方式, 由從機去通知主機取資料.

第一個方法雖然有點耗時, 但其實 IIC 的通訊非常快, 如果是從機預先準備好資料, 主機查詢就把最後更新的資料送回去, 也不會浪費很多時間.  特別是 PM2.5 之類的 sensor, 原本要數十秒採樣的, 現在可以先準備好, 即時回傳, 如果自身採樣頻率夠, 一般差距不會很大.

第二個方法可以用 interrupt 去達成, 當從機準備好資料就通知主機去取. MPU6050 的 DMP 也是用類似的方法, 由 MPU6050 通知主機有數據可讀取.  但也不是直接上傳, 只是通知主機, 最後還是要主機向從機發出請求, 才可以上傳的.

c51 我沒試過, 不知是否有類似的東西.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-15 17:51:37 | 显示全部楼层
openmmoo 发表于 2015-10-14 19:04
其实我就想看看你是么样应用iic的、
我用5个arduino通讯,一个作主,其他的作从,有两各方法:
1、主要得 ...

一般來說, 也會用第一個方法吧.
因為主機不是專門為一個從機服務, 而且還會可能有不同的工作要做.   
有些數據可以不斷讀取的, 那主機豈非要不停招呼那個從機?  又或是從機自行決定發送頻率.
在沒需要資料的時間, 通知主機也是沒用的.  主機也不一定可以即時放下手上的工作去取資料.
如果主機有特定頻率發放資料 (例如上載到物聯網), 乾脆就由主機去控制接收資料的頻率更好.

至於是否會耗資源, 如果有需要資料時, 向從機查詢一次, 也合理吧.
除非收集資料需要比較長時間, 而主機查詢的頻率很高, 大部份時間都沒有新資料, 否則也不應該算是耗資源, 這是有需要的使用吧.
回复 支持 反对

使用道具 举报

发表于 2015-10-21 16:56:24 | 显示全部楼层
我用的是第二种方法,从机有数据上传,就发出一个中断到主机的d2脚,主机收到中断,再根据程序判断是那一个从机发出的,再来读取从机的上传数据。
哎,这个方法又多占用了一个中断脚。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-21 21:19:35 | 显示全部楼层
openmmoo 发表于 2015-10-21 16:56
我用的是第二种方法,从机有数据上传,就发出一个中断到主机的d2脚,主机收到中断,再根据程序判断是那一个 ...

這個方法表面上看是可以避免主機浪費時間去向從機讀取資料, 但實際情況會因應不同系統有所分別.

比方說主機本身有不少工序, 每個循環也需要比較長時間, 又或者從機採樣速度很快, 基本上每個循環從機都已更新了, 這樣用第二個方法就變成浪費了一個 interrupt, 要知道 interrupt 比丁點的通訊時間更珍貴.

但如果從機要收集的資料, 需要一段長時間去收集的話, 第二個方法就有意義了. 例如 PM2.5 的樣本收集, 一般要 30秒左右, 用第二個方法, 每個讀數之間就有可能減少了成千上萬次的通訊了.

我自己用過的傳感不多, 只有 PM2.5 需要這麼長時間的採樣, 其他的基本上可以即時收到的.  
所以, 由於 interrupt 太珍貴了, 基本上不會選用第二個方式.
回复 支持 反对

使用道具 举报

发表于 2016-1-16 12:18:17 | 显示全部楼层
好帖,收获不少,期待更新!
回复 支持 反对

使用道具 举报

发表于 2016-1-16 16:11:35 | 显示全部楼层
楼主,可以把其它帖子放上来吗,非常想学习,谢谢你了!
回复 支持 反对

使用道具 举报

发表于 2016-5-6 09:42:15 | 显示全部楼层
你好 ,我现在卡在这个地方了,主机和从机用IIC通讯方式,但是主机无法向从机发送多字节,从机也无法回传给主机多字节,例如,主机可以给从机发送3,但是超过255就会乱码,随机发送个数,从机也是如此,大神能给告诉如何发送多字节的么、跪求了!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-6 10:02:29 | 显示全部楼层
soolge 发表于 2016-5-6 09:42
你好 ,我现在卡在这个地方了,主机和从机用IIC通讯方式,但是主机无法向从机发送多字节,从机也无法回传给 ...

你只看了(序), 為什麼不看下去, 之後有完整的範例, 都是多字節的.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 23:26 , Processed in 0.044073 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表