ALUNAR M508 メインボードのファームウェアをアップデートして !!! バグに対応する


以前、3D プリンタ ALUNAR M508 のファームウェア (正確にはブートローダだが) には問題があって、!!! をシリアル通信で受信するとモニタモードに変わるという問題があった。

色々ググってみると、ファームウェアをアップデートするとこの問題に対応できるので、対応してみた。

必要なもの

今回の問題は、ALUNAR M508 の CPU である ATmega2560 ではなく、USB – シリアルブリッジとして使われている ATmega16U4 側にある。なので、ATmega16U2 が DFU (Device Firmware Update) に移行するようにジャンパでショートさせる必要がある。

一番楽なのはメス – メスのジャンパ線だが、ここは割と何でもいい。導通すればいいのでピンセットでもいいし、自分の場合はオス – メスのジャンパ線とブレッドボードを組み合わせた。

書き換え

dfu-programmer をインストール

DFU モードになった AVR に対してプログラムを書き込むためのプログラムが必要になる。今回は Mac でやったので、dfu-programmer をインストールした。

sudo brew install dfu-programmer

Windows の場合は Flip をインストールすればいいらしい。

DFU モードに移行

DFU モードに移行するために、まずジャンパ線か何かで ATmega16U2 側の ICSP コネクタの RESET を GND に接続する。ICSP は 2 つあるので、ICSP2 かどうか確認する。

この状態で電源を供給するか、リセットボタンを押してボードをリセットする。これで DFU モードに移行する。

ファームウェアを書き換える

DFU モードに入ったら、あとはファームウェアを書き換える。ファームウェアは Arduino IDE のパッケージ内に含まれている。Mac の場合はコンソールからファームウェアのあるディレクトリに移動する。

cd /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/firmwares/atmegaxxu2

ファームウェアを書き換える前に、まずは既存のファームウェアを削除する。

$ sudo dfu-programmer atmega16u2 erase
Password:
Checking memory from 0x0 to 0x2FFF...  Not blank at 0x1.
Erasing flash...  Success

削除が終わったら、修正済みのファームウェアを書き込む。

$ sudo dfu-programmer atmega16u2 flash Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex --suppress-bootloader-mem
Checking memory from 0x0 to 0xFFF...  Empty.
0%                            100%  Programming 0x1000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
0%                            100%  Reading 0x3000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
Validating...  Success
0x1000 bytes written into 0x3000 bytes memory (33.33%).

これでファームウェアの書き込みは完了。

最新の Marlin をインストールする

ここまで来れば !!! を含むデータをやりとりしても問題はない。なので、ALUNAR M508 用にいじった最新の Marlin を持ってきて Arduino IDE から書き込む。


なお、自分の環境ではちょくちょく timeout になることがある。USB ケーブルを抜き差しして何度か試すとデータが流れるようにはなるが、Arduino を触るときのように常に成功するわけではないので、若干モヤモヤする。