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 腳未來讀取資料,我們現在就要透過一個可變電阻來實現。請先按照下圖連接:




可變電阻有三個腳,左右腳位分別是5VGND(既然是電阻,故沒有方向性),中間的腳位則是類比輸出。

接好之後就可以插上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()

同樣的,我們也可以利用可變電阻來控制蜂鳴器、馬達等的輸出,您可以自行發揮創意測試一下。

留言

這個網誌中的熱門文章

Python可以這樣玩(16):共陰/共陽七段顯示器

Python可以這樣玩(11):數學繪圖

Python可以這樣玩(15):蜂鳴器與音樂