不久前,我創建了RohmMultiSensor – Arduino程式館,利用該程式館可以輕鬆控制ROHM感測器評估套件中的多個感測器。第一篇文章發佈以來,程式館API發生了一些變化,使得測量更加容易。此外,RohmMultiSensor現在為每個感測器和擴展板提供3D列印外殼!
在本文中,我們將介紹該程式館的一些新功能和改進功能。我們還會介紹感測器和擴展板的3D列印外殼。
首先解釋一下我如何——也許更重要的是為什麼——改變了測量方式。在之前版本的程式館中,您調用了一個函數,其返回值如下所示:
1 |
float* accelValue = acc.measure(); |
雖然這種方法非常直觀,而且對於大多數感測器來說效果很好,但對於返回多個值的感測器而言並不方便。比如,加速度計會返回三個值:X、Y和Z軸的加速度。然後,該函數必須返回一個包含三個值的陣列。用C/C++術語來說,這意味著返回一個指向陣列的指標,動態地分配一個新的陣列。陣列用完之後,我們需要手動釋放該陣列以釋放記憶體。
1 |
delete[] accelValue; |
在C/C++中動態分配陣列並重新分配陣列在C/C++中並不少見,但對於剛剛開始程式設計且尚未完全理解記憶體管理和指標等內容的人來說,這並不是最直觀的。
為了讓Arduino初學者便於使用該程式館,測量系統發生了以下變化:每個感測器仍然具有原始 .measure() 函數。但是,這個函數不帶參數,不返回任何東西。感測器測量的值被存儲一個測量變數中,該變數是感測器類的一部分。
1 2 3 4 5 6 |
sensorAcc.measure(); // 現在我們把資料放在測量變數中 Serial.println(sensorAcc.accelX); Serial.println(sensorAcc.accelY); Serial.println(sensorAcc.accelZ); |
這個新系統也意味著程式館能夠更好地處理非同步測量和中斷。
更新程式館還改進了對中斷的支援。在舊版本中,唯一支援——實際上是需要——中斷的感測器是BM1422GMV地磁感測器。但是,幾乎所有使用I2C匯流排的感測器都有某種形式的中斷。這就是為什麼現在程式館可以支援KX022加速度計的中斷功能,後續我會提供更多支援!
現在,實現中斷的方式非常簡單:每次Arduino接收到感測器的中斷後,測量變數就會被更新。這個值一直有效,直到新中斷到達。此時,系統從感測器讀取一個新值並保存。
以下代碼展示了如何將BM1422GMV和KX022與中斷一起使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
// 定義所使用的感測器 #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不需要中斷工作,因此可以禁用中斷!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// 定義所使用的感測器 #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留言或在本文下方進行評論!