ATtiny85 的 DigiSpark山寨可插拔開發編程板

在蝦皮購買電子零件的時候,意外發現這個小工具,上面有 USB 插槽供電、連線電腦,以及 8-DIP 的IC插槽,可以安插 ATtiny 85/45/25 這幾種的8隻腳的MCU,而且旁邊還有引出8支排針,看起來很方便,價錢也超便宜,就順便買了。 
DigiSpark 山寨可插拔開發板
原本以為有了這個工具,可以用USB來編程測試,邊寫邊試,完成後可以直接把 IC 拔起來,焊上去麵包板、PCB板就能用了,以後還可以當燒錄器重複燒錄,這樣豈不太方便了?
買來後仔細看一下電路板,才發現不是這麼一回事,不但板子上沒有看到任何 USB 控制 IC,裝上 ATtiny85 連接 USB之後,電腦根本認不到這片板子。

後來查了一些資料,才了解這塊板子使用前,需要先把 micronucleus bootloader 燒錄進去 ATtiny85 中,才能使用。原版的開發板,直接焊上一片 SMD 封裝的 ATtinybootloader也預先燒好,所以插上USB就能使用、開發程式,但是ATtiny就不能直接拔起來了。
DigiSpark 原版開發板
因為這次想用 ATtiny853D列印機做一個可以自動關機、模擬 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 ISP

VCC: 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)
ResetGND 之間,用一個 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)

燒錄 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 視窗版燒錄工具,但後來爬文後了解,用DigiSparkBoard 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 原來的功能,只留下5IO 可用。建議沒有特別需要6I/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 DeviceVendor ID 16d0Device ID 0753

micronucleus bootloader 韌體Fuse參數

根據 micronucleus bootloader 原始檔目錄中,Makefile.inc檔案,對三組Fuse位元的描述(0Enable1Disable)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這個 VendorIDDeviceID,就可以用 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

4 則留言:

  1. 我也看他方便買了一顆一模一樣的,然後拼命找教學怎麼使用,最後看到這一篇……
    Arduino新手表示太深奧看不懂……

    回覆刪除