使用 Arduino IDE 將 Sketch 直接寫入到 ATtiny85

Arduino 令學習及使用電子零件變得簡單
但如果製作細小的專案,體積較大的 Arduino 開發板並不適合
之前在下提及的 ATtiny85 雖然細小,但需要 ISP 及連接其他額外電子零件才能寫入程式,長遠而並方便
如果有又細小又方便寫入程式,便可以方便製作及開發小型電子產品

DigiSpark 原裝開發板

見下文
DigiSpark 原裝開發板 正面

見下文
使用標準的 USB 2.0 Type-A 插頭,能直接連接到大部分電腦的 USB 插口

見下文
使用 7805 確保電壓輸入為 5V

見下文
使用 SOP 封裝的 ATtiny85

引腳
見下文
電源相關的引腳
由最近 USB 插頭向右分別為:
  1. 5V
  2. GND
  3. VIN

見下文
DigiSpark PortATtiny85 PortPWMAnalogSPII 2 C其他
05PWM0ArefMOSISDA
16PWM1MISOLED
27A1SCKSCL
32A3USB+
43PWM4A2USB-
51A0RST

見下文
DigiSpark 原裝開發板 背面

見下文
背面有詳細說明每支引腳的功能

見下文
接駁電源時 綠色LED 會亮著

見下文
製作簡單 電路板LED閃動 測試

DigiSpark 兼容開發板

見下文
DigiSpark 兼容開發板 正面

見下文
使用 Micro USB Type-B 插孔

見下文
同樣使用 7805 確保電壓輸入為 5V

見下文
同樣使用 SOP 封裝的 ATtiny85

引腳
見下文
電源相關的引腳
由最近 USB 插孔向右分別為:
  1. 5V
  2. GND
  3. VIN

見下文
控制相關的引腳
由最近電源相關引腳向右分別為:
  1. P0
  2. P1
  3. P2
  4. P3
  5. P4
  6. P5

控制相關的引腳
由最近電源相關引腳向右分別為:

見下文
DigiSpark 兼容開發板 背面
背面有詳細說明每支引腳的功能

見下文
接駁電源時 紅色LED 會亮著

見下文
電路板LED閃動 效果

DigiSpark(DIP) 兼容開發板

見下文
DigiSpark(DIP) 兼容開發板 正面

見下文
同樣使用 Micro USB Type-B 插孔

見下文
同樣使用 7805 確保電壓輸入為 5V

引腳
見下文
電源相關的引腳
由最近 USB 插孔向右分別為:
  1. 5V
  2. GND
  3. VIN

見下文
控制相關的引腳
由最近電源相關引腳向右分別為:
第1欄第2欄第3欄第4欄
第1列P4P5P2P1
第2列P3GNDP05V

見下文
DigiSpark(DIP) 兼容開發板 背面
背面有詳細說明每支引腳的功能

見下文
引腳座缺口要匹配 ATtiny85 的第1引腳

見下文
見下文
見下文
DigiSpark(DIP) 兼容開發板 的 特點是可以將 ATtiny85 DIP 安裝及卸除
測試時將 ATtiny85 安裝到開發板,測試完成後將 ATtiny85 卸除,並安裝到原型或正式產品使用

見下文
接駁電源時 紅色LED 會亮著

見下文
電路板LED閃動 效果

各種 DigiSpark 比較

見下文
3款 DigiSpark 開發板都各有好處及壞處

見下文
DigiSpark 原裝開發板
  • 可以直接像 USB 裝置般連接到電腦
  • 沒有 USB Type-A 延長線使用上則比較麻煩
  • 經常插拔較容易損壞電腦的 USB 插孔

見下文
DigiSpark 兼容開發板
  • 3款開發板中最細小

見下文
見下文
DigiSpark(DIP) 兼容開發板
  • 雖然是3款開發板中最大,但卸除 ATtiny85 後使用卻是最小
  • 不附帶 ATtiny85 的 DigiSpark 開發板最便宜
  • 控制引腳沒有為安裝到麵包板設計
  • 需要燒錄起動器才能直接經 USB 上載 Sketch

安裝及設定 DigiSpark 上載器

見下文
開啟 Arduino IDE 並在 File > Preferences > Additional Boards Manager URLs 加入
https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json

見下文
到 Tools > Board > Boards Manager 尋找 Digistump AVR Boards 並安裝

見下文
到 Tools > Board > Digistump AVR Boards 選擇 Digispark (Default -16.5mhz)

見下文
閣下應該會發現 Arduino IDE 沒有偵測到 DigiSpark 開發板的連接埠
DigiSpark 使用 Micronucleus 直接使用 USB訊號 將 Sketch 上載到 ATtiny85 ,而不是將 USB訊號 轉換成 UART訊號 上載
因此 Arduino IDE 不會顯示 DigiSpark 開發板連接埠
當將 Sketch 上載到 ATtiny85 出現 無法找到 libusb-0.1.so.4 錯誤

見下文
開啟 Terminal 輸入
sudo apt install libusb-0.1-4
按此安裝 libusb-0.1-4

見下文
再次上載 Sketch 到 ATtiny85 出現 micronucleus_connect: Assertion `res >= 4' failed 錯誤

見下文
在 Terminal 輸入
lsusb | grep -i digi
找到 DigiSpark 開發板的 ID

見下文
建立 /etc/udev/rules.d/49-micronucleus.rules 檔案

見下文
在檔案中加入
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
並儲存

見下文
完成後輸入
sudo udevadm control --reload-rules
更新 USB 裝置的規則,並重新開機

見下文
終於可以將 Sketch 上載到 ATtiny85

燒錄起動器到 ATtiny85

以前在下曾使用 Arduino 作為 ISP裝置 將 Sketch 上載到 ATtiny85 ,這種方法還需要接駁繁瑣的線路
因此使用與 DigiSpark 相同的方法,將起動器燒錄到 ATtiny85 ,便可以直接將 Sketch 上載到 ATtiny85
但燒錄起動器到 ATtiny85 前,需要先將 Arduino 修改成 ISP裝置
然後將 Arduino ISP 及 ATtiny85 連接,連接方法與在下的 經 Arduino 上載 Sketch 到 ATtiny85 相同
因此在下不重覆內容,請自行前往該文章了解連接的線路的佈局

見下文
如果已經將 ATtiny85 安裝 DigiSpark 上,亦可以直接連接線路
DigiSpark 上的引腳排列,其實是 ICSP6 的排列,方便連接到 ISP裝置
注意: DigiSpark 的 RST 要連接到 Arduino 的 D10引腳 (SS引腳)

見下文
https://github.com/Jasdoge/Attiny85-Bootloader-Tutorial
下載 burn_attiny85_bootloader.bat t85_default.hex

見下文
由於 burn_attiny85_bootloader.bat 是 Windows 的 批次檔案,無法在 Linux 上執行
因此修改成 Shell Script 及部分設定值,讓腳本可以在 Linux 上執行

當然閣下亦可以將在下已經修改的 Shell Script 複製再修改亦可
#!/bin/bash
arduino_user_dir="/arduino_user_dir"
avrdude_dir="${arduino_user_dir}/hardware/tools/avr"
"${avrdude_dir}/bin/avrdude" \
-C"${avrdude_dir}/etc/avrdude.conf" \
-v \
-p"attiny85" \
-c"stk500v1" \
-P"/dev/ttyACM0" \
-b"19200" \
-U"flash:w:t85_default.hex":i \
-U lfuse:w:0xe1:m \
-U hfuse:w:0xdd:m \
-U efuse:w:0xfe:m
按此下載 burn_attiny85_bootloader.sh
需要注意的是
  • arduino_user_dir 需要修改成閣下正在使用的 Arduino IDE 的使用者設定目錄
  • 在下使用的 Arduino UNO 的位置為 /dev/ttyACM0 ,閣下需要將些位置改修成閣下的 ISP 裝置的位置

見下文
見下文
修改完成後執行 burn_attiny85_bootloader.bat 等待起動器燒錄到 ATtiny85

更新上載器

見下文
雖然已經將起動器燒錄到 ATtiny85
但上載 Sketch 時,顯示 Micronucleus 上載器版本不支援新版本的 DigiSpark

見下文
https://github.com/micronucleus/micronucleus 下載最新版本的 Micronucleus

見下文
將 最新版本的 Micronucleus 存放到 ${arduino_user_dir}/packages/digistump/tools/micronucleus/<Version>
在下將不同版本的 Micronucleus 都保存,方便選擇不同版本,並建立捷徑來調用合適的版本

見下文
見下文
使用最新版本的 Micronucleus 後,可以只經過 USB 便可以將 Sketch 上載到 ATtiny85

補充資料

ATtiny85 除了細小,將 Micronucleus 燒錄到起動器,還能夠像 ATmega32u8 一般模擬 USB HID 裝置的訊號
但 ATtiny85 並不支援 Arduino 原生的 Keyboard.h 及 Mouse.h 等函式庫
需要使用由 DigiSpark 提供的 DigiKeyboard.h 及 DigiMouse.h 等函式庫

////////// ino file //////////

#include <DigiKeyboard.h>
#include "Config.h"

void setup() {
	pinMode(LED_PIN, OUTPUT);
	digitalWrite(LED_PIN, LOW);
	for (byte i = 0; i < 1000 / INIT_DELAY; i++) {
		digitalWrite(LED_PIN, !digitalRead(LED_PIN));
		delay(INIT_DELAY);
	}
	digitalWrite(LED_PIN, HIGH);
	DigiKeyboard.delay(2000);
	DigiKeyboard.sendKeyStroke(KEY_A, MOD_GUI_LEFT);
	delay(10);
	DigiKeyboard.sendKeyStroke(KEY_A, MOD_CONTROL_LEFT);
	delay(10);
	DigiKeyboard.print(MY_PASSWORD);
	DigiKeyboard.print("\n");
	digitalWrite(LED_PIN, LOW);
}

void loop() {
}
////////// Config.h //////////

#define LED_PIN 1
#define INIT_DELAY 50
#define MY_PASSWORD "Your Login Password"
在下製作一個模仿登入認證的 Sketch 可以在登入畫面連接 DigiSpark USB 後,自動填寫密碼及登入
(警告:
純粹娛樂及測試效果,實際上是非常危險
若果 DigiSpark 遺失,便會洩漏密碼)

見下文
見下文
支援模擬成 USB 訊號的 ATtiny85

由於 Arduino IDE 沒有收錄所有 DigiSpark 函式庫,要使用其他 DigiSpark 函式庫
需要自行到 https://github.com/digistump/DigisparkArduinoIntegration/tree/master/libraries 下載並安裝

總結

使用ArduinoDroid
由於能夠透過 OTG USB 將 Android裝置 以宿主連接 USB裝置
因此 Android 可以經 OTG USB 將 Sketch 上載到 DigiSpark
DigiSpark 體績細小,配合 Android裝置 的便攜性,可以隨時編寫及製作電子控制裝置

https://play.google.com/store/apps/details?id=name.antonsmirnov.android.arduinodroid2 安裝 ArduinoDroid

見下文
可以編寫 Sketch

見下文
見下文
見下文
見下文
按右上角的 更多選項 > Settings > Board type > Digistump > Digispark (Default - 16.5mhz)

見下文
然後 儲存 及 編譯 Sketch

見下文
將 DigiSpark 透過 OTG USB 連接到 Android裝置
會顯示 USB device attached

見下文
按 上載 按鈕
顯示 要允許「ArduinoDroid」存取「null」嗎? 後,按 確定

見下文
將 Sketch 上載到 DigiSpark
顯示 Sketch uploaded

Android 連接 DigiSpark 後,大概只有 5秒 是編程模式
超過 5秒 便會自動回復 操作模式 ,無法上載 Sketch
因此必須在 5秒 內,按 上載 按鈕 及 按 確定 來上載 Sketch

意外操作
DigiSpark 使用 P3 及 P4 作為 USB引腳
在下將 LED正極 接駁到 P3 ,LED負極 接駁到 GND ,令上載 Sketch 時的 USB訊號出錯
意外地將 ATtiny85 SOP DigiSpark 資料清除,令 ATtiny85 SOP 遺失起動器,導致無法直接上載 Sketch
但 ATtiny85 SOP 是焊接在 DigiSpark 上,若果要除焊是非常困難
即使能夠除焊,在沒有 SOP連接器 的情況下,將資料寫入到 SOP晶片 都是非常困難
還要重新焊接 ATtiny85 SOP 到 DigiSpark 都是非常困難的操作

見下文
因此在下嘗試直接使用跳線,透過 DigiSpark 的引腳接駁到 Arduino ISP 重新燒錄起動器到 ATtiny85
ATtiny85 SOP DigiSparkArduino ISP電子零件
VIN5V
GNDGND10uF電解電容負極
P011
P112
P213
P510
RST10uF電解電容正極
結果能夠將起動器燒錄到 ATtiny85 SOP ,能再次將 Sketch 直接上載到 ATtiny85
這情況亦令在下留意經 DigiSpark 的 USB 上載 Sketch 到 ATtiny85 前
不要接駁任何電子零件到所有 GPIO引腳,避免發生意外

DigiSpark 開發板雖然細小,但官方售價為 8美元,比功能更多的 Raspberry Pi Pico W 還要昂貴
不過,某些網上平台發售的 DigiSpark 兼容開發板,則大約 1美元 即可
而且細小的體積,使用標準 USB Type-A 的插頭,使用上確實是非常方便
即使不焊接引腳,亦可以直接將金屬線路纏在引腳孔上使用,即時製作臨時裝置

由於 DigiSpark 開發板並沒有連接到 ATtiny85 的 RST引腳
因此,已經連接到電腦的 DigiSpark 開發板不能控制 ATtiny85 重置而無法上載
所以需要先手動將 DigiSpark 開發板卸除,執行上載 Sketch 的等候狀態時
才將 DigiSpark 開發板連接到電腦,才能將 Sketch 上載到 ATtiny85
否則會繼續出現 micronucleus_connect: Assertion `res >= 4' failed 錯誤 或 上載逾時 錯誤

由於 DigiSpark(DIP) 的引腳座外露的引腳,導致安裝 ATtiny85 時非常刺手
擺放在物件上,亦有有機會損壞其表面,因此在下將外露的引腳剪去,再重新焊錫
焊錫因為液體表面張力現象,會形成圓球狀,便不會有尖刺的引腳外露,而且亦比較美觀

起動速度比較
見下文
  1. DigiSpark 兼容開發板 大約 5.916秒
  2. DigiSpark(DIP) 兼容開發板 大約 6.316秒
  3. DigiSpark 原裝開發板 大約 6.683秒

參考資料