3D printer Anet A8のfirmwareを書き換える手順
3D printer Anet A8のfirmwareの書き換えです。
Anet A8のfirmwareを書き換えてmarlin2.0にします。
プリンタに後付で液晶パネル等のシールド類を追加する場合等でファームの書き換えが必要になると思います。
Anet A8ファームウェアをアップグレードする最大の理由は 火災事故 が起きないようにするためと書いてありました。
温度センサーは付いていますが高温になったときの緊急停止機能がデフォルトで無いという事らしいです。
marlin2.0はオープンソースで自由に改造できます。
ソースのビルドはVisual Studio Codeが使えます。
Visual Studio Codeの拡張機能でPlatformIOでAtmel AVRマイコン用等のクロスコンパイルが可能です。
クロスコンパイルされたバイナリをCOMポート経由でマイコンのブートローダに転送できます。
ブートローダがあると128Kしか無いプログラムメモリ(フラッシュROM)を圧迫し後々これが問題になる可能性もあります。
ブートローダはメモリーマップの底に配置されるとあります。
使わない機能を削ぎ落とすみたいなことになりそうです。
更にブートローダがあるとブート時の起動速度が落ちる問題もあります。(0.75秒)
これ以上ファームをいじらないと思ったらブートローダが不要になると思います。
avrdude等を使ってISP端子経由でプログラムメモリを直接書き換えてしまうのもありだと思います。
https://www.nongnu.org/avrdude/user-manual/avrdude.html
マイコンをバイトレベルで弄くり回すという世界が来ます。
avrdudeでカレントのメモリダンプなんかも簡単にできてしまいます。プログラムメモリのbackup
avrdude -p m1284p -c usbasp -U flash:r:flash.hex:r
プログラムメモリへrestore
avrdude -p m1284p -c usbasp -U flash:w:flash.hex:r
プログラムメモリの読み書き等がダイレクトにできるのでメモリのバックアップ、リストアも簡単です。
Visual Studio Codeがかなり優秀で最近はこれに変わりつつある空気です。
Anet A8は オープンソースハードウェア(OSHW) です。
自身でソースをビルドしメンテやソフトハードの改造を行え得るようになっています。
製品はキットになっていて自身で組み立てる必要があります。(完成品ではない。)
製品が売れる理由はこのオープンにあると思います。
企業の利益の最大化ではなく技術を公開し人類の知的財産の共有をやろうという趣旨らしいです。
●大まかな作業の流れは以下の通りです。
1) ブートローダをA8マザーボードのプログラムメモリに書き込み。
2) ファームをソースからビルドしA8マザーボードのプログラムメモリに書き込み。
このプリンタのA8マザーボードはAVRマイコン(Arduino)です。
出荷状態ではArduinoブートローダがA8マザーボードのプログラムメモリに書き込まれていません。
USBaspとArduino IDEを使ってブートローダをマザーボードのプログラムメモリに書き込みます。
https://www.arduino.cc/en/software
https://www.fischl.de/usbasp/
ブートローダだけではプリンタの制御は行なえません。
ブートローダからファームをA8マザーボードに流し込んでプログラムメモリに書き込みします。
プログラムメモリへの転送はVisual Studio CodeとPaltformIO拡張機能を使います。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
https://platformio.org/
プログラムメモリ上にはブートローダ+ファームウェアが書き込まれます。
マザーのプログラムメモリは128Kしかないためオーバーしてしまう可能性があります。
メモリーを消費するブートローダを使わない方法も検討する場合も後であると思います。
●ブートローダの書き込み作業開始
ブートローダを使ってファームをA8マザーボードのプログラムメモリに書き込みに転送します。
通常の開発用のardiunoは起動時はブートローダから始まるようになっています。
ブートローダはプログラムをプログラム領域にロードしプログラム領域に書かれたコードが実行されます。
プログラムの差し替えが簡単にできます。
ブートローダがない場合はあらかじめプログラム領域に書かれたコードが実行されます。
ブートローダがあればシリアルポートからプログラムが読み込まれます。
PCとardiunoをつないでシリアルポート経由でardiunoのプログラムを流し込んで実行する事ができるように> なります。
1) USBaspを用意しプリンタとPCに繋ぎます。
USBaspはA8マザーボードのプログラムメモリ、EEPROM等にアクセスする為のISPアダプタです。
amazonで1000円位です。
apliexpressで3ドル位です。
接続はプリンタの電源を落として6pinコネクタ側をA8マザーボードのJ3コネクタに刺します。
リボンケーブルの赤線と既に刺さってるLCDのリボンケーブルの赤線が同じ方向になるように刺します。(赤線が下向き)
6ピンコネクタは10ピンコネクタ側の3,4,5,6,7,8番ピンに刺します。
10ピンコネクタ側の1,2,9,10ピンは使いません。
逆刺しすると壊れそうです。
USBaspのUSB端子をPCに接続します。
このマザーボードのセンターにあるチップはチップの印字を見るとAVRマイコン ATMEGA1284Pです。
中身はArduino基板に各種IO機能追加したものだと思われます。
マザーボード上のJ3端子はArduinoのISP端子のことだと思われます。
プログラムメモリへの書き込み時のデータの流れは以下のようになると思われます。
PC -> Arudiono IDE -> PC USB -> USBasp -> ISP端子 -> ATMEGA1284P
2) PC用のUSBaspのドライバーをZadigでインストールします。
USBaspはUSB機器でWindows10用のドライバーが必要です。
Zadigでドライバを設定します。
以下のサイトからZadig-2.5.exeをインストールします。
https://github.com/pbatard/libwdi/releases/download/b730/zadig-2.5.exe
zadig-2.5.exeを起動しこれを実行します。
メニューのOptions->List All Devices
USBaspを選択
Libusb-win32を選択
Reinstall Driverボタンをクリックします。
3) PCでArduino IDEをインストールします。
4) Arduino IDEにanet-boardを組み込みます。
anet-boardを入手しドキュメントフォルダのArduinoフォルダにコピーします。
anet-boardを以下のgithubからダウンロードします。
https://github.com/SkyNet3D/anet-board
フォルダ構成がDocuments\Arduino\hardwareになれば完成です。
5) Arduino IDEを起動しブートローダを書き込みます。
Toolメニューから
ボードをAnet1.0を選択
書き込み装置USBaspを選択
ブートローダを書き込みます。
●ファームウェアのアップロード作業
1) Marlinのfirmwareのソースを入手します。
https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.0.x
このページのcloneのzipをc:\Marlin-bugfix-2.0.xなどに解凍します。
https://github.com/MarlinFirmware/Configurations/tree/import-2.0.x/config/examples/Anet/A8
このページにある3つのファイルをc:\Marlin-bugfix-2.0.x\Marlinフォルダにコピーし上書きします。
c:\Marlin-bugfix-2.0.x\Marlin_Statusscreen.h
c:\Marlin-bugfix-2.0.x\Marlin\Configuration.h
c:\Marlin-bugfix-2.0.x\Marlin\Configuration_adv.h
おそらくこのConfigurationが環境依存の外だしヘッダになると思います。
2) Visual Studio Code本体をインストールします。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
3) Visual Studio Codeを起動しExtensionからplatformIOをインストールします。
4) Visual Studio Codeでc:\Marlin-bugfix-2.0.xフォルダを開きます。
5) c:\Marlin-bugfix-2.0.x\platformio.iniのdefault_envsの値を以下に書き換えます。
default_envs = melzi
6) Visual Studio Codeで下部のツールバーから
PlatformIO:Build
を実行します。
7) USBケーブルでA8マザーボード上のUSBコネクタからPCのUSBポートに接続します。
USB のシリアルドライバーは必須です。
CH340G_windows.zipでwindowsにドライバを組み込みます。
8) Visual Studio Codeで下部のツールバーから
PlatformIO:Upload
を実行します。
●Visual Studio Codeでビルドに失敗する場合
pioの追加ライブラリが不足しビルドエラーが出る場合があります。
CLI からpio lib installコマンドで追加installで改善される場合があります。画面下部のツールバー等からPlatformIO New terminalでターミナルを開き以下のpioコマンドを実行します。
pio lib install "arduino-libraries/LiquidCrystal"
●その他
マザーボードリセット時にEEPROMエラーが出ても無視して構わないらしいです。
EEPROMをリセットし設定情報をクリアします。
前のファームのゴミがEEPROM内に残ってるせいだとか。
EEPROMは4Kバイトでここに設定値等が書き込まれているみたいです。
Anet A8は約200ドルのチープな3Dプリンタですがカスタマイズして色々遊べます。
ハードもソフトも色々いじれます。
業務用の大型NC加工機と同じようなGコードプログラムの知識も得られると思います。
もしかしてdockerでcode-serverを動かしてNAS上でビルドしてそのままファームの書き換えができる可能性もありそうです。
code-serverで開発PC用にはソースも開発環境もおかずにwebからサーバーで全部やるみたいなのが理想です。
avrdudeコマンドもWinAVRを導入して入れておいたほうがいいです。
http://winavr.sourceforge.net/
avrdudeとUSBaspを使ってファームのバックアップを取っておくと簡単に元にに戻せます。
avrdudeとUSBaspを使ってバイナリファイルから書き換えがでファームの更新が数分で終わります。
●3Dプリンタ造形物の品質を上げるノウハウ
ここをまず読むと成果物がかなり良くなると思いました。
https://www.simplify3d.com/support/print-quality-troubleshooting/
3Dプリンタは試行錯誤の世界です。
3Dプリンタで造形物を作るのもありですが3Dプリンタのハードソフトを触るのも楽しいです。