在蝦皮購買電子零件的時候,意外發現這個小工具,上面有 USB 插槽供電、連線電腦,以及 8-DIP 的IC插槽,可以安插 ATtiny 85/45/25 這幾種的8隻腳的MCU,而且旁邊還有引出8支排針,看起來很方便,價錢也超便宜,就順便買了。
DigiSpark 山寨可插拔開發板
原本以為有了這個工具,可以用USB來編程測試,邊寫邊試,完成後可以直接把 IC 拔起來,焊上去麵包板、PCB板就能用了,以後還可以當燒錄器重複燒錄,這樣豈不太方便了?買來後仔細看一下電路板,才發現不是這麼一回事,不但板子上沒有看到任何 USB 控制 IC,裝上 ATtiny85 連接 USB之後,電腦根本認不到這片板子。
後來查了一些資料,才了解這塊板子使用前,需要先把 micronucleus bootloader 燒錄進去 ATtiny85 中,才能使用。原版的開發板,直接焊上一片 SMD 封裝的 ATtiny,bootloader也預先燒好,所以插上USB就能使用、開發程式,但是ATtiny就不能直接拔起來了。
DigiSpark
原版開發板
因為這次想用 ATtiny85為3D列印機做一個可以自動關機、模擬
ATX電源控制的控制器,決定把這個東西拿出來用。以下紀錄一下處理這片開發板的過程與心得,分享給同好,過程主要參考以下兩份文件,寫得很詳盡。但有些步驟,實際按著文件說明操作之後,還是遇到一些問題,可能是文件太舊了。Beginners Guide to Extended Programming Attinys with Digispark
http://digistump.com/wiki/digispark/tutorials/programming
Connecting and Programming Your Digispark
http://digistump.com/wiki/digispark/tutorials/connecting
備註: 這個韌體有個特性,就是上電後,大概5秒才會開始執行程式。前5秒韌體會透過PB3、PB4 試著跟外部串列埠通信。程式寫入需求,就是利用前面這5秒的空檔啟動寫入,所以上傳程式的步驟,是在Arduino IDE 先按下上傳,再插入山寨開發板。
如果外部電路跟燒寫micronucleus bootloader的ATtiny共用電源,需要特別注意是否有時序的問題。
準備工作
除了 Ardunio
板子之外,我手上有一顆全新的、DIP
封裝的 ATtiny85,還有USBASP
燒錄工具 (也是很便宜),作業系統是
Ubuntu
Linux 18.04 LTS,已經安裝好 Arduino
IDE 1.8.10。基本上,我的想法是將
USBASP
連接到山寨開發板的排針上,直接燒錄。燒錄完之後,我想應該插入USB就能用了。
想得很天真,但實做之後,便發現每個關卡都有問題,首先遇到的問題是,山寨開發板的
8-pin
排針跟 USBASP
的10pin
排針腳位不相容,沒辦法直接插。加上排針間,因為有其他零件的關係,也不是完全短路,最終決定還是把
ATtiny拔下來,插在麵包板上面連接
USBASP。這樣子一來,就沒什麼便利性可言了,跟使用
ArduinoISP
一樣意思。
我的
USBASP
燒錄工具,也用它燒過 ESP8266
的韌體
將 ATtiny85連接 ISP
可以用 Arduino Uno 或者 USBASP 當作 ISP 燒錄器,根據以下的接線說明,將ATtiny85接上 ISP。
ATtiny 的腳位圖
Arduino
Uno 當 ISPVCC: AtTiny 8 (VCC) <> 5V Power
SCK: AtTiny 7 (SD2) <> Uno 13 (AtMega 19, PB5)
MISO: AtTiny 6 (SD1) <> Uno 12 (AtMega 18, PB4)
MOSI: AtTiny 5 (SD0) <> Uno 11 (AtMega 17, PB3)
GND: AtTiny 4 (GND) <> GND
RESET: AtTiny 1 (reset) <> Uno 10 (AtMega 16, PB2)
在 Reset跟 GND 之間,用一個 10uF的電容,確保燒錄過程的穩定性。
USBASP
當 ISP
除了在麵包板插線連接 USBASP 的方式,也可以像國外網友一樣,做一個轉接板。這樣以後可以直接插 USBASP來燒錄micronucleus bootloader,也可以燒其他 Firmware。
MOSI <> AtTiny 5 (MOSI)
RST <> AtTiny 1 (PB5)
SCK <> AtTiny 7 (SCK)
MISO <> AtTiny 6 (MISO)
VCC <> AtTiny 8 (VCC)
GND <> AtTiny 4 (GND)
韌體本來可以到這邊下載:
https://github.com/micronucleus/micronucleus
不過後來發現,最新的 2.04版韌體,無法搭配 DigiSpark 的 Arduino 板卡庫,必須安裝1.11版的韌體才行。到這邊下載 1.11版的韌體 micronucleus-1.11.hex:
https://github.com/micronucleus/micronucleus/tree/v1.11
網路上可以搜尋到各種不同的ATtiny 視窗版燒錄工具,但後來爬文後了解,用DigiSpark的Board Manager,頂多就是選擇要不要把 RST 腳位,變成單純的 I/O 腳位,暫存器的設定位元,我附錄在本節下面可參考。(ATtiny 稱為Fuse,分成三個雙位元組來設定)。
為了保險起見,我先用讀取內容的指令,試試看行不行:
Windows 命令提示字元視窗,參數 -P 的序列埠名稱,根據實際狀況更改:
cd "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin"
avrdude.exe -C ..\etc\avrdude.conf -p attiny85 -P com4 -U lfuse:r:-:i -v -b 19200 -B4
Ubuntu:
avrdude -c usbasp -p attiny85 -U lfuse:r:-:i -v -b 19200 -B4
一開始,沒有在結尾加上 -B4 這個參數前,會跑出錯誤訊息,告知ATtiny85沒有回應。這個參數,用來指定位元時脈的速度,單位是微秒 (µs),設成 4 µs之後就可以了。
確定讀取沒問題之後,將韌體檔案 micronucleus-1.11.hex,複製到當前目錄。然後執行以下指令,便能執行燒錄。
Windows:
cd "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin"
avrdude.exe -C ..\etc\avrdude.conf -p attiny85 -U flash:w:micronucleus-1.11.hex -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -B4
Ubuntu:
avrdude -c usbasp -p attiny85 -U flash:w:micronucleus-1.11.hex -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -B4
上面的燒錄命令,會保留 Reset Pin 原來的功能,只留下5個IO 可用。建議沒有特別需要6個I/O的條件,保留下 Reset,這樣才不會因為燒錄失敗,ATtiny變磚頭 (還是有解,但比較麻煩)。
若確定要把 Reset 腳位,變成一般的 I/O,可以執行下面這個指令,high byte fuse 從 0xdd 改成 0x5d:
Windows:
cd "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin"
avrdude.exe -C ..\etc\avrdude.conf -p attiny85 -U flash:w:micronucleus-1.11.hex -U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xfe:m -B4
除了在麵包板插線連接 USBASP 的方式,也可以像國外網友一樣,做一個轉接板。這樣以後可以直接插 USBASP來燒錄micronucleus bootloader,也可以燒其他 Firmware。
MOSI <> AtTiny 5 (MOSI)
RST <> AtTiny 1 (PB5)
SCK <> AtTiny 7 (SCK)
MISO <> AtTiny 6 (MISO)
VCC <> AtTiny 8 (VCC)
GND <> AtTiny 4 (GND)
燒錄 micronucleus bootloader 韌體
系統中若已經安裝 Arduino IDE,就能直接使用 avrdude 燒錄程式。在 Ubuntu Linux 的終端機下,直接就能執行,Windows 的使用者,執行檔是放在 C:\Program Files (x86)\Arduino\hardware\tools\avr\bin 裡面,在命令提示字元視窗之下,可以先設定好 Path。韌體本來可以到這邊下載:
https://github.com/micronucleus/micronucleus
不過後來發現,最新的 2.04版韌體,無法搭配 DigiSpark 的 Arduino 板卡庫,必須安裝1.11版的韌體才行。到這邊下載 1.11版的韌體 micronucleus-1.11.hex:
https://github.com/micronucleus/micronucleus/tree/v1.11
網路上可以搜尋到各種不同的ATtiny 視窗版燒錄工具,但後來爬文後了解,用DigiSpark的Board Manager,頂多就是選擇要不要把 RST 腳位,變成單純的 I/O 腳位,暫存器的設定位元,我附錄在本節下面可參考。(ATtiny 稱為Fuse,分成三個雙位元組來設定)。
為了保險起見,我先用讀取內容的指令,試試看行不行:
Windows 命令提示字元視窗,參數 -P 的序列埠名稱,根據實際狀況更改:
cd "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin"
avrdude.exe -C ..\etc\avrdude.conf -p attiny85 -P com4 -U lfuse:r:-:i -v -b 19200 -B4
Ubuntu:
avrdude -c usbasp -p attiny85 -U lfuse:r:-:i -v -b 19200 -B4
一開始,沒有在結尾加上 -B4 這個參數前,會跑出錯誤訊息,告知ATtiny85沒有回應。這個參數,用來指定位元時脈的速度,單位是微秒 (µs),設成 4 µs之後就可以了。
確定讀取沒問題之後,將韌體檔案 micronucleus-1.11.hex,複製到當前目錄。然後執行以下指令,便能執行燒錄。
Windows:
cd "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin"
avrdude.exe -C ..\etc\avrdude.conf -p attiny85 -U flash:w:micronucleus-1.11.hex -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -B4
Ubuntu:
avrdude -c usbasp -p attiny85 -U flash:w:micronucleus-1.11.hex -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -B4
上面的燒錄命令,會保留 Reset Pin 原來的功能,只留下5個IO 可用。建議沒有特別需要6個I/O的條件,保留下 Reset,這樣才不會因為燒錄失敗,ATtiny變磚頭 (還是有解,但比較麻煩)。
若確定要把 Reset 腳位,變成一般的 I/O,可以執行下面這個指令,high byte fuse 從 0xdd 改成 0x5d:
Windows:
cd "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin"
avrdude.exe -C ..\etc\avrdude.conf -p attiny85 -U flash:w:micronucleus-1.11.hex -U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xfe:m -B4
Ubuntu:
avrdude -c usbasp -p attiny85 -U flash:w:micronucleus-1.11.hex -U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xfe:m -B4
刷完新的韌體之後,把 ATtiny85插上去 DigiSpart 山寨開發板,並連接 USB 之後,作業系統就會找到新的 USB 硬體,”16d0:0753 MCS Digistump DigiSpark” ,這是個虛擬的 USB Device,Vendor ID 16d0,Device ID 0753。
micronucleus: library/micronucleus_lib.c:66: micronucleus_connect: Assertion `res >= 4' failed.
Aborted (core dumped)
解決的方法很簡單,只要把這個 USB 裝置,加入 plugdev 這個群組即可。這個群組,預設就有把安裝使用者的帳號加進去。執行 lsusb 這個指令,看一下山寨開發板的資訊:
Bus 001 Device 019: ID 16d0:0753 MCS Digistump DigiSpark
有了 16d0:0753這個 VendorID跟DeviceID,就可以用 sudo 指令,在 /etc/udev/rules.d 目錄中,建立編輯一個新檔案,90-digispark.rules,號碼是執行的順序,後面的檔名可以自己取,加上.rules這個延伸檔名。
接著在檔案中,加入一行:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", GROUP="plugdev"
等於把這個 USB 裝置,加入 plugdev 使用者群組,而你就是在這個群組的預設使用者,自然就有權限控制這片山寨開發板了。
重新來一次前一節提到的上傳方法,就能上傳成功了。
> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.11
> Available space for user applications: 6330 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 99 page size: 64
> Erase function sleep duration: 792ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
avrdude -c usbasp -p attiny85 -U flash:w:micronucleus-1.11.hex -U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xfe:m -B4
刷完新的韌體之後,把 ATtiny85插上去 DigiSpart 山寨開發板,並連接 USB 之後,作業系統就會找到新的 USB 硬體,”16d0:0753 MCS Digistump DigiSpark” ,這是個虛擬的 USB Device,Vendor ID 16d0,Device ID 0753。
micronucleus bootloader 韌體Fuse參數
根據 micronucleus bootloader 原始檔目錄中,Makefile.inc檔案,對三組Fuse位元的描述(0是Enable,1是Disable), lfuse (Fuse low byte),跟 efuse (Fuse extended byte) 就維持bootloader原始的要求。只有 hfuse (Fuse high byte) 你可以自己決定要用 0xdd 還是 0x5d,是否保留 Reset腳位的原來Reset功能。讓Arduino 支援 ATtiny MPU
Boot Loader刷好了之後,經過一些設定,便可以直接在 Arduino IDE 環境中直接把程式上傳到山寨開發板上的 ATtiny85。
在
Arduino
IDE 的畫面中開啟
“File->Preferences”
並且更改“Additional
Boards Manager URLs” 文字方塊中的內容,輸入:
http://digistump.com/package_digistump_index.json
稍後就能在
“Tools
-> Board -> Boards Manager”裡面,安裝
“Digistump
AVR Boards by Digistump” 套件
安裝完成後,就可以在
“Tools
-> Board” 中,找到新的選項,Digispark
(Default - 16.5mhz)”燒錄
”File
-> Example -> Digispark” 裡面,Start這個簡單的LED閃爍程式。
上傳範例程式
Digispark
上傳程式的流程,跟一般
Arduino
不太一樣,按下上傳按鈕之前,先把插在USB的板子拔掉,我想是因為
PB3
跟 PB4
被拿來共用 USB
信號輸出入的緣故。程式寫入之後,就會發現,把剛把山寨開發板插進去
USB
埠的時候,作業系統會出現該
USB
裝置,但過幾秒就不見了。顯然當板子在前5秒會先以PB3、PB4 跟外部聯絡,發現沒有連線之後,才會開始執行之前上傳的程式。
按下上傳按鈕後,會出現以下的訊息:
Running
Digispark Uploader...
Plug
in device now... (will timeout in 60 seconds)
60秒的期限結束之前,插入山寨開發板,就會開始上傳程式。上傳完
Start
這個範例程式之後,就會看到山寨板上第二個
LED
開始閃爍,代表上傳成功。
Linux 使用者會遇到的上傳問題
由於 Liunx 對於外接的 USB 裝置,有權限管理,因此在上傳的時候,會出現以下的錯誤訊息:micronucleus: library/micronucleus_lib.c:66: micronucleus_connect: Assertion `res >= 4' failed.
Aborted (core dumped)
解決的方法很簡單,只要把這個 USB 裝置,加入 plugdev 這個群組即可。這個群組,預設就有把安裝使用者的帳號加進去。執行 lsusb 這個指令,看一下山寨開發板的資訊:
Bus 001 Device 019: ID 16d0:0753 MCS Digistump DigiSpark
有了 16d0:0753這個 VendorID跟DeviceID,就可以用 sudo 指令,在 /etc/udev/rules.d 目錄中,建立編輯一個新檔案,90-digispark.rules,號碼是執行的順序,後面的檔名可以自己取,加上.rules這個延伸檔名。
接著在檔案中,加入一行:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", GROUP="plugdev"
等於把這個 USB 裝置,加入 plugdev 使用者群組,而你就是在這個群組的預設使用者,自然就有權限控制這片山寨開發板了。
重新來一次前一節提到的上傳方法,就能上傳成功了。
> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.11
> Available space for user applications: 6330 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 99 page size: 64
> Erase function sleep duration: 792ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
後記
其實在拍賣網上,零買這顆IC,並不便宜,相較之下,一些現成的模組,可能比這個 IC 還要更容易使用,本身就有排針 Reset 按鈕,電源模組。排針要是焊在 PCB板的下方,之後一樣可以把模組焊到更大的麵包板上,跟其他的零件規劃在一起,變成組合電路。
比方說,常見的 Arduino Pro Mini,以及最近發現一款基於大陸 Logic Green LGT8FX8P系列 MCU,LGT8F328P-SSOP20 MiniEVB。這片MCU模塊是以 32MHz 運行,速度是 ATmega328P的兩倍。蝦皮可以找到 NT$35以下的賣家。最近拿來開發 3D 列印機模擬ATX電源自動關機,還蠻好用的。關於這片板子的介紹,可以參考本文:「Arduino Pro Mini 的便宜替代品 MiniEVB」
感謝分享
回覆刪除不错,受教了
回覆刪除我也看他方便買了一顆一模一樣的,然後拼命找教學怎麼使用,最後看到這一篇……
回覆刪除Arduino新手表示太深奧看不懂……
感謝 !!
回覆刪除