返回文章列表

樹莓派MicroPython物聯網馬達控制

本文探討使用樹莓派結合 MicroPython 控制各種馬達的技術,包含直流馬達、步進馬達和伺服馬達,並涵蓋 PWM 速度控制、L293D 驅動模組應用、藍牙通訊控制,以及 Pyboard 在物聯網應用中的實作,包含家庭自動化控制與 OLED 顯示器整合。

物聯網 嵌入式系統

本文詳細介紹如何使用樹莓派與 MicroPython 控制不同種類別的馬達,包含直流馬達的 PWM 速度與方向控制、L293D 馬達驅動器電路連線與程式撰寫、伺服馬達的角度控制與程式範例,以及步進馬達的全步和半步控制原理與程式碼。此外,文章也示範瞭如何透過藍牙連線手機與樹莓派,使用 Blue Dot 應用程式控制裝置,並延伸探討 MicroPython Pyboard 在物聯網應用中的實作,包含家庭自動化控制與 OLED 顯示器整合,提供讀者更全面的馬達控制與物聯網應用知識。

馬達控制(直流馬達、步進馬達和伺服馬達)

在這一部分中,我們將探討各種與樹莓派介接的馬達型別,例如直流馬達、步進馬達和伺服馬達。

直流馬達控制

直流馬達的工作原理是當磁場和電場相互作用時,會產生機械力,這被稱為驅動作用。直流馬達有兩種型別:標準型和無刷直流馬達。

使用PWM技術控制直流馬達速度

直流馬達的速度與供應電壓成正比;如果電壓從12V降低到6V,那麼速度就會變成原來的一半。但在實際操作中,我們不能一直改變供應電壓來改變直流馬達的速度。必須調整提供給直流馬達的電壓,以在不同的扭矩水平下控制速度。可以使用PWM技術透過改變施加訊號的佔空比來控制直流馬達的速度。

如同我們在3.1節(使用PWM控制LED)中所看到的,這裡我們將直接使用PWM來控制直流馬達的速度。GPIO引腳最多可以輸出15mA的電流,所有26個GPIO引腳的總電流不應超過50mA。樹莓派板上有+5V和+3.3V電源輸出引腳,用於連線其他模組和感測器。這個電源軌也為處理器供電。從這個電源軌中抽取高電流會影響處理器。可以從+3.3V軌安全地抽取100mA的電流。為了避免這種負載效應,直流馬達使用單獨的電源。L293D馬達驅動IC模組用於驅動馬達。L293D是一個強大的IC,可以控制兩個直流馬達的方向和速度,供應電壓範圍從4.5V到36V。

馬達驅動器—L293D驅動模組

L293D是一款用於驅動直流馬達的中等功率H橋馬達驅動器。它包含兩個H橋電路,用於控制每個馬達。H橋用於改變輸出的極性,以便直流馬達可以在兩個方向上被控制。它可以驅動電壓高達12V、總直流電流高達600mA的馬達。L293D的引腳圖如圖3.18所示,引腳描述如下:

  • Enable 1和Enable 2是使能引腳。只有當這些引腳為高電平時,馬達才會移動。
  • Vs是供應電壓。
  • Vss是邏輯供應電壓。
  • Input1、Input2、Input3和Input4是輸入引腳。
  • Output1、Output2、Output3和Output4是輸出引腳。馬達將連線到這些引腳。
  • GND引腳用於裝置接地和散熱。

真值表

真值表3.1提供了使馬達順時針或逆時針旋轉的邏輯條件。表3.2顯示了具有L293馬達驅動器的樹莓派與馬達的引腳連線。 圖3.19a和b分別顯示了與樹莓派介接的直流馬達的電路圖和實物連線圖。圖3.19c給出了控制直流馬達的流程圖。

程式碼範例

# 控制直流馬達的程式
import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

Enable1 = 10
input1 = 12
input2 = 18

GPIO.setup(Enable1, GPIO.OUT)
GPIO.setup(input1, GPIO.OUT)
GPIO.setup(input2, GPIO.OUT)

pwm = GPIO.PWM(Enable1, 100)
pwm.start(0)

Rotation = input("輸入c/C代表順時針,a/A代表逆時針:")
duty_cycle = int(input("輸入佔空比(1到100):"))
pwm.start(duty_cycle)
delay = 0.1

print("按下Ctrl+c終止程式")
if Rotation == 'c' or Rotation == 'C':
    print("順時針運動")
    try:
        while True:
            GPIO.output(input1, False)  # 引腳2,驅動器IN1
            GPIO.output(input2, True)   # 引腳7,驅動器IN2
            GPIO.output(Enable1, True)  # 引腳1,驅動器使能
            sleep(delay)
    except KeyboardInterrupt:
        pass

elif Rotation == 'a' or Rotation == 'A':
    print("逆時針運動")
    try:
        while True:
            GPIO.output(input1, True)
            GPIO.output(input2, False)
            GPIO.output(Enable1, True)
            sleep(delay)
    except KeyboardInterrupt:
        pass
else:
    print("錯誤輸入")

pwm.stop()
GPIO.cleanup()
print("完成")  # 清理所有GPIO通道

#### 內容解密:

此程式碼用於控制直流馬達的方向和速度。首先,初始化GPIO引腳並設定為輸出模式。然後,根據使用者輸入的方向(順時針或逆時針)和佔空比,控制馬達的旋轉。透過改變input1input2的輸出狀態,可以控制馬達的方向。使用pwm.start(duty_cycle)來設定PWM的佔空比,從而控制馬達的速度。

使用PWM控制伺服馬達

伺服馬達是一種旋轉或線性執行器,可以精確控制角度或線性位置、加速度和速度。伺服馬達的主要應用是在遙控裝置、機器人和工業應用中。伺服馬達與普通馬達不同,根據伺服馬達的規格,它們可以透過改變PWM訊號的佔空比來旋轉0度到180度。伺服臂頭的移動速度也可以透過使用PWM改變佔空比來控制。在本實作中,使用了Tower Pro伺服馬達SG90。伺服馬達可以推動重負載,但不能提起重負載。對於Tower Pro伺服馬達,給定的PWM持續時間為20毫秒(頻率50Hz)。必須生成持續時間為20毫秒、訊號佔空比在0到2毫秒之間的PWM訊號,以旋轉伺服馬達。

圖表翻譯:

此圖示展示了伺服馬達到不同角度所需的PWM訊號佔空比。

馬達控制(DC 馬達、步進馬達和伺服馬達)

伺服馬達控制

伺服馬達是一種能夠根據輸入訊號精確控制其角度或位置的馬達。它廣泛應用於需要精確定位的場合,如機械臂、無人機和機器人等。伺服馬達的控制通常透過脈寬調變(PWM)訊號來實作,不同的PWM佔空比對應不同的角度。

伺服馬達的工作原理

伺服馬達的控制訊號是PWM波形,其週期通常為20毫秒。改變佔空比可以控制伺服馬達的角度。例如,當佔空比為7.5%時,伺服馬達通常會轉到90度的位置。要計算特定角度對應的佔空比,可以使用以下公式:

Duty_cycle = (set_angle/18) + 2.5

這意味著對於90度,佔空比應為7.5%,而對於180度,佔空比應為12.5%。透過調整佔空比,可以輕鬆地將伺服馬達轉到特定的角度。

程式碼範例

以下是一個使用Raspberry Pi控制伺服馬達的Python程式碼範例:

# 程式用於控制伺服馬達
import RPi.GPIO as GPIO
from time import sleep

# 設定GPIO模式
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# 定義控制腳位
control_pin = 10
GPIO.setup(control_pin, GPIO.OUT)

# 設定PWM頻率為50Hz
pwm = GPIO.PWM(control_pin, 50)
set_angle = int(input("輸入伺服馬達旋轉角度:"))
pwm.start(0)
delay = 1

# 計算佔空比
duty_cycle = (set_angle/18) + 2.5

# 控制伺服馬達
GPIO.output(control_pin, True)
pwm.ChangeDutyCycle(duty_cycle)
sleep(delay)
GPIO.output(control_pin, False)
pwm.ChangeDutyCycle(0)
pwm.stop()
GPIO.cleanup()

內容解密:

  1. GPIO設定:首先,程式設定Raspberry Pi的GPIO模式為BOARD模式,並停用警告訊息。
  2. 控制腳位設定:定義伺服馬達的控制腳位,並將其設定為輸出模式。
  3. PWM設定:建立一個PWM物件,頻率設為50Hz,用於產生控制伺服馬達所需的PWM訊號。
  4. 角度輸入:程式會提示使用者輸入伺服馬達的旋轉角度。
  5. 佔空比計算:根據輸入的角度計算所需的佔空比。
  6. 伺服馬達控制:將控制腳位設為高電平,改變PWM的佔空比以控制伺服馬達轉到指定的角度。
  7. 延遲與清理:等待一段時間後,將控制腳位設為低電平,並停止PWM,最後清理GPIO資源。

步進馬達控制

步進馬達是一種能夠將電脈衝轉換為精確機械運動的馬達。它在需要精確定位的應用中非常有用,如3D列印機、CNC銑床和精密機械裝置。

步進馬達的工作原理

步進馬達透過一系列電脈衝來控制其旋轉,每個脈衝使馬達轉過一定的角度。步進馬達有全步和半步兩種工作模式,全步模式下每次激發兩相線圈,而半步模式下則是每次激發一相或兩相線圈,以實作更精確的控制。

步進馬達的驅動

由於Raspberry Pi的GPIO無法提供足夠的電流來驅動步進馬達,因此通常使用驅動IC(如ULN2003)來放大電流,驅動步進馬達。

程式碼範例

以下是一個使用Raspberry Pi和ULN2003驅動IC控制步進馬達的Python程式碼範例:

# 程式用於控制步進馬達
import RPi.GPIO as GPIO
from time import sleep

# 設定GPIO模式
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# 定義步進馬達的控制腳位
pins = [10, 11, 12, 13]

# 全步順時針序列(逆序可用於逆時針)
full_step = [[0, 1, 1, 0],
             [1, 1, 0, 0],
             [1, 0, 0, 1],
             [0, 0, 1, 1]]

# 半步順時針序列(逆序可用於逆時針)
half_step = [[0, 1, 1, 0],
             [1, 1, 1, 0],
             [1, 1, 0, 0],
             [1, 1, 0, 1],
             [1, 0, 0, 1],
             [1, 0, 1, 1],
             [0, 0, 1, 1],
             [0, 1, 1, 1]]

圖表翻譯:

此圖展示了步進馬達的全步和半步工作模式,以及對應的線圈激發序列。全步模式每次激發兩相線圈,而半步模式則在全步之間插入額外的步驟,以實作更精細的控制。

ULN2003驅動IC

ULN2003是一種Darlington陣列驅動IC,能夠同時處理多個輸入/輸出訊號,適合用於驅動步進馬達。

樹莓派與手機透過藍牙介面控制

樹莓派3B+ 搭載了BCM43438整合晶片,內含2.4 GHz無線區域網路、藍牙和FM接收器。藍牙的主要目的是釋放板載GPIO埠。在此,我們建立了樹莓派和智慧型手機之間的藍牙通訊,以控制裝置。

樹莓派3B+板載藍牙組態

  1. 開啟藍牙 → 設定為可被發現(圖3.25a)。
  2. 開啟智慧型手機的藍牙。同時,在樹莓派上選擇「新增裝置」(圖3.25a)。選擇裝置後,點選配對,如圖3.25b所示。
  3. 上述步驟會提示確認傳送到智慧型手機的配對碼,如圖3.25c所示。裝置接受連線後,樹莓派和藍牙裝置將配對並建立連線,如圖3.25d所示。

使用智慧型手機透過藍牙控制裝置(Blue Dot應用程式)

  1. 從Google Play商店下載Blue Dot應用程式到智慧型手機。
  2. 開啟終端機,輸入以下命令安裝Python 3的dbus和bluedot套件:
    sudo apt install python3-dbus
    sudo pip3 install bluedot
    
    (可選)對於Python 2,使用以下命令:
    sudo apt install python-dbus
    sudo pip install bluedot
    
  3. 使用以下命令升級到最新版本的bluedot:
    sudo pip3 install bluedot --upgrade
    

Python程式碼:使用藍牙控制裝置

import os
from bluedot import BlueDot
import RPi.GPIO as GPIO

# 設定GPIO模式
GPIO.setmode(GPIO.BOARD)
# 定義控制pin
pin = 11  # 物理pin 11 = GPIO 17
GPIO.setup(pin, GPIO.OUT)

# 建立BlueDot物件
bd = BlueDot()

while True:
    # 等待按壓事件
    bd.wait_for_press()
    # 開啟裝置
    GPIO.output(pin, GPIO.HIGH)
    # 等待釋放事件
    bd.wait_for_release()
    # 關閉裝置
    GPIO.output(pin, GPIO.LOW)

程式碼解密:

  1. 匯入必要的模組:程式開始時匯入了必要的Python模組,包括osBlueDotRPi.GPIO,分別用於作業系統操作、藍牙控制和GPIO控制。
  2. 設定GPIO模式:使用GPIO.setmode(GPIO.BOARD)設定GPIO的編號模式為物理pin編號模式。
  3. 定義控制pin:選擇物理pin 11(對應GPIO 17)作為控制輸出pin,並使用GPIO.setup(pin, GPIO.OUT)設定為輸出模式。
  4. 建立BlueDot物件bd = BlueDot()建立了一個BlueDot物件,用於處理來自Blue Dot應用程式的藍牙控制指令。
  5. 主迴圈:程式進入無限迴圈,等待Blue Dot應用程式的控制指令。當接收到按壓事件時,開啟連線到指定GPIO pin的裝置;當接收到釋放事件時,關閉裝置。

習題

  1. 連線5個LED到樹莓派。在BCM模式下寫一個程式,使LED按照特定模式閃爍,每種模式之間間隔1秒。
  2. 將一個開關和一個LED介面到樹莓派。當開關開啟時,LED亮度應從低到高逐漸增加並保持高亮度。當開關關閉時,LED亮度應從高到低逐漸減少並熄滅。
  3. 使用樹莓派使八個LED以不同的佔空比閃爍。
  4. 在OLED顯示器上顯示字串“Hello World”、整數和浮點數。

MicroPython PyBoard在物聯網(IoT)中的應用

摘要

本章節將介紹如何使用MicroPython程式設計Pyboard來實作物聯網(IoT)應用。MicroPython是一種針對微控制器最佳化的Python語言,能夠在資源有限的嵌入式系統中高效執行。因此,MicroPython非常適合用於IoT應用。

MicroPython在PyCharm IDE中的安裝

PyCharm IDE支援Pyboard、ESP8266和BBC Micro:bit等微控制器裝置。要在PyCharm中使用Pyboard,首先需要安裝MicroPython外掛。以下是詳細的安裝步驟:

  1. 從官方網站下載並安裝PyCharm IDE:https://www.jetbrains.com/pycharm/
  2. 在PyCharm中安裝MicroPython外掛:開啟PyCharm → 檔案 → 設定 → 外掛 → 在搜尋視窗中輸入’MicroPython’ → 點選’安裝’按鈕。
  3. 建立新的Python專案:檔案 → 新專案(例如TestIoT)→ 點選’建立’按鈕。
  4. 設定專案結構:檔案 → 設定 → 專案:TestIoT → 專案結構。然後右鍵點選’.Idea’和’venv’並選擇排除。
  5. 啟用MicroPython支援和路徑選擇:檔案 → 設定 → 語言和框架 → MicroPython,選擇裝置型別為Pyboard。勾選’啟用MicroPython支援’和’自動檢測裝置路徑’。也可以手動輸入裝置路徑,然後點選’檢測’按鈕,最後點選’確定’。
  6. 重啟PyCharm IDE,然後右鍵點選專案名稱(TestIoT)→ 新建 → Python檔案 → 輸入Python檔案名稱(例如main.py)。
  7. 安裝缺失的套件,如IDE提示。
  8. 設定Python REPL(Read Evaluate Print Loop):點選工具 → MicroPython → MicroPython REPL。此步驟有助於顯示錯誤並允許在Pyboard裝置上執行MicroPython shell。
  9. 將檔案燒錄到Pyboard:工作列,執行 → 點選’燒錄main.py’。

簡單測試:開啟Pyboard的LED

安裝完成後,可以透過以下程式碼測試Pyboard的LED:

import pyb
pyb.LED(1).on()
pyb.LED(2).on()
pyb.LED(3).on()
pyb.LED(4).on()

內容解密:

這段程式碼首先匯入pyb模組,然後分別開啟Pyboard上的四個LED燈。這是測試Pyboard基本功能的一個簡單例子。

家庭自動化

家庭自動化系統允許使用者透過物聯網控制家中的各種裝置。本文將介紹如何使用Pyboard和ESP32實作家庭自動化系統。

使用Pyboard控制家電

本範例中,四個家電(風扇、空調、冰箱和燈)透過繼電器模組與Pyboard連線。系統使用0.96英寸的OLED SSD1306顯示屏來顯示家電的狀態。

實作步驟:

  1. 複製MicroPython的OLED ssd1306函式庫:https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py
  2. 在PyCharm IDE中貼上該程式碼並儲存為ssd1306.py。
# 以下為範例程式碼,用於控制家電並顯示狀態在OLED螢幕上
import pyb
from ssd1306 import SSD1306_I2C

# 初始化I2C和OLED
i2c = pyb.I2C(1, pyb.I2C.MASTER)
oled = SSD1306_I2C(128, 64, i2c)

# 控制家電的函式
def control_appliance(relay, state):
    if state:
        relay.on()
    else:
        relay.off()

# 初始化繼電器
relay_fan = pyb.Pin('X1', pyb.Pin.OUT_PP)
relay_ac = pyb.Pin('X2', pyb.Pin.OUT_PP)

# 開啟風扇
control_appliance(relay_fan, True)
oled.fill(0)
oled.text('Fan is ON', 0, 0)
oled.show()

# 關閉空調
control_appliance(relay_ac, False)
oled.fill(0)
oled.text('AC is OFF', 0, 0)
oled.show()

內容解密:

這段程式碼首先匯入必要的模組,然後初始化I2C匯流排和OLED顯示屏。control_appliance函式用於控制繼電器的開關,從而控制家電。範例中展示瞭如何開啟風扇和關閉空調,並在OLED螢幕上顯示相應的狀態訊息。