本文介紹如何使用樹莓派控制各種硬體裝置,從高壓交流電源切換到精細的伺服馬達角度調整,涵蓋了多元的應用場景。文章將深入探討如何利用 Python 與 gpiozero、guizero 等函式庫,簡化硬體控制的程式碼撰寫,並搭配 Blue Dot 等工具,實作透過 Android 裝置進行藍牙遠端控制。此外,文章也將詳細說明如何使用 PWM 技術控制 LED 亮度、馬達速度,以及 RGB LED 的色彩變化,並提供 ServoBlaster 等進階工具的應用,讓讀者能更精確地控制伺服馬達。

控制高壓交流裝置

問題 您想要使用樹莓派(Raspberry Pi)切換110或240V的交流電(AC)。

解決方案 使用PowerSwitch Tail II(見圖10-6)。這個方便的裝置使得使用樹莓派切換交流裝置的開關變得非常安全和容易。它有一端是交流插座,另一端是插頭,像延長線一樣;唯一的區別是中間的控制盒有三個螺絲端子。透過玄貓的控制,該裝置像一個開關一樣,可以開啟和關閉家電。

您可以使用與Recipe 10.1相同的Python程式碼來使用PowerSwitch Tail,如圖10-6所示。

討論 PowerSwitch Tail使用繼電器,但為了切換繼電器,它使用了一種叫做光電隔離器的元件,該元件有一個發光二極體照射在一個光敏三極體(高壓、光敏開關)上;當發光二極體照亮時,光敏三極體導通,為繼電器線圈供電。

光電隔離器內的發光二極體由GPIO腳位限制其電流為3.3V。

您還會在eBay和Amazon上找到類別似但更便宜的PowerSwitch Tail裝置。

參考 關於使用功率MOSFET切換直流電,請參考Recipe 10.4;關於使用麵包板上的繼電器切換,請參考Recipe 10.5。 PowerSwitch Tail還有一個240V版本可供購買。

圖10-6. 使用PowerSwitch Tail與樹莓派

使用Android和藍牙控制硬體

問題 您想要使用Android手機和藍牙與您的樹莓派進行互動。

解決方案 使用免費的Blue Dot Android應用程式和Python函式庫:

$ sudo pip3 install bluedot 接下來,您需要確保您的樹莓派可以被發現。在樹莓派螢幕的右上角,點選藍牙圖示,然後點選“使可發現”(圖10-7)。

圖10-7. 將您的樹莓派設為可發現的藍牙裝置 接下來,您需要將您的樹莓派和手機配對。確保您的手機已經開啟藍牙,然後在樹莓派的藍牙選單上點選“新增新裝置”(圖10-8)。

圖10-8. 將您的樹莓派和手機配對 在列表中找到您的手機,然後點選“配對”。您將在手機上被提示確認一個程式碼以完成配對。 當配對完成後,前往您的手機上的Play Store應用程式。搜尋並安裝Blue Dot應用程式。該應用程式將無法與您的手機一起工作,直到您在樹莓派上執行一個使用Python Blue Dot程式碼來接收命令的Python程式,因此請執行以下程式(ch_10_bluedot.py):

from bluedot import BlueDot

bd = BlueDot() while True:

使用Blue Dot和Guizero進行互動

在本文中,我們將探討如何使用Blue Dot和Guizero進行互動。Blue Dot是一個允許您使用手機或平板電腦電腦作為藍牙遙控器的函式庫,而Guizero則是一個簡單易用的GUI函式庫。

使用Blue Dot進行互動

首先,我們需要安裝Blue Dot函式庫。您可以使用以下命令進行安裝:

pip3 install bluedot

接下來,我們可以使用以下程式碼建立一個簡單的Blue Dot應用:

from bluedot import BlueDot

bd = BlueDot()

def pressed():
    print("You pressed the blue dot!")

bd.wait_for_press()
print("You pressed the blue dot!")

這個程式碼會建立一個Blue Dot物件,並定義一個pressed函式,當按下藍色按鈕時會被呼叫。然後,程式碼會等待按下藍色按鈕,並在按下時印出一條訊息。

使用Guizero進行互動

接下來,我們將探討如何使用Guizero進行互動。Guizero是一個簡單易用的GUI函式庫,允許您建立簡單的圖形介面。

首先,我們需要安裝Guizero函式庫。您可以使用以下命令進行安裝:

pip3 install guizero

接下來,我們可以使用以下程式碼建立一個簡單的Guizero應用:

from guizero import App, PushButton
from gpiozero import DigitalOutputDevice

app = App()
pin = DigitalOutputDevice(18)

def toggle_pin():
    pin.toggle()

button = PushButton(app, text="Toggle Pin", command=toggle_pin)
app.display()

這個程式碼會建立一個Guizero應用,並定義一個toggle_pin函式,當按下按鈕時會被呼叫。然後,程式碼會建立一個按鈕,並將其新增到應用中。當按下按鈕時,toggle_pin函式會被呼叫,切換GPIO引腳的狀態。

結合Blue Dot和Guizero

最後,我們可以結合Blue Dot和Guizero進行互動。以下程式碼示範瞭如何使用Blue Dot和Guizero建立一個簡單的應用:

from bluedot import BlueDot
from guizero import App, PushButton
from gpiozero import DigitalOutputDevice

bd = BlueDot()
app = App()
pin = DigitalOutputDevice(18)

def pressed():
    print("You pressed the blue dot!")
    pin.on()

def released():
    print("You released the blue dot!")
    pin.off()

bd.wait_for_press()
print("You pressed the blue dot!")

button = PushButton(app, text="Toggle Pin", command=lambda: pin.toggle())
app.display()

這個程式碼會建立一個Blue Dot物件和一個Guizero應用,並定義兩個函式,當按下藍色按鈕時會被呼叫。然後,程式碼會等待按下藍色按鈕,並在按下時印出一條訊息。同時,程式碼也會建立一個按鈕,並將其新增到應用中。當按下按鈕時,GPIO引腳的狀態會被切換。

圖表翻譯:

  graph LR
    A[Blue Dot] -->|pressed|> B[GPIO Pin]
    B -->|on|> C[LED]
    C -->|off|> B
    B -->|released|> A
    A -->|wait_for_press|> B

這個圖表示範了Blue Dot和Guizero之間的互動流程。當按下藍色按鈕時,GPIO引腳的狀態會被切換,LED會被點亮或熄滅。

使用GUI控制PWM輸出

在上一個例子中,我們使用GUI控制數位輸出。現在,我們將使用GUI控制PWM(脈衝寬度調變)輸出,以調整LED的亮度或馬達的速度。

程式碼

import gpiozero
from guizero import App, PushButton, Slider

def update_pwm(value):
    pwm.value = int(value)

app = App(width=300, height=200)
pwm = gpiozero.PWMOutputDevice(18, frequency=100)

slider = Slider(app, command=update_pwm, start=0, end=100)
slider.text_size = 20

app.display()

內容解密:

在這個程式碼中,我們使用gpiozero函式庫控制PWM輸出,並使用guizero函式庫建立一個簡單的GUI。當滑動條的值改變時,update_pwm函式會被呼叫,更新PWM輸出的值。

解說

這個程式碼使用gpiozero函式庫的PWMOutputDevice類別控制PWM輸出。當滑動條的值改變時,update_pwm函式會被呼叫,更新PWM輸出的值。這個例子展示瞭如何使用GUI控制PWM輸出,以調整LED的亮度或馬達的速度。

圖表翻譯:

  flowchart TD
    A[使用者操作滑動條] --> B[呼叫update_pwm函式]
    B --> C[更新PWM輸出的值]
    C --> D[控制LED的亮度或馬達的速度]

圖表翻譯:

這個圖表展示了使用者操作滑動條,呼叫update_pwm函式,更新PWM輸出的值,最終控制LED的亮度或馬達的速度。

實際應用

這個例子可以用於控制LED的亮度或馬達的速度。例如,在機器人專案中,可以使用這個程式碼控制馬達的速度,以實作機器人的移動。

在未來,可以使用這個程式碼作為基礎,開發出更複雜的GUI應用,以控制多個PWM輸出,實作更複雜的功能。例如,可以使用多個滑動條控制多個馬達的速度,以實作機器人的多方向移動。

控制 PWM 輸出至裝置

使用 Raspberry Pi 時,常需要控制連線到 GPIO 腳位的裝置的功率。這可以透過脈衝寬度調製(PWM)來實作。以下是使用 Python 程式語言和 gpiozero 及 guizero 函式庫,建立一個簡單的圖形使用者介面(GUI)來控制 PWM 輸出的範例。

解決方案

首先,需要安裝必要的函式庫。然後,建立一個新的 Python 檔案,例如 ch_10_gui_slider.py,並加入以下程式碼:

from gpiozero import PWMOutputDevice
from guizero import App, Slider

# 設定 PWM 輸出裝置
pin = PWMOutputDevice(18)

# 定義滑桿變化時的回呼函式
def slider_changed(percent):
    # 更新 PWM 輸出值
    pin.value = int(percent) / 100

# 建立 GUI 應用程式
app = App(title='PWM', width=500, height=150)

# 建立滑桿元件
slider = Slider(app, command=slider_changed, width='fill', height=50)

# 設定滑桿文字大小
slider.text_size = 30

# 顯示 GUI 應用程式
app.display()

執行程式

執行程式前,請確保已經連線好 LED 或其他可接受 PWM 訊號的裝置到 GPIO 腳位 18。然後,使用以下命令執行程式:

$ python3 ch_10_gui_slider.py

討論

此範例程式使用 guizero 的 Slider 類別來建立一個滑桿元件。當滑桿值變化時,slider_changed 函式會被呼叫,以更新 PWM 輸出值。注意,slider_changed 函式的引數是一個字串,即使它包含一個數字,因此需要使用 int() 函式將其轉換為整數。

相關資訊

此程式可以用來控制 LED、DC 馬達或高功率 DC 裝置。請參考相關的食譜以取得更多資訊。

控制 RGB LED 顏色

如果您想要控制 RGB LED 的顏色,可以使用類別似的方法。請參考下一節以取得更多資訊。

內容解密:

上述程式碼使用 gpiozero 函式庫來控制 PWM 輸出,並使用 guizero 函式庫來建立一個簡單的 GUI。滑桿元件的 command 選項被設定為 slider_changed 函式,以便在滑桿值變化時更新 PWM 輸出值。

圖表翻譯:

  flowchart TD
    A[程式啟動] --> B[初始化 GPIO]
    B --> C[建立 GUI 應用程式]
    C --> D[建立滑桿元件]
    D --> E[設定滑桿回呼函式]
    E --> F[顯示 GUI 應用程式]
    F --> G[滑桿值變化]
    G --> H[更新 PWM 輸出值]

此圖表顯示了程式的流程,從初始化 GPIO 到顯示 GUI 應用程式,並且展示了滑桿值變化時的回呼函式如何更新 PWM 輸出值。

RGB LED 控制

使用 PWM 控制 RGB LED 的紅、綠、藍通道

要實作這個功能,需要以下元件:

*麵包板和跳線(見「原型設計裝置和套件」) *三個 470Ω 電阻器(見「電阻器和電容器」) *RGB 共陰極 LED(見「光電元件」) *Perma-Proto(配方 9.9)或 Pi Plate(見配方 9.19)以製作更永久的專案(可選)

圖 10-13 顯示如何在麵包板上連線 RGB LED。請確保 LED 的方向正確;最長的引腳應該是從麵包板頂部算起的第二個引腳。這種連線被稱為共陰極,因為 LED 內部的紅、綠、藍 LED 的陰極(負極)都連線在一起,以減少套件中所需的引腳數量。

圖 10-13。使用 RGB LED 與 Raspberry Pi

使用麵包板的替代方法是使用 Raspberry Squid(見配方 9.10)。

以下程式有三個滑桿控制 LED 的紅、綠、藍通道(圖 10-14)。

圖 10-14。使用使用者介面控制 RGB LED

開啟編輯器並貼入以下程式碼(檔案名為 ch_10_gui_slider_RGB.py):

from gpiozero import RGBLED
from guizero import App, Slider
from colorzero import Color

rgb_led = RGBLED(18, 23, 24)

red = 0
green = 0
blue = 0

def red_changed(value):
    global red
    red = int(value)

def green_changed(value):
    global green
    green = int(value)

def blue_changed(value):
    global blue
    blue = int(value)

內容解密:

上述程式碼使用 gpiozeroguizero 函式庫控制 RGB LED。RGBLED 類別用於控制 LED 的紅、綠、藍通道,而 AppSlider 類別用於建立使用者介面。Color 類別用於處理顏色值。

red_changedgreen_changedblue_changed 函式分別用於更新紅、綠、藍通道的值。這些函式被呼叫當滑桿的值改變時。

圖表翻譯:

  flowchart TD
    A[使用者調整滑桿] --> B[更新紅/綠/藍通道值]
    B --> C[控制 RGB LED]
    C --> D[顯示顏色]

上述流程圖顯示使用者調整滑桿後,紅、綠、藍通道的值被更新,然後控制 RGB LED 顯示相應的顏色。

使用 Raspberry Pi 控制 RGB LED 顏色

在這個例子中,我們將使用 Raspberry Pi 的 GPIO 介面控制一個 RGB LED 的顏色。RGB LED 是一種可以顯示紅、綠、藍三種顏色的 LED,透過調整每種顏色的亮度,可以產生出各種不同的顏色。

首先,我們需要連線 RGB LED 到 Raspberry Pi 的 GPIO 介面。RGB LED 通常有四個腳位,分別是紅、綠、藍和公共端(common)。公共端可以是公共陽極(common anode)或公共陰極(common cathode)。在這個例子中,我們使用的是公共陰極的 RGB LED。

下一步是編寫程式碼來控制 RGB LED 的顏色。我們可以使用 Python 的 Tkinter 函式庫來建立一個 GUI 介面,並使用 GPIO 函式庫來控制 GPIO 介面。

import tkinter as tk
from tkinter import ttk
import RPi.GPIO as GPIO

# 初始化 GPIO 介面
GPIO.setmode(GPIO.BCM)

# 設定 RGB LED 的腳位
red_pin = 17
green_pin = 23
blue_pin = 24

# 初始化 PWM 通道
GPIO.setup(red_pin, GPIO.OUT)
GPIO.setup(green_pin, GPIO.OUT)
GPIO.setup(blue_pin, GPIO.OUT)

# 建立 Tkinter 介面
root = tk.Tk()
root.title("RGB LED Controller")

# 建立滑動條來控制顏色
def red_changed(val):
    # 設定紅色通道的 PWM 值
    GPIO.output(red_pin, int(val))

def green_changed(val):
    # 設定綠色通道的 PWM 值
    GPIO.output(green_pin, int(val))

def blue_changed(val):
    # 設定藍色通道的 PWM 值
    GPIO.output(blue_pin, int(val))

red_slider = tk.Scale(root, from_=0, to=255, orient=tk.HORIZONTAL, command=red_changed)
green_slider = tk.Scale(root, from_=0, to=255, orient=tk.HORIZONTAL, command=green_changed)
blue_slider = tk.Scale(root, from_=0, to=255, orient=tk.HORIZONTAL, command=blue_changed)

# 將滑動條新增到介面中
red_slider.pack()
green_slider.pack()
blue_slider.pack()

# 啟動 Tkinter 介面
root.mainloop()

這個程式碼會建立一個 GUI 介面,有三個滑動條來控制 RGB LED 的顏色。當滑動條的值改變時,相應的 PWM 通道會被更新,從而改變 RGB LED 的顏色。

內容解密:

  • 我們使用 Tkinter 函式庫來建立 GUI 介面。
  • 我們使用 RPi.GPIO 函式庫來控制 GPIO 介面。
  • 我們設定 RGB LED 的腳位並初始化 PWM 通道。
  • 我們建立滑動條來控制顏色,並設定滑動條的命令為更新 PWM 值。
  • 我們將滑動條新增到介面中並啟動 Tkinter 介面。

圖表翻譯:

  graph LR
    A[RGB LED] -->|紅|> B[紅色通道]
    A -->|綠|> C[綠色通道]
    A -->|藍|> D[藍色通道]
    B -->|PWM|> E[GPIO 介面]
    C -->|PWM|> E
    D -->|PWM|> E
    E -->|GUI 介面|> F[Tkinter]
    F -->|滑動條|> G[紅色滑動條]
    F -->|滑動條|> H[綠色滑動條]
    F -->|滑動條|> I[藍色滑動條]

這個圖表展示了 RGB LED 控制系統的架構。RGB LED 連線到 GPIO 介面,GPIO 介面控制 PWM 通道。Tkinter GUI 介面使用滑動條來控制 PWM 值,從而改變 RGB LED 的顏色。

控制伺服馬達

問題描述

您想要使用 Raspberry Pi 控制伺服馬達的位置。

解決方案

使用脈衝寬度調製(PWM)控制傳送到伺服馬達的脈衝寬度,以改變其角度。雖然這個方法可以工作,但由於 PWM 產生的不完全穩定,伺服馬達可能會有少許抖動。如需更穩定的脈衝時序解決方案,請參考 Recipe 11.2 和 Recipe 11.3。

如果您使用的是舊款 Raspberry Pi 1,您應該從獨立的 5V 電源供應伺服馬達電力,因為負載電流的峰值可能會導致 Raspberry Pi 當機或過載。如果您使用的是 Raspberry Pi B+ 或更新版本,由於板載電壓調節的改進,您可能可以直接從 GPIO 埠的 5V 引腳供應小型伺服馬達電力。

硬體連線

伺服馬達的引線通常為紅色(5V)、棕色(地線)和橙色(控制引線)。將 5V 和地線引線連線到 GPIO 埠的 5V 和 GND 引腳,將控制引線連線到引腳 18。使用母對公引頭線進行連線。如果您使用的是獨立電源,則麵包板是保持所有引線整齊的良好方法。

所需元件

  • 5V 伺服馬達
  • 麵包板和跳線
  • 1kΩ 電阻器
  • 5V 1A 電源或 4.8V 電池組

程式碼實作

from gpiozero import AngularServo
from guizero import App, Slider

# 初始化伺服馬達物件
servo = AngularServo(18, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000)

# 定義滑動條變化事件處理函式
def slider_changed(angle):
    servo.angle = int(angle)

# 建立 GUI 應用程式
app = App(title='Servo Angle', width=500, height=150)

# 建立滑動條元件
slider = Slider(app, start=-90, end=90, command=slider_changed, width='fill', height=50)

# 啟動 GUI 應用程式
app.display()

內容解密:

此程式碼使用 gpiozeroguizero 函式庫來控制伺服馬達的角度。AngularServo 類別用於初始化伺服馬達物件,AppSlider 類別用於建立 GUI 應用程式和滑動條元件。當滑動條的值變化時,slider_changed 函式被呼叫,以更新伺服馬達的角度。

圖表翻譯:

  flowchart TD
    A[初始化伺服馬達] --> B[建立 GUI 應用程式]
    B --> C[建立滑動條元件]
    C --> D[定義滑動條變化事件處理函式]
    D --> E[啟動 GUI 應用程式]

此流程圖描述了程式碼的執行流程,從初始化伺服馬達開始,到建立 GUI 應用程式和滑動條元件,然後定義滑動條變化事件處理函式,最終啟動 GUI 應用程式。

使用 ServoBlaster 控制伺服馬達

在 Raspberry Pi 上控制伺服馬達是一項常見的任務,特別是在機器人和自動化應用中。雖然 gpiozero 函式庫提供了一種簡單的方式來控制伺服馬達,但它的脈衝生成功能可能不夠精確或穩定。為瞭解決這個問題,我們可以使用 ServoBlaster 函式庫,它提供了一種更精確和穩定的方式來控制伺服馬達。

安裝 ServoBlaster

要安裝 ServoBlaster,我們需要執行以下命令:

$ cd PiBits/ServoBlaster/user
$ sudo make
$ sudo make install

然後重新啟動 Raspberry Pi。

修改程式碼

我們可以修改 Recipe 11.1 中的程式碼來使用 ServoBlaster 函式庫。以下是修改後的程式碼:

import os
from guizero import App, Slider

servo_min = 500  # uS
servo_max = 2500  # uS
servo = 2  # GPIO 18

def map(value, from_low, from_high, to_low, to_high):
    # 將值從一個範圍對映到另一個範圍
    return (value - from_low) * (to_high - to_low) / (from_high - from_low) + to_low

app = App()
slider = Slider(app, start=-90, end=90, command=lambda v: os.system(f"echo {servo}={map(v, -90, 90, servo_min, servo_max)} > /dev/servoblaster"))
slider.text_size = 30
app.display()

這個程式碼使用 ServoBlaster 函式庫來控制伺服馬達,將滑桿的值對映到伺服馬達的角度範圍內。

圖表翻譯:
  graph LR
    A[滑桿] --> B[對映]
    B --> C[伺服馬達]
    C --> D[角度控制]

這個圖表展示了滑桿的值如何被對映到伺服馬達的角度範圍內,並控制伺服馬達的角度。

內容解密:

上述程式碼使用 map 函式將滑桿的值從 -9090 的範圍對映到 servo_minservo_max 的範圍內。然後使用 os.system 函式將對映後的值寫入到 /dev/servoblaster 裝置中,以控制伺服馬達的角度。

使用ServoBlaster控制伺服馬達

伺服馬達控制介紹

ServoBlaster是一個強大的伺服馬達控制驅動程式,允許您使用Raspberry Pi的GPIO引腳控制多個伺服馬達。以下是使用ServoBlaster控制伺服馬達的範例程式碼:

def map(value, from_low, from_high, to_low, to_high):
    from_range = from_high - from_low
    to_range = to_high - to_low
    scale_factor = float(from_range) / float(to_range)
    return to_low + (value / scale_factor)

def set_angle(angle):
    pulse = int(map(angle+90, 0, 180, servo_min, servo_max))
    command = "echo {}={}us > /dev/servoblaster".format(servo, pulse)
    os.system(command)

def slider_changed(angle):
    set_angle(int(angle))

app = App(title='Servo Angle', width=500, height=150)
slider = Slider(app, start=-90, end=90, command=slider_changed,
                width='fill', height=50)
slider.text_size = 30
app.display()

ServoBlaster的工作原理

ServoBlaster的工作原理是將GPIO引腳組態為伺服馬達控制引腳,然後使用echo命令將控制訊號輸出到/dev/servoblaster裝置中。這個裝置會將控制訊號轉換為伺服馬達的控制訊號,從而控制伺服馬達的角度。

關閉ServoBlaster

當您需要使用GPIO引腳進行其他用途時,需要關閉ServoBlaster。可以使用以下命令關閉ServoBlaster:

$ sudo update-rc.d servoblaster disable
$ sudo reboot

重新啟動Raspberry Pi後,ServoBlaster將不再控制GPIO引腳,您可以再次使用音訊功能。

啟用ServoBlaster

如果您需要再次啟用ServoBlaster,可以使用以下命令:

$ sudo update-rc.d servoblaster enable
$ sudo reboot

ServoBlaster的組態

ServoBlaster的組態檔案位於/etc/servoblaster.conf。您可以編輯這個檔案來組態ServoBlaster的行為,例如修改GPIO引腳的組態或調整伺服馬達的控制引數。

Mermaid圖表:ServoBlaster的工作流程

  flowchart TD
    A[啟動ServoBlaster] --> B[組態GPIO引腳]
    B --> C[輸出控制訊號]
    C --> D[控制伺服馬達]
    D --> E[關閉ServoBlaster]

圖表翻譯:ServoBlaster的工作流程

上述Mermaid圖表展示了ServoBlaster的工作流程。首先,啟動ServoBlaster,然後組態GPIO引腳,輸出控制訊號,控制伺服馬達,最後關閉ServoBlaster。

從使用者經驗視角來看,本文探討瞭如何使用樹莓派控制各種硬體裝置,涵蓋了高壓交流電、藍牙互動、PWM 輸出以及伺服馬達等多個應用場景。文章詳細介紹了 PowerSwitch Tail II 等硬體裝置的使用方法,以及 Blue Dot、Guizero、gpiozero 和 ServoBlaster 等軟體函式庫的整合技巧,提供讀者兼具實用性與安全性的解決方案。然而,文章對於不同方案的效能比較略顯不足,例如 gpiozero 與 ServoBlaster 控制伺服馬達的穩定性差異並未深入探討。此外,部分程式碼範例缺乏錯誤處理機制,在實際應用中可能存在風險。展望未來,隨著物聯網技術的發展,預期將出現更多功能更強大、使用更便捷的硬體和軟體工具,進一步簡化樹莓派的硬體控制流程。對於想要深入學習的開發者,建議進一步研究不同控制方案的底層原理和效能差異,並在程式碼中加入完善的錯誤處理和安全機制,以確保系統的穩定性和安全性。玄貓認為,掌握這些技巧將有助於開發者更好地利用樹莓派實作各種創意應用。