資料介紹
描述
更新(26/7/2022):
此項(xiàng)目托管在 Amazon Lambda 上的代碼需要更新,目前無法運(yùn)行。
什么是天空查找器?
樂高一直致力于通過游戲發(fā)現(xiàn)和學(xué)習(xí)。使用這款 LEGO Mindstorms 小工具成為一名太空探險(xiǎn)家,并將 Alexa 變成您的宇宙私人向?qū)А?/font>Sky Finder 會(huì)向您展示天空中最有趣的恒星、行星甚至星系,而 Alexa 會(huì)告訴您有關(guān)它們的信息。
無需昂貴的望遠(yuǎn)鏡即可在天空中看到許多令人興奮的事物,但如果沒有一些幫助則很難找到它們。該項(xiàng)目是一個(gè)樂高小工具,您可以使用標(biāo)準(zhǔn)的 Mindstorms EV3 套裝 (31313) 輕松拼搭,并發(fā)現(xiàn)從您的窗戶或后院可以看到的東西。
我為什么要建這個(gè)?
該項(xiàng)目參加了 hackster.io 上的 LEGO Mindstorms 語音挑戰(zhàn)賽。我想構(gòu)建一些有趣且原創(chuàng)的東西,而這些東西無法單獨(dú)使用 Alexa 或 LEGOMindstorms 完成。
Alexa 和樂高的結(jié)合非常適合這個(gè)項(xiàng)目。Alexa 提供了一個(gè)友好的界面來探索天空,Sky Finder 小工具會(huì)告訴你在哪里看。觀看屏幕后,您的眼睛需要一段時(shí)間才能適應(yīng)夜空的黑暗,因此語音界面是在深空和我們自己的太陽(yáng)系中定位數(shù)百個(gè)不同物體的完美方式。
它能做什么?
Sky Finder 知道從北半球和南半球可見的所有星座;天空中許多最有趣的星星;我們太陽(yáng)系中的所有行星;以及許多肉眼可見的深空天體,例如仙女座星系和昴宿星團(tuán)。
它還會(huì)建議從您的位置可見的天空中有趣的事物,并為您提供有關(guān)您正在查看的內(nèi)容的信息。
得益于亞馬遜 AWS 服務(wù)中可用的處理能力,Sky Finder 可以執(zhí)行定位恒星、行星和其他天體所需的復(fù)雜計(jì)算,而僅靠 EV3 brick 很難完成這些計(jì)算。
使其易于構(gòu)建
我想讓人們盡可能輕松地構(gòu)建項(xiàng)目,從中學(xué)習(xí)并根據(jù)需要擴(kuò)展項(xiàng)目。
- 該小工具僅使用 LEGO Mindstorms EV3 套裝 (31313) 中的零件
- 提供完整的樂高搭建說明
- 在 EV3 brick 上運(yùn)行的代碼和 Alexa 技能代碼都是用 Python 編寫的
- 技能代碼可以由 Alexa 托管,因此一切都可以在 Alexa Skills 控制臺(tái)中完成。
完整演練:如何構(gòu)建 Skyfinder
下面的演練包含有關(guān)如何制作您自己的 Skyfinder 的說明及其工作原理的信息。如果您想在不了解其工作原理的情況下構(gòu)建它,只需按照編號(hào)說明進(jìn)行操作即可。
構(gòu)建樂高小工具
1. 使用本頁(yè)底部示意圖部分中的完整搭建說明搭建樂高小工具。
2. 小工具完成后,使用 4 根電纜將電機(jī)和傳感器連接到積木上。我建議如下:
使用 50 厘米電纜將顏色傳感器連接到 EV3 程序塊上的插座 1,確保電纜在 EV3 程序塊上方運(yùn)行。
使用 25 厘米的電纜將觸摸傳感器連接到插座 4。您可能需要暫時(shí)將傳感器與小工具分離,以便更容易插入。
使用 25 厘米的電纜將大型電機(jī)連接到插座 D,小心地在 EV3 程序塊和電機(jī)之間鋪設(shè)電纜。
使用 35 厘米電纜將中型電機(jī)連接到插座 C。
設(shè)置 ev3dev 構(gòu)建環(huán)境
3. 您需要將 ev3dev 操作系統(tǒng)安裝到您的 micro SD 卡上,從卡上啟動(dòng)您的 EV3 程序塊,并將 EV3 連接到 Visual Studio Code 編輯器。LEGO MINDSTORMS 語音挑戰(zhàn)團(tuán)隊(duì)在此處提供了一些分步說明。(除非您想了解更多信息,否則無需繼續(xù)執(zhí)行任何任務(wù))。
在 Alexa Developer Console 中注冊(cè)您的小工具
4. 接下來您需要在 Alexa 開發(fā)者控制臺(tái)中注冊(cè)您的小工具。LEGO MINDSTORMS 語音挑戰(zhàn)團(tuán)隊(duì)再次提供了說明。按照此處的步驟 1-10進(jìn)行操作,并記下Amazon ID和Alexa Gadget Secret。
該軟件
Sky Finder 由物理樂高硬件和兩個(gè)用 Python 編寫的軟件程序組成。第一個(gè)(“Alexa 技能”)在亞馬遜的云服務(wù)器上運(yùn)行并處理來自 Echo 設(shè)備的語音命令,計(jì)算星星位置并創(chuàng)建一個(gè)有效載荷/命令,該有效載荷/命令被發(fā)送到 Sky Finder 小工具(通過 Echo)以移動(dòng)電機(jī).
第二個(gè)軟件程序也是用 Python 編寫的,在 EV3 程序塊上運(yùn)行。它通過藍(lán)牙將 Sky Finder 小工具連接到 Echo 設(shè)備,然后收聽來自 Alexa 技能的命令,通過 Echo 轉(zhuǎn)發(fā),并相應(yīng)地移動(dòng)電機(jī)。
在下一節(jié)中,我將介紹 Alexa skill 的一些主要功能,并解釋如何在 Alexa 開發(fā)人員控制臺(tái)中進(jìn)行設(shè)置。
自定義 Alexa Skill - 設(shè)置
5. 要構(gòu)建新的 Alexa 技能,請(qǐng)轉(zhuǎn)到Alexa Developer Console ,根據(jù)需要登錄并單擊“創(chuàng)建技能”按鈕。
6. 在下一個(gè)屏幕上,輸入您的技能名稱(Sky Finder 或您選擇的其他名稱)并選擇與您的 Echo 設(shè)備上的設(shè)置相匹配的語言/地區(qū)。接下來選擇Custom skill model 和Alexa-Hosted (Python) ,然后單擊Create Skill按鈕。
7. 在最后一個(gè)屏幕上,選擇Hello World模板并單擊“選擇”按鈕以創(chuàng)建新技能。設(shè)置需要幾分鐘時(shí)間。
自定義 Alexa Skill - 交互模型
自定義 Alexa 技能包括一個(gè)語音交互模型,它將用戶的口頭輸入映射到Python 軟件中的類可以處理的意圖。
Sky Finder 接受兩個(gè)主要意圖:
- ScanIntent:掃描部分天空以尋找有趣的物體,并告訴用戶它們是什么。(例如,您在南方能看到什么?)。
- LocateIntent:定位天空中的特定物體(恒星、行星、星座等),讓小工具指向它并向用戶提供有關(guān)該物體的一些信息。(例如定位金星)
語音交互模型還指定槽(或參數(shù)),其中包含上面兩個(gè)示例中以粗體顯示的羅盤方向或?qū)ο蟆?/font>
8. 首先我們需要啟用技能來使用我們的小工具,因此在“構(gòu)建”選項(xiàng)卡上,從左側(cè)菜單中選擇界面并啟用自定義界面控制器。
9. 單擊頁(yè)面頂部的保存接口按鈕。
10. 接下來,從左側(cè)菜單中選擇JSON 編輯器。將本教程底部提供的 JSON 交互模型代碼下載到編輯器中,然后將文件拖放到編輯器上方的拖放區(qū)域。
11. 單擊屏幕頂部的保存模型按鈕,然后單擊構(gòu)建模型按鈕。構(gòu)建需要一分鐘左右的時(shí)間。您應(yīng)該會(huì)看到意圖(LocateIntent 和 ScanIntent)及其相應(yīng)的槽出現(xiàn)在屏幕左側(cè)。
單擊“意圖”以查看示例話語,這些話語是用戶可能會(huì)說出的觸發(fā)該意圖的示例。Alexa 的 AI 根據(jù)用戶所說的內(nèi)容選擇最合適的話語 - 他們不必說出示例中列出的確切單詞。
單擊插槽類型以查看用戶可能會(huì)說的羅盤方向或(天體)物體的名稱,以及同義詞。插槽值還包含一個(gè) ID,該 ID 將傳遞給唯一標(biāo)識(shí)對(duì)象的 Python 代碼。例如,如果您是美國(guó)人,您可能會(huì)詢問“找到北斗七星”的技能,如果您是英國(guó)人,則可能會(huì)詢問“找到犁”的技能,但除了這些信息之外,還有“UMa”(大熊座)的官方名稱作為 ID 傳遞。
自定義 Alexa Skill - Lambda 函數(shù)
在本例中用 Python 編寫的 Lambda 函數(shù)包含 Alexa 技能的所有主要處理邏輯。它由許多處理意圖的方法組成。@ 語法根據(jù) Alexa SDK 的要求將裝飾器應(yīng)用于類。所有技能都遵循相似的結(jié)構(gòu),因此您可以輕松調(diào)整此技能,或亞馬遜團(tuán)隊(duì)提供的適合您目的的技能,而不是完全從頭開始編寫。
12. 單擊開發(fā)人員控制臺(tái)的“代碼”選項(xiàng)卡。
13.將lambda_function.py 、utils.py和requirements.txt的內(nèi)容替換為本頁(yè)底部Code部分對(duì)應(yīng)文件的內(nèi)容。
注意:目前,請(qǐng)忽略代碼部分中標(biāo)記為“API 代碼”的同名文件
14. 右鍵單擊?? utils.py 下面的空間并選擇創(chuàng)建文件。
15.在 lambda 文件夾中創(chuàng)建一個(gè)名為data.py的新文件。
16.將本頁(yè)底部代碼部分的data.py文件內(nèi)容復(fù)制到新文件中。
17. 單擊保存按鈕保存您創(chuàng)建的文件,如果您想查看下面解釋的代碼,則單擊 lambda_function.py 選項(xiàng)卡。
啟動(dòng)請(qǐng)求
除了我們?cè)诮换ツP椭卸x的兩個(gè)意圖(ScanIntent 和 LocateIntent)之外,還有一些內(nèi)置的意圖需要處理。其中最重要的是 LaunchRequest,它在用戶打開技能時(shí)調(diào)用(“Alexa,打開 Sky Finder”)。
@skill_builder.request_handler(can_handle_func=is_request_type("LaunchRequest"))
def launch_request_handler(handler_input: HandlerInput):
LaunchRequest 處理程序方法首先檢查 Alexa 小工具是否已連接到 Echo 設(shè)備。
system = handler_input.request_envelope.context.system
api_access_token = system.api_access_token
api_endpoint = system.api_endpoint
# Get connected gadget endpoint ID.
endpoints = get_connected_endpoints(api_endpoint, api_access_token)
如果小工具已連接,端點(diǎn) ID 將存儲(chǔ)在會(huì)話屬性中,以便我們將來可以將位置發(fā)送到小工具。
# Store endpoint ID for using it to send custom directives later.
logger.debug("Received endpoints. Storing Endpoint Id: %s", endpoint_id)
session_attr = handler_input.attributes_manager.session_attributes
session_attr["endpoint_id"] = endpoint_id
一般來說,每次用戶說話時(shí)都會(huì)再次調(diào)用 lambda 函數(shù),因此我們需要在對(duì)話期間保留的任何變量都應(yīng)存儲(chǔ)在會(huì)話屬性中。
定位意圖
LocateIntent 是我們定義的自定義意圖,當(dāng)用戶要求 Sky Finder 在天空中定位某物時(shí)調(diào)用它。當(dāng)我們收到 YesIntent 時(shí),也會(huì)調(diào)用此處理程序方法。(稍后對(duì)此進(jìn)行更多解釋)。
@skill_builder.request_handler(can_handle_func=lambda handler_input:
is_intent_name("AMAZON.YesIntent")(handler_input) or
is_intent_name("LocateIntent")(handler_input))
def locate_intent_handler(handler_input: HandlerInput):
首先,請(qǐng)求處理程序嘗試獲取我們?cè)诮换ツP偷牟宀垲愋筒糠种兄付ǖ模ㄌ祗w)對(duì)象的唯一 ID,例如 UMa(大熊座)。
# Get the name of the object the user is trying to locate from the slot
slots = handler_input.request_envelope.request.intent.slots
try:
# See if it's been matched to one of the specified values for this slot type in the interaction model
object = slots["object"].resolutions.resolutions_per_authority[0].values[0].value.id
下一段代碼在我們定位對(duì)象時(shí)向用戶發(fā)送一個(gè)臨時(shí)響應(yīng)(“定位大熊座......”)我不會(huì)在這里詳細(xì)解釋它,除了說 SpeakDirective 是一種發(fā)送在 lambda 函數(shù)完成執(zhí)行之前響應(yīng) Echo 設(shè)備。
# Locate the object in space
az,alt,distance = utils.locate(object)
物體在天空中的位置使用方位角、高度坐標(biāo)指定。方位角在 0 到 359 度之間,對(duì)應(yīng)于羅盤方向。高度表示物體在天空中的高度,從地平線上的 0 度到頭頂正上方的 90 度。
接下來,處理程序準(zhǔn)備來自 Alexa 的語音響應(yīng),告訴用戶對(duì)象已被定位,并提供一些有趣的事實(shí)(如果我們有)。
# object found and visible with a defined distance
compass = utils.degrees_to_dir(az)
speak_output = "{} Located. {} is currently {} kilometers from your location. {} {}".format(radar_ping, name, distance, description, data.ASK_MESSAGE)
如果小工具已連接,我們會(huì)準(zhǔn)備一個(gè)負(fù)載(命令),其中包含 Echo 設(shè)備中繼到小工具的位置,指定我們保存到 LaunchIntent 處理程序中的會(huì)話屬性的端點(diǎn) ID。
if ("endpoint_id" in session_attr and object_located):
payload = {
"type": "move",
"az": az,
"alt": alt,
}
endpoint_id = session_attr["endpoint_id"]
directive = build_send_directive(NAMESPACE, NAME_CONTROL, endpoint_id, payload)
最后,我們使用 Alexa SDK 中響應(yīng)生成器類的方法來構(gòu)建發(fā)送回 Echo 設(shè)備的數(shù)據(jù)結(jié)構(gòu)。
return (handler_input.response_builder
.speak(speak_output)
.ask("What do you want me to find?")
.add_directive(directive)
.response)
掃描意圖
當(dāng)用戶詢問有關(guān)他們?cè)谔囟ㄌ炜諈^(qū)域中可以看到的內(nèi)容的信息時(shí),將調(diào)用 ScanIntent。
@skill_builder.request_handler(can_handle_func=is_intent_name("ScanIntent"))
def scan_intent_handler(handler_input: HandlerInput):
首先,技能從插槽中獲取用戶指定的羅盤方向。
# Get the compass direction the user has specified
slots = handler_input.request_envelope.request.intent.slots
try:
direction = slots["compass_direction"].resolutions.resolutions_per_authority[0].values[0].value.id
再一次,下一段代碼在我們進(jìn)行查找時(shí)向用戶發(fā)送一個(gè)臨時(shí)響應(yīng),然后我們調(diào)用一個(gè)函數(shù)返回該部分天空中突出物體的列表。
# Find a list of objects in our specified part of the sky
logger.info("Scanning sky in {}.".format(direction))
scan_list = utils.scan(direction)
接下來,我們創(chuàng)建一個(gè)以逗號(hào)分隔的對(duì)象列表,供 Alexa 與用戶對(duì)話。為此,我們?cè)?data.py 文件中的 Python 字典中維護(hù)對(duì)象的常用名稱列表。
for object in scan_list:
# Get list of proper names of objects from database
spoken_list.append(data.OBJECT_DATA[object['name']]['name'])
speak_output += utils.comma(spoken_list)
如果只找到一件物品,Alexa 會(huì)問,“你想讓我告訴你它在哪里嗎?”。對(duì)象名稱保存在會(huì)話屬性中。如果用戶回答“是”,則下次將觸發(fā)YesIntent ,這實(shí)際上是由LocateIntent處理程序處理的,該處理程序?qū)⒍ㄎ灰驯4嬖跁?huì)話屬性中的對(duì)象。
如果有多個(gè)對(duì)象,Alexa 會(huì)詢問“您希望我定位哪一個(gè)?”。
if (len(scan_list) > 1):
speak_output += ". Which one would you like me to locate? "
else:
speak_output += ". Do you want me to show you where it is?"
# save object ready for a possible 'yes' response from the user
object_of_interest = scan_list[0]['name']
session_attr = handler_input.attributes_manager.session_attributes
session_attr["object_of_interest"] = object_of_interest
最后,構(gòu)建響應(yīng)并將其發(fā)送到 Echo 設(shè)備。
return (handler_input.response_builder
.speak(speak_output)
.ask("Do you want me to show you where they are?")
.response)
自定義 Alexa Skill - utils.py 和 data.py
Lambda 函數(shù)導(dǎo)入另外兩個(gè)文件:
utils.py包含許多實(shí)用函數(shù),包括查找恒星和行星位置的代碼。目前,這會(huì)調(diào)用外部查找 API 以避免必須將依賴項(xiàng)編譯到 Lambda 函數(shù)中。API 的代碼包含在本頁(yè)底部以供參考,但您不需要使用它。
data.py包含一個(gè) Python 字典,其中包含有關(guān)恒星、星座、行星和其他物體的信息,以及 Alexa 可能會(huì)向用戶發(fā)出的消息列表,例如用戶在技能啟動(dòng)時(shí)聽到的歡迎消息。
自定義 Alexa 技能 - 指定緯度/經(jīng)度和測(cè)試
18、目前gadget的地理位置是在data.py文件中指定的。
# My latitude and longitude - NB no spaces
LAT = '51.5842N'
LON = '2.9977W'
要將其替換為您的位置,您可以使用 Google 查找附近城市的緯度/經(jīng)度。
在將其粘貼到代碼中之前,請(qǐng)刪除空格和度數(shù)符號(hào)。
19. 完成此操作后,單擊保存按鈕,然后單擊編輯器窗口上方的部署按鈕。
20. 要測(cè)試技能,請(qǐng)轉(zhuǎn)到開發(fā)人員控制臺(tái)中的“測(cè)試”選項(xiàng)卡。
21. 在Alexa 模擬器的輸入窗口中輸入Open Sky Finder (或您之前選擇的技能名稱)。您應(yīng)該會(huì)收到以下響應(yīng)。
在下一節(jié)中,我們將了解 EV3 程序塊的軟件。
5. EV3 程序塊代碼
22. 在您的 PC 上,創(chuàng)建一個(gè)名為 SkyFinder 的新文件夾。從本頁(yè)底部的代碼部分下載skyfinder.py和skyfinder.ini文件,并將它們移動(dòng)到您剛剛創(chuàng)建的新文件夾中。
23. 打開 Visual Studio 代碼編輯器,點(diǎn)擊 File -> Open Folder 并打開剛剛創(chuàng)建的 SkyFinder 文件夾,
24. 在編輯器中打開skyfinder.ini文件,添加第 4 步中的Amazon ID和Alexa Gadget Secret ,然后點(diǎn)擊 File -> Save
25. 將 Visual Studio 連接到 EV3 程序塊。
26. 設(shè)備連接后,圓圈將變?yōu)榫G色。單擊 ev3dev 設(shè)備瀏覽器旁邊的圖標(biāo),將工作區(qū)發(fā)送到設(shè)備。
與 Alexa 技能類相比,EV3 brick 上的代碼相對(duì)簡(jiǎn)單。SkyFinder主類擴(kuò)展了 AlexaGadget并調(diào)用超類來初始化小工具。
class SkyFinder(AlexaGadget):
"""
A Mindstorms gadget that points to a specified position in the sky
For use with the Sky Finder skill
"""
def __init__(self):
"""
Performs Alexa Gadget initialization routines and ev3dev resource allocation.
"""
super().__init__()
當(dāng)小工具與 Echo 設(shè)備連接或斷開連接時(shí),將調(diào)用OnConnected和OnDisconnected方法。這些只是將前面的 LED 分別設(shè)置為綠色或關(guān)閉作為狀態(tài)指示。
on_custom_mindstorms_gadget_control方法在小工具通過 Echo 設(shè)備從技能接收有效負(fù)載時(shí)被調(diào)用。我們支持兩種有效載荷,一種將小工具重置為其起始位置(目前僅在啟動(dòng)時(shí)使用),另一種將指針移動(dòng)到指定的方位角、高度坐標(biāo)。
def on_custom_mindstorms_gadget_control(self, directive):
"""
Handles the Custom.Mindstorms.Gadget control directive.
:param directive: the custom directive with the matching namespace and name
"""
try:
payload = json.loads(directive.payload.decode("utf-8"))
print("Control payload: {}".format(payload), file=sys.stderr)
control_type = payload["type"]
if control_type == "move":
# Expected params: [az, alt]
self.go_to(payload["az"], int(payload["alt"]))
if control_type == "reset":
# Expected params: none
self.reset_position()
except KeyError:
print("Missing expected parameters: {}".format(directive), file=sys.stderr)
reset_position方法首先轉(zhuǎn)動(dòng)控制轉(zhuǎn)盤的大電機(jī),直到觸摸傳感器被按下,然后將轉(zhuǎn)盤旋轉(zhuǎn)指定距離回到起始位置。接下來它轉(zhuǎn)動(dòng)移動(dòng)手臂的中型電機(jī),直到它被顏色傳感器檢測(cè)到。然后以與起始位置相反的方向旋轉(zhuǎn)。
def reset_position(self):
"""
Move arm to starting position
"""
logger.info(""Resetting arm position)
self.lm.stop_action = 'brake'
self.lm.reset()
self.lm.position = 0
# Rotate arm until it pushes touch sensor switch
# and then move specified distance to start position
self.lm.on_for_rotations(speed = SpeedDPS(72), rotations = -3, block=False)
self.ts.wait_for_pressed()
self.lm.off()
self.lm.on_for_degrees(SpeedDPS(72), START_AZ, block = True)
# Rotate arm in other axis until it's seen by the colour sensor
# and then move specified distance to start position
self.mm.stop_action = 'brake'
self.mm.on_for_rotations(speed = 5, rotations = -3, block=False)
# wait until sensor sees (red) arm
while self.cs.color != 5:
continue
self.mm.off()
self.mm.reset()
self.mm.position = 0
self.mm.on_for_degrees(5, START_ALT, block = True)
# turn off the distracting LED on the colour sensor
self.cs.mode='COL-AMBIENT'
# Reset the position counter to 0
self.mm.off()
self.mm.reset()
self.mm.position = 0
self.lm.off()
self.lm.reset()
self.lm.position = 0
重置完成后,指針應(yīng)水平并指向與 EV3 程序塊成直角的位置。如果不是這種情況,請(qǐng)嘗試調(diào)整代碼第 23 和 24 行中的變量。
# Calibration constants for initial position
# Tweak these if required to ensure starting pos is North horizon (0 az, 0 alt)
START_AZ = 388
START_ALT = 210
go_to方法處理“移動(dòng)”有效負(fù)載并簡(jiǎn)單地將轉(zhuǎn)盤和指針移動(dòng)到指定位置。
為避免電纜纏結(jié),我們只將轉(zhuǎn)盤向任一方向移動(dòng) 180 度(北向各 90 度)。要指向南方的某個(gè)位置,我們將轉(zhuǎn)盤移動(dòng)到指向北方,并將指針移到天頂(垂直向上的位置)以外以指向相反的方向。
電機(jī)位置已經(jīng)以度為單位指定,但由于它們連接到齒輪,我們將數(shù)字乘以包含齒輪比的GEAR_LM和GEAR_MM 。
def go_to(self, new_az, new_alt):
"""
Move pointer to a specified position
:param new_az: new azimouth position (in degrees)
:param new_alt: new altitude position (in degrees)
"""
self.leds.set_color("LEFT", "YELLOW")
self.leds.set_color("RIGHT", "YELLOW")
# Normalise rotation to prevent cable tangle
if (new_az > 270):
az1 = new_az - 360
alt1 = new_alt
elif (new_az > 90):
az1 = new_az - 180
alt1 = 180 - new_alt
else:
az1 = new_az
alt1 = new_alt
# Move arm
self.lm.on_to_position(SpeedDPS(ARM_SPEED), az1 * GEAR_LM, block = False, brake = True)
self.mm.on_to_position(SpeedDPS(ARM_SPEED), alt1 * GEAR_MM, block = True, brake = True)
self.leds.set_color("LEFT", "GREEN")
self.leds.set_color("RIGHT", "GREEN")
最后一段代碼在啟動(dòng)時(shí)運(yùn)行并調(diào)用主入口點(diǎn)。
27. 要在 EV3 程序塊上運(yùn)行代碼,請(qǐng)?jiān)?VS 代碼中的 ev3dev 設(shè)備瀏覽器中導(dǎo)航到skyfinder.py文件,右鍵單擊該文件并選擇運(yùn)行。
EV3 程序塊上的綠燈將開始閃爍。
28. 如果小工具尚未連接到 Echo 設(shè)備,它將進(jìn)入藍(lán)牙配對(duì)模式,您將在 EV3 磚屏和 VS Code 中看到類似的消息。
。許可證:CC BY ( http://creativecommons.org/licenses/by/4.0/ )圖表中使用的圖標(biāo): Ben Davis 的 Amazon echo dot 來自 Noun Projectchat 來自 Noun Project 的 I cons 來自 Noun Project 的 naim 的 Signal 來自 Noun Project 的 Deemak DaksinaWoman 來自 Noun Projectlego 來自 Gerardo Martín Martínez 來自 Noun Projectpython 格式來自 ICONZ來自名詞項(xiàng)目
- amo的編程小工具合集 6次下載
- 電阻分壓計(jì)算小工具 37次下載
- 射頻工程類計(jì)算小工具 49次下載
- CAD看圖小工具免費(fèi)下載 45次下載
- 單片機(jī)計(jì)算小工具 11次下載
- mil_mm_inch單位互轉(zhuǎn)_小工具 42次下載
- AMO的編程小工具集合V1.2.3 19次下載
- 進(jìn)制轉(zhuǎn)換小工具 14次下載
- 自寫小工具 40次下載
- 自制51小工具 7次下載
- 算校驗(yàn)位的小工具 2次下載
- 電子工程類小工具(大合集) 1895次下載
- amo的編程小工具集合 14次下載
- 每日文件管理小工具 24次下載
- 寄存器位查看小工具
- POC管理和漏洞掃描小工具 569次閱讀
- USB設(shè)備充電器電路原理圖 829次閱讀
- 分享只有一行代碼的實(shí)用小工具 438次閱讀
- MoreFind:用于快速導(dǎo)出URL、Domain和IP的小工具 641次閱讀
- 一個(gè)簡(jiǎn)單而不起眼的2瓦迷你音頻放大器電路 3120次閱讀
- 用Python寫個(gè)小工具網(wǎng)頁(yè) 1083次閱讀
- 介紹RTOOL的JLINK燒錄小工具 3013次閱讀
- 雜項(xiàng)加密解密小工具使用方法 1144次閱讀
- STM32CubeIDE所支持的幾個(gè)調(diào)試小工具及功能 2842次閱讀
- 時(shí)序分析的小工具——Global Timing Debugger 7683次閱讀
- 如何使用Python開發(fā)截圖識(shí)別OCR的小工具 3404次閱讀
- 介紹幾款非常實(shí)用的單片機(jī)小工具 1.1w次閱讀
- 區(qū)塊鏈上的虛擬樂高是什么? 1561次閱讀
- 分享一份網(wǎng)友學(xué)習(xí)python時(shí)編寫的一個(gè)小工具 7218次閱讀
- 技術(shù)專家手把手教你計(jì)算放大器噪聲系數(shù) 2.1w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多