資料介紹
描述
介紹和動機
語音和家庭自動化自然結(jié)合。昨天回家告訴家里該做什么的夢想是今天的現(xiàn)實。
為了嘗試家庭自動化,我決定修改我的一個舊項目BLElectric Light 101 ,并使其成為帶有Mycroft/Picroft的語音控制物聯(lián)網(wǎng)設(shè)備。
整體設(shè)計
我已經(jīng)從Chuck Hellyebuck 的 Filament Friday中“回收”了 3D 打印的 Edison 風(fēng)格的電燈泡。燈泡中的新像素環(huán)提供光和顏色效果。在最初的項目中,我使用 Arduino 101 使用其板載 BLE 功能來控制環(huán)。
在這個項目中,我用基于 ESP8266 的開發(fā)板SparkFun ESP8266 Thing - Dev Board 替換了 Arduino 101 和 BLE,并將其變成了燈泡的 Web 服務(wù)器。這允許將燈泡或東西放置在我的家庭 Wifi 網(wǎng)絡(luò)上。
在我的 MyCroft 技能中使用 python HTTP請求庫給了我們:語音物聯(lián)網(wǎng)!
我還決定將步進(jìn)電機連接到電路板上。為什么?好吧,因為我可以!但說真的,從我用來啟動它的語音命令中,你可能會猜到我將來會在這個項目中走向何方。. .
請注意,這個項目也可以使用帶有 ESP8266 WiFi 的 Adafruit Feather HUZZAH來完成。
開始使用基于 8266 的板
ESP8266 是一款支持 WiFi 的微控制器,可以通過 Arduino IDE 進(jìn)行編程。adafruit 和 Sparkfun 基于這種芯片的開發(fā)板價格低廉,并且有大量的庫、教程和代碼示例可供學(xué)習(xí)。它們的主要優(yōu)勢是能夠使用 Arduino IDE 和 WiFi 功能輕松對其進(jìn)行編程。這些板的小尺寸使其非常容易嵌入到物體中并通過 WiFi 輕松連接。該板的一個相對缺點是 GPIO 和 ADC 引腳數(shù)量較少,但正如您從我的項目中看到的那樣,Huzzah!用 PubNub 給我上色!,有辦法克服這個問題。
總體而言,易用性、大量社區(qū)支持和共享以及 WiFi 使其成為 Makers 幾乎理想的物聯(lián)網(wǎng)微控制器。即將推出的ESP32 開發(fā)板希望讓任何對引腳編號的擔(dān)憂成為過去!
為了開始使用 Arduino 上的電路板,我將您指向 Sparkfun 和 adafruit 網(wǎng)站。兩個指南都很有用,推薦的設(shè)置似乎適用于任一板:
兩個教程都涵蓋了使用開發(fā)板和 Arduino IDE 所需的驅(qū)動程序和庫的安裝。
安裝 ESP8266 庫后,您應(yīng)該查看 WiFi 示例草圖。我使用這些示例提出了我自己的 Web 服務(wù)器代碼,如下所述。
網(wǎng)絡(luò)服務(wù)器
Web 服務(wù)器是一個程序,它在端口上偵聽http命令并通過沿指定路由執(zhí)行代碼來響應(yīng)它們(路由是處理特定http命令的代碼 - 這將在稍后顯而易見)。ESP8266 提供了多個庫和大量代碼示例,使您可以非常輕松地設(shè)計自己的 Web 服務(wù)器。不要害怕,您的 Web 服務(wù)器草圖將遵循與 Arduino IDE 程序相同的結(jié)構(gòu)。它將具有 setup() 和 loop() 函數(shù),以及一些函數(shù)等。
我們的網(wǎng)絡(luò)服務(wù)器將有 4 條路線。一個用于處理根部,一個用于打開和關(guān)閉燈泡,一個用于處理燈光顏色,最后一個用于控制我們的步進(jìn)電機。您可以將這些路由中的每一個視為按需執(zhí)行的函數(shù)或代碼塊。在未來的重構(gòu)中,燈泡相關(guān)的路由將更改為一個路由,有 2 個參數(shù),但稍后會更多。現(xiàn)在,我將逐行介紹如何在 ESP8266 板上設(shè)置 Web 服務(wù)器的代碼。
就像在 Arduino IDE 中編寫的任何程序一樣,我們將編寫我們的 Web 服務(wù)器作為草圖上傳到我們的板上。為了設(shè)置我們的服務(wù)器,我們需要導(dǎo)入一些標(biāo)準(zhǔn)庫:
#include
#include
#include
#include
為了將我們的 Web 服務(wù)器連接到我們的 WiFi 網(wǎng)絡(luò),我們必須提供我們的網(wǎng)絡(luò) ID 和密碼,并創(chuàng)建一個 Web 服務(wù)器對象來監(jiān)聽端口 80:
const char* ssid = "********";
const char* password = "**********";
ESP8266WebServer server(80);
如果您遵循代碼,您將看到處理我上面提到的路由的函數(shù)列表。但是,我們將首先進(jìn)入草圖的setup()函數(shù)。當(dāng)我們正在編寫我們的第一個 Web 服務(wù)器時,我們需要將消息寫入串行端口。這將使我們能夠看到我們正在使用的開發(fā)板的IP 地址,這對于我們向開發(fā)板發(fā)送命令至關(guān)重要!
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}
在串行輸出中看到 IP 地址后,請記下它。它將用于在我們的 MyCroft 技能中與董事會溝通。它將類似于172.16.254.1 ,為了連接到板,您將發(fā)出一個 http 命令,例如:
http://172.16.254.1/stepper
IP 是服務(wù)器的主機地址,“/stepper”是我們在代碼中指定的資源路徑或路由。事實上,以下幾行指定了我們的每個路徑和每個服務(wù)器應(yīng)該執(zhí)行的響應(yīng)。要理解這一點,請像 Web 服務(wù)器一樣閱讀它:
從 http 請求 http://172.16.254.1/stepper 接收到路徑“/stepper”后,我將執(zhí)行名為 handleStepper 的函數(shù)中的代碼
server.on("/", handleRoot);
server.on("/lamp", handleCommand);
server.on("/color", handleColor);
server.on("/stepper",handleStepper);
步進(jìn)器處理代碼很容易理解(我為使用延遲功能道歉),因此不是很有趣。
因此,我將介紹handleCommand()代碼,它不僅可以幫助您學(xué)習(xí)如何創(chuàng)建和處理資源路徑,而且還必須將參數(shù)和值發(fā)送到您的函數(shù)!handleCommand的代碼在函數(shù)void handleCommand()中定義,它必須具有參數(shù)中指定的確切名稱才能傳遞給server.on()函數(shù)。
void handleCommand()
{
String message = "done";
int commandValue;
...
我們創(chuàng)建一個名為message的 String 變量,以傳回發(fā)出請求的客戶端。您可以在此過程中修改此字符串以將您希望返回的任何消息傳遞給您的客戶。客戶端可以是您的網(wǎng)絡(luò)瀏覽器、您編寫的程序,或者在我們的例子中是 Mycroft/Picroft 系統(tǒng)。
然后我們創(chuàng)建一個名為commandValue的整數(shù)變量。我們的客戶端將傳入一個參數(shù)值。在這種情況下,參數(shù)值將是 1 或 0,具體取決于客戶端是否希望打開或關(guān)閉燈。在瀏覽器窗口中,這看起來像:
http://176.16.254.1/lamp?cmd=1
or
http://176.16.254.1/lamp?cmd=0
還記得我們創(chuàng)建了/lamp資源路徑來處理這個嗎?當(dāng)遵循此資源路徑時,調(diào)用來處理它的函數(shù)可以訪問使用server.arg()函數(shù)發(fā)送的參數(shù)和值。在我們的例子中,只有一個叫做cmd:
commandValue = (server.arg("cmd")).toInt();
首先,當(dāng)然,我們檢查以確??蛻舳税l(fā)送了一個參數(shù),如果沒有使用我們的消息變量將錯誤消息發(fā)送回客戶端。有更好的方法來處理這個問題,但是由于我們正在創(chuàng)建客戶端和它將發(fā)送的命令,所以現(xiàn)在這已經(jīng)足夠好了。cmd參數(shù)值作為字符串類型接收。為了在非常優(yōu)雅的switch/case控制結(jié)構(gòu)中有效地使用它,我們使用 String 類的toInt() 函數(shù)將其轉(zhuǎn)換為整數(shù)類型。然后我們可以執(zhí)行與打開或關(guān)閉燈對應(yīng)的代碼:
switch(commandValue)
{
case 0:
currentColor = 0;
setLampColor();
break;
case 1:
currentColor = 1;
setLampColor();
break;
default:
message = "choose from 0, 1 for lamp off/on";
break;
}
這里有兩個重點。首先,如果客戶端應(yīng)該發(fā)送一個無意義的cmd參數(shù)值,我們將向客戶端發(fā)送一條錯誤消息。其次,我們使用一個名為currentColor的狀態(tài)變量來設(shè)置和跟蹤當(dāng)前的燈顏色。在打開或關(guān)閉燈的情況下,這將分別是白色或黑色。使用這種方法,我們可以將setLampColor()重新用于開/關(guān)和特定顏色設(shè)置。變量currentColor不僅充當(dāng)燈泡的狀態(tài)變量,而且還是新像素顏色對象數(shù)組的索引。
如果您遵循所有這些,您可以設(shè)計自己的 Web 服務(wù)器以嵌入任何 8266 項目并制作連接的東西!
客戶
現(xiàn)在 Web 服務(wù)器已經(jīng)啟動并運行,我們可以在 python 中開發(fā)客戶端。
正如我們在上面看到的,我們可以使用 Web 瀏覽器作為我們的客戶端,甚至可以編寫我們自己的自定義 HTML/Javascrip/CSS 頁面來與之交互。我們也可以編寫自己的 python 腳本來做同樣的事情。只要運行它的計算機可以訪問您的網(wǎng)絡(luò),您就可以開展業(yè)務(wù)。然后,您可以在 Mycroft 中實施技能之前測試您希望包含在語音技能中的大部分功能。
如果您熟悉使用 Mycroft 技能,則不必編寫腳本來測試 Mycroft 之外的客戶端功能。Mycroft 技能中的大部分動作發(fā)生在技能的__init__.py文件中。您可以在此文件中實現(xiàn) python 代碼寫入并從那里進(jìn)行調(diào)試。由你決定!
請求和物聯(lián)網(wǎng)演示技能
如果您還沒有創(chuàng)建自己的技能,我建議您查看以下資源:
看完這些后,繼續(xù)學(xué)習(xí)你自己的“Hello World”技能并開始運行吧!以下不是技能設(shè)計和實施的綜合教程,只是亮點和一些見解。
一切由此開始:
import requests
如果你能在你的樹莓派上用 python 做到這一點,你可以在 Mycroft 下用你的聲音來控制它!
使用 python 與我們的 Web 服務(wù)器交互的關(guān)鍵是Requests: HTTP for Humans庫。沒有什么比他們自己的描述更能描述這個庫了:
Requests 是一個優(yōu)雅而簡單的 Python HTTP 庫,專為人類構(gòu)建。
它是為人類使用而設(shè)計和建造的!我們將使用這個庫在語音控制下與我們的物聯(lián)網(wǎng)設(shè)備進(jìn)行通信。該庫將允許我們在我們的 python 意圖代碼中簡單地復(fù)制上面討論的 http 命令。
此 IoT 演示技能將由 3 個意圖組成:
def handle_lamp_command_intent(self, message):
def handle_lamp_color_intent(self, message):
def handle_feeder_intent(self,message):
這些意圖中的每一個都將對應(yīng)于我們服務(wù)器上的一個路由(根路由除外)。它不必是這樣,也許這不是最有效的設(shè)計,但它有效,我現(xiàn)在會堅持下去。
在 initialize() 函數(shù)中注冊意圖:
lamp_color_intent = IntentBuilder("LampColorIntent").require("LampColorKeyword").require("ColorName").build()
self.register_intent(lamp_color_intent, self.handle_lamp_color_intent)
請務(wù)必注意,此意圖將使用LampColorKeyword.voc文件將話語與此特定意圖相匹配。該文件如下所示:
change
make
這就是說,“嘿,Mycroft,讓顏色變成粉紅色?!?這不是很理想,但我在為這個意圖創(chuàng)建正確的用語并讓它識別這樣的短語時遇到了一些困難。當(dāng)我更多地了解意圖及其與 vocab 或 .voc 文件的關(guān)系時,在我看來,這些意圖是由構(gòu)成話語的關(guān)鍵詞組成的,而不是完整的話語。我認(rèn)為這可能會引起對重疊關(guān)鍵字沖突的擔(dān)憂。我發(fā)現(xiàn)并繼續(xù)發(fā)現(xiàn)以下資源是我繼續(xù)理解意圖、關(guān)鍵字等的關(guān)鍵:
當(dāng)我們改變燈的顏色時,我們需要能夠響應(yīng)用戶請求的顏色。這是通過使用正則表達(dá)式完成的。文件lampactions.rx如下所示:
(turn|switch) (?Pon|off) (?P.*)
(change|make) (?Pcolor|color to) (?P.*)
如果 btoharye 看到這個,他會注意到他的家庭助理工作有一些相似之處!
第二條線是我們的重點。這個正則表達(dá)式將允許我們在消息總線上通過變量名稱ColorName 傳遞用戶命名的顏色。通過匹配單詞change或make來進(jìn)行匹配。我目前沒有使用Action變量。
def handle_lamp_color_intent(self, message):
lamp_color = message.data.get("ColorName")
LOGGER.info("Lamp Color: " + lamp_color)
if self.color_map.has_key(lamp_color):
self.speak_dialog("lamp.color",{"color": lamp_color})
color_index = self.color_map[lamp_color]
r = requests.get('http://ip_here/color?color='+str(color_index))
else:
self.speak_dialog("lamp.color.error",{"color": lamp_color})
我們可以創(chuàng)建函數(shù)處理程序并使用參數(shù)消息從用戶的話語中獲取命名的顏色:
def handle_lamp_color_intent(self, message):
lamp_color = message.data.get("ColorName")
LOGGER 對象將這些語句打印到 /var/log/mycroft-skills.log。另一種調(diào)試方法是讓 Mycroft 使用 self.speak_dialog() 函數(shù)說話。在此之前,我正在單獨編寫 python 技能功能,并將該代碼放入__init__.py文件中。但是,熟悉“在”Mycroft 本身內(nèi)進(jìn)行調(diào)試會為您節(jié)省一些時間,我建議您轉(zhuǎn)向這種方法。
LOGGER.info("Lamp Color: " + lamp_color)
在這之前,我們創(chuàng)建了一個名為color_map 的 python 地圖:
def __init__(self):
. . .
self.color_map = {'black': 0, 'white': 1, 'blue': 2, 'green': 3, 'orange': 4, 'red': 5, 'purple': 8, 'yellow': 9, 'pink': 10}
這種方法允許我們獲取 ColorName 話語并將其用作訪問相應(yīng)顏色值以發(fā)送到 ESP8266 Dev Thing 的鍵。從草圖中的這段代碼可以看出,顏色鍵值和顏色索引匹配。
// From the sketch file running on the ESP8266 board
void setStandardColors()
{
black = neoRing.Color(0,0,0); //used for 'off' state
white = neoRing.Color(255,255,255);
blue = neoRing.Color(0,0,255);
green = neoRing.Color(255,0,0);
orange = neoRing.Color(140,255,0);
red = neoRing.Color(0,255,0);
red_orange = neoRing.Color(69,255,0);
sky_blue = neoRing.Color(206,135,235);
purple = neoRing.Color(0,255,255);
yellow = neoRing.Color(255,255,0);
pink = neoRing.Color(0,255,180);
standardColors[0] = black;
standardColors[1] = white;
standardColors[2] = blue;
standardColors[3] = green;
standardColors[4] = orange;
standardColors[5] = red;
standardColors[6] = red_orange;
standardColors[7] = sky_blue;
standardColors[8] = purple;
standardColors[9] = yellow;
standardColors[10] = pink;
}
這使得發(fā)送顏色消息變得容易,尤其是當(dāng)我們使用請求庫時!
if self.color_map.has_key(lamp_color):
self.speak_dialog("lamp.color",{"color": lamp_color})
color_index = self.color_map[lamp_color]
r = requests.get('http://ip_here/color?color='+str(color_index))
無論您在哪里看到 ip_here ,都將其替換為您的板 IP 地址。未來版本將在 settings.json文件中包含此內(nèi)容。
在沒有與可用顏色匹配的鍵的情況下,我們使用lamp.color.error.dialog文件中的錯誤對話框報告此情況。我們可以通過重復(fù)請求的顏色來幫助用戶,并提供一些有效的選項(有關(guān)更多信息,請參見下文)。
sorry {{color}} not available maybe try red green or blue
sorry {{color}} not available maybe try orange yellow or purple
{{color}} is not an option you can try red green or blue instead
{{color}} is not an option you can try purple orange or yellow
sorry could you try purple blue or orange instead of {{color}}
sorry could you try red yellow or green instead of {{color}}
聲音設(shè)計
有這么多顏色!您怎么知道要嘗試哪個,以及我們?nèi)绾卧谔峁┯杏媒ㄗh的同時避免認(rèn)知超負(fù)荷。. .這就是語音接口的挑戰(zhàn)。
當(dāng) Mycroft 無法識別所請求的顏色時,例如“chartreuse”,它會回復(fù)一個包含 3 個備選顏色的列表。這三種選擇是一種很好的方式,不僅可以讓用戶知道一些有效的選項,還可以引導(dǎo)用戶使用基本的顏色請求。所有可用顏色選項的綜合列表將無法處理并且占用太多時間。
sorry {{color}} not available maybe try red green or blue
sorry {{color}} not available maybe try orange yellow or purple
...
當(dāng)我反思良好的聲音設(shè)計時,我不喜歡這里的短語:“..maybe try”?設(shè)備不應(yīng)該知道它知道什么顏色嗎?跛腳,我知道,我會擺脫這個。. .
此外,這些替代方案在.dialog 文件中進(jìn)行了“硬”編碼。未來的重構(gòu)可能會受益于從可用的顏色中證明 3 種隨機顏色。另一個選項,可以提供更大的智能和響應(yīng)能力,是讓 Mycroft 提供 2 或 3 種顏色選項,在色調(diào)上與請求的選項最接近。
目前 Mycroft 不直接支持多輪對話:
Mycroft 是否支持多回合/會話技能?
這是一個進(jìn)展中的工作。在當(dāng)前的主線中,有能力告訴 Mycroft 在說完任何話后立即聽。在技??能中,您可以使用...調(diào)用它self.speak("utterance", expect_response=True)
...請參閱https://github.com/MycroftAI/mycroft-core/blob/dev/mycroft/skills/core.py#L3262)
這只允許用戶與 Mycroft 對話,而不必說“Hey Mycroft”。
對于真正的對話交互,有一些正在進(jìn)行的工作來實現(xiàn) converse() 方法。這是即將到來的拉取請求:https ://github.com/MycroftAI/mycroft-core/pull/9253
這將允許技能在調(diào)用 Adapt 意圖解析器之前預(yù)覽話語。只有最近使用的技能會收到 converse() 通知,并按使用順序傳遞給他們。因此,您可以編寫執(zhí)行以下操作的技能:
@intent_handler(IntentBuilder().require('alarm').require('cancel').build()) def handle_cancel_alarm(): self.speak("are you sure you want to cancel?", expect_response=True) def converse(self, utterances,): if utterances == "yes": # do whatever self.speak("Alarm canceled")
這顯然是頭腦簡單,但使用此代碼,以下交互將起作用:
用戶:嘿,Mycroft,請取消鬧鐘 Mycroft:你確定要取消嗎? 用戶:是 Mycroft:警報取消
未來將會有更多的工具讓建立和管理對話變得更容易,但這是基礎(chǔ)。
在這里,當(dāng)我們請求未知顏色時,從用戶體驗的角度來看,多輪方法將是理想的。
3D 打印
您可以在我的文章 BLElectric Light 101中了解 3D 打印以及如何將組件組合在一起。我想在此重申 Lulzbot mini 能夠在沒有支撐的情況下將燈泡打印為單個單元。試試吧,它可以工作,讓您的印后整理變得更加輕松!
該設(shè)計

結(jié)論
希望你喜歡這個項目。. .更多在路上!
- 節(jié)日花環(huán)自動化開源項目
- 家庭自動化系統(tǒng)開源構(gòu)建
- 樹莓派家庭自動化開源
- 使用電報機器人進(jìn)行自動化開源
- 溫室自動化開源硬件
- 照明自動化開源分享
- 濾光輪自動化開源項目
- 家庭自動化系統(tǒng)開源分享
- 哈利波特式的家庭自動化開源
- 植物澆水自動化開源分享
- ESP32家庭自動化開源分享
- 家庭自動化開源分享
- 舊電腦UPS的家電自動化開源分享
- PCB家庭自動化開源分享
- 機器人自動化開展應(yīng)用資料包 0次下載
- 自動化焊接機器人:引領(lǐng)制造業(yè)未來的高效工具 1227次閱讀
- 工業(yè)自動化中的控制方式 898次閱讀
- 工業(yè)自動化和自動化區(qū)別是什么 1840次閱讀
- 過程自動化控制和運動自動化控制的原理詳解 1736次閱讀
- Selenium在自動化中有何用處 2083次閱讀
- 基于PlatformIO IDE的家庭自動化系統(tǒng)設(shè)計方案實現(xiàn) 2489次閱讀
- 基于Raspberry Pi Pico開發(fā)先進(jìn)的家庭自動化系統(tǒng) 3003次閱讀
- 如何自學(xué)PLC與自動化? 2814次閱讀
- 什么是非標(biāo)自動化設(shè)備及分類介紹 4.3w次閱讀
- 非標(biāo)自動化設(shè)備的分類 6671次閱讀
- ATE自動化測試系統(tǒng)是什么_ATE自動化測試系統(tǒng)介紹 3.2w次閱讀
- 自動化領(lǐng)域初涉水 非標(biāo)自動化和自動化到底有哪些區(qū)別? 6349次閱讀
- jenkins自動化部署 4717次閱讀
- 紅帽推出Ansible 2.2 :為開源自動化框架奠定牢靠的基礎(chǔ) 1022次閱讀
- 意法半導(dǎo)體:家庭自動化完全解決方案 1097次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 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十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論