牟曉東
霍爾傳感器是一種用來檢測磁場的傳感器,其內(nèi)部磁場中有個霍爾半導(dǎo)體片,在恒定電流經(jīng)過時(洛侖茲力的作用)就會產(chǎn)生電位差,即“霍爾電壓”?;魻栯妷簳S磁場強度的變化而變化——磁場越強,電壓就越高;磁場越弱,電壓也就越低。常見的霍爾傳感器有四個引腳,除了VCC正極和GND接地端外,另外兩個引腳分別標注為DO和AO,對應(yīng)數(shù)字信號和模擬信號的輸入。利用霍爾傳感器檢測磁場時能夠產(chǎn)生數(shù)字或模擬信號的特性,我們可以在Arduino中分別設(shè)計實現(xiàn)“時速計”和“智能路燈”。
利用霍爾傳感器能夠?qū)z測到的磁場產(chǎn)生數(shù)字信號的特性,可以對“車輪”(由風(fēng)扇模塊來代替)每分鐘轉(zhuǎn)動的圈數(shù)進行計數(shù),然后就能計算出它的時速。實驗器材分為兩大部分:一部分是樹莓派帶動風(fēng)扇進行勻速轉(zhuǎn)動,風(fēng)扇的邊緣處通過熱熔膠粘貼上一小塊圓形磁鐵;另一部分是Arduino控制霍爾傳感器對旋轉(zhuǎn)的風(fēng)扇磁鐵進行檢測并計數(shù),最終計算出“車輪”的時速進行輸出。
實驗器材包括樹莓派3B+和古德微擴展板各一塊,ArduinoUNO一塊,KY-024霍爾傳感器一個,風(fēng)扇模塊一個,紅色LED燈兩支,圓形小磁鐵一個,杜邦線若干。首先,將一支紅色LED燈插入樹莓派擴展板的5號引腳,注意“長腿正、短腿負”的規(guī)則;接著,通過杜邦線將風(fēng)扇模塊的VCC、GND和IA端分別連接到樹莓派擴展板的24號引腳的VCC、GND和D端;最后,為樹莓派連接數(shù)據(jù)線,通電啟動操作系統(tǒng)。在瀏覽器中訪問古德微機器人網(wǎng)站,切換進入“積木”編程區(qū),通過“控制5號小燈亮”和“控制24號GPIO輸出PWM800”等模塊,實現(xiàn)風(fēng)扇的轉(zhuǎn)動(如圖1)。
在Arduino中先將另外一支紅色LED燈的長腿插入13號引腳、短腿插入GND引腳,然后通過杜邦線將霍爾傳感器的VCC、GND和DO端分別插入Arduino的5V、GND和7號引腳,最后插入數(shù)據(jù)線并與計算機的USB接口連接。
運行Mind+,點擊“擴展”按鈕將“主控板”中的“ArduinoUno”添加后開始進行圖形化編程。
在程序的初始化部分先設(shè)置串口波特率為9600,再新建“車輪半徑”“車輪周長”和“圈數(shù)的計算值”三個變量,并且根據(jù)測量將“車輪半徑”賦值為0.02(單位為米),即風(fēng)扇模塊上小磁鐵與圓心間的距離是2厘米,“車輪周長”的計算公式即圓周長的求解公式,而變量“圈數(shù)的計算值”的初始值為0,作用是計算1分鐘內(nèi)車輪轉(zhuǎn)過的圈數(shù)。
新建一個“重復(fù)執(zhí)行1000次”的循環(huán)結(jié)構(gòu),內(nèi)嵌的延時模塊控制每次循環(huán)均等待0.005秒,因此循環(huán)從開始到結(jié)束的時間是5秒鐘;在循環(huán)中設(shè)置變量“霍爾傳感器”,其值為“讀取數(shù)字引腳7”的信號,即檢測到磁場信號時就會變?yōu)?(高電平);然后對其值進行是否為1的判斷,條件成立的話則先將變量“圈數(shù)的計數(shù)值”進行“自增1”運算,再點亮紅色LED燈作為提示;循環(huán)結(jié)束后新建變量“車輪轉(zhuǎn)速”,并進行兩次計算和輸出:第一次計算的公式是變量“圈數(shù)的計數(shù)值”乘以60再除以5,這樣得到的結(jié)果是車輪每分鐘轉(zhuǎn)動的圈數(shù),即“車輪轉(zhuǎn)速”,單位為“轉(zhuǎn)/分鐘”(r/min);第二次計算的公式是變量“車輪轉(zhuǎn)速”乘以60再乘以變量“車輪周長”后再除以1000,此時的計算結(jié)果就是真正的“時速”,單位為“千米/小時”(km/h),均通過串口監(jiān)視器輸出顯示。
將程序保存為“Arduino‘時速計’.sb3”,上傳至Arduino中運行測試,注意此時要將轉(zhuǎn)動的風(fēng)扇模塊靠近霍爾傳感器的檢測探頭(保證風(fēng)扇每轉(zhuǎn)動一周時小磁鐵都能近距離經(jīng)過),同時還要打開串口監(jiān)視窗口。很快就會有結(jié)果輸出:“車輪的轉(zhuǎn)速為:1296.00轉(zhuǎn)/分鐘”“車輪的時速為:9.77千米/小時”(如圖2)。
保持實驗器材及連接方式不變,再來嘗試使用代碼編程實現(xiàn)Arduino“時速計”。首先,通過“int Hall_Sensor_pin = 7;”和“int Red_LED_pin = 13;”實現(xiàn)霍爾傳感器和LED與Arduino連接引腳號的聲明,再通過“int Hall_Sensor_State = 0;”將霍爾傳感器的初始狀態(tài)定義為0(低電平);由于待構(gòu)建的循環(huán)是固定的1000次循環(huán),而不是一直循環(huán),因此要保持void loop()函數(shù)為空,代碼語句均在void setup()函數(shù)中完成——
設(shè)置霍爾傳感器的引腳為輸入:“pinMode(Hall_Sensor_pin,INPUT);”,設(shè)置紅色LED燈的引腳為輸出:“pinMode(Red_LED_pin,OUTPUT);”,設(shè)置串口波特率:“Serial.begin(9600);”;新建浮點型變量car_r(車輪半徑),賦值為0.02(單位為米);再新建浮點型變量car_c(車輪的周長),按照圓的周長公式進行計算賦值:“float car_c = 2*3.14*car_r;”;新建變量car_counter(對應(yīng)圈數(shù)的計數(shù)值),初始值為0;使用for建立運行1000次的循環(huán)結(jié)構(gòu)(for(int i=0;i<1000;i++)),語句“Hall_Sensor_State = digitalRead(Hall_Sensor_pin);”的作用是將霍爾傳感器檢測磁場的狀態(tài)寫入變量Hall_Sensor_State中(1對應(yīng)高電平);然后通過if語句對Hall_Sensor_State的值進行判斷,如果該值是1:“if(Hall_Sensor_State==1)”,則執(zhí)行兩條語句:一是變量car_counter進行自增1運算:“car_counter++;”,二是點亮紅色LED燈:“digitalWrite(Red_LED_pin,HIGH);”;接著,通過語句“delay(5);”延時5毫秒,并且熄滅LED燈:“digitalWrite(Red_LED_pin,LOW);”。
1000次循環(huán)結(jié)束后,新建浮點型變量car_v1(車輪的轉(zhuǎn)速),通過計算公式為其賦值為“car_counter*60/5”(單位為轉(zhuǎn)/分鐘),然后通過Serial.println將結(jié)果顯示輸出;再新建浮點型變量car_v2(車輪的時速),通過計算公式為其賦值為“car_v1*car_c*60/1000”(單位為千米/小時),同樣也是通過Serial.println將結(jié)果顯示輸出。
將程序代碼保存為“Speedometer.ino”,編譯上傳至Arduino進行測試,操作方法與圖形化編程方式類似,同樣注意要打開“工具”菜單下的串口監(jiān)視器。此時可嘗試在古德微機器人網(wǎng)站的“積木”代碼中修改一下風(fēng)扇模塊的轉(zhuǎn)速,比如提高至原來的3倍大小,最終測試的結(jié)果為:“車輪的轉(zhuǎn)速(轉(zhuǎn)/分鐘)為:3444.00”“車輪的時速(千米/小時)為:25.95”(如圖3)。
利用霍爾傳感器能夠?qū)z測到的磁場產(chǎn)生模擬量信號的特性,根據(jù)這個模擬量數(shù)據(jù)范圍再進行映射計算,對應(yīng)驅(qū)動LED燈亮度的PWM值(0-255),最終實現(xiàn)有“人”(帶磁鐵)靠近時LED燈才發(fā)光、越靠近LED的燈光就越亮的“智能路燈”效果——當人遠離至一定范圍時(霍爾傳感器檢測不到有磁場信號),LED燈熄滅。
實驗器材包括ArduinoUNO一塊,KY-024霍爾傳感器一個,紅色LED燈一支,圓形小磁鐵一個,微型改錐一把,小型面包板一塊,杜邦線若干。首先,通過兩根杜邦線從Arduino中將5V和GND引至面包板的側(cè)邊紅色和藍色卡槽線;接著,將霍爾傳感器的VCC和GND端通過杜邦線連接至面包板的側(cè)邊卡槽,再將AO端連接至Arduino的A0模擬引腳;然后,將紅色LED燈的短腿插入面包板的藍色卡槽,長腿則通過杜邦線連接至Arduino的3號引腳(序號前標注有“~”表示支持PWM信號);最后,將圓形小磁鐵吸至微型改錐的尖頭處,放置待用,給Arduino插入數(shù)據(jù)線與計算機的USB接口連接。
運行Mind+,同樣也是先設(shè)置好串口的波特率為9600,然后在“循環(huán)執(zhí)行”中先建立變量“霍爾傳感器”,賦值為“讀取模擬引腳A0”的數(shù)據(jù),并且使用串口字符串輸出其讀取的磁場信號值;接著,新建變量“LED的PWM值”,為其賦值為“映射變量霍爾傳感器從[519,170]到[0,255]”,其中的519和170兩個數(shù)據(jù)是運行程序測試得出的,分別對應(yīng)霍爾傳感器探頭周圍基本無磁場信號和小磁鐵最靠近探頭時讀取的模擬數(shù)據(jù)量,同樣也是將該值顯示輸出——“驅(qū)動LED的PWM值”;然后,通過“設(shè)置PWM引腳3輸出”模塊將變量“LED的PWM值”作為目標值,即控制LED燈發(fā)出對應(yīng)強度的光線;最后,添加“等待0.01秒”的延時模塊。
將程序保存為“Arduino‘智能路燈’.sb3”,連接設(shè)備后再上傳至Arduino進行測試。當微型改錐帶動小磁鐵越來越靠近霍爾傳感器的探頭時,之前保持熄滅狀態(tài)的紅色LED燈會逐漸發(fā)光,而且是隨著二者距離的縮短而越來越亮,直至相互接觸時發(fā)出最強的紅光;當遠離時,LED燈的光線強度則會越來越弱,最終隨著距離的增大而熄滅。同時,在屏幕的串口顯示窗口上也會不斷顯示有相對應(yīng)的提示信息:“從A0端讀取的磁場信號為:376.00”“驅(qū)動LED的PWM值為:104.00”,實現(xiàn)了“智能路燈”的功能(如圖4)。
依照上面Arduino“時速計”的圖形化與代碼編程方式,同樣可以對“智能路燈”進行代碼編程。