牟曉東
在Arduino開源硬件編程中,常規(guī)實(shí)現(xiàn)方法是在Arduino IDE環(huán)境中進(jìn)行C語言(包括C++)式的代碼編程,代碼精簡、效率比較高。中小學(xué)生通常是從圖形化編程入手,通過將高度集成編譯好的“積木”式模塊進(jìn)行組合來實(shí)現(xiàn)同樣的編程效果,比如Mind+、Mixly等等。除此之外,我們還可以在Python中借助PinPong庫模塊的引入進(jìn)行代碼編程,也能夠讓Arduino控制各種外設(shè)來實(shí)現(xiàn)非常豐富的功能。以“紅外感應(yīng)燈”為例——當(dāng)有物體靠近(默認(rèn)為2~30cm范圍)時(shí),Arduino控制LED燈發(fā)光;否則,LED燈保持熄滅狀態(tài)。
實(shí)驗(yàn)器材:Arduino UNO主板一個(gè),紅外線傳感器一個(gè),紅色LED燈一支,三色公對母杜邦線各一根。首先將LED燈長腿(正極)插入13號(hào)引腳,短腿(負(fù)極)插入與之相鄰的GND接地引腳;接著將三根杜邦線一端與紅外傳感器相連,紅色線將VCC引腳與Arduino的5V引腳連接,黑色線負(fù)責(zé)接地(兩端均連接GND),黃色線將紅外傳感器的OUT信號(hào)輸出端與Arduino的7號(hào)引腳相連;最后,通過數(shù)據(jù)線將Arduino與計(jì)算機(jī)USB接口連接,準(zhǔn)備開始編程(如圖1)。

首先,在Arduino IDE中進(jìn)行兩個(gè)變量的定義與賦值,語句“int led = 13;”對應(yīng)插接在13號(hào)引腳的紅色LED燈,語句“int irSensorPin = 7;”對應(yīng)插接在7號(hào)引腳的紅外傳感器;接著,在setup()函數(shù)中寫入兩個(gè)語句:“pinMode(led,OUTPUT);”的作用是聲明LED燈的引腳(13號(hào))為輸出模式,而“pinMode(irSensorPin, INPUT);”的作用是聲明紅外傳感器引腳(7號(hào))為輸入模式。
最后,在loop()函數(shù)中寫入一個(gè)“if…else…”選擇結(jié)構(gòu),其中的判斷條件是“digitalRead(irSensorPin) == HIGH”,即判斷從紅外傳感器中讀取的數(shù)字信號(hào)是否為HIGH高電平;高電平是對應(yīng)“沒有物體進(jìn)入檢測范圍”的情況,因此后面要寫一個(gè)“digitalWrite(led,LOW);”語句,控制LED燈處于低電平的熄滅狀態(tài);如果條件不成立,說明紅外傳感器檢測到“有物體進(jìn)入”,則在else后面寫一個(gè)“digitalWrite(led,HIGH);”語句,控制LED燈處于高電平的發(fā)光狀態(tài)(如圖2)。

將程序編譯并上傳,對紅外感應(yīng)燈進(jìn)行檢測:當(dāng)沒有物體靠近時(shí),LED燈熄滅;而當(dāng)有物體進(jìn)入檢測范圍時(shí),LED燈開始發(fā)光(如圖3),直到物體移出后又熄滅。

借助于PinPong第三方庫模塊,我們可以非常方便地在Python中對Arduino進(jìn)行代碼編程。首先需要在Python中進(jìn)行PinPong庫模塊的安裝,方法是在Python的腳本安裝目錄(比如:C:\Users\ZYYZ-BJ\AppData\Local\Programs\Pyth
on\Python38\Scripts)中按住Shift鍵的同時(shí),在空白處點(diǎn)擊右鍵并選擇“在此處打開命令窗口”;接著在彈出的CMD窗口中輸入命令“pip install pinpong”,回車后即可開始安裝,成功后會(huì)顯示“Successfully installed”的提示信息(如圖4)。

首先,進(jìn)入Python IDLE編程環(huán)境后新建一個(gè)Python文件,導(dǎo)入time和pinPong庫模塊:“import time”和“from pinpong.board import Board,Pin”;接著,通過語句“Board(“uno”).begin()”來實(shí)現(xiàn)對Arduino uno板型的初始化操作,同時(shí)還會(huì)自動(dòng)識(shí)別端口號(hào)(比如COM9);然后,建立led和irSensor兩個(gè)變量,語句“l(fā)ed = Pin(Pin.D13, Pin.OUT)”的作用是設(shè)置連接在13號(hào)引腳的LED燈為信號(hào)輸出端,語句“irSensor = Pin(Pin.D7, Pin.IN)”的作用是設(shè)置連接在7號(hào)數(shù)字引腳的紅外傳感器為信號(hào)輸入端。
最后,在“while True:”循環(huán)結(jié)構(gòu)中先建立變量Sensor_Value,并為其賦值為“irSensor.read_digital()”,作用是讀取紅外傳感器所監(jiān)測到的數(shù)字信號(hào);然后建立一個(gè)“if…else…”選擇結(jié)構(gòu),對變量Sensor_Value的值進(jìn)行“是否等于1”的判斷,條件成立的話,說明未檢測到有物體進(jìn)入,則執(zhí)行語句“l(fā)ed.write_digital(0)”,向LED燈的13號(hào)引腳寫入低電平0,即保持熄滅狀態(tài);反之,則通過語句“l(fā)ed.write_digital(1)”向13號(hào)引腳寫入高電平1,控制LED燈發(fā)光。語句“time.sleep(0.1)”的作用是控制每次循環(huán)運(yùn)行均延遲0.1秒,防止消耗過多的系統(tǒng)資源而造成“死機(jī)”。
將程序保存后按功能鍵F5運(yùn)行程序,Arduino紅外感應(yīng)燈開始“工作”:有物體靠近,亮燈;反之,熄滅。
運(yùn)行Mind+進(jìn)入圖形化編程界面,難度比較低,直接通過“積木”塊語句的拖動(dòng)和組合:
首先在左側(cè)通過點(diǎn)擊“擴(kuò)展”項(xiàng)添加“主控板”下的“Arduino Uno”,返回后在“循環(huán)執(zhí)行”中建立一個(gè)“如果…那么執(zhí)行…否則…”選擇結(jié)構(gòu),同樣是對插接在7號(hào)引腳的紅外傳感器進(jìn)行數(shù)字信號(hào)讀取;如果值為1,說明沒有物體進(jìn)入有效檢測范圍,則控制插接在13號(hào)引腳的LED燈熄滅——“輸出為低電平”;反之,則“輸出為高電平”,即控制LED燈發(fā)光(如圖5)。

程序編寫完畢后點(diǎn)擊“上傳到設(shè)備”項(xiàng),當(dāng)出現(xiàn)“上傳成功”提示后,Arduino紅外感應(yīng)燈可以根據(jù)對物體的監(jiān)測進(jìn)行“熄滅、發(fā)光”的自動(dòng)切換,與之前使用Arduino IDE和Python代碼編程所實(shí)現(xiàn)的效果完全一致,大家不妨一試。