搜索
热搜: ROHM 模拟 车载
查看: 3660|回复: 4

[分享] ROHM传感器评估套件的3D外壳以及RohmMultiSensor库更新

  [复制链接]

该用户从未签到

77

主题

190

帖子

0

精华

高级会员

最后登录
2023-9-22
发表于 2018-8-23 01:10:49 | 显示全部楼层 |阅读模式
QQ截图20180823010435.jpg
不久前,我创建了RohmMultiSensor – Arduino库,利用该库可以轻松控制ROHM传感器评估套件中的多个传感器。第一篇文章发布以来,库API发生了一些变化,使得测量更加容易。此外,RohmMultiSensor现在为每个传感器和开发板提供3D打印外壳!

硬件

Arduino UNO或Mega
ROHM传感器评估套件
3D打印传感器外壳,详细信息请参阅Thingiverse
软件

Arduino IDE
RohmMultiSensor库,详细信息请参阅GitHub
工具

3D打印机
在本文中,我们将介绍该库的一些新功能和改进功能。我们还会介绍传感器和开发板的3D打印外壳。

新测量方法


首先解释一下我如何——也许更重要的是为什么——改变了测量方式。在之前版本的库中,您调用了一个函数,其返回值如下所示:

float* accelValue = acc.measure();
1
float* accelValue = acc.measure();
虽然这种方法非常直观,而且对于大多数传感器来说效果很好,但对于返回多个值的传感器而言并不方便。比如,加速度计会返回三个值:X、Y和Z轴的加速度。然后,该函数必须返回一个包含三个值的数组。用C/C++术语来说,这意味着返回一个指向数组的指针,动态地分配一个新的数组。数组用完之后,我们需要手动释放该数组以释放内存。

delete[] accelValue;
1
delete[] accelValue;
在C/C++中动态分配数组并重新分配数组在C/C++中并不少见,但对于刚刚开始编程且尚未完全理解内存管理和指针等内容的人来说,这并不是最直观的。

为了让Arduino初学者便于使用该库,测量系统发生了以下变化:每个传感器仍然具有原始.measure()函数。但是,这个函数不带参数,不返回任何东西。传感器测量的值被存储一个测量变量中,该变量是传感器类的一部分。

sensorAcc.measure();
// 现在我们把数据放在测量变量中
<b>Serial</b>.println(sensorAcc.accelX);
<b>Serial</b>.println(sensorAcc.accelY);
<b>Serial</b>.println(sensorAcc.accelZ);
1
2
3
4
5
sensorAcc.measure();
// 现在我们把数据放在测量变量中
<b>Serial</b>.println(sensorAcc.accelX);
<b>Serial</b>.println(sensorAcc.accelY);
<b>Serial</b>.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库,我们还为传感器制作了重要的外壳!凭借这些装置,您可以将传感器安装在任何位置,然后使用线将它们连至开发板。如果您需要确保像加速度计和磁力计这样的传感器牢固安装并提供精确测量,或者需要将传感器开发板放在单独的外壳中,这将非常有用。

将传感器安装到外壳中非常简单。所有外壳都由两部分组成:下半部分和上半部分。
QQ截图20180823010455.jpg
图1  KX022-1020或BM1422GMV等传感器的通用外壳。左边为下半部分,右边为上半部

只需将传感器插入外壳的下半部分,让引脚突出另一侧即可。
QQ截图20180823010507.jpg

图2  插入外壳下半部分的传感器,底视图(左)和顶视图(右)

然后,用两个M3螺栓将传感器固定到位。
QQ截图20180823010524.jpg
图3  装有两个M3螺栓的传感器,底视图(左)和顶视图(右)

现在只需要用M3螺栓将外壳的上半部分固定到下半部分。完成!外壳现在可以自由安装在几乎任何东西上。
QQ截图20180823010534.jpg
图4  装配完成的传感器外壳

有些传感器,比如紫外线传感器或颜色传感器,需要与外界进行光学接触。这些传感器的外壳设计能够实现这种光学接触,如下图所示。
QQ截图20180823010545.jpg
图5装配完成的UV传感器外壳

当然,如果没有开发板外壳,那么这个外壳清单就不完整!开发板外壳可以让您将Arduino和ROHM传感器评估开发板放入一个非常方便的箱子中,同时仍然能够在上面安装传感器!
QQ截图20180823010558.jpg
图6  开发板外壳
QQ截图20180823010613.jpg
图7  传感器开发板的顶盖
QQ截图20180823010623.jpg
图8  传感器开发板的底盖

当然,还有很多需要改进的地方。如上文所述,许多其他传感器也可以使用中断,实现这些功能也不错。另外,我们可以设法在运行程序(sketch)时重新配置传感器设置,该功能也很有用。目前,这个过程只能在Arduino启动、构建传感器类时完成。
回复

使用道具 举报

该用户从未签到

18

主题

395

帖子

0

精华

金牌会员

最后登录
2019-6-28
发表于 2018-8-23 10:50:10 | 显示全部楼层
学习
回复

使用道具 举报

该用户从未签到

1153

主题

5959

帖子

0

精华

论坛元老

最后登录
2021-2-19
发表于 2018-8-23 17:17:11 | 显示全部楼层
最后那个画的不错啊
回复 支持 反对

使用道具 举报

该用户从未签到

2248

主题

1万

帖子

1

精华

论坛元老

最后登录
2024-4-23
发表于 2018-8-23 17:32:33 | 显示全部楼层
看起来很不错
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

362

帖子

0

精华

金牌会员

最后登录
2024-4-23
发表于 2018-8-23 20:49:28 | 显示全部楼层
高大上
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|罗姆半导体技术社区

GMT+8, 2024-4-23 16:46 , Processed in 0.105997 second(s), 17 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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