本文將說明LinkIt Smart 7688 Duo 的 Arduino COM port 常見的問題與處理方式
文:Ted Lee李俊德 個人CC授權發布於CAVEDU blog [1]
延伸閱讀:LinkIt Smart 7688 Duo-Wi-Fi 掛點急救篇
Q:我的7688 Duo(以下簡稱7688D)在Arduino IDE上時常行蹤飄忽不定,有時會在燒錄Arduino草稿碼(sketch)(以下簡稱Arduino程式)之前找不著指定的COM埠(port),有時程式燒到一半它就不見了。更糟的是,還會有程式順利燒好了,原本配置的埠卻也不見,再也找不到?
A:
問題思考 在探究問題的根源之前,我們需要先了解Arduino程式如何在7688D上執行的整個過程,將之整理為圖1。
以Arduino IDE寫好的程式對作業系統來說皆屬於應用程式的性質,此類應用程式會呼叫作業系統的系統服務(system services),並透過驅動程式將此程式傳到Arduino晶片上。Arduino晶片上的啟動程式(bootloader),以啟動程式簡稱)會將之載入內部的記憶體後不斷地重覆執行(Arduino程式會循環地執行loop()副程式區塊(block)內的程式碼)。
因此,先排除硬體故障和作業系統錯誤的可能性(可用另一片正常的Arduino交叉測試)與Arduino程式的撰寫錯誤(可找另一可執行無誤的程式替換),我們可以合理懷疑都是驅動程式或啟動程式「惹的禍」!
圖1:Arduino程式在7688D上從燒入到執行的一連串過程[2]
本問題的解法有三[3]:
一. 重置MCU 如開發手冊(Developer’s Guide)的3.1節所述,按下MCU重置鈕(MCU Reset Button) 後讓ATmega32U晶片重新啟動(reboot)。
圖2:重置MCU
二. 重灌驅動程式 在Windows作業系統的裝置管理員(device manager)內確認7688D的驅動程式是否運作正常。如果異常,請参考本文的「複習」一節重新再安裝一次適合您電腦作業系統版本的驅動程式。
圖3:可從裝置管理員中確認7688D驅動程式是否正確被作業系統識別(recognize)。[4]
補充說明:在您玩7688D時是否曾注意到這個COM埠,有時名稱是B(啟動程式COM埠)、有時卻出現G(一般COM埠)呢?原因是這樣的:
- 啟動程式COM埠:這個COM埠是由ATmega32U4上的啟動程式提供。它出現的時機有二:
- 當使用者剛重新燒錄ATmega32U4的啟動程式但還未燒錄Arduino程式時,這個COM埠會出現。
- 當使用者快速按兩下MCU重置鈕時,此COM埠會短暫出現後才切換到Arduino程式提供的COM埠。
- 一般COM埠:這個COM埠由Arduino程式提供(使用者本身沒有寫它,但Arduino函式庫(library)一定會連結)。如果Arduino程式錯誤或寫壞記憶體時,這個COM埠就可能會消失。
三:重裝啟動程式:使用AVRDUDE(AVR Downloader/UploaDEr)套件這個命令列工具(command line tool)將啟動程式重新到ATmega32U的快閃記憶(flash momory)中[5]。
- 將Caterina-smart7688.hex(通常放在C:\Users\使用者名稱\AppData\Local\Arduino15\packages\LinkIt\hardware\avr\0.1.6\bootloaders\caterina\之下)複製到USB隨身碟(handy drive)。
- 將此隨身碟(以USB-A1稱之)插到7688D上。
- 使用Putty工具以SSH(Secure Shell)方式連入7688D後(注意:使用SSH連線時你的電腦和7688D需在同一網段下),下達:
avrdude -p m32u4 -c linuxgpio -v -e -U flash:w:Caterina-smart7688.hex -U lock:w:0x0f:m
其中各參數[6] 說明如下:
-c:程式代號(programmer-id)。linuxgpio:Linux GPIO(General Purpose Input/Output,通用輸出/入)組態(configuration)
-p:零件編號(part no)。m32u4 表示 ATmega32U4
-U:執行記憶體操作
-e:清除(erase)
-v:詳列的輸出訊息(verbose)
- 成功重燒妥啟動程式的畫面如圖4所示:
圖4:以AVRDUDE指令重燒啟動程式的成功畫面。
複習(review)開發環境(development environment)設定(setup)
根据MTK(MediaTek,聯發科)的線上版開發手冊之第2小節預先準備好後續的開發環境:
- 將韌體(firmware)的版本更新(update)到最新版(筆者撰稿時為9.3)。
- 安裝6.4版的Arduino IDE。
- 在開發板管理程式(board manager)內指定JSON格式的擴充套件(package)下載網址(http://download.labs.mediatek.com/package_mtk_linkit_smart_7688_index.json),以安裝7688D识別資訊。
- 驅動程式安裝:
- Windows 7:從
http://download.labs.mediatek.com/mediatek_linkit_smart_7688_duo-windows-com-port-driver.zip下載後解压縮,在inf档案上按滑鼠右鍵選安擇安裝(請無視Windows的安全性警告,強迫安裝即可)。 - Windows 8:請先停用驅動程式強制的數位簽章(signature),再重覆上述在Win 7系統的安裝步驟即可完成。其中,停止數位簽章的方法[7]詳列如下:
- Windows 7:從
- 將滑鼠移到桌面右上角,選擇設定齒輪。
- 在設定選單中點撃變更電腦設定。
- 在電腦設定選單中點撃:一般®進階設定®立即重新啟動。
- 在選擇選項選單中點撃疑難排解。
- 在疑難排解選單中點撃進階選項。
- 在進階選項選單中點撃啟動設定。
- 在啟動設定選單中點撃重新啟動。
- 重新開機後,在啟動設定選單中點撃7) 停用驅動程式強制簽章。然後電腦會自動重新開機。
- Windows 10:7688D驅動程式已內建,但需額外設定(第一次將7688D接到電腦時設定妥即可)。
- 連接7688D與電腦。
- 在700毫秒(ms)[8]內快速按压MCU(Micro Controller Unit,微控制單元)[9]重置鈕二次。
- Ubuntu:和Windows 10同,驅動程式已自動被掛載到(mount)在/dev目錄下的ttyUSBx(類UNIX(UNIX-like)的檔案系統(file system)規定所有週邊的硬體裝置(peripheral devices)皆以檔案(file)的方式存放在/dev(device)內)。其中,數字x在不同機器上會顯示不同的值。
- OS X:Apple Mac上的作業系統OS X也是從UNIX某個版本修訂而來的。因此,同上述的Ubuntu,7688D的驅動程式會被掛載到/dev/tty.usbmodemxxxx。其中,數字xxxx在不同機器上出現不一樣的數值。
[2] MT7688AN的韌體(firmware)會在開機時期將OpebnWrt載入到7688D的記憶體內執行。因本問題發生在ATmega32U的使用,為了清晰起見,在圖1中並未繪出。
[3] 就筆者在晶片廠工作的實務經驗,當晶片在準備量產(mass production)階段如遇有臭蟲(bug),通常會尋求軟體補丁(software patch),例如:驅動程式改版(revision)、韌體升級(upgrade)、…等等。如有軟體無法避免的瑕疵(defect),才會排入最新一期的硬體更新(update)時程(schedule)考量之中。
[4] 圖片來源:http://www.slideshare.net/NissinAllelujahnissin/linkit-smart-7688-duo-and-mcs-basics。
[5] http://labs.mediatek.com/site/global/developer_tools/mediatek_linkit_smart_7688/training_docs/arduino/duo_update_arduino_bootloader/index.gsp或Gitbook知識庫的11.2節。
[6] http://www.nongnu.org/avrdude/user-manual/avrdude_4.html。
[7] 此連結連到MTK原廠的英文版開發手冊。因筆者手邊無安裝Win 8的電腦,故無法擷取實際系統的中文操作畫面,讀者亦可参考Hello著作中圖文並茂的解說:win8.1 停止強制數位簽章。
[8] 即700×10-3=0.7秒。
[9] 即為7688D內封裝的編号為ATmega32U4之Arduino控制晶片。