電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>從Alexa控制Raspberry Pi(Linux設(shè)備)

從Alexa控制Raspberry Pi(Linux設(shè)備)

2022-12-09 | zip | 0.41 MB | 次下載 | 免費(fèi)

資料介紹

描述

當(dāng)向 Alexa 發(fā)出語音命令時(shí),在 Raspberry Pi 上運(yùn)行命令/腳本。

?

我希望能夠通過向我家里的 Alexa Dots 發(fā)出語音命令來在我的 Raspberry Pi 上運(yùn)行命令。此外,我想通過 Alexa 安排任務(wù),而不是必須將計(jì)劃任務(wù)單獨(dú)添加到我家里的幾個(gè) Pis。

為此,我們需要設(shè)置:

  • 同時(shí)登錄 AWS 和 Amazon 開發(fā)者站點(diǎn)以確認(rèn)您可以訪問 AWS 和 Amazon 開發(fā)者站點(diǎn)
  • AWS IAM:創(chuàng)建 RPi 腳本將用于登錄 AWS 的用戶和組
  • AWS SQS(消息隊(duì)列)。
  • AWS LAMBDA 函數(shù)
  • 亞馬遜 Alexa 技能

Alexa 技能指向 Lambda 函數(shù),根據(jù)發(fā)出的語音命令取決于將什么消息添加到 SQS 隊(duì)列,在 Rapsberry Pi 上運(yùn)行腳本來檢查 SQS 隊(duì)列并根據(jù)消息啟動(dòng)作業(yè)或腳本樹莓派。

AWS 和亞馬遜開發(fā)賬戶

如果您還沒有 AWS 帳戶,則需要設(shè)置一個(gè),沒有理由認(rèn)為該項(xiàng)目不屬于 AWS“免費(fèi)套餐”,該套餐允許每月向 Lambda 發(fā)出 100 萬次免費(fèi)請(qǐng)求,向 Lambda 發(fā)出 100 萬次免費(fèi)請(qǐng)求。 SQS 服務(wù)。為了超越免費(fèi)套餐,您需要每 3 秒發(fā)出超過 1 個(gè)請(qǐng)求(基于每月 30 天),設(shè)置后我將腳本設(shè)置為每 15 秒運(yùn)行一次,但當(dāng)然如果我有 10 個(gè) RPi 在做那么需要考慮的一個(gè)請(qǐng)求。

AWS - 創(chuàng)建用戶和組

登錄 AWS 并轉(zhuǎn)到 IAM 管理控制臺(tái)并添加用戶:

https://console.aws.amazon.com/iam/home?#/users

?
pYYBAGOSnc-AHZytAABIfL9Xris835.png
?
?
pYYBAGOSndSAX_ogAADCI_SN6aQ828.png
?

由于權(quán)限是在組級(jí)別設(shè)置的,因此我們需要為該用戶創(chuàng)建一個(gè)新組,如果我們將來創(chuàng)建更多用戶,他們也可以使用同一組。該用戶將從 Raspberry Pi 登錄,因此需要能夠查看和更新?? AWS SQS 中的隊(duì)列。

?
poYBAGOSndeAL8f9AABqSi_2a1Y700.png
?

為此,我們可以使用亞馬遜預(yù)定義策略(預(yù)設(shè)權(quán)限),搜索“sqs”并選擇策略“AWSLambdaSQSQueueExecutionRole”,然后單擊“創(chuàng)建組”(這將允許用戶讀取和寫入 SQS 隊(duì)列) .

?
pYYBAGOSnduAfHtlAAE8V3xliMs913.png
?

這會(huì)將您帶回“將用戶添加到組”屏幕,并且將選擇新組以將新用戶添加到其中,單擊“下一步:標(biāo)簽”按鈕繼續(xù)。

?
pYYBAGOSnd6ASMs4AAEFHCbYF7k662.png
?

在“添加標(biāo)簽”屏幕上,只需單擊“下一步:審閱”按鈕繼續(xù)。

在下一個(gè)屏幕上,查看新用戶的詳細(xì)信息并單擊“創(chuàng)建用戶”

在接下來的屏幕上,確保您“下載.csv”,因?yàn)檫@將是您獲取此用戶憑據(jù)的唯一機(jī)會(huì)。

?
pYYBAGOSneSAWSlWAACqlpCa3XI156.png
?

CSV 中的憑據(jù)將添加到 RPi 上的腳本中,以便它可以登錄以訪問 SQS 隊(duì)列。

注意:自 2019 年 6 月起,為了讓 Alexa 技能運(yùn)行 Lambda 函數(shù),Lamda 代碼必須托管在以下區(qū)域之一:

  • 亞太地區(qū)(東京)
  • 歐盟(愛爾蘭)
  • 美國東部(弗吉尼亞北部)
  • 美國西部(俄勒岡)

https://developer.amazon.com/docs/custom-skills/host-a-custom-skill-as-an-aws-lambda-function.html

由于我住在英格蘭 (UK),我將在愛爾蘭地區(qū)通過 SQS 隊(duì)列和 Lambda 函數(shù)托管。

?
poYBAGOSneiALwaMAAAJ8oP6dw0845.png
?

創(chuàng)建 AWS SQS 隊(duì)列

找到 SQS 頁面并創(chuàng)建一個(gè)新的簡單隊(duì)列服務(wù):

?
poYBAGOSneuAA5_GAAAuTTjRR0c152.png
?

輸入新名稱并使用“快速創(chuàng)建隊(duì)列”選項(xiàng)創(chuàng)建“標(biāo)準(zhǔn)隊(duì)列”:

?
pYYBAGOSne2AW-hiAABnk6S4tBY813.png
?

單擊新隊(duì)列并記下我們稍后需要的 ARN 和 URL:

?
poYBAGOSne-ANc30AACCMWrs2lE136.png
?

創(chuàng)建 Lambda 函數(shù)

在 AWS 中,在“服務(wù)”中搜索“Lambda”并創(chuàng)建一個(gè)新函數(shù):

?
pYYBAGOSnfSAZibLAAHt6ibgZbU545.png
?

選擇“從頭開始創(chuàng)作”,添加名稱并將“運(yùn)行時(shí)”更改為“Python 2.7”。對(duì)于執(zhí)行角色,選擇“從 AWS 策略模板創(chuàng)建新角色”,選擇“Amazon SQS 輪詢器權(quán)限”策略,為角色命名并創(chuàng)建函數(shù)。

對(duì)于功能的配置,當(dāng)您在“設(shè)計(jì)器”面板中單擊某些內(nèi)容時(shí),配置設(shè)置將顯示在屏幕的下半部分。

從左側(cè)添加“Alexa Skills Kit”觸發(fā)器,需要配置才能保存此功能。滾動(dòng)到底部,因?yàn)槲覀冞€沒有 Alexa 技能 ID(我們還沒有創(chuàng)建技能)我們暫時(shí)“禁用”它,稍后再回來。

?
poYBAGOSnfmAT-hjAAEdM_qoBq8449.png
?

選擇 Lambda 函數(shù)圖標(biāo)(對(duì)我來說是“RPi-LED-Function”),在底部我們需要提供自定義 Python 代碼,此代碼將向 Alexa 技能提供反饋并更新 SQS 隊(duì)列。

我在下面的代碼中添加了一些關(guān)于需要更改的注釋。

import boto3
  
# Below you need to add in your access key, access secret, rgion and sqs queue url
  
access_key = "This can be found in the downloaded .csv file"
access_secret = "This can be found in the downloaded .csv file"
region ="eu-west-1"
queue_url = "This can be found when looking at the SQS queue, https://..."
  
# you should not need to change the following unless you know what your doing.
  
def build_speechlet_response(title, output, reprompt_text, should_end_session):
   return {
       'outputSpeech': {
           'type': 'PlainText',
           'text': output
       },
       'card': {
           'type': 'Simple',
           'title': "SessionSpeechlet - " + title,
           'content': "SessionSpeechlet - " + output
       },
       'reprompt': {
           'outputSpeech': {
               'type': 'PlainText',
               'text': reprompt_text
           }
       },
       'shouldEndSession': should_end_session
   }
def build_response(session_attributes, speechlet_response):
   return {
       'version': '1.0',
       'sessionAttributes': session_attributes,
       'response': speechlet_response
   }
def post_message(client, message_body, url):
   response = client.send_message(QueueUrl = url, MessageBody= message_body)
def lambda_handler(event, context):
   client = boto3.client('sqs', aws_access_key_id = access_key, aws_secret_access_key = access_secret, region_name = region)
   intent_name = event['request']['intent']['name']
  
# The following needs to be customised
# The intent names shown below are linked with intents created in the custom Alexa Skill.
# The 'post_message' relates to the SQS queue 
# The 'message' line is the message/response that Alexa will speak back to you  
  
   if intent_name == "LightsOn":
       post_message(client, 'on', queue_url)
       message = "Lounge Lights will now turn on"
   elif intent_name == "LightsOff":
       post_message(client, 'off', queue_url)
       message = "Lounge Lights will now turn off"
   elif intent_name == "LightsRed":
       post_message(client, 'red', queue_url)
       message = "Lounge Lights will change to red"
   elif intent_name == "LightsGreen":
       post_message(client, 'green', queue_url)
       message = "Lounge Lights will now change to green"
   elif intent_name == "LightsBlue":
       post_message(client, 'blue', queue_url)
       message = "Lounge Lights will now change to blue"
   elif intent_name == "LightsTest":
       post_message(client, 'test', queue_url)
       message = "Lounge Lights will now run a test sequence"
   else:
       message = "Sorry but I do not understand that request"
  
   speechlet = build_speechlet_response("Mirror Status", message, "", "true")
   return build_response({}, speechlet)
0

創(chuàng)建自定義 Alexa 技能

在這里登錄并創(chuàng)建一項(xiàng)新技能,選擇“自定義”技能和“從頭開始:”

https://developer.amazon.com/en-US/alexa/alexa-skills-kit

這里需要配置如下:

?
pYYBAGOSnfyAMP2EAAEhtNAyTP8863.png
?

Invocation Name - 這是將用于觸發(fā)技能的名稱,我稱我的為“l(fā)ounge lights”。

意圖、示例和槽- 對(duì)于這個(gè)示例,我保持簡單并為每個(gè)操作創(chuàng)建了一個(gè)“意圖”,如下所示,您還應(yīng)該注意到這些意圖反映了我在 Lambda 中添加的代碼。

?
poYBAGOSngCAIjNxAABH2BgFIJA975.png
?

這是我的一個(gè)意圖的例子,你當(dāng)然可以根據(jù)你的要求添加任何你想要的:

?
pYYBAGOSngKAeioOAABTpt5PL-I065.png
?

所以,為了讓這句話起作用,我會(huì)說“Alexa,讓 Lounge Lights 關(guān)掉?!?/font>

構(gòu)建模型- 完成上述操作后,保存并構(gòu)建模型。

端點(diǎn)- 添加一個(gè)端點(diǎn),這是我們已經(jīng)創(chuàng)建的 Lambda 函數(shù)的 ARN。如果您在保存此端點(diǎn)時(shí)遇到任何錯(cuò)誤,請(qǐng)確保已檢查以下內(nèi)容:

  • Lambda 代碼位于:亞太地區(qū)(東京)、歐洲(愛爾蘭)、美國東部(弗吉尼亞北部)或美國西部(俄勒岡)
  • “Alexa Skills Kit”觸發(fā)器已添加到 Lamdba 函數(shù)中

測試 Alexa 技能

在 Alexa 技能界面中,單擊“測試”選項(xiàng)卡,您可以在此處進(jìn)行測試以確認(rèn) 1) 您的意圖是正確的,以及 2) lambda 函數(shù)已正確配置。測試完成后,您可以繼續(xù)配置 Raspberry Pi 以從 SQS 隊(duì)列中讀取數(shù)據(jù)。

配置樹莓派(linux設(shè)備)

根據(jù)您的最終目標(biāo)取決于您需要在 RPi 上做什么,我的第一個(gè)測試是打開/關(guān)閉我的 Magic Mirror 顯示器,并且能夠重新啟動(dòng) RPi。

第二個(gè)是與這個(gè)項(xiàng)目 writeup 內(nèi)聯(lián)的,是能夠打開 ws2811/ws2812 LED 燈帶連接到我的 RPi。

需要運(yùn)行以下代碼,這將登錄到 AWS 并查看 SQS 隊(duì)列中的條目,并根據(jù)存儲(chǔ)的消息取決于運(yùn)行的本地 Python 腳本。要運(yùn)行 LED,您需要將腳本作為“sudo”運(yùn)行。

import boto3
import os
import time
  
access_key = "Access key from the csv file"
access_secret = "Access seret from the csv file"
region = "the region where the SQS queue is - found in the queue url"
queue_url = "SQS Queue URL, https://sqs....."
  
def pop_message(client, url):
response = client.receive_message(QueueUrl = url, MaxNumberOfMessages = 10)
  
#last message posted becomes messages
message = response['Messages'][0]['Body']
receipt = response['Messages'][0]['ReceiptHandle']
client.delete_message(QueueUrl = url, ReceiptHandle = receipt)
return message
  
client = boto3.client('sqs', aws_access_key_id = access_key, aws_secret_access_key = access_secret, region_name = nameOfTheRegion
  
waittime = 20
client.set_queue_attributes(QueueUrl = queue_url, Attributes = {'ReceiveMessageWaitTimeSeconds': str(waittime)})
  
time_start = time.time()
while (time.time() - time_start < 30):
print("Checking...")
try:
message = pop_message(client, queue_url)
print(message)
if message == "on":
os.system("python /home/pi/LEDScripts/LED_on.py")
elif message == "off":
os.system("python /home/pi/LEDScripts/LED_off.py")
elif message == "blue":
os.system("python /home/pi/LEDScripts/LED_blue.py")
elif message == "red":
os.system("python /home/pi/LEDScripts/LED_red.py")
elif message == "green":
os.system("python /home/pi/LEDScripts/LED_green.py")
elif message == "test":
os.system("python /home/pi/LEDScripts/LED_test.py")
except:
pass

您會(huì)在上面看到使用了包“boto3”(AWS SDK),您可以通過運(yùn)行以下命令來安裝它:

python -m pip install boto3

這是運(yùn)行的 Python 腳本之一的示例:

from neopixel import *
  
# LED strip configuration:
LED_COUNT = 12  # Number of LED pixels.
LED_PIN = 19  # GPIO pin connected to the pixels (18 uses PWM!).
LED_FREQ_HZ = 800000  # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10  # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 30   # Set to 0 for darkest and 255 for brightest
LED_INVERT  = False   # True to invert the signal
LED_CHANNEL = 1   # set to '1' for GPIOs 13, 19, 41, 45 or 53
  
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
  
for i in range(strip.numPixels()):
strip.setPixelColor(i, Color(0, 255, 0))
  
strip.show()

為 LED 燈條設(shè)置 Pi

如果在可以運(yùn)行不同的庫之前你還沒有運(yùn)行它們,但是我選擇使用這個(gè):https ://github.com/jgarff/rpi_ws281x.git

您需要運(yùn)行以下命令:

sudo apt-get install build-essential python-dev git scons swig
git clone https://github.com/jgarff/rpi_ws281x.git

然后從 GitHub 下載包中的“python”目錄:

sudo python setup.py build
sudo python setup.py install

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)