PyFirmata 讓 Python 開發者能輕鬆控制 Arduino,簡化硬體互動流程。本文涵蓋讀取 Arduino 類別比輸入、利用 PWM 控制 LED 亮度,以及精準控制伺服馬達角度等應用。每個範例都提供逐步說明、程式碼片段和電路連線參考,方便讀者理解 PyFirmata 的運作方式,並能根據自身需求修改程式碼。透過這些例項,讀者能快速掌握 PyFirmata 的核心功能,並將其應用於各種物聯網和嵌入式系統專案。
使用Python和PyFirmata讀取Arduino的類別比輸入
介紹
在這個範例中,我們將使用Python和PyFirmata函式庫來讀取Arduino板上的類別比輸入。這個範例假設你已經安裝了PyFirmata函式庫並且有一個Arduino板連線到你的電腦。
程式碼
import time
import pyfirmata
# 初始化Arduino板
board = pyfirmata.Arduino('/dev/ttyACM0')
# 取得類別比輸入引腳
analog_pin = board.get_pin('a:0:i')
# 建立一個迭代器來讀取類別比輸入
it = pyfirmata.util.Iterator(board)
it.start()
# 啟用類別比輸入報告
analog_pin.enable_reporting()
while True:
    # 讀取類別比輸入值
    reading = analog_pin.read()
    
    # 如果讀取值不為None
    if reading is not None:
        # 將讀取值轉換為電壓值(假設電壓範圍為0-5V)
        voltage = reading * 5.0
        
        # 印出讀取值和電壓值
        print("Reading=%f\tVoltage=%f" % (reading, voltage))
    
    # 暫停1秒
    time.sleep(1)
解釋
- 初始化Arduino板:我們使用pyfirmata.Arduino類別來初始化Arduino板,指定序列埠路徑為/dev/ttyACM0。
- 取得類別比輸入引腳:我們使用board.get_pin方法來取得類別比輸入引腳,指定引腳為a:0:i,代表類別比輸入引腳0。
- 建立迭代器:我們使用pyfirmata.util.Iterator類別來建立一個迭代器,指定Arduino板為board。
- 啟用類別比輸入報告:我們使用analog_pin.enable_reporting方法來啟用類別比輸入報告。
- 讀取類別比輸入值:我們使用analog_pin.read方法來讀取類別比輸入值,如果讀取值不為None,我們將其轉換為電壓值並印出。
執行結果
執行這個程式後,你應該可以看到類別比輸入值和對應的電壓值被印出,例如:
Reading=0.000000 Voltage=0.000000
Reading=0.165200 Voltage=0.826000
Reading=0.784000 Voltage=3.920000
Reading=1.000000 Voltage=5.000000
注意:這個範例假設你的Arduino板上有一個類別比輸入引腳連線到一個電壓源,否則你可能需要修改程式碼來符合你的實際硬體組態。
使用PyFirmata控制Arduino的類別比輸出(PWM)
問題描述
您想要使用Python控制Arduino的類別比輸出,實作PWM(脈衝寬度調變)訊號,以調整LED的亮度。
解決方案
使用PyFirmata函式庫,向Arduino傳送命令,生成PWM訊號,並控制LED的亮度。
所需元件
- Arduino Uno -麵包板和跳線
- 270Ω電阻
- LED
連線麵包板
將麵包板連線到Arduino,如圖18-11所示。
安裝PyFirmata
如果尚未安裝PyFirmata,請按照Recipe 18.3的步驟進行設定。
Python指令碼
以下Python指令碼會提示您輸入PWM功率的值,然後根據輸入值設定LED的亮度:
import pyfirmata
board = pyfirmata.Arduino('/dev/ttyACM0')
led_pin = board.get_pin('d:10:p')
while True:
    duty_s = input("Enter Brightness (0 to 100):")
    # 將輸入值轉換為適合PWM的格式
    duty = int(duty_s)
    led_pin.write(duty / 100.0)
內容解密:
在這段程式碼中,我們首先匯入pyfirmata函式庫,然後建立一個Arduino物件,指定連線到的序列埠(/dev/ttyACM0)。我們取得Arduino上的第10個數字引腳(’d:10:p’),這個引腳將用於生成PWM訊號。
在無窮迴圈中,我們不斷地提示使用者輸入一個亮度值(0到100),然後將這個值轉換為適合PWM的格式。最後,我們使用write()方法將轉換後的值寫入到LED引腳,從而控制LED的亮度。
圖表翻譯:
  flowchart TD
    A[開始] --> B[輸入亮度值]
    B --> C[轉換為PWM格式]
    C --> D[寫入LED引腳]
    D --> E[控制LED亮度]
    E --> A
這個流程圖描述了程式碼的邏輯:從使用者輸入亮度值,轉換為PWM格式,然後寫入到LED引腳,最終控制LED的亮度。
使用PyFirmata控制伺服馬達
問題描述
您想要使用玄貓控制伺服馬達的位置。
解決方案
使用PyFirmata向Arduino傳送命令,生成控制伺服馬達位置所需的脈衝。
所需材料
- Arduino Uno(見「模組」) -麵包板和跳線(見「原型設計裝置和套件」)
步驟
- 連線伺服馬達:將伺服馬達連線到Arduino的數字引腳上。通常,伺服馬達的訊號線連線到Arduino的引腳,而正、負極連線到電源。
- 安裝PyFirmata:在您的Python環境中安裝PyFirmata函式庫。
- 匯入PyFirmata:在您的Python指令碼中匯入PyFirmata函式庫。
- 建立Arduino連線:使用PyFirmata建立與Arduino的連線。
- 設定伺服馬達引腳:使用PyFirmata設定伺服馬達連線的Arduino引腳為PWM輸出。
- 控制伺服馬達:使用PyFirmata向Arduino傳送命令,生成控制伺服馬達位置所需的脈衝。
程式碼範例
import pyfirmata
# 建立Arduino連線
board = pyfirmata.Arduino('/dev/ttyACM0')
# 設定伺服馬達引腳
servo_pin = board.get_pin('d:9:p')  # 9引腳為PWM輸出
# 控制伺服馬達
def set_servo_angle(angle):
    # 將角度轉換為PWM值
    pwm_value = angle / 180.0 * 2.5 + 0.5
    servo_pin.write(pwm_value)
# 測試伺服馬達
set_servo_angle(0)  # 0度
set_servo_angle(90)  # 90度
set_servo_angle(180)  # 180度
討論
使用PyFirmata控制伺服馬達的位置相當簡單。您只需要將伺服馬達連線到Arduino,安裝PyFirmata,然後使用PyFirmata向Arduino傳送命令即可。
圖表翻譯
  flowchart TD
    A[開始] --> B[連線伺服馬達]
    B --> C[安裝PyFirmata]
    C --> D[匯入PyFirmata]
    D --> E[建立Arduino連線]
    E --> F[設定伺服馬達引腳]
    F --> G[控制伺服馬達]
    G --> H[結束]
內容解密
在上述程式碼中,我們首先匯入PyFirmata函式庫,然後建立與Arduino的連線。接下來,我們設定伺服馬達連線的Arduino引腳為PWM輸出。最後,我們使用PyFirmata向Arduino傳送命令,生成控制伺服馬達位置所需的脈衝。
控制伺服馬達的基礎
所需元件
- 1kΩ 電阻器
- LED(參考「光電元件」)
- 伺服馬達
連線麵包板
根據圖 18-13 所示,連線麵包板。
圖 18-13:Arduino 控制伺服馬達的連線圖
如果尚未設定 PyFirmata,請參考配方 18.3 進行設定。 以下 Python 指令碼會提示您輸入伺服馬達的角度值,然後設定伺服馬達的臂部相應地(您可以在本文的下載區找到該程式,名稱為 ch_18_ardu_servo.py):
import pyfirmata
board = pyfirmata.Arduino('/dev/ttyACM0')
servo_pin = board.get_pin('d:11:s')
while True:
    angle_s = input("Enter Angle (0 to 180):")
    angle = int(angle_s)
    servo_pin.write(angle)
當您輸入 0 時,伺服馬達應該在其行程的一端。改為輸入 180 時,伺服馬達會移到另一端,而輸入 90 時,則會移到中間位置:
$ python3 ch_18_ardu_servo.py
Enter Angle (0 to 180):0
Enter Angle (0 to 180):180
Enter Angle (0 to 180):90
討論
此配方的程式碼實際上非常直截了當。您定義輸出為伺服輸出,由玄貓進行操作:
servo_pin = board.get_pin('d:11:s')
其中,s 代表伺服馬達。這可以用於 Arduino 的任何數位腳位。如果您已經建造了配方 11.1,您可能會注意到,在這種方式下使用 Arduino 時,伺服馬達沒有抖動。
參考資料
僅使用 Raspberry Pi 的伺服馬達控制方案在配方 11.1、11.2 和 11.3 中進行了描述。
此圖示
Mermaid 圖表用於視覺化展示程式流程或系統架構。以下是 Mermaid 圖表的範例:
  flowchart TD
    A[開始] --> B[輸入角度]
    B --> C[設定伺服馬達]
    C --> D[執行]
圖表翻譯
上述 Mermaid 圖表展示了程式的流程。首先,程式從開始點 A 啟動,然後跳轉到 B 點,提示使用者輸入角度值。接著,程式設定伺服馬達的角度,並執行相應的動作。這個流程不斷重複,直到使用者停止程式。
使用小型Arduino板與樹莓派
問題
您想要使用Arduino板與樹莓派,但您希望有更緊湊的選擇。
解決方案
使用小型、適合麵包板的Arduino板。圖18-14顯示了一個Arduino Pro Mini板。這種板具有很大的優勢,可以直接插入麵包板中,與其他元件一起使用。Pro Mini板也有3.3V版本,可以避免在使用樹莓派時需要進行電平轉換。
討論
有些板子,例如圖18-14中的Pro Mini,需要USB程式設計介面。您可以從樹莓派或其他電腦程式設計它們(如果從樹莓派程式設計有問題)。 除了官方的Arduino板外,您還可以找到很多低成本的複製品,它們可以成為樹莓派的理想伴侶。 請參考以下其他板子:
- Teensy
- Arduino Micro
- Arduino Nano
Arduino與Python的結合,為硬體控制和物聯網應用開發提供了低門檻且功能強大的解決方案。本文深入探討了使用PyFirmata控制Arduino的各種導向,涵蓋了類別比輸入讀取、PWM輸出控制、伺服馬達控制等關鍵技術。分析PyFirmata的實作方式,可以發現其巧妙地利用了Arduino的韌體,透過串列通訊實作了Python程式碼與Arduino硬體的互動。然而,PyFirmata的效能瓶頸在於串列通訊的延遲,對於需要高速即時控制的應用場景,則需考量其他方案。此外,本文提供的程式碼範例雖然簡潔易懂,但在實際應用中,仍需根據具體硬體組態和功能需求進行調整。展望未來,隨著邊緣運算的興起,預期PyFirmata這類別工具將扮演更重要的角色,整合更豐富的感測器與致動器,賦能更多創新應用。對於有意投入物聯網開發的工程師而言,掌握PyFirmata的使用技巧將是提升開發效率與系統整合能力的關鍵策略。玄貓認為,PyFirmata作為連線軟體和硬體的橋樑,其易用性和靈活性使其成為物聯網原型開發和小型專案的理想選擇,值得開發者深入學習和應用。
 
            