3D printer Anet A8のfirmwareを書き換える手順

## 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に接続します。

![A8 Mainboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399473/7bf328c9-198e-3b68-ddf1-fcd745108ad5.jpeg)

> このマザーボードのセンターにあるチップはチップの印字を見るとAVRマイコン ATMEGA1284Pです。
> 中身はArduino基板に各種IO機能追加したものだと思われます。

![USBasp](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399473/bdcd36ef-730f-dd25-2a18-dd92ecc5f8e0.jpeg)


> マザーボード上の**J3端子**はArduinoのISP端子のことだと思われます。
> プログラムメモリへの書き込み時のデータの流れは以下のようになると思われます。
> PC -> Arudiono IDE -> PC USB -> USBasp -> ISP端子 -> ATMEGA1284P

#### 2) PC用のUSBaspのドライバーを**Zadig**でインストールします。
> USBaspはUSB機器でWindows10用のドライバーが必要です。
> Zadigでドライバを設定します。

> https://zadig.akeo.ie/

> 以下のサイトから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**をインストールします。

> https://www.arduino.cc/en/software

#### 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で下部のツールバーから

![toolbar](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399473/88892434-93a4-fe47-e71a-48639524736e.png)


> **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プリンタのハードソフトを触るのも楽しいです。