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)

解釋

  1. 初始化Arduino板:我們使用pyfirmata.Arduino類別來初始化Arduino板,指定序列埠路徑為/dev/ttyACM0
  2. 取得類別比輸入引腳:我們使用board.get_pin方法來取得類別比輸入引腳,指定引腳為a:0:i,代表類別比輸入引腳0。
  3. 建立迭代器:我們使用pyfirmata.util.Iterator類別來建立一個迭代器,指定Arduino板為board
  4. 啟用類別比輸入報告:我們使用analog_pin.enable_reporting方法來啟用類別比輸入報告。
  5. 讀取類別比輸入值:我們使用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(見「模組」) -麵包板和跳線(見「原型設計裝置和套件」)

步驟

  1. 連線伺服馬達:將伺服馬達連線到Arduino的數字引腳上。通常,伺服馬達的訊號線連線到Arduino的引腳,而正、負極連線到電源。
  2. 安裝PyFirmata:在您的Python環境中安裝PyFirmata函式庫。
  3. 匯入PyFirmata:在您的Python指令碼中匯入PyFirmata函式庫。
  4. 建立Arduino連線:使用PyFirmata建立與Arduino的連線。
  5. 設定伺服馬達引腳:使用PyFirmata設定伺服馬達連線的Arduino引腳為PWM輸出。
  6. 控制伺服馬達:使用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作為連線軟體和硬體的橋樑,其易用性和靈活性使其成為物聯網原型開發和小型專案的理想選擇,值得開發者深入學習和應用。