牟曉東
在Arduino開源硬件編程中,常規(guī)實現(xiàn)方法是在Arduino IDE環(huán)境中進行C語言(包括C++)式的代碼編程,代碼精簡、效率比較高。中小學(xué)生通常是從圖形化編程入手,通過將高度集成編譯好的“積木”式模塊進行組合來實現(xiàn)同樣的編程效果,比如Mind+、Mixly等等。除此之外,我們還可以在Python中借助PinPong庫模塊的引入進行代碼編程,也能夠讓Arduino控制各種外設(shè)來實現(xiàn)非常豐富的功能。以“紅外感應(yīng)燈”為例——當(dāng)有物體靠近(默認為2~30cm范圍)時,Arduino控制LED燈發(fā)光;否則,LED燈保持熄滅狀態(tài)。
實驗器材:Arduino UNO主板一個,紅外線傳感器一個,紅色LED燈一支,三色公對母杜邦線各一根。首先將LED燈長腿(正極)插入13號引腳,短腿(負極)插入與之相鄰的GND接地引腳;接著將三根杜邦線一端與紅外傳感器相連,紅色線將VCC引腳與Arduino的5V引腳連接,黑色線負責(zé)接地(兩端均連接GND),黃色線將紅外傳感器的OUT信號輸出端與Arduino的7號引腳相連;最后,通過數(shù)據(jù)線將Arduino與計算機USB接口連接,準(zhǔn)備開始編程(如圖1)。
首先,在Arduino IDE中進行兩個變量的定義與賦值,語句“int led = 13;”對應(yīng)插接在13號引腳的紅色LED燈,語句“int irSensorPin = 7;”對應(yīng)插接在7號引腳的紅外傳感器;接著,在setup()函數(shù)中寫入兩個語句:“pinMode(led,OUTPUT);”的作用是聲明LED燈的引腳(13號)為輸出模式,而“pinMode(irSensorPin, INPUT);”的作用是聲明紅外傳感器引腳(7號)為輸入模式。
最后,在loop()函數(shù)中寫入一個“if…else…”選擇結(jié)構(gòu),其中的判斷條件是“digitalRead(irSensorPin) == HIGH”,即判斷從紅外傳感器中讀取的數(shù)字信號是否為HIGH高電平;高電平是對應(yīng)“沒有物體進入檢測范圍”的情況,因此后面要寫一個“digitalWrite(led,LOW);”語句,控制LED燈處于低電平的熄滅狀態(tài);如果條件不成立,說明紅外傳感器檢測到“有物體進入”,則在else后面寫一個“digitalWrite(led,HIGH);”語句,控制LED燈處于高電平的發(fā)光狀態(tài)(如圖2)。
將程序編譯并上傳,對紅外感應(yīng)燈進行檢測:當(dāng)沒有物體靠近時,LED燈熄滅;而當(dāng)有物體進入檢測范圍時,LED燈開始發(fā)光(如圖3),直到物體移出后又熄滅。
借助于PinPong第三方庫模塊,我們可以非常方便地在Python中對Arduino進行代碼編程。首先需要在Python中進行PinPong庫模塊的安裝,方法是在Python的腳本安裝目錄(比如:C:\Users\ZYYZ-BJ\AppData\Local\Programs\Pyth
on\Python38\Scripts)中按住Shift鍵的同時,在空白處點擊右鍵并選擇“在此處打開命令窗口”;接著在彈出的CMD窗口中輸入命令“pip install pinpong”,回車后即可開始安裝,成功后會顯示“Successfully installed”的提示信息(如圖4)。
首先,進入Python IDLE編程環(huán)境后新建一個Python文件,導(dǎo)入time和pinPong庫模塊:“import time”和“from pinpong.board import Board,Pin”;接著,通過語句“Board(“uno”).begin()”來實現(xiàn)對Arduino uno板型的初始化操作,同時還會自動識別端口號(比如COM9);然后,建立led和irSensor兩個變量,語句“l(fā)ed = Pin(Pin.D13, Pin.OUT)”的作用是設(shè)置連接在13號引腳的LED燈為信號輸出端,語句“irSensor = Pin(Pin.D7, Pin.IN)”的作用是設(shè)置連接在7號數(shù)字引腳的紅外傳感器為信號輸入端。
最后,在“while True:”循環(huán)結(jié)構(gòu)中先建立變量Sensor_Value,并為其賦值為“irSensor.read_digital()”,作用是讀取紅外傳感器所監(jiān)測到的數(shù)字信號;然后建立一個“if…else…”選擇結(jié)構(gòu),對變量Sensor_Value的值進行“是否等于1”的判斷,條件成立的話,說明未檢測到有物體進入,則執(zhí)行語句“l(fā)ed.write_digital(0)”,向LED燈的13號引腳寫入低電平0,即保持熄滅狀態(tài);反之,則通過語句“l(fā)ed.write_digital(1)”向13號引腳寫入高電平1,控制LED燈發(fā)光。語句“time.sleep(0.1)”的作用是控制每次循環(huán)運行均延遲0.1秒,防止消耗過多的系統(tǒng)資源而造成“死機”。
將程序保存后按功能鍵F5運行程序,Arduino紅外感應(yīng)燈開始“工作”:有物體靠近,亮燈;反之,熄滅。
運行Mind+進入圖形化編程界面,難度比較低,直接通過“積木”塊語句的拖動和組合:
首先在左側(cè)通過點擊“擴展”項添加“主控板”下的“Arduino Uno”,返回后在“循環(huán)執(zhí)行”中建立一個“如果…那么執(zhí)行…否則…”選擇結(jié)構(gòu),同樣是對插接在7號引腳的紅外傳感器進行數(shù)字信號讀取;如果值為1,說明沒有物體進入有效檢測范圍,則控制插接在13號引腳的LED燈熄滅——“輸出為低電平”;反之,則“輸出為高電平”,即控制LED燈發(fā)光(如圖5)。
程序編寫完畢后點擊“上傳到設(shè)備”項,當(dāng)出現(xiàn)“上傳成功”提示后,Arduino紅外感應(yīng)燈可以根據(jù)對物體的監(jiān)測進行“熄滅、發(fā)光”的自動切換,與之前使用Arduino IDE和Python代碼編程所實現(xiàn)的效果完全一致,大家不妨一試。