Python可以這樣玩(19):電位計實驗
這個單元是屬於基礎 Arduino 的最後一個單元,元我們會一次性談完 Python 如何透過 Firmata 去控制不同類型的 Arduino 腳位。還記得之前討論過 pinMode() 函數吧,我們透過該 AVR 函數去設定腳位是 INPUT 還是 OUTPUT,在Python,則可以透過下面兩種方式來設定腳位。
我們可以透過設定開發板物件:
Board.analog[2].mode
= INPUT
Board.digital[3].mode
= OUTPUT
Board.digital[5].mode
= PWM
Board.digital[10].mode
= SERVO
或是直接設定腳位物件:
A2
= board.get_pin('a:2:i') # a 代表類比,
i 代表 input
D3
= board.get_pin('d:10:o') # d 代表數位,
o 代表
output
D5
= board.get_pin('d:11:p') # p 代表PWM
D10
= board.get_pin('d:12:s') # s 代表SERVO
PWM我們在前面的單元已經介紹過,而 SERVO
我們會在未來介紹機器手臂的單元再介紹。
我們雖然已經介紹了很多種小實驗,但是還沒有談到如何透過 Analog 腳未來讀取資料,我們現在就要透過一個可變電阻來實現。請先按照下圖連接:
可變電阻有三個腳,左右腳位分別是5V與GND(既然是電阻,故沒有方向性),中間的腳位則是類比輸出。
接好之後就可以插上USB,然後將 Standart
Firmata 上傳。成功之後我們就用 Python 來測試,程式碼如下:
from
pyfirmata import Arduino, util
from
time import sleep
#
Setting up the Arduino board
port
= 'COM3'
board
= Arduino(port)
#
Need to give some time to pyFirmata and Arduino to synchronize
sleep(5)
#
Start Iterator to avoid serial overflow
it =
util.Iterator(board)
it.start()
#
Assign a role and variable to analog pin 0
a0
= board.get_pin('a:0:i')
#
Running loop for ever
try:
while True:
# Reading value on port a0
p = a0.read()
print(p)
except
KeyboardInterrupt:
board.exit()
注意程式紅色的部分,當我們在讀取序列埠的資料的時候,必須開啟這個 Iterator 來壁面序列溢位,請務必加上這一行。
執行結果會出現 1.0 到 0.0 之間的小數,所謂數位不是1就是0,而類比則會有中間值。如果要結束程式,請按 Contral – C。如果您夠細心,應該會發現這次我們按下 Contral – C 的時候並沒有報錯,這是因為我們程式的寫法使用了 try: except: 的結構,所以遇到 exception 的時候,就會執行 board.exit()。
將程式的最後加上 board.exit() 是個好習慣,代表停用這個 board 的 COM3 port 的資源,如果您的程式有做這個動作,那麼接著使用 Arduino IDE 上傳其他程式的時候,資源就不會被占據了,還記得我們之前上傳的時候常常會遇到錯誤吧,就是這個原因。
讀出來的數據有什麼用處呢?當然可以做任何的用途,就看你的 Python 程式要如何寫了。當然,我們也可以直接使用這個類比輸出來控制LED的亮度,請按照下圖連結測試一下便知:
有兩種接法,第一種是把可變電阻的輸出腳位接到LED的陰極,然後將LED的陽極接到 5V;第二種方式是把輸出腳位接到LED的陽極,然後LED的陰及接地。當然,還有第三種繞遠路的方式,就是將LED接到 PWM 的數位接腳,由程式來控制。我們來用Python 測試,並學習 PWM 的用法。
回到第一張圖,可變電阻的接法不變,LED則是將陽極接到腳位11(這是支援 PWM的腳位),陰極接地,中間加個 220歐姆的電阻。程式碼修改如下:
a0
= board.get_pin('a:0:i')
d11 =
board.get_pin('d:11:p')
#
Running loop for ever
#
This command executes loop body indefinitely until keyboard interrupt
try:
while True:
# Reading value on port a0
p = a0.read()
print(p)
d11.write(p)
except
KeyboardInterrupt:
board.exit()
同樣的,我們也可以利用可變電阻來控制蜂鳴器、馬達等的輸出,您可以自行發揮創意測試一下。
留言
張貼留言