本文說明如何透過 Alexa 語音指令控制連線到 Raspberry Pi 的硬體裝置,例如 LED 和 Explorer HAT。利用 MQTT 作為通訊中介,讓 Alexa Skill 傳送指令到 Raspberry Pi,進而控制實體裝置。實作上,Raspberry Pi 端使用 Python 程式碼監聽 MQTT 訊息,並根據訊息內容觸發對應的硬體操作。程式碼中包含 MQTT 客戶端設定、訊息回呼函式,以及針對 LED 和 Explorer HAT 馬達的控制邏輯。此外,文章也涵蓋 Alexa Skill 的開發流程,包含語音互動模型設計和後端邏輯實作,讓使用者能透過語音指令控制連線的硬體。

處理語音命令

以下是修改過的 MoveDirectionIntentHandler 類別:

class MoveDirectionIntentHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        return ask_utils.is_intent_name("MoveDirectionIntent")(handler_input)

    def handle(self, handler_input):
        slots = handler_input.slots
        logger.info(slots)

        if slots["direction"].value == 'left':
            send_mqtt_directive("/myPi", "left", data)
        elif slots["direction"].value == 'right':
            send_mqtt_directive("/myPi", "right", data)
        elif slots["direction"].value == 'on':  # for LED on
            send_mqtt_directive("/myPi", "on", data)
        elif slots["direction"].value == 'off':  # for LED off
            send_mqtt_directive("/myPi", "off", data)
        elif slots["direction"].value == 'back' or slots["direction"].value == 'backward' or slots["direction"].value == 'backwards':
            send_mqtt_directive("/myPi", "back", data)
        else:
            send_mqtt_directive("/myPi", "forward", data)

        return (
            handler_input.response_builder
               .speak("你可以告訴我要轉向左或右或停止移動")
               .ask("你可以告訴我要轉向左或右或停止移動")
               .response
        )

這個類別負責處理 MoveDirectionIntent,它會根據使用者的語音命令來決定要送出的 MQTT 訊息。

新增請求處理器

接下來,我們需要新增請求處理器到技能建構器中:

sb = SkillBuilder()
sb.add_request_handler(StopMovingIntentHandler())
sb.add_request_handler(MoveDirectionIntentHandler())

儲存和佈署技能

儲存技能模型並佈署它。

執行 listener.py

在你的 Raspberry Pi 上執行 listener.py

測試技能

呼叫技能並送出一些命令,例如:『移動前進』或『停止移動』。檢查你的 Pi 是否收到命令。

修改 Pi 程式碼

現在,我們要修改 Pi 的程式碼,以便它可以控制硬體。

修改程式碼以適應硬體

為了讓程式碼能夠適應您的硬體,特別是簡單的LED或Explorer HAT,您需要進行一些修改。以下是如何修改您的程式碼的步驟。

修改Raspberry Pi程式碼 - LED

首先,編輯listener.py程式碼。您需要新增必要的匯入並初始化LED物件。從gpiozero函式庫匯入LED類別,並建立一個LED物件,指定GPIO引腳(在這個例子中是17)。

from gpiozero import LED
led = LED(17)

接下來,修改driveCallback函式以控制LED的狀態。這個函式會在收到MQTT訊息時被呼叫,並根據訊息的內容控制LED的開啟或關閉。

# 自訂MQTT訊息回呼函式
def driveCallback(client, userdata, message):
    print(f"收到 {message.payload}{message.topic}")
    
    payload = json.loads(message.payload)
    command = payload['directive']
    print(f"處理命令:{command}")
    
    if command == "on":
        led.on()
    # 根據您的需求,您可能需要新增更多的命令處理,例如關閉LED
    elif command == "off":
        led.off()

圖表翻譯:

  flowchart TD
    A[收到MQTT訊息] --> B[解析訊息內容]
    B --> C{命令為「on」嗎?}
    C -->|是|> D[開啟LED]
    C -->|否|> E[關閉LED]
    D --> F[完成]
    E --> F

內容解密:

在這個例子中,我們使用gpiozero函式庫來控制Raspberry Pi上的LED。LED類別提供了一個簡單的方式來控制LED的狀態。當收到MQTT訊息時,driveCallback函式會被呼叫,並根據訊息的內容控制LED的開啟或關閉。這個例子展示瞭如何使用Raspberry Pi和MQTT協定來控制硬體元件。

修改Pi程式碼以控制Explorer HAT

為了控制Explorer HAT,需要修改listener.py程式碼。首先,加入必要的匯入陳述式:

import explorerhat

接下來,修改driveCallback函式以控制Explorer HAT的馬達。這個函式會根據收到的MQTT訊息來決定如何控制馬達。以下是修改過的driveCallback函式:

# 自訂MQTT訊息回呼函式

def driveCallback(client, userdata, message):
    print(f"收到 {message.payload}{message.topic}")
    
    payload = json.loads(message.payload)
    
    command = payload['directive']
    
    print(f"處理命令: {command}")
    
    if command == "left":
        # 左轉
        explorerhat.motor.one.forwards(50)
        explorerhat.motor.two.backwards(50)
    elif command == "right":
        # 右轉
        explorerhat.motor.one.backwards(50)
        explorerhat.motor.two.forwards(50)
    elif command == "on":
        # 開啟LED
        led.on()
    elif command == "off":
        # 關閉LED
        led.off()
    else:
        print("命令未找到")

這段程式碼會根據收到的命令來控制Explorer HAT的馬達和LED。當收到「left」命令時,馬達會向左轉;當收到「right」命令時,馬達會向右轉。當收到「on」命令時,LED會亮起;當收到「off」命令時,LED會熄滅。如果收到未知的命令,則會印出「命令未找到」的訊息。

內容解密:

  • explorerhat.motor.one.forwards(50):這行程式碼會讓Explorer HAT的第一個馬達向前旋轉,速度為50%。
  • explorerhat.motor.two.backwards(50):這行程式碼會讓Explorer HAT的第二個馬達向後旋轉,速度為50%。
  • json.loads(message.payload):這行程式碼會將收到的MQTT訊息從JSON格式轉換為Python字典。
  • payload['directive']:這行程式碼會從字典中取得「directive」的值,也就是收到的命令。

圖表翻譯:

  flowchart TD
    A[收到MQTT訊息] --> B[解析JSON訊息]
    B --> C[取得命令]
    C --> D{命令判斷}
    D -->|left| E[左轉]
    D -->|right| F[右轉]
    D -->|on| G[開啟LED]
    D -->|off| H[關閉LED]
    D -->|其他| I[命令未找到]

這個流程圖展示了程式碼如何根據收到的命令來控制Explorer HAT的馬達和LED。當收到不同的命令時,程式碼會執行不同的動作。

智慧家居裝置的開發與應用

在前一章中,我們探討瞭如何使用樹莓派(Raspberry Pi)和Alexa開發語音控制的IoT應用。在本章中,我們將深入探討智慧家居裝置的開發與應用。

13.1 智慧家居裝置的介紹

智慧家居裝置是指可以透過網際網路或其他通訊技術遠端控制和監控的家居裝置。這些裝置可以包括燈泡、溫控器、安全系統、家電等。透過使用智慧家居裝置,我們可以提高家居的舒適度、安全性和能源效率。

13.2 智慧家居裝置的開發

開發智慧家居裝置需要結合硬體和軟體的知識。硬體部分需要選擇合適的微控制器、感測器和執行器,而軟體部分需要設計和實作控制邏輯和通訊協定。

硬體選擇

在選擇硬體時,需要考慮到裝置的功能、功耗和成本。例如,若要開發一個智慧燈泡,需要選擇一個可以控制燈泡亮度和顏色的微控制器。

軟體設計

軟體設計是智慧家居裝置開發的核心部分。需要設計和實作控制邏輯、通訊協定和使用者介面。控制邏輯需要根據使用者的需求和裝置的功能來設計,而通訊協定需要確保裝置之間的通訊是可靠和安全的。

13.3 智慧家居裝置的應用

智慧家居裝置的應用非常廣泛。以下是一些例子:

  • 智慧燈泡:可以透過手機或語音助手控制燈泡的亮度和顏色。
  • 智慧溫控器:可以透過手機或語音助手控制家居的溫度。
  • 智慧安全系統:可以透過手機或語音助手監控家居的安全狀態。
程式碼範例

以下是一個簡單的智慧燈泡控制程式碼範例:

import RPi.GPIO as GPIO

# 設定GPIO模式
GPIO.setmode(GPIO.BCM)

# 設定燈泡的GPIO口
LED_GPIO = 17

# 初始化燈泡的GPIO口
GPIO.setup(LED_GPIO, GPIO.OUT)

# 定義燈泡的控制函式
def control_led(state):
    if state == "on":
        GPIO.output(LED_GPIO, GPIO.HIGH)
    elif state == "off":
        GPIO.output(LED_GPIO, GPIO.LOW)

# 測試燈泡的控制
control_led("on")
control_led("off")

Mermaid 圖表

  flowchart TD
    A[開始] --> B[初始化GPIO]
    B --> C[設定燈泡的GPIO口]
    C --> D[定義燈泡的控制函式]
    D --> E[測試燈泡的控制]
    E --> F[結束]

圖表翻譯

此圖表示了智慧燈泡控制程式碼的流程。首先,初始化GPIO口,然後設定燈泡的GPIO口。接下來,定義燈泡的控制函式,最後,測試燈泡的控制。

智慧家居裝置

從使用者經驗視角來看,建構語音控制的智慧家居系統,關鍵在於簡化操作流程並提升裝置間的互通性。本文深入探討了利用樹莓派結合Alexa語音服務,實作對LED燈和Explorer HAT等硬體裝置的控制,並提供了實務程式碼範例。透過MQTT訊息代理作為中介,成功橋接了語音指令與硬體動作,展現語音控制在智慧家居領域的應用潛力。

然而,目前的實作仍存在一些限制。例如,程式碼的錯誤處理機制尚未完善,缺乏對於異常狀況的偵測與回報。此外,語音指令的辨識準確度和靈活性仍有提升空間,特別是對於複雜的控制邏輯或多裝置聯動的場景。系統的安全性也需要進一步強化,例如加入身分驗證機制,以防止未經授權的存取。

展望未來,隨著AI技術的發展,預期語音辨識的準確度和自然語言理解能力將持續提升,進而實作更精確、更人性化的語音控制。結合機器學習,系統可以學習使用者的習慣和偏好,提供更個人化的智慧家居體驗。同時,跨平臺整合與標準化的趨勢,將有助於打破不同廠商裝置間的壁壘,打造更無縫的智慧家居生態系統。

對於想要建構類別似系統的開發者,建議優先關注使用者經驗的最佳化,例如設計更直覺的語音指令和提供更豐富的回饋資訊。同時,也應重視系統的安全性與穩定性,確保裝置在各種情況下都能正常運作。持續關注新興技術的發展,並將其整合至系統中,將是保持競爭力的關鍵。玄貓認為,語音控制將成為未來智慧家居的主流互動方式,值得持續投入研發資源。