I²C,是 Inter-Integrated Circuit(集成电路总线)的缩写,它是一种常见的串行总线结构,用以连接整体电路,实现高低速设备同步和通信。
如果想更多的了解 I²C,可以到这里。
前提条件
使用 I²C
请根据外设的数据手册,确定外设的接口类型为 I²C。
配置 driver.json
确定自己的硬件接口是 I²C 后,需要声明硬件接口类型为 I²C。 在 driver.json 文件里的 inputs,指定接口的类型(type)为 I²C。
{ ... "inputs": { "i2c": { "type": "i2c", "args": { "address": -1 } } } }
|
接口属性
I²C 接口可以配置以下属性:
address
定义 I²C 接口的地址,需要用户从器件的数据手册中获得。
编写驱动
读取功能
驱动程序可以从总线上读取数据,下面是一个例子,根据数据手册,需要设置指令为0x01,然后,读取的值在回调函数中返回:
function read(callback) { i2c.readBytes(0x01, function (error, value) { if (error) { callback(error); return; }
callback(undefined, 0xff - value); }); }
|
写入功能
驱动程序可以向总线上写入数据,下面是一个向总线上写入一个字节的例子:
var data = 0; ...
i2c.writeByte(-1, data);
|
如果想了解更多细节,请参考其 API 文档。
应用
光照传感器(GY-30)
光照传感器是一个可以获取亮度的传感器,根据数据手册,它需要配置一个地址为35的 I²C 接口。我们在driver.json 文件中声明一个类型为 I²C 的接口,设定接口地址为 35。
{ "models": [ "GY-30" ], "inputs": { "i2c": { "i2c": { "type": "i2c", "args": { "address": 35 } } } } }
|
我们为光照传感器提供得到当前光强(getIlluminance)的接口,其具体实现方式如下:
- getIlluminance,先向 I²C 接口写入设置字节(0x20),延迟一段时间后,从 I²C 接口读取两个字节数据,返回经过计算的光照强度。
'use strict';
var driver = require('ruff-driver');
module.exports = driver({ attach: function (inputs, context) { this._i2c = inputs['i2c']; },
exports: { getIlluminance: function(callback) { var i2c = this._i2c;
i2c.writeByte(-1, 0x20, function(error) { if (error) { callback(error); return; }
setTimeout(function() { i2c.readBytes(-1, 2, function (error, values) { if (error) { callback(error); return; } var value = Math.floor((values[0] << 8 | values[1]) / 1.2); callback(undefined, value); }); }, 180); }; } } });
|