牟曉東
在Arduino開源硬件編程中,常規(guī)實(shí)現(xiàn)方法是在Arduino IDE環(huán)境中進(jìn)行C語(yǔ)言(包括C++)式的代碼編程,代碼精簡(jiǎn)、效率比較高。中小學(xué)生通常是從圖形化編程入手,通過(guò)將高度集成編譯好的“積木”式模塊進(jìn)行組合來(lái)實(shí)現(xiàn)同樣的編程效果,比如Mind+、Mixly等等。除此之外,我們還可以在Python中借助PinPong庫(kù)模塊的引入進(jìn)行代碼編程,也能夠讓Arduino控制各種外設(shè)來(lái)實(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燈一支,三色公對(duì)母杜邦線各一根。首先將LED燈長(zhǎng)腿(正極)插入13號(hào)引腳,短腿(負(fù)極)插入與之相鄰的GND接地引腳;接著將三根杜邦線一端與紅外傳感器相連,紅色線將VCC引腳與Arduino的5V引腳連接,黑色線負(fù)責(zé)接地(兩端均連接GND),黃色線將紅外傳感器的OUT信號(hào)輸出端與Arduino的7號(hào)引腳相連;最后,通過(guò)數(shù)據(jù)線將Arduino與計(jì)算機(jī)USB接口連接,準(zhǔn)備開始編程(如圖1)。

首先,在Arduino IDE中進(jìn)行兩個(gè)變量的定義與賦值,語(yǔ)句“int led = 13;”對(duì)應(yīng)插接在13號(hào)引腳的紅色LED燈,語(yǔ)句“int irSensorPin = 7;”對(duì)應(yīng)插接在7號(hào)引腳的紅外傳感器;接著,在setup()函數(shù)中寫入兩個(gè)語(yǔ)句:“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高電平;高電平是對(duì)應(yīng)“沒(méi)有物體進(jìn)入檢測(cè)范圍”的情況,因此后面要寫一個(gè)“digitalWrite(led,LOW);”語(yǔ)句,控制LED燈處于低電平的熄滅狀態(tài);如果條件不成立,說(shuō)明紅外傳感器檢測(cè)到“有物體進(jìn)入”,則在else后面寫一個(gè)“digitalWrite(led,HIGH);”語(yǔ)句,控制LED燈處于高電平的發(fā)光狀態(tài)(如圖2)。

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

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

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