2023-09-24

Arduino Nano ATmega328PB !?

最初的 Arduino Nano 使用 Mini USB Type-B 插孔
早期的 Arduino Nano 兼容開發板同樣使用 Mini USB Type-B 插孔
但使用 Mini USB Type-B 的裝置已經越來越少,傳輸線亦較難找到
因此在下想尋找一些 使用 Micro USB Type-B 或 USB Type-C 的 Arduino Nano
雖然找到這些 Arduino Nano ,但卻需要額外工序才能使用

不同 USB介面 的 Arduino Nano

見下文
使用 Micro USB Type-B 或 USB Type-C 的 Arduino Nano 兼容開發板

ATmega328PB 晶片

見下文
Mini USB Type-B 的 Arduino Nano 或 兼容 Arduino Nano 開發板 使用 ATmega328P

見下文
見下文
在下發現 Micro USB Type-B 或 USB Type-C Arduino Nano 開發板 則使用 ATmega328PB

見下文
使用 ATmega328P 開發板 接駁電源,顯示電源的 LED 為 綠色
使用 ATmega328PB 開發板 接駁電源,顯示電源的 LED 為 紅色

ATmega328PB 上載錯誤

見下文
見下文
使用 Arduino IDE ,不論使用 Arduino Nano ATmega328PArduino Nano ATmega328P (Old Bootloader)
都不能將 Sketch 上載到 ATmega328PB 的 Arduino Nano

修改 avrdude.conf 設定檔

見下文
由於 ATmega328PB 不能使用 ATmega328P 的設定方式上載 Sketch
因此在下嘗試修改 avrdude.conf 設定檔,希望令 Arduino IDE 能夠支援 ATmega328PB
Arduino IDE 預設的 avrdude.conf 設定檔位於 <Path-of-Arduino-IDE>/packages/arduino/tools/avrdude/<Avrdude-Version>/etc/avrdude.conf

見下文
見下文
在設定檔中尋找 atmega328p
雖然設定檔有提供 ATmega328PB 的設定值,但原生的的 Arduino Nano 選項,並沒有 ATmega328PB 選項
因此無法使用 ATmega328PB
要讓原生的 Arduino Nano 選項能支援 ATmega328PB ,需要修改 ATmega328P 的設定值,偽裝成 ATmega328PB

signature = 0x1e 0x95 0x0F;
修改成
signature = 0x1e 0x95 0x16;
亦可以使用 # (井號) 將原本的設定值修改成註釋,再複製其內容修改
可以較容易變動及復原資料

見下文
最後使用 Arduino Nano ATmega328P 的設定值將 Sketch 上載到 ATmega328PB

修改 boards.txt 設定檔

但每次手動修改設定檔來切換 ATmega328P 及 ATmega的328PB 的設定值非常不方便
因此除了修改 avrdude.conf 設定檔,亦可以修改 Arduino IDE 的 boards.txt 設定檔

由於只需要修改 ATmega328P 的簽名值,便可以上載 Sketch 到 ATmega328PB
因此可以將 ATmega328P 作為範本,並在 boards.txt 新增一項 ATmega328PB 的選項
便可以隨時切換 ATmega328P 及 ATmega328PB

見下文
尋找 nano.menu.cpu.atmega328=ATmega328P
將 ATmega328P 的設定值複製,並修改為以下資料:
## Arduino Nano w/ ATmega328PB
## --------------------------
nano.menu.cpu.atmega328pb=ATmega328PB

nano.menu.cpu.atmega328pb.upload.maximum_size=30720
nano.menu.cpu.atmega328pb.upload.maximum_data_size=2048
nano.menu.cpu.atmega328pb.upload.speed=115200

nano.menu.cpu.atmega328pb.build.mcu=atmega328pb
注意:由於 ATmega328P 的 Bootloader 並不適合 ATmega328PB ,因此 ATmega328P 的 Bootloader 資料,不需要複製

見下文
開啟 Arduino IDE 便可以發現新增 ATmega328PB 的選項,便不需要手動修改 avrdude.conf 上載 Sketch 到 ATmega328PB

使用 Mini Core

在下其中一塊 Arduino Nano ATmega328PB 開發板,完全無法使用任何方法上載 Sketch
估計是 ATmega328PB 沒有燒錄 Bootloader ,因此嘗試將 Bootloader 燒錄到這塊 開發板 的 ATmega328PB 中
Arduino IDE 沒有適合 ATmega328PB 的 Bootloader ,因此在下尋找適合 ATmega328PB 的 Bootloader

見下文
見下文
Additional Boards Manager URLs 加入
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
並到 Boards Manager... 尋找及安裝 MiniCore

見下文
見下文
Board 選擇 MinoCore > ATmega328
Variant 選擇 328PB
Programmer 選擇 AVRISP mkII
其他設定值保持預設,便可以在 Arduino IDE 中選擇設定值,而不需要手動修改設定檔

燒錄 ATmega328PB Bootloader

見下文
在下使用另一塊 Arduino Nano 作為 Arduino ISP 燒錄器
嘗試將 Bootloader 燒錄到懷疑沒有 Bootloader 的 ATmega328PB 中

見下文
方法與 燒錄 Bootloader 到 ATmega328P* 並獨立運作 完全相同,先將 ArduinoISP 的 Sketch 上載到一塊運作正常的 Arduino
將線路接
Arduino ISP 目標裝置
VCC VIN
GND GND
10(SS) RST
11(MOSI) 11(MOSI)
12(MISO) 12(MISO)
13(SCK) 13(SCK)

見下文
將 Programmer 設定為 Arduino as ISP

見下文
將 Bootloader 燒錄後,終於可以上載 Sketch 到 Arduino Nano ATmega328PB

USB ISP 燒錄器

除了使用 Arduino 作為 ISP 燒錄 Bootloader 及 上載 Sketch 外
亦可以使用稱為 USB ISP 的燒錄器燒錄 Bootloader 及 上載 Sketch 到 ATmega328PB
USB ISP 燒錄器 有很多種,在下使用 USBASP V2.0 燒錄器
是一種以 USB介面 ,並專門為 AVR微控制器燒錄程式的ISP

見下文
USBASP V2.0 燒錄器 的 正面

見下文
USBASP V2.0 燒錄器 的 背面

見下文
USBASP V2.0 燒錄器同樣 AVR系列 的 ATmega8A微控制器

見下文
USBASP V2.0 提供 5V 及 3.3V 電壓切換
方便支援不同工作電壓的微控制器

ICSP-10 介面

見下文
Pin 1 MOSI Pin 2 VCC Pin 3 NC Pin 4 GND Pin 5 SS Pin 6 GND Pin 7 SCK Pin 8 GND Pin 9 MISO Pin 10 GND
USBASP V2.0 使用 ICSP-10 插頭

見下文
見下文
由於 ICSP-10插頭,無法直接連接到目標裝置
因此需要使用 ICSP-10延長線 方便連接到目標裝置

見下文
由於目標裝置沒有 ICSP-6 或 ICSP-10 ,因此在下以跳線連接到 Arduino Nano 的引腳使用

留意,從延長線另一端接駁跳線時,插孔方向是反轉的

顏色 引腳功能
紅色 VCC
黑色 GND
藍色 SS
綠色 MOSI
白色 MISO
黃色 SCK

見下文
以 ICSP-10插孔 連接到 Arduino Nano

見下文
將引腳接駁到 Arduino Nano

見下文
將 USBASP V2.0 連接到電腦後,將 Programmer 修改為 USBasp

見下文
但 燒錄 Bootloader 時出現錯誤
avrdude usbOpenDevice() warning: cannot open USB device: Permission denied
avrdude usbasp_open() error: cannot find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp
avrdude main() error: unable to open programmer usbasp on port usb
原因是 USBASP V2.0 沒有存取 USB裝置 的權限,導致無法找到 USB裝置

要讓 USBASP V2.0 存取 USB裝置 ,需要 設定 udev規則
開啟 Terminal 輸入
echo -n 'SUBSYSTEM=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", GROUP="dialout"' | sudo tee "/etc/udev/rules.d/99-usbasp.rules"
檔案必須儲存在 /etc/udev/rules.d ,但檔案名不一定使用 99-usbasp.rules
設定 udev規則 後,重新開機便可以令 udev規則 生效,亦可以輸入
sudo udevadm control --reload-rules
sudo udevadm trigger
令 udev規則 立即生效

見下文
udev規則 生效後,便可以將 Bootloader 燒錄到 Arduino Nano ATmega328PB

經 USB ISP 上載 Sketch

見下文
雖然能夠 燒錄Bootloader 到 Arduino Nano ATmega328PB
但上載 Sketch 到 Arduino Nano ATmega328PB 卻出現錯誤
avrdude ser_open() OS error: cannot open port /dev/ttyUSB0: No such file or directory
avrdude main() error: unable to open programmer arduino on port /dev/ttyUSB0
將上載指令複製

見下文
開啟 Terminal ,將剛才的指令貼上,並將 -carduino 修改為 -cusbasp 及 -P/dev/ttyUSB0 修改為 -Pusb
<Path-of-Arduino-IDE>/packages/MiniCore/tools/avrdude/<Avrdude-Version>/bin/avrdude \
-C<Path-of-Arduino-IDE>/packages/MiniCore/hardware/avr/<Mini-Core-Version>/avrdude.conf \
-v \
-patmega328pb \
-cusbasp \
-Pusb \
-b115200 \
-D \
-Uflash:w:<hex-file>:i

見下文
雖然比較轉接,但都能夠使用 USBASP V2.0 將 Sketch 上載到 ATmega328PB

見下文
同樣可以修改 Mini Core 的 boards.txt 指令,強制使用 USBASP 及 USB
328.menu.variant.modelPB_USBASP=328PB (USBASP)
328.menu.variant.modelPB_USBASP.bootloader.cksel_bits=1111
328.menu.variant.modelPB_USBASP.bootloader.cfd_bit=0
328.menu.variant.modelPB_USBASP.build.variant=pb-variant
328.menu.variant.modelPB_USBASP.build.mcu=atmega328pb
328.menu.variant.modelPB_USBASP.upload.protocol=usbasp
328.menu.variant.modelPB_USBASP.serial.port=usb

見下文
在 Variant 中找到 328PB (USBASP) ,便可以在 Arduino IDE 選擇

總結

雖然 ATmega328PB 已經是 2016年 的產品,但尋找到的資料並不多
當然,實際使用上其實與 ATmega328P 完全相同,只是簽名值不同
如果 Bootloader 已經燒錄到,只需要選擇對應的設定值便可以上載 Sketch

Arduino Nano 到手後發現無法上載 Sketch 以為已經損壞
以為是 微控制器 沒有 Bootloader ,但無法將 Bootloader 燒錄到 Arduino Nano
仔細了解有否遺漏,結果發現這些 Arduino Nano 使用 ATmega328PB ,而非 ATmega328P
最後上網尋找上載 Sketch 到 ATmega328PB 的方法,結果就是修改 avrdude.conf
但網上沒有修改 boards.txt 的建議,看來都只是搬字過紙

參考資料

沒有留言 :

張貼留言