不久前,我创建了RohmMultiSensor – Arduino库,利用该库可以轻松控制ROHM传感器评估套件中的多个传感器。第一篇文章发布以来,库API发生了一些变化,使得测量更加容易。此外,RohmMultiSensor现在为每个传感器和开发板提供3D打印外壳!
硬件
- Arduino UNO或Mega
- ROHM传感器评估套件
- 3D打印传感器外壳,详细信息请参阅Thingiverse
软件
- Arduino IDE
- RohmMultiSensor库,详细信息请参阅GitHub
工具
- 3D打印机
在本文中,我们将介绍该库的一些新功能和改进功能。我们还会介绍传感器和开发板的3D打印外壳。
新测量方法
首先解释一下我如何——也许更重要的是为什么——改变了测量方式。在之前版本的库中,您调用了一个函数,其返回值如下所示:
float* accelValue = acc.measure();
虽然这种方法非常直观,而且对于大多数传感器来说效果很好,但对于返回多个值的传感器而言并不方便。比如,加速度计会返回三个值:X、Y和Z轴的加速度。然后,该函数必须返回一个包含三个值的数组。用C/C++术语来说,这意味着返回一个指向数组的指针,动态地分配一个新的数组。数组用完之后,我们需要手动释放该数组以释放内存。
delete[] accelValue;
在C/C++中动态分配数组并重新分配数组在C/C++中并不少见,但对于刚刚开始编程且尚未完全理解内存管理和指针等内容的人来说,这并不是最直观的。
为了让Arduino初学者便于使用该库,测量系统发生了以下变化:每个传感器仍然具有原始.measure()函数。但是,这个函数不带参数,不返回任何东西。传感器测量的值被存储一个测量变量中,该变量是传感器类的一部分。
sensorAcc.measure();
// 现在我们把数据放在测量变量中
Serial.println(sensorAcc.accelX);
Serial.println(sensorAcc.accelY);
Serial.println(sensorAcc.accelZ);
这个新系统也意味着库能够更好地处理异步测量和中断。
改进的中断支持
更新库还改进了对中断的支持。在旧版本中,唯一支持——实际上是需要——中断的传感器是BM1422GMV地磁传感器。但是,几乎所有使用I2C总线的传感器都有某种形式的中断。这就是为什么现在库可以支持KX022加速度计的中断功能,后续我会提供更多支持!
现在,实现中断的方式非常简单:每次Arduino接收到传感器的中断后,测量变量就会被更新。这个值一直有效,直到新中断到达。此时,系统从传感器读取一个新值并保存。
以下代码展示了如何将BM1422GMV和KX022与中断一起使用。
// 定义所使用的传感器
#define INCLUDE_BM1422GMV
#define INCLUDE_KX022_1020
// 包含库
#include <RohmMultiSensor.h>
// 用中断0实例化KX022-1020类
KX022_1020 sensorAcc(INT_0);
// 用中断1实例化BM1422GMV类
BM1422GMV sensorMag(INT_1);
// 定义中断服务程序
void acc_isr(void) {
sensorAcc.setFlagDrdy();
}
void mag_isr(void) {
sensorMag.setFlagDrdy();
}
void setup() {
// 开始串行通信
Serial.begin(9600);
Serial.println();
// 开启TWI(I2C)接口。
// 调用.init()之前,必须调用这个函数!
Wire.begin();
// 用默认值初始化KX022-1020和BM1422GMV
// 我们必须为.init()提供中断服务例程
sensorAcc.init(acc_isr);
sensorMag.init(mag_isr);
Serial.println("X[g]\tY[g]\tZ[g]\tX[uT]\tY[uT]\tZ[uT]");
}
void loop() {
// 测量传感器数值
sensorAcc.measure();
sensorMag.measure();
// 输出所测量的数值
Serial.print(sensorAcc.accelX);
Serial.print('\t');
Serial.print(sensorAcc.accelY);
Serial.print('\t');
Serial.print(sensorAcc.accelZ);
Serial.print('\t');
Serial.print(sensorMag.magX);
Serial.print('\t');
Serial.print(sensorMag.magY);
Serial.print('\t');
Serial.println(sensorMag.magZ);
// 下次测量之前等待100 ms
delay(100);
}
由于KX022不需要中断工作,因此可以禁用中断!
// 定义所使用的传感器
#define INCLUDE_KX022_1020
// 包含库
#include RohmMultiSensor.h
// 用默认设置实例化传感器类
KX022_1020 sensorAcc;
// 上述指令相当于
// KX022_1020 acc(INT_NONE);
void setup() {
// 开始串行通信
Serial.begin(9600);
Serial.println();
// 开启TWI(I2C)接口。
// 调用.init()之前,必须调用这个函数!
Wire.begin();
// 用默认值初始化KX022-1020
sensorAcc.init();
Serial.println("X[g]\tY[g]\tZ[g]");
}
void loop() {
// 测量传感器数值
sensorAcc.measure();
// 将值打印至串口
Serial.print(sensorAcc.accelX);
Serial.print('\t');
Serial.print(sensorAcc.accelY);
Serial.print('\t');
Serial.println(sensorAcc.accelZ);
// 下次测量之前等待100 ms
delay(100);
}
传感器外壳
除了RohmMultiSensor库,我们还为传感器制作了重要的外壳!凭借这些装置,您可以将传感器安装在任何位置,然后使用线将它们连至开发板。如果您需要确保像加速度计和磁力计这样的传感器牢固安装并提供精确测量,或者需要将传感器开发板放在单独的外壳中,这将非常有用。
将传感器安装到外壳中非常简单。所有外壳都由两部分组成:下半部分和上半部分。
只需将传感器插入外壳的下半部分,让引脚突出另一侧即可。
然后,用两个M3螺栓将传感器固定到位。
现在只需要用M3螺栓将外壳的上半部分固定到下半部分。完成!外壳现在可以自由安装在几乎任何东西上。
有些传感器,比如紫外线传感器或颜色传感器,需要与外界进行光学接触。这些传感器的外壳设计能够实现这种光学接触,如下图所示。
当然,如果没有开发板外壳,那么这个外壳清单就不完整!开发板外壳可以让您将Arduino和ROHM传感器评估开发板放入一个非常方便的箱子中,同时仍然能够在上面安装传感器!
当然,还有很多需要改进的地方。如上文所述,许多其他传感器也可以使用中断,实现这些功能也不错。另外,我们可以设法在运行程序(sketch)时重新配置传感器设置,该功能也很有用。目前,这个过程只能在Arduino启动、构建传感器类时完成。
如果您想查看更详细的库文件,请访问以下链接:RohmMultiSensor Wiki。该网页将始终为您呈现最新的变化和库更新。与往常一样,非常感谢您阅读本文,如果您有任何改进建议,请在我的GitHub留言或在本文下方进行评论!