2022-12-21

使用 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 Port ATtiny85 Port PWM Analog SPI I2C 其他
0 5 PWM0 Aref MOSI SDA
1 6 PWM1 MISO LED
2 7 A1 SCK SCL
3 2 A3 USB+
4 3 PWM4 A2 USB-
5 1 A0 RST

見下文
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列 P4 P5 P2 P1
第2列 P3 GND P0 5V

見下文
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.batt85_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裝置 的便攜性,可以隨時編寫及製作電子控制裝置


見下文
可以編寫 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 DigiSpark Arduino ISP 電子零件
VIN 5V
GND GND 10uF電解電容負極
P0 11
P1 12
P2 13
P5 10
RST 10uF電解電容正極
結果能夠將起動器燒錄到 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秒

參考資料

沒有留言 :

張貼留言