資料介紹
描述
我們的家人出于各種原因都喜歡糖果。我們想圍繞我們最喜歡的主題創新一些家庭自動化。所以我們制造了一臺帶有傳送帶的機器,可以為我們提供糖果。讓 Amazon Echo Dot 與 Mindstorms EV3 進行通信,很容易向 Alexa 傳授一些技巧,這對我們有益。
希望您按照以下步驟構建我們的模型,然后用您自己的酷想法對其進行擴展。
演示視頻
“Alexa,打開糖果機”
“糖果機已啟動。有什么可以為您服務的嗎?”
“請給我一顆藍色糖果和一顆綠色糖果”
甚至可以說出以下內容:
“Alexa,告訴糖果機我已經完成了我的作業”
“恭喜!你應該得到一些糖果”
---
通訊概述
1. 用戶與 Echo Dot 對話
2. Echo Dot 將音頻樣本發送到 Alexa Voice Service
3. AVS 將其轉換為文本,并將其與我們的 Alexa 技能模型匹配,然后調用我們的 lambda 來處理消息
4. 我們的 lambda 將語音和/或 EV3 命令發送回 Echo Dot
5. Echo Dot 說出消息和/或通過藍牙向 EV3 發送我們的命令
6. EV3 執行我們的命令
第 1 步:設置開發環境
請遵循LEGO MINDSTORMS 語音挑戰:設置頁面上的指南,該頁面將引導您完成以下步驟:
EV3
- 下載 + 刷寫 ev3dev 軟件到 microSD 卡
- (這將允許您在 EV3 上運行 python 代碼并使用高級硬件功能)
- 將 microSD 卡插入 EV3 + 啟動
- 通過 USB 將 EV3 連接到 PC
- (這將加快您的程序傳輸到 EV3 和實時調試)
個人電腦
- 安裝 Visual Studio Code + 其擴展
- 配置 Visual Studio Code 以連接到您的 EV3
- 將示例代碼下載到 EV3
第 2 步:將您的 EV3 注冊為 Alexa Gadget
由于我們將使用 EV3 作為 Alexa Gadget(即 Alexa 將在 Echo Dot 的藍牙的幫助下使用 EV3),我們需要按照LEGO MINDSTORMS Voice Challenge: Mission 1頁面的步驟注冊并連接 EV3 到 Alexa,其中:
- 注冊 developer.amazon.com 帳戶 + 將 EV3 添加為 Alexa Gadget
EV3
- 在 EV3 上打開藍牙
- (這是與 Echo Dot 通信所必需的)
- 通過啟動示例代碼連接到 Echo Dot,并完成配對過程
第 3 步:從 Alexa 技能向 EV3 發送消息
現在按照LEGO MINDSTORMS 語音挑戰:任務 3頁面的步驟操作,該頁面將指導您將 Alexa 技能連接到您的 EV3。完成后,您可以為自己沒有任何連接問題而感到自豪。
您不需要構建 EV3STORM,將大型電機連接到端口 B 和 C,將中型電機連接到端口 A 就足夠了。請記住,我們只是在此處設置和測試連接。
在這里你會做:
亞歷克斯
- 打造全新 Alexa 技能+交互模型
- (教 Alexa 理解什么以及如何理解)
- 將 NodeJS lambda 代碼添加到技能中
- (因此 Alexa 可以對您的命令做出反應并在 EV3 上調用事件)
EV3
- Python 代碼將處理 EV3 端的事件,并將移動電機
第 4 步:構建糖果機
完成上述設置步驟后,您就可以自己構建糖果機了。您將需要零售 31313 LEGO Mindstorms 套裝以及一些額外的 LEGO Technic 元素用于我們的傳送帶。(請找到硬件列表中列出的額外元素。)
該裝置以模塊化方式構建。下面的視頻顯示了模塊以及如何構建機器。
請注意:中型電機連接到端口 A,大型電機連接到端口 B,顏色傳感器連接到端口 2。
接下來是糖果。
EV3 的顏色傳感器可以檢測黑色、藍色、綠色、黃色、紅色、白色和棕色。但是,傳送帶測量為黑色或紅色。在剩下的顏色中,我們只有藍色、綠色和黃色糖果。所以我們將在這個項目中只使用這 3 種顏色。
第 5 步:為糖果機定制 Alexa
在這里,我們正在實施通信概述的#3。
使用與創建 Mindstorms 技能時相同的步驟創建一個名為 CandyMachine 的新技能。
打開此項目中的代碼示例(alexa-candymachine-code.zip
在此頁面底部)并將model.json
文件內容復制粘貼到構建/交互模型/JSON 編輯器中,然后保存模型。
這將定義 Alexa 技能的調用名稱,aCandyIndent
用于請求糖果,aGoalIntent
用于實現您的目標。請查看我們定義的短語。
{
"interactionModel": {
"languageModel": {
"invocationName": "candy machine",
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "AMAZON.NavigateHomeIntent",
"samples": []
},
{
"name": "CandyIntent",
"slots": [
{
"name": "Pieces",
"type": "AMAZON.NUMBER"
},
{
"name": "Color",
"type": "AMAZON.Color"
},
{
"name": "PiecesB",
"type": "AMAZON.NUMBER"
},
{
"name": "ColorB",
"type": "AMAZON.Color"
}
],
"samples": [
"Give me {Pieces} pieces of {Color} candies",
"Give me {Pieces} pieces of {Color} and {PiecesB} pieces of {ColorB} candies",
"Give me {Pieces} pieces of candies",
"Give me a {Color} candy",
"Give me a candy"
]
},
{
"name": "GoalIntent",
"slots": [],
"samples": [
"I have finished my homework",
"My room is clean"
]
}
],
"types": []
}
}
}
完成此操作后,您需要將 lambda 文件從alexa-candymachine-code.zip
Alexa 代碼編輯器復制并粘貼到相應的文件:common.js
、index.js
和. 不要忘記保存它們。這些文件基本上是 Alexa 技能背后的 lambda 代碼。邏輯的驗證部分和 Alexa 會說的消息在這里,以及我們要發送給 EV3 的命令也在這里。package.json
util.js
讓我們來看看它們:
// Skill starting event
const LaunchRequestHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
},
handle: async function(handlerInput) {
const request = handlerInput.requestEnvelope;
const { apiEndpoint, apiAccessToken } = request.context.System;
const apiResponse = await Util.getConnectedEndpoints(apiEndpoint, apiAccessToken);
if ((apiResponse.endpoints || []).length === 0) {
return handlerInput.responseBuilder
.speak(`I couldn't find an EV3 Brick connected to this Echo device. Please check to make sure your EV3 Brick is connected, and try again.`)
.getResponse();
}
// Store the gadget endpointId to be used in this skill session
const endpointId = apiResponse.endpoints[0].endpointId || [];
Util.putSessionAttribute(handlerInput, 'endpointId', endpointId);
return handlerInput.responseBuilder
.speak("Candy machine activated. What can I do for you?")
.reprompt("What can I do for you?")
.getResponse();
}
};
LaunchRequestHandler
如果你說"Alexa, open Candy Machine"就會被調用。這將檢查與 EV3 的連接,并在成功時回復用戶。
方法.reprompt()
在這里很重要。它會讓 Alexa 在 Candy Machine 模式下等待下一個命令(保持會話打開)。
// Construct and send a custom directive to the connected gadget with
// data from the CandyIntent.
const CandyIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'CandyIntent';
},
handle: function (handlerInput) {
const request = handlerInput.requestEnvelope;
// Parameter is optional, use default if not available
const pieces = Alexa.getSlotValue(request, 'Pieces') || 1;
const color = Alexa.getSlotValue(request, 'Color') || "";
const piecesB = Alexa.getSlotValue(request, 'PiecesB') || 0;
const colorB = Alexa.getSlotValue(request, 'ColorB') || "";
////debug : return handlerInput.responseBuilder.speak(`Please wait while I am serving your ${pieces} pieces of ${color} and ${piecesB} pieces of ${colorB} candies.`).getResponse();
// Validations - if request is not valid, we will require the user to specify his/her request in more detail.
let validationSpeechOutput = "";
let repromptSpeechOutput = "What can I do for you?";
if (color === "")
validationSpeechOutput = "I am afraid, you forgot to mention the color";
else if (color !== "blue" && color !== "green" && color !== "yellow")
validationSpeechOutput = "Sorry, I don't have this color";
else if (colorB !== "" && colorB !== "blue" && colorB !== "green" && colorB !== "yellow")
validationSpeechOutput = "Sorry, I don't have this color";
else if (pieces > 5 || piecesB > 5)
validationSpeechOutput = "I am afraid, this is too much for you";
// (reprompt will keep session open)
if (validationSpeechOutput !== "")
return handlerInput.responseBuilder
.speak(validationSpeechOutput + repromptSpeechOutput)
.reprompt(repromptSpeechOutput)
.getResponse();
// Validations done
// Get data from session attribute
const attributesManager = handlerInput.attributesManager;
const endpointId = attributesManager.getSessionAttributes().endpointId || [];
// Construct the directive with the payload containing the move parameters
let directive = Util.build(endpointId, NAMESPACE, NAME_CONTROL,
{
type: 'candy',
pieces: pieces,
color: color,
piecesB: piecesB,
colorB: colorB
});
const speechOutput = (piecesB === 0)
? `Please wait while I am serving your ${pieces} ${color} candies.`
: `Please wait while I am serving your ${pieces} ${color} and ${piecesB} ${colorB} candies.`;
return handlerInput.responseBuilder
.speak(speechOutput)
.addDirective(directive)
.getResponse();
}
};
CandyIntentHandler
將處理用戶要求糖果的命令。首先我們用 獲取參數Alexa.getSlotValue()
。請注意,如果缺少值,我們會設置默認值,因為用戶說一些不完整的東西,例如Color
缺少。
////debug
當我們測試參數或意圖樣本是否良好時,這是我們的一大幫助。只需取消注釋,Alexa 就會告訴你她得到的參數。(您甚至可以使用 Alexa 開發人員控制臺的“測試”選項卡執行測試而無需部署。)
接下來是驗證。對于幾個不完整或未處理的輸入,我們會回復一條消息,并使用 保持會話打開.reprompt()
。這些情況是用戶錯過了顏色,或者要求我們沒有顏色,或者要求太多糖果。
一旦驗證成功,我們將參數傳遞給 EV3 的糖果處理程序Util.build()
最后,我們還會讓用戶知道我們正在提供糖果。
// Construct and send a custom directive to the connected gadget with
// data from the GoalIntent.
const GoalIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'GoalIntent';
},
handle: function (handlerInput) {
const request = handlerInput.requestEnvelope;
return handlerInput.responseBuilder
.speak("Congratulations! You deserve some candies.")
.reprompt("You deserve some candies.")
.getResponse();
}
};
作為獎勵,我們通過他/她是否達到模型GoalIntentHandler
中先前列出的目標之一來激勵用戶。GoalIntent
在這里,我們只是回復祝賀并保持會話開放。這足以讓用戶和 Alexa 之間繼續進行討論。
---
在代碼編輯器中保存lambda 的所有文件后,您還需要單擊Deploy ,因此該解決方案將在云中處于活動狀態。
第 6 步:為糖果機定制 EV3
現在 Alexa 已準備好將我們的參數傳遞給 EV3 Python 代碼的糖果處理程序,讓我們實現它。這是我們的通信概述中的#6。
首先,您需要編輯candymachine.ini
,并將您的 Alexa Gadget ID 和 Secret(您在第 2 步中注冊的)粘貼到此文件中。因此 Alexa 將能夠通過 Echo Dot 和藍牙連接到您的 EV3。
[GadgetSettings]
amazonId = xxxxxxxxxxxxxx
alexaGadgetSecret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
接下來是candmayhine.py
用 Python 編寫的 EV3 代碼:
一開始,我們定義了如何連接外圍設備。
from agt import AlexaGadget
from ev3dev2.led import Leds
from ev3dev2.sound import Sound
from ev3dev2.motor import OUTPUT_A, MediumMotor
from ev3dev2.motor import OUTPUT_B, LargeMotor
from ev3dev2.sensor.lego import ColorSensor
同樣在初始化中:
def __init__(self):
"""
Performs Alexa Gadget initialization routines and ev3dev resource allocation.
"""
super().__init__()
# Connect motors and color sensor
self.colorsensor = ColorSensor()
self.beltmotor = LargeMotor(OUTPUT_B)
self.ejectmotor = MediumMotor(OUTPUT_A)
self.sound = Sound()
self.leds = Leds()
然后當命令到達 Mindstorms Gadget 時,我們將參數拆箱并調用我們自己的方法:
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 == "candy":
# Expected params: [pieces, color, piecesB, colorB]
self._candy(int(payload["pieces"]), payload["color"], int(payload["piecesB"]), payload["colorB"])
except KeyError:
print("Missing expected parameters: {}".format(directive), file=sys.stderr)
這是供應糖果的主要部分:
def _candy(self, pieces: int, color, piecesB: int, colorB, is_blocking=False):
"""
Handles candy commands from the directive.
Sample:
Give me {Pieces} {Color} and {PiecesB} {ColorB} candies
Variations:
1 blue and 2 green
1 blue and 0
"""
print("Candy command: ({}, {}, {}, {})".format(pieces, color, piecesB, colorB), file=sys.stderr)
# Let EV3 do his job
# Music at the beginning
self.leds.set_color("LEFT", "RED")
self.leds.set_color("RIGHT", "RED")
self.sound.play_song((('C4', 'e'), ('D4', 'e'), ('E5', 'q')))
self.colorsensor.mode='COL-COLOR'
colors=('unknown','black','blue','green','yellow','red','white','brown')
print("Processing 1st color", file=sys.stderr)
for x in range(pieces):
print("Belt started: candy: {}".format(x), file=sys.stderr)
self.beltmotor.run_forever(speed_sp=-100)
while True:
actualcolor = colors[self.colorsensor.value()]
print("Actual color: {}, {}".format(actualcolor, color), file=sys.stderr)
if actualcolor == color:
break
self.beltmotor.stop(stop_action="hold")
self.beltmotor.wait_while('running')
print("Belt stopped", file=sys.stderr)
print("Move candy to eject position", file=sys.stderr)
self.beltmotor.run_to_rel_pos(position_sp=-135, speed_sp=-100, stop_action="hold")
self.beltmotor.wait_while('running')
print("Eject candy", file=sys.stderr)
self.ejectmotor.run_to_rel_pos(position_sp=-360, speed_sp=400, stop_action="hold")
self.ejectmotor.wait_while('running')
print("Processing 2nd color", file=sys.stderr)
for x in range(piecesB):
print("Belt started: candy: {}".format(x), file=sys.stderr)
self.beltmotor.run_forever(speed_sp=-100)
while True:
actualcolor = colors[self.colorsensor.value()]
print("Actual color: {}, {}".format(actualcolor, colorB), file=sys.stderr)
if actualcolor == colorB:
break
self.beltmotor.stop(stop_action="hold")
self.beltmotor.wait_while('running')
print("Belt stopped", file=sys.stderr)
print("Move candy to eject position", file=sys.stderr)
self.beltmotor.run_to_rel_pos(position_sp=-135, speed_sp=-100, stop_action="hold")
self.beltmotor.wait_while('running')
print("Eject candy", file=sys.stderr)
self.ejectmotor.run_to_rel_pos(position_sp=-360, speed_sp=400, stop_action="hold")
self.ejectmotor.wait_while('running')
# Music at the end
self.leds.set_color("LEFT", "GREEN")
self.leds.set_color("RIGHT", "GREEN")
self.sound.play_song((('C4', 'e'), ('D4', 'e'), ('E5', 'q')))
所以對于 Python 代碼,首先我們使用 EV3 自己的編程語言來實現和測試,像這樣:
Python代碼就是以此為基礎的,所以在一些啟動聲音之后,我們用大電機轉動皮帶,同時不斷檢查顏色傳感器的值。如果傳感器看到我們選擇的糖果顏色,那么我們立即停止傳送帶,然后將其移動到所需的彈出位置,然后中型電機將彈出我們的糖果。如此重復直到所有第一種顏色的糖果都被彈出。然后再次重復第二種顏色。
當我們將程序翻譯成 Python 時,這個站點非常有用:https ://sites.google.com/site/ev3python/learn_ev3_python/using-motors
第7步:有趣!
現在讓我們將糖果放入機器中,讓樂趣開始吧。
您可以通過使用 Visual Studio Code 將程序下載到 EV3 來啟動該程序,然后右鍵單擊您的candymachine.py
文件并運行它。然后 Visual Studio Code 將以調試模式啟動它,您還將在 PC 上看到 EV3 的控制臺輸出:
該過程會不斷地向控制臺注銷正在發生的事情,因此您可以在從 Visual Studio Code 運行時檢查它,如下所示:
Starting: brickrun --directory="/home/robot/alexa-candymachine" "/home/robot/alexa-candymachine/candymachine.py"
Started.
----------
Attempting to reconnect to Echo device with address: 08:A6:BC:95:53:02
Connected to Echo device with address: 08:A6:BC:95:53:02
GadgetDFD connected to Echo device
Control payload: {'pieces': '2', 'color': 'blue', 'piecesB': '1', 'type': 'candy', 'colorB': 'green'}
Candy command: (2, blue, 1, green)
Processing 1st color
Belt started: candy: 0
Actual color: black, blue
Actual color: black, blue
Actual color: black, blue
...
Actual color: red, blue
Actual color: red, blue
Actual color: red, blue
...
Actual color: black, blue
Actual color: black, blue
Actual color: black, blue
Actual color: blue, blue
Belt stopped
Move candy to eject position
Eject candy
Belt started: candy: 1
Actual color: red, blue
Actual color: red, blue
...
Actual color: black, blue
Actual color: black, blue
Actual color: black, blue
...
Actual color: red, blue
Actual color: red, blue
Actual color: red, blue
...
Actual color: black, blue
Actual color: black, blue
Actual color: black, blue
Actual color: blue, blue
Belt stopped
Move candy to eject position
Eject candy
Processing 2nd color
Belt started: candy: 0
Actual color: red, green
Actual color: red, green
...
Actual color: black, green
Actual color: black, green
Actual color: black, green
...
Actual color: red, green
Actual color: red, green
...
Actual color: black, green
Actual color: black, green
Actual color: black, green
Actual color: green, green
Belt stopped
Move candy to eject position
Eject candy
?
現在,讓我們與 Alexa 聊天:
“Alexa,打開糖果機”
“糖果機已啟動。有什么可以為您服務的嗎?”
“給我 2 塊綠色和 3 塊黃色糖果”
“請稍等,我正在為您提供 2 個綠色和 3 個黃色的糖果?!?/font>
或者根據 Alexa 技能交互模型:
“Alexa,讓糖果機給我一顆糖果”
“給我兩顆藍色糖果”
“給我一顆綠糖”
“給我3塊糖果”
“給我6塊紅糖”
每當您的請求不完整或您請求的內容不可用時,Alexa 將根據 lambda 中實現的邏輯做出相應的響應。
你也可以告訴她你已經達到了你的目標,這樣她就可以給你一顆糖果。
“我已經完成了我的家庭作業”
“恭喜!你應該得到一些糖果”
“我的房間很干凈”
“恭喜!你應該得到一些糖果”
?
您可以在下面的視頻中看到與她的一些高級對話:
我們希望您喜歡構建我們的糖果機項目!
(于 2019 年 11 月 17 日提交)
- MIFARE DESFire EV3特性和功能與其他MIFARE的比較 6次下載
- Nerf Alexa家庭防御炮塔開源構建 0次下載
- 利用ev3 教程制作的手臂機器人 1次下載
- LEGO EV3 Baby Yoda-Alexa控制的EV3機器人 0次下載
- Alexa自動保姆開源項目 0次下載
- 由Mindstorms EV3和Alexa提供支持的LEGO Target Practice 0次下載
- Mindstorms Math Alexa啟用獎品卡車開源構建 0次下載
- 由Alexa控制的Lego Mindstorms EV3機器人 0次下載
- 如何讓Lego Ev3機器人與BluPants一起工作 0次下載
- 適用于Amazon Alexa的游戲Speed Tap開源 0次下載
- 使用LEGO MINDSTORMS EV3 Amazon Alexa構建的Shelly解決方案 0次下載
- LEGO EV3神話生物DNA掃描儀開源 0次下載
- EV3使用NXT Hitechnic觸摸多路復用器 0次下載
- Mindstorms EV3和VL53l01x激光距離傳感器 1次下載
- 第7章:事件管理器模塊(EV)PPT下載 9次下載
- EV充電站的類型和使用方法 913次閱讀
- 前沿開源技術領域的開源大數據一一解讀 787次閱讀
- 用遠-R1接收模塊解碼EV1527的C代碼 3331次閱讀
- 如何將私家車改造為一輛電動車 (EV) 3292次閱讀
- 如何用空糖果盒制作LED面板? 3264次閱讀
- HEV/EV電池管理系統的運算放大器應用解決方案研究 2769次閱讀
- 如何在HEV/EV動力系統中使用放大器 4369次閱讀
- 放大器在HEV/EV汽車動力電池管理系統中的作用 4014次閱讀
- 微雪電子ROC-RK3308主板CC-Amazon Alexa簡介 1129次閱讀
- ev3顏色傳感器能夠識別幾種顏色 2w次閱讀
- EV12AQ605,EV12AQ600面向競爭激烈的大用量應用的優化版本 1857次閱讀
- 更小更智能的電機控制器推進HEV/EV市場 1023次閱讀
- NASA的開源軟件是什么?NASA的開源軟件的詳細分析 6904次閱讀
- EV電池包設計方面一些方向及趨勢 1.3w次閱讀
- 為HEV/EV電機控制打造的汽車MCU 2159次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多