智慧寵物餵食機第2部分—具有語音辨識功能的餵食應用程式

點擊此處閱讀本文第1部分 >

automatic pet feeder

在智慧寵物餵食機的第1部分“使用Arduino Uno製作智慧自動寵物餵食機”中,我們建立了一個自動化平台,可以判斷您的寵物是否被餵食以及計算下一次餵食的時間。在第2部分中,我們將嘗試透過MIT App Inventor研發一個應用程式並添加語音辨識功能,使系統更加“智慧”。在之前的課程中,我們已經使用過MIT App Inventor來創建應用程式。App Inventor是一種易於使用的基於塊的語言,用於設計Android應用程式。

硬體

  • Arduino UNO
  • RFID RC522
  • HC-05 藍牙模組

沿用第1部分的硬體:

  • Arduino Uno
  • 光感測器 TEMT6000
  • 距離感測器 Sharp GP2Y0A21YK
  • RFID RC522
  • 蜂鳴器
  • 馬達 SG90
  • RTC DS1307

軟體

 

步驟1:使用帶有RFID標籤的EEPROM

我們在第1部分中設定的用於EEPROM的標籤—在該記憶體中,標籤將被保存到我們將其清除為止。此功能有助於我們將自己的寵物與其他寵物分開來,只為帶有指定標籤的寵物提供食物。

我們在第1部分中設定了兩個標籤,並使用EEPROM來存儲資料。RFID標籤有助於識別您的寵物並將其與其他人的寵物區分開,從而僅向帶有指定標籤的寵物提供食物。使用EEPROM可以確保資料在系統重新開機後也可以安全地存儲在記憶體中。您可以使用以下代碼從EEPROM更改標籤資訊:

 

 

automatic pet feeder

圖1:我們在EEPROM中的寵物標籤

上次,我們將寵物指定為紅色標籤。這次,我們將標籤更改為綠色。

步驟2:怎樣控制伺服

伺服馬達透過來自微控制器的PWM(脈衝寬度調節)來更改其位置。伺服需要進行校準,並將其閥門開度角度設定為90度。

為了控制伺服,我們將使用Arduino Sweep 代碼。該代碼中伺服馬達軸可以旋轉180度。我們將把旋轉角度從0-180度更改為10-170度。

 

關於伺服的注意事項:

您的伺服在某些時候可能會行為異常。當您由於Arduino自行重啟而無法執行指令時,可能是因為USB埠沒有提供足夠的電源來驅動伺服。在這種情況下,Arduino會進行重置,應用程式也無法工作。用以下兩種方法可以避免此問題的產生:

  1. 您可以在麵包板上的GND和5V之間添加一個大容值電容(470uF或更大)。當Arduino沒有足夠的電源來維持電流時,該電容可以用作臨時電源。較長的端子必須連接到VDD=5V,而較短的端子必須連接到GND。
  1. 您可以透過USB對研發板進行程式設計,之後斷開連接。然後,您可以使用手機充電器透過插頭來為裝置供電,因為它具有更大的電流容量。

讓我們簡要地看一下 <Servo.h> 程式館的工作方式。

#include <Servo.h>

必須含有該指令才能使用Servo.h程式館。Servo程式館中給出的兩個範例是“Knob”和“Sweep”。這兩個控制器對伺服的測試很有用。使用Knob,您就可以透過電位計將伺服轉動到特定角度。使用Sweep,您就可以在180度的範圍內來回掃動伺服軸。

Servo servo;

這是一個類型的聲明。它定義了 servo 類型的變數 Servo 。它與其他用於伺服的類型相似,如 int (整型)和 float (浮點型)。

servo.attach(servoPin);

在設定代碼塊時,您需要將伺服分配給特定的引腳。該指令用於將伺服變數分配引腳。

servo.write(angle);

此指令將設定伺服軸角度(在0到180度範圍內),然後將伺服轉動至該角度。

 

步驟3:添加HC-05藍牙模組

———-

關於藍牙HC-05 – 用戶使用手冊

藍牙序列模組的運行不需要進行驅動,並且可以與具有序列介面的其他藍牙裝置進行通信。兩個藍牙模組之間實現通信至少需要兩個條件:

(1) 必須在主裝置和從裝置之間進行。
(2) 密碼必須正確。

該模組的屬性:

  • 可以在主模式和從模式之間切換
  • 藍牙名稱:HC-05
  • 密碼:1234

配對:主裝置不僅可以與指定的藍牙位址配對(如手機、電腦合適器、從裝置),還可以自動搜索從裝置並與之配對。

典型方法:在某些特定條件下,主裝置和從裝置可以自動配對(這是默認方法)。

———-

在本項目中,我們選擇了藍牙連接,因為這種方式易於配置。藍牙模組用作Arduino的序列端子,將被連接到TX和RX引腳。

想要透過藍牙進行資料傳輸需要遵循一些規則。我們需要有:

  • (通常值為邏輯0)
  • 資料位元
  • 校驗位元(資料位元的和;我們將會比較從頭到尾所有位的和)
  • 停止位元(大多數情況下值為邏輯1)

引腳連接:

  1. 將HC-05的TX引腳連接到Arduino的RX引腳。
  2. 將HC-05的RX引腳連接到Arduino的TX引腳。
  3. 將GND引腳連接在一起。

 

在我們之前的課程 製作您自己的Arduino RFID門鎖—第2部分:用智慧型手機解鎖中對HC-05設定進行了詳細說明。如果您在連接藍牙模組時遇到問題,請參考上述課程。

automatic pet feeder

圖2:HC-05和Arduino Uno之間的連接

藍牙傳輸代碼:

 

 

 

該代碼中的演算法非常簡單:我們對串口進行初始化,然後等待埠打開。我們將透過該代碼發送指令。如果代碼不可用,程式將不會執行,“餵食”指令將不會發送到微控制器進行相應處理。

該程式還將比較來自“voice(聲音)”變數的字串和串口讀取的字串。如果兩者相同,則會向馬達發送一個指令來觸發SG90伺服馬達。

automatic pet feeder

圖3:連接到第1部分裝置中的HC-05藍牙模組

步驟3:設計應用程式

現在,讓我們來創建一個應用程式吧!和以前一樣,我們將使用MIT App Inventor。我們的最終目標是創建一個對所連接的多種裝置進行積體的組合型應用程式(例如,積體了多個所連接裝置的智慧家居應用程式)。

有關MIT App Inventor的設定指南,請參考上一課程製作您自己的Arduino RFID門鎖—第2部分:用智慧型手機解鎖 (步驟3:應用程式)。本課程將分步指導您使用App Inventor創建自己的應用程式。

我們所創建的應用程式將會具有一個簡單的介面,其中包含以下功能:

  • 連接到藍牙
  • 使您可以遠端餵食寵物
  • 存儲:將資料(以檔形式)存儲在手機中
  • 顯示日期:在手機螢幕上顯示日期資訊
automatic pet feeder

圖4:寵物餵食器應用程式的簡單使用者介面

 

該程式的模組圖非常簡單易懂:

  • 第一個模組:第一個模組用於藍牙按鈕
    • ListPicker – MIT App Inventor
      按一下該按鈕,將顯示文本清單供使用者選擇。可以透過Designer或Blocks Editor來指定文本內容,方法是將ElementsFromString屬性設定為文本的拆分字串級聯(例如,選擇1,選擇2,選擇3)或者將Elements屬性設定為一個Blocks editor中的列表。
    • ListPicker顯示所有可用的藍牙;該功能在您選擇某一個藍牙前有效。
automatic pet feeder

圖5:第一個模組

  • 第二個模組:透過調用call BluetoothClient1.Connect address實現應用程式與用戶端之間的連接。您手機中的藍牙將搜索附近的裝置,並將其顯示在ListPicker中。您可以選擇要配對的裝置。
automatic pet feeder

圖6:第二個模組

同時還有一個標籤,在建立連接後標籤上會顯示相關消息。如果裝置已經成功連接,您將在螢幕上看到“已連接(Connected)”的消息。

  • 第三個模組:僅用於連接完成時透過用戶端發送一個消息。該文本以序列通信的方式,透過藍牙從一個裝置發送到另一個裝置。這就像在Arduino的序列監視器中鍵入文本一樣。
    當我們從序列讀取資料時,就是在對使用者的輸入與Arduino記憶體中存儲的字串進行比較。這就是演算法的工作原理。

 

automatic pet feeder

圖7:第三個模組

我們接下來看看另一組模組圖:

  • 第一個模組:將藍牙傳輸的日期保存到存儲在手機記憶體裡的.txt文件中。
automatic pet feeder

圖8:第一個模組

  • 第二個模組:當按下按鈕時,將會讀取保存在文字檔中的資料。
automatic pet feeder

圖9:第二個模組

  • 第三個模組:將餵食的時間和標籤寫入螢幕。這個資訊很有用,因為它可以幫助我們對餵食時間進行記錄,如果我們不想對寵物餵食過多,可以查看時間來確認。
automatic pet feeder

圖10:第三個模組

  • 第四個模組:發生錯誤時,該模組將刪除.txt檔中的所有資料。這一功能很重要,因為一旦執行,將不再顯示以前的資訊。
automatic pet feeder

圖11:第四個模組

該應用程式的第二部分提供了不同的餵食模式:正常餵食模式,用於寵物寶寶的餵食模式和用於成年寵物的餵食模式。這也為您提供了需要為寵物餵食多少食物量的有關資訊。其中最酷的功能之一是語音辨識模式。我們將在下文中討論有關該功能的更多內容。

automatic pet feeder

圖12:應用程式上顯示的非正確時間和日期

如果想要查找餵食的日期和時間,可以按“顯示日期”按鈕。該應用程式是以精簡模式製作的,因為並不是每個人都希望看到所有資訊。如圖所示,日期和時間顯示不正確。為了獲得確切的日期和時間,我們需要使用Arduino IDE中的Set Time 範例。現在,RTC模組將指示正確的日期和時間。

automatic pet feeder

圖13:如何找到Arduino IDE中的SetTime

 

 

圖14顯示了該應用程式的最終版本:

automatic pet feeder

圖14:應用程式的最終版本

應用程式概述:

  • 需要連接到藍牙。
  • 根據寵物的年齡採用不同的餵食模式。
  • 要啟動語音辨識模式,只需按一下“語音辨識餵食”按鈕並講話即可。
    • 僅當正確說出指令時,餵食器才能運行。如果關鍵字不正確(無法正確識別),則只會在標籤上顯示而不執行指令。
    • 在語音辨識的模式下,當兩次說出/重複“餵食”指令(比如您沒有等待幾秒鐘的時間讓系統對資訊進行處理)時,指令就會變成“餵食餵食”,這不是有效的指令。它將保留在標籤上而不執行。
    • 如果語音辨識上的“餵食”指令正常工作,標籤上將會列印出時間。
  • 還包括一個餵食指南,您可以根據寵物的體重查找有關所應提供食物量的資訊。
automatic pet feeder

圖15:寵物餵食指南/ ©Fish4Dogs

所有指令都可以在Arduino IDE的序列監視器上找到。這有助於我們在必要時對應用程式進行調試。

automatic pet feeder

圖16:序列監視器中顯示的餵食資料

對於語音辨識,我們需要一個按鈕來啟動該模式。我們可以使用App Inventor中已經提供的 SpeechRecognizer 元件。

 

automatic pet feeder

圖17:在MIT App Interventor上添加SpeechRecognizer組件

有了這兩個元件後,將它們連接起來非常簡單。您需要處理來自講話者的文本。這是透過調用Call SpeechRecognizer. GetText來完成的。之後,您需要有一個標籤來顯示所說的內容,也可以沒有這個標籤,但是如果沒有標籤您將無法看到自己是否說了正確的指令。在程式迴圈中,您還需要透過藍牙將語音指令傳輸到Arduino,需要使用SentText text 程式。

automatic pet feeder

圖18:語音辨識模組

對於每種模式,您都需要有相對應的按鈕。每個按鈕對應不同的指令,該指令將會被發送到Arduino,然後據此餵食不同量的食物。

automatic pet feeder

image041
圖19:寵物寶寶模式,正常餵食模式和成年寵物模式模組

 

點擊此處閱讀本文的第1部分 >