牟曉東
霍爾傳感器是一種用來檢測磁場的傳感器,其內部磁場中有個霍爾半導體片,在恒定電流經過時(洛侖茲力的作用)就會產生電位差,即“霍爾電壓”。霍爾電壓會隨磁場強度的變化而變化——磁場越強,電壓就越高;磁場越弱,電壓也就越低。常見的霍爾傳感器有四個引腳,除了VCC正極和GND接地端外,另外兩個引腳分別標注為DO和AO,對應數字信號和模擬信號的輸入。利用霍爾傳感器檢測磁場時能夠產生數字或模擬信號的特性,我們可以在Arduino中分別設計實現“時速計”和“智能路燈”。
利用霍爾傳感器能夠對檢測到的磁場產生數字信號的特性,可以對“車輪”(由風扇模塊來代替)每分鐘轉動的圈數進行計數,然后就能計算出它的時速。實驗器材分為兩大部分:一部分是樹莓派帶動風扇進行勻速轉動,風扇的邊緣處通過熱熔膠粘貼上一小塊圓形磁鐵;另一部分是Arduino控制霍爾傳感器對旋轉的風扇磁鐵進行檢測并計數,最終計算出“車輪”的時速進行輸出。
實驗器材包括樹莓派3B+和古德微擴展板各一塊,ArduinoUNO一塊,KY-024霍爾傳感器一個,風扇模塊一個,紅色LED燈兩支,圓形小磁鐵一個,杜邦線若干。首先,將一支紅色LED燈插入樹莓派擴展板的5號引腳,注意“長腿正、短腿負”的規則;接著,通過杜邦線將風扇模塊的VCC、GND和IA端分別連接到樹莓派擴展板的24號引腳的VCC、GND和D端;最后,為樹莓派連接數據線,通電啟動操作系統。在瀏覽器中訪問古德微機器人網站,切換進入“積木”編程區,通過“控制5號小燈亮”和“控制24號GPIO輸出PWM800”等模塊,實現風扇的轉動(如圖1)。

在Arduino中先將另外一支紅色LED燈的長腿插入13號引腳、短腿插入GND引腳,然后通過杜邦線將霍爾傳感器的VCC、GND和DO端分別插入Arduino的5V、GND和7號引腳,最后插入數據線并與計算機的USB接口連接。
運行Mind+,點擊“擴展”按鈕將“主控板”中的“ArduinoUno”添加后開始進行圖形化編程。
在程序的初始化部分先設置串口波特率為9600,再新建“車輪半徑”“車輪周長”和“圈數的計算值”三個變量,并且根據測量將“車輪半徑”賦值為0.02(單位為米),即風扇模塊上小磁鐵與圓心間的距離是2厘米,“車輪周長”的計算公式即圓周長的求解公式,而變量“圈數的計算值”的初始值為0,作用是計算1分鐘內車輪轉過的圈數。
新建一個“重復執行1000次”的循環結構,內嵌的延時模塊控制每次循環均等待0.005秒,因此循環從開始到結束的時間是5秒鐘;在循環中設置變量“霍爾傳感器”,其值為“讀取數字引腳7”的信號,即檢測到磁場信號時就會變為1(高電平);然后對其值進行是否為1的判斷,條件成立的話則先將變量“圈數的計數值”進行“自增1”運算,再點亮紅色LED燈作為提示;循環結束后新建變量“車輪轉速”,并進行兩次計算和輸出:第一次計算的公式是變量“圈數的計數值”乘以60再除以5,這樣得到的結果是車輪每分鐘轉動的圈數,即“車輪轉速”,單位為“轉/分鐘”(r/min);第二次計算的公式是變量“車輪轉速”乘以60再乘以變量“車輪周長”后再除以1000,此時的計算結果就是真正的“時速”,單位為“千米/小時”(km/h),均通過串口監視器輸出顯示。
將程序保存為“Arduino‘時速計’.sb3”,上傳至Arduino中運行測試,注意此時要將轉動的風扇模塊靠近霍爾傳感器的檢測探頭(保證風扇每轉動一周時小磁鐵都能近距離經過),同時還要打開串口監視窗口。很快就會有結果輸出:“車輪的轉速為:1296.00轉/分鐘”“車輪的時速為:9.77千米/小時”(如圖2)。

保持實驗器材及連接方式不變,再來嘗試使用代碼編程實現Arduino“時速計”。首先,通過“int Hall_Sensor_pin = 7;”和“int Red_LED_pin = 13;”實現霍爾傳感器和LED與Arduino連接引腳號的聲明,再通過“int Hall_Sensor_State = 0;”將霍爾傳感器的初始狀態定義為0(低電平);由于待構建的循環是固定的1000次循環,而不是一直循環,因此要保持void loop()函數為空,代碼語句均在void setup()函數中完成——
設置霍爾傳感器的引腳為輸入:“pinMode(Hall_Sensor_pin,INPUT);”,設置紅色LED燈的引腳為輸出:“pinMode(Red_LED_pin,OUTPUT);”,設置串口波特率:“Serial.begin(9600);”;新建浮點型變量car_r(車輪半徑),賦值為0.02(單位為米);再新建浮點型變量car_c(車輪的周長),按照圓的周長公式進行計算賦值:“float car_c = 2*3.14*car_r;”;新建變量car_counter(對應圈數的計數值),初始值為0;使用for建立運行1000次的循環結構(for(int i=0;i<1000;i++)),語句“Hall_Sensor_State = digitalRead(Hall_Sensor_pin);”的作用是將霍爾傳感器檢測磁場的狀態寫入變量Hall_Sensor_State中(1對應高電平);然后通過if語句對Hall_Sensor_State的值進行判斷,如果該值是1:“if(Hall_Sensor_State==1)”,則執行兩條語句:一是變量car_counter進行自增1運算:“car_counter++;”,二是點亮紅色LED燈:“digitalWrite(Red_LED_pin,HIGH);”;接著,通過語句“delay(5);”延時5毫秒,并且熄滅LED燈:“digitalWrite(Red_LED_pin,LOW);”。
1000次循環結束后,新建浮點型變量car_v1(車輪的轉速),通過計算公式為其賦值為“car_counter*60/5”(單位為轉/分鐘),然后通過Serial.println將結果顯示輸出;再新建浮點型變量car_v2(車輪的時速),通過計算公式為其賦值為“car_v1*car_c*60/1000”(單位為千米/小時),同樣也是通過Serial.println將結果顯示輸出。
將程序代碼保存為“Speedometer.ino”,編譯上傳至Arduino進行測試,操作方法與圖形化編程方式類似,同樣注意要打開“工具”菜單下的串口監視器。此時可嘗試在古德微機器人網站的“積木”代碼中修改一下風扇模塊的轉速,比如提高至原來的3倍大小,最終測試的結果為:“車輪的轉速(轉/分鐘)為:3444.00”“車輪的時速(千米/小時)為:25.95”(如圖3)。

利用霍爾傳感器能夠對檢測到的磁場產生模擬量信號的特性,根據這個模擬量數據范圍再進行映射計算,對應驅動LED燈亮度的PWM值(0-255),最終實現有“人”(帶磁鐵)靠近時LED燈才發光、越靠近LED的燈光就越亮的“智能路燈”效果——當人遠離至一定范圍時(霍爾傳感器檢測不到有磁場信號),LED燈熄滅。
實驗器材包括ArduinoUNO一塊,KY-024霍爾傳感器一個,紅色LED燈一支,圓形小磁鐵一個,微型改錐一把,小型面包板一塊,杜邦線若干。首先,通過兩根杜邦線從Arduino中將5V和GND引至面包板的側邊紅色和藍色卡槽線;接著,將霍爾傳感器的VCC和GND端通過杜邦線連接至面包板的側邊卡槽,再將AO端連接至Arduino的A0模擬引腳;然后,將紅色LED燈的短腿插入面包板的藍色卡槽,長腿則通過杜邦線連接至Arduino的3號引腳(序號前標注有“~”表示支持PWM信號);最后,將圓形小磁鐵吸至微型改錐的尖頭處,放置待用,給Arduino插入數據線與計算機的USB接口連接。
運行Mind+,同樣也是先設置好串口的波特率為9600,然后在“循環執行”中先建立變量“霍爾傳感器”,賦值為“讀取模擬引腳A0”的數據,并且使用串口字符串輸出其讀取的磁場信號值;接著,新建變量“LED的PWM值”,為其賦值為“映射變量霍爾傳感器從[519,170]到[0,255]”,其中的519和170兩個數據是運行程序測試得出的,分別對應霍爾傳感器探頭周圍基本無磁場信號和小磁鐵最靠近探頭時讀取的模擬數據量,同樣也是將該值顯示輸出——“驅動LED的PWM值”;然后,通過“設置PWM引腳3輸出”模塊將變量“LED的PWM值”作為目標值,即控制LED燈發出對應強度的光線;最后,添加“等待0.01秒”的延時模塊。
將程序保存為“Arduino‘智能路燈’.sb3”,連接設備后再上傳至Arduino進行測試。當微型改錐帶動小磁鐵越來越靠近霍爾傳感器的探頭時,之前保持熄滅狀態的紅色LED燈會逐漸發光,而且是隨著二者距離的縮短而越來越亮,直至相互接觸時發出最強的紅光;當遠離時,LED燈的光線強度則會越來越弱,最終隨著距離的增大而熄滅。同時,在屏幕的串口顯示窗口上也會不斷顯示有相對應的提示信息:“從A0端讀取的磁場信號為:376.00”“驅動LED的PWM值為:104.00”,實現了“智能路燈”的功能(如圖4)。

依照上面Arduino“時速計”的圖形化與代碼編程方式,同樣可以對“智能路燈”進行代碼編程。