這篇文章來源于DevicePlus.com英語網站的翻譯稿。
不久前,我創(chuàng)建了RohmMultiSensor – Arduino庫,利用該庫可以輕松控制ROHM傳感器評估套件中的多個傳感器。第一篇文章發(fā)布以來,庫API發(fā)生了一些變化,使得測量更加容易。此外,RohmMultiSensor現(xiàn)在為每個傳感器和開發(fā)板提供3D打印外殼!
硬件
Arduino UNO或Mega
ROHM傳感器評估套件
3D打印傳感器外殼,詳細信息請參閱Thingiverse
軟件
Arduino IDE
RohmMultiSensor庫,詳細信息請參閱GitHub
工具
3D打印機
在本文中,我們將介紹該庫的一些新功能和改進功能。我們還會介紹傳感器和開發(fā)板的3D打印外殼。
新測量方法
首先解釋一下我如何——也許更重要的是為什么——改變了測量方式。在之前版本的庫中,您調用了一個函數,其返回值如下所示:
float* accelValue = acc.measure();
雖然這種方法非常直觀,而且對于大多數傳感器來說效果很好,但對于返回多個值的傳感器而言并不方便。比如,加速度計會返回三個值:X、Y和Z軸的加速度。然后,該函數必須返回一個包含三個值的數組。用C/C++術語來說,這意味著返回一個指向數組的指針,動態(tài)地分配一個新的數組。數組用完之后,我們需要手動釋放該數組以釋放內存。
delete[] accelValue;
在C/C++中動態(tài)分配數組并重新分配數組在C/C++中并不少見,但對于剛剛開始編程且尚未完全理解內存管理和指針等內容的人來說,這并不是最直觀的。
為了讓Arduino初學者便于使用該庫,測量系統(tǒng)發(fā)生了以下變化:每個傳感器仍然具有原始.measure()函數。但是,這個函數不帶參數,不返回任何東西。傳感器測量的值被存儲一個測量變量中,該變量是傳感器類的一部分。
sensorAcc.measure(); // 現(xiàn)在我們把數據放在測量變量中 Serial.println(sensorAcc.accelX); Serial.println(sensorAcc.accelY); Serial.println(sensorAcc.accelZ);
這個新系統(tǒng)也意味著庫能夠更好地處理異步測量和中斷。
改進的中斷支持
更新庫還改進了對中斷的支持。在舊版本中,唯一支持——實際上是需要——中斷的傳感器是BM1422GMV地磁傳感器。但是,幾乎所有使用I2C總線的傳感器都有某種形式的中斷。這就是為什么現(xiàn)在庫可以支持KX022加速度計的中斷功能,后續(xù)我會提供更多支持!
現(xiàn)在,實現(xiàn)中斷的方式非常簡單:每次Arduino接收到傳感器的中斷后,測量變量就會被更新。這個值一直有效,直到新中斷到達。此時,系統(tǒng)從傳感器讀取一個新值并保存。
以下代碼展示了如何將BM1422GMV和KX022與中斷一起使用。
// 定義所使用的傳感器 #define INCLUDE_BM1422GMV #define INCLUDE_KX022_1020 // 包含庫 #include // 用中斷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庫,我們還為傳感器制作了重要的外殼!憑借這些裝置,您可以將傳感器安裝在任何位置,然后使用線將它們連至開發(fā)板。如果您需要確保像加速度計和磁力計這樣的傳感器牢固安裝并提供精確測量,或者需要將傳感器開發(fā)板放在單獨的外殼中,這將非常有用。
將傳感器安裝到外殼中非常簡單。所有外殼都由兩部分組成:下半部分和上半部分。
圖1 KX022-1020或BM1422GMV等傳感器的通用外殼。左邊為下半部分,右邊為上半部分。
只需將傳感器插入外殼的下半部分,讓引腳突出另一側即可。
圖2 插入外殼下半部分的傳感器,底視圖(左)和頂視圖(右)
然后,用兩個M3螺栓將傳感器固定到位。
圖3 裝有兩個M3螺栓的傳感器,底視圖(左)和頂視圖(右)
現(xiàn)在只需要用M3螺栓將外殼的上半部分固定到下半部分。完成!外殼現(xiàn)在可以自由安裝在幾乎任何東西上。
圖4 裝配完成的傳感器外殼
有些傳感器,比如紫外線傳感器或顏色傳感器,需要與外界進行光學接觸。這些傳感器的外殼設計能夠實現(xiàn)這種光學接觸,如下圖所示。
圖5 裝配完成的UV傳感器外殼
當然,如果沒有開發(fā)板外殼,那么這個外殼清單就不完整!開發(fā)板外殼可以讓您將Arduino和ROHM傳感器評估開發(fā)板放入一個非常方便的箱子中,同時仍然能夠在上面安裝傳感器!
圖6 開發(fā)板外殼
圖7 傳感器開發(fā)板的頂蓋
圖8 傳感器開發(fā)板的底蓋
當然,還有很多需要改進的地方。如上文所述,許多其他傳感器也可以使用中斷,實現(xiàn)這些功能也不錯。另外,我們可以設法在運行程序(sketch)時重新配置傳感器設置,該功能也很有用。目前,這個過程只能在Arduino啟動、構建傳感器類時完成。
審核編輯:湯梓紅
-
傳感器
+關注
關注
2552文章
51288瀏覽量
755129 -
Rohm
+關注
關注
8文章
372瀏覽量
66120 -
Arduino
+關注
關注
188文章
6474瀏覽量
187425
發(fā)布評論請先 登錄
相關推薦
評論