這篇文章來(lái)源于DevicePlus.com英語(yǔ)網(wǎng)站的翻譯稿。

不久前,我創(chuàng)建了RohmMultiSensor – Arduino庫(kù),利用該庫(kù)可以輕松控制ROHM傳感器評(píng)估套件中的多個(gè)傳感器。第一篇文章發(fā)布以來(lái),庫(kù)API發(fā)生了一些變化,使得測(cè)量更加容易。此外,RohmMultiSensor現(xiàn)在為每個(gè)傳感器和開(kāi)發(fā)板提供3D打印外殼!
硬件
Arduino UNO或Mega
ROHM傳感器評(píng)估套件
3D打印傳感器外殼,詳細(xì)信息請(qǐng)參閱Thingiverse
軟件
Arduino IDE
RohmMultiSensor庫(kù),詳細(xì)信息請(qǐng)參閱GitHub
工具
3D打印機(jī)
在本文中,我們將介紹該庫(kù)的一些新功能和改進(jìn)功能。我們還會(huì)介紹傳感器和開(kāi)發(fā)板的3D打印外殼。
新測(cè)量方法
首先解釋一下我如何——也許更重要的是為什么——改變了測(cè)量方式。在之前版本的庫(kù)中,您調(diào)用了一個(gè)函數(shù),其返回值如下所示:
float* accelValue = acc.measure();
雖然這種方法非常直觀,而且對(duì)于大多數(shù)傳感器來(lái)說(shuō)效果很好,但對(duì)于返回多個(gè)值的傳感器而言并不方便。比如,加速度計(jì)會(huì)返回三個(gè)值:X、Y和Z軸的加速度。然后,該函數(shù)必須返回一個(gè)包含三個(gè)值的數(shù)組。用C/C++術(shù)語(yǔ)來(lái)說(shuō),這意味著返回一個(gè)指向數(shù)組的指針,動(dòng)態(tài)地分配一個(gè)新的數(shù)組。數(shù)組用完之后,我們需要手動(dòng)釋放該數(shù)組以釋放內(nèi)存。
delete[] accelValue;
在C/C++中動(dòng)態(tài)分配數(shù)組并重新分配數(shù)組在C/C++中并不少見(jiàn),但對(duì)于剛剛開(kāi)始編程且尚未完全理解內(nèi)存管理和指針等內(nèi)容的人來(lái)說(shuō),這并不是最直觀的。
為了讓Arduino初學(xué)者便于使用該庫(kù),測(cè)量系統(tǒng)發(fā)生了以下變化:每個(gè)傳感器仍然具有原始.measure()函數(shù)。但是,這個(gè)函數(shù)不帶參數(shù),不返回任何東西。傳感器測(cè)量的值被存儲(chǔ)一個(gè)測(cè)量變量中,該變量是傳感器類(lèi)的一部分。
sensorAcc.measure(); // 現(xiàn)在我們把數(shù)據(jù)放在測(cè)量變量中 Serial.println(sensorAcc.accelX); Serial.println(sensorAcc.accelY); Serial.println(sensorAcc.accelZ);
這個(gè)新系統(tǒng)也意味著庫(kù)能夠更好地處理異步測(cè)量和中斷。
改進(jìn)的中斷支持
更新庫(kù)還改進(jìn)了對(duì)中斷的支持。在舊版本中,唯一支持——實(shí)際上是需要——中斷的傳感器是BM1422GMV地磁傳感器。但是,幾乎所有使用I2C總線的傳感器都有某種形式的中斷。這就是為什么現(xiàn)在庫(kù)可以支持KX022加速度計(jì)的中斷功能,后續(xù)我會(huì)提供更多支持!
現(xiàn)在,實(shí)現(xiàn)中斷的方式非常簡(jiǎn)單:每次Arduino接收到傳感器的中斷后,測(cè)量變量就會(huì)被更新。這個(gè)值一直有效,直到新中斷到達(dá)。此時(shí),系統(tǒng)從傳感器讀取一個(gè)新值并保存。
以下代碼展示了如何將BM1422GMV和KX022與中斷一起使用。
// 定義所使用的傳感器
#define INCLUDE_BM1422GMV
#define INCLUDE_KX022_1020
// 包含庫(kù)
#include
// 用中斷0實(shí)例化KX022-1020類(lèi)
KX022_1020 sensorAcc(INT_0);
// 用中斷1實(shí)例化BM1422GMV類(lèi)
BM1422GMV sensorMag(INT_1);
// 定義中斷服務(wù)程序
void acc_isr(void) {
sensorAcc.setFlagDrdy();
}
void mag_isr(void) {
sensorMag.setFlagDrdy();
}
void setup() {
// 開(kāi)始串行通信
Serial.begin(9600);
Serial.println();
// 開(kāi)啟TWI(I2C)接口。
// 調(diào)用.init()之前,必須調(diào)用這個(gè)函數(shù)!
Wire.begin();
// 用默認(rèn)值初始化KX022-1020和BM1422GMV
// 我們必須為.init()提供中斷服務(wù)例程
sensorAcc.init(acc_isr);
sensorMag.init(mag_isr);
Serial.println("X[g]tY[g]tZ[g]tX[uT]tY[uT]tZ[uT]");
}
void loop() {
// 測(cè)量傳感器數(shù)值
sensorAcc.measure();
sensorMag.measure();
// 輸出所測(cè)量的數(shù)值
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);
// 下次測(cè)量之前等待100 ms
delay(100);
}
由于KX022不需要中斷工作,因此可以禁用中斷!
// 定義所使用的傳感器
#define INCLUDE_KX022_1020
// 包含庫(kù)
#include RohmMultiSensor.h
// 用默認(rèn)設(shè)置實(shí)例化傳感器類(lèi)
KX022_1020 sensorAcc;
// 上述指令相當(dāng)于
// KX022_1020 acc(INT_NONE);
void setup() {
// 開(kāi)始串行通信
Serial.begin(9600);
Serial.println();
// 開(kāi)啟TWI(I2C)接口。
// 調(diào)用.init()之前,必須調(diào)用這個(gè)函數(shù)!
Wire.begin();
// 用默認(rèn)值初始化KX022-1020
sensorAcc.init();
Serial.println("X[g]tY[g]tZ[g]");
}
void loop() {
// 測(cè)量傳感器數(shù)值
sensorAcc.measure();
// 將值打印至串口
Serial.print(sensorAcc.accelX);
Serial.print('t');
Serial.print(sensorAcc.accelY);
Serial.print('t');
Serial.println(sensorAcc.accelZ);
// 下次測(cè)量之前等待100 ms
delay(100);
}
傳感器外殼
除了RohmMultiSensor庫(kù),我們還為傳感器制作了重要的外殼!憑借這些裝置,您可以將傳感器安裝在任何位置,然后使用線將它們連至開(kāi)發(fā)板。如果您需要確保像加速度計(jì)和磁力計(jì)這樣的傳感器牢固安裝并提供精確測(cè)量,或者需要將傳感器開(kāi)發(fā)板放在單獨(dú)的外殼中,這將非常有用。
將傳感器安裝到外殼中非常簡(jiǎn)單。所有外殼都由兩部分組成:下半部分和上半部分。

圖1 KX022-1020或BM1422GMV等傳感器的通用外殼。左邊為下半部分,右邊為上半部分。
只需將傳感器插入外殼的下半部分,讓引腳突出另一側(cè)即可。

圖2 插入外殼下半部分的傳感器,底視圖(左)和頂視圖(右)
然后,用兩個(gè)M3螺栓將傳感器固定到位。

圖3 裝有兩個(gè)M3螺栓的傳感器,底視圖(左)和頂視圖(右)
現(xiàn)在只需要用M3螺栓將外殼的上半部分固定到下半部分。完成!外殼現(xiàn)在可以自由安裝在幾乎任何東西上。

圖4 裝配完成的傳感器外殼
有些傳感器,比如紫外線傳感器或顏色傳感器,需要與外界進(jìn)行光學(xué)接觸。這些傳感器的外殼設(shè)計(jì)能夠?qū)崿F(xiàn)這種光學(xué)接觸,如下圖所示。

圖5 裝配完成的UV傳感器外殼
當(dāng)然,如果沒(méi)有開(kāi)發(fā)板外殼,那么這個(gè)外殼清單就不完整!開(kāi)發(fā)板外殼可以讓您將Arduino和ROHM傳感器評(píng)估開(kāi)發(fā)板放入一個(gè)非常方便的箱子中,同時(shí)仍然能夠在上面安裝傳感器!

圖6 開(kāi)發(fā)板外殼

圖7 傳感器開(kāi)發(fā)板的頂蓋

圖8 傳感器開(kāi)發(fā)板的底蓋
當(dāng)然,還有很多需要改進(jìn)的地方。如上文所述,許多其他傳感器也可以使用中斷,實(shí)現(xiàn)這些功能也不錯(cuò)。另外,我們可以設(shè)法在運(yùn)行程序(sketch)時(shí)重新配置傳感器設(shè)置,該功能也很有用。目前,這個(gè)過(guò)程只能在Arduino啟動(dòng)、構(gòu)建傳感器類(lèi)時(shí)完成。
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2573文章
54056瀏覽量
782979 -
Rohm
+關(guān)注
關(guān)注
8文章
393瀏覽量
67512 -
Arduino
+關(guān)注
關(guān)注
190文章
6512瀏覽量
195457
發(fā)布評(píng)論請(qǐng)先 登錄
3D打印外殼資料
3D傳感器有哪些類(lèi)型
快速了解3D力度感測(cè)技術(shù)廠商Peratech推出3D力度觸摸傳感器
多個(gè)3D智能傳感器組網(wǎng)的多傳感器網(wǎng)絡(luò)介紹
3D視覺(jué)傳感器的精度是指什么
選擇3D傳感器時(shí)需要注意什么
創(chuàng)建3D打印智能燈絲傳感器的教程
利用Arduino Create和ROHM傳感器評(píng)估套件制作智能花園系統(tǒng)
用ROHM Arduino傳感器套件打造DIY萬(wàn)圣節(jié)僵尸面具
采用ROHM傳感器套件的DIY Arduino家庭安防系統(tǒng) 第1部分 機(jī)制
利用ROHM傳感器評(píng)估套件實(shí)現(xiàn)UCLA AirMouse–第2部分
3D霍爾傳感器與三軸的霍爾開(kāi)關(guān)傳感器有什么區(qū)別和聯(lián)系
?TMAG5170UEVM 3D霍爾效應(yīng)傳感器評(píng)估模塊(EVM)數(shù)據(jù)手冊(cè)總結(jié)

ROHM傳感器評(píng)估套件的3D外殼以及RohmMultiSensor庫(kù)更新
評(píng)論