2019年8月31日土曜日

PlatformIO Core で Marlin 1.1.9 コンパイル

はじめに

Arduino IDE ではなく、PlatformIO Core を使って 3D プリンターのファームウェア Marlin をコンパイルしてみました。

自宅の 3D プリンターは Alunar M508 です。この 3D プリンター用に修正した Marlin 1.1.9 ソースコードは Arduino IDE ではすんなりコンパイルできたのですが、PlatformIO では更に一か所修正しないといけなかったのでブログ記事にしました。

なお、PlatfromIO Core なので全てコマンドラインでの操作です。

環境

  • Ubuntu 18.04.3 (Windows10 WSL)
  • 3D プリンター Alunar M508
  • Marlin 1.1.9

PlatformIO Core インストール

Python3 のバージョン確認

$ python3 --version
Python 3.6.8

Python 3.6 で pipenv プロジェクト作成

$ mkdir myproject/
$ cd myproject/
$ pipenv --python 3.6

PlatformIO Core インストール

$ pipenv install platformio

プロジェクトの virtualenv をアクティベート

$ pipenv shell

PlatformIO のバージョン確認

$ platformio --version
PlatformIO, version 4.0.3

以降、全てアクティベートした virtualenv で実行しました。

自宅の 3D プリンター Alunar M508 用の Marlin 1.1.9 をダウンロード

自宅の 3D プリンター Alunar M508 用に修正した Marlin 1.1.9 は以前のブログ 「 3D プリンター Alunar M508 の Marlin を 1.1.9 にバージョンアップするためにソースコードを修正 」 に書いた通りで、このソースコードを GitHub からダウンロードしました。

$ wget https://github.com/nezuppo/Marlin-for-my-alunar-m508/archive/1.1.9r1.tar.gz
$ tar xvzf 1.1.9r1.tar.gz

Alunar M508 用の Marlin 1.1.9 ソースコードディレクトリができました。

$ ls -lad Marlin-for-my-alunar-m508-1.1.9r1/
drwxrwxr-x 1 worker worker 4096 Aug 16 15:19 Marlin-for-my-alunar-m508-1.1.9r1/

ソースコードディレクトリ に移動

$ cd Marlin-for-my-alunar-m508-1.1.9r1/

以降、このディレクトリで作業しました。

ディレクトリの中を確認しました。

$ ls -la
total 132
drwxrwxr-x 1 worker worker  4096 Aug 16 15:19 .
drwxrwxrwx 1 worker worker  4096 Aug 31 20:46 ..
-rw-rw-r-- 1 worker worker   347 Aug 16 15:19 .gitattributes
drwxrwxr-x 1 worker worker  4096 Aug 16 15:19 .github
-rwxrwxr-x 1 worker worker  1958 Aug 16 15:19 .gitignore
-rw-rw-r-- 1 worker worker 14163 Aug 16 15:19 .travis.yml
-rw-rw-r-- 1 worker worker 35144 Aug 16 15:19 LICENSE
drwxrwxr-x 1 worker worker  4096 Aug 16 15:19 Marlin
-rw-rw-r-- 1 worker worker  8539 Aug 16 15:19 README.md
drwxrwxr-x 1 worker worker  4096 Aug 16 15:19 buildroot
-rw-rw-r-- 1 worker worker  4130 Aug 16 15:19 platformio.ini
-rw-rw-r-- 1 worker worker 10974 Aug 16 15:19 process-palette.json
  • PlatformIO 用の設定ファイル platformio.ini もありました。

PlatformIO 用の環境名確認

本家 Marlin のドキュメント 「 Installing Marlin (CLI) 」 を参考にしました。

自宅の Alunar M508 のマザーボードは MKS_BASE で、Marlin/Configuration.h でも定義してます。

$ grep '#define MOTHERBOARD' Marlin/Configuration.h
  #define MOTHERBOARD BOARD_MKS_BASE

Marlin/pins.h の MKS_BASE の該当箇所確認

$ cat Marlin/pins.h
... snip ...
#elif MB(MKS_BASE)
  #include "pins_MKS_BASE.h"          // ATmega1280, ATmega2560                     env:megaatmega1280 env:megaatmega2560
... snip ...

env:megaatmega1280 env:megaatmega2560 となっているので、環境名は megaatmega1280 か megaatmega2560 のどちらかなのですが、Arduino ID でコンパイルした時はプロセッサを ATmega2560 (Mega 2560) にしてうまくいったので、PlatformIO 用の環境名は megaatmega2560 でよさそうです。

Marlin を PlatformIO でコンパイル (まずはエラーになるところを確認)

カレントディレクトリは platformio.ini があるディレクトリです。

$ ls -la
total 132
drwxrwxr-x 1 worker worker  4096 Aug 16 15:19 .
drwxrwxrwx 1 worker worker  4096 Aug 31 20:46 ..
-rw-rw-r-- 1 worker worker   347 Aug 16 15:19 .gitattributes
drwxrwxr-x 1 worker worker  4096 Aug 16 15:19 .github
-rwxrwxr-x 1 worker worker  1958 Aug 16 15:19 .gitignore
-rw-rw-r-- 1 worker worker 14163 Aug 16 15:19 .travis.yml
-rw-rw-r-- 1 worker worker 35144 Aug 16 15:19 LICENSE
drwxrwxr-x 1 worker worker  4096 Aug 16 15:19 Marlin
-rw-rw-r-- 1 worker worker  8539 Aug 16 15:19 README.md
drwxrwxr-x 1 worker worker  4096 Aug 16 15:19 buildroot
-rw-rw-r-- 1 worker worker  4130 Aug 16 15:19 platformio.ini
-rw-rw-r-- 1 worker worker 10974 Aug 16 15:19 process-palette.json

環境名に megaatmega2560 を指定してコンパイルしたら以下のようにエラーになりました。

$ platformio run -e megaatmega2560
... snip ...
Marlin/ultralcd_impl_HD44780.h:194:29: fatal error: LiquidCrystal.h: No such file or directory

***********************************************************************
* Looking for LiquidCrystal.h dependency? Check our library registry!
*
* CLI  > platformio lib search "header:LiquidCrystal.h"
* Web  > https://platformio.org/lib/search?query=header:LiquidCrystal.h
*
***********************************************************************
... snip ...

Marlin/ultralcd_impl_HD44780.h の 194行目で LiquidCrystal.h が無いって怒ってました。

書かれている通りに ライブラリのレジストリを確認して LiquidCrystal.h の依存関係を確認してみました。

$ platformio lib search "header:LiquidCrystal.h"
$ platformio lib search "header:LiquidCrystal.h"
Found 2 libraries:

LiquidCrystal
=============
#ID: 136
LiquidCrystal Library is faster and extensable, compatible with the original LiquidCrystal library

Keywords: lcd, hd44780
Compatible frameworks: Arduino
Compatible platforms: Atmel AVR, Espressif 32, Espressif 8266
Authors: F Malpartida

LiquidCrystal
=============
#ID: 887
Allows communication with alphanumerical liquid crystal displays (LCDs).

Keywords: display
Compatible frameworks: Arduino
Compatible platforms: Atmel AVR, Atmel SAM, Espressif 32, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, Teensy, TI MSP430
Authors: Arduino, Adafruit

LiquidCrystal.h は LiquidCrystal ライブラリに含まれているようです。 ただし同名のライブラリが二つ (ID:136 と ID:887) があるようで、どちらが正解なのかわかりませんでした。

ソースコードを修正して再度コンパイル

適当にググるとこのエラーの場合は platformio.ini を以下のように修正すると良いと書かれていました。

$ diff -u platformio.ini{.org,}
--- platformio.ini.org  2019-08-31 21:42:42.054394900 +0900
+++ platformio.ini      2019-08-31 21:43:28.900397600 +0900
@@ -28,7 +28,7 @@
   -ggdb
 lib_deps =
   https://github.com/MarlinFirmware/U8glib-HAL/archive/dev.zip
-  LiquidCrystal_I2C@1.1.2
+  LiquidCrystal@1.3.4
   TMC2130Stepper
   https://github.com/teemuatlut/TMC2208Stepper/archive/v0.1.1.zip
   Adafruit NeoPixel@1.1.3

GitHub 上の本家 Marlin の bugfix-2.0.x ブランチ (2aef83ddcdd3317c3191e79c3be3fc06969f7768) の platformio.ini 」 もこれになっているので良さそうです。

上に書いたとおり、エラーが出た LiquidCrystal.h は LiquidCrystal ライブラリに含まれている点も合致します。

この platformio.ini で再度コンパイル

$ platformio run -e megaatmega2560
... snip ...
Building .pioenvs/megaatmega2560/firmware.hex
Memory Usage -> http://bit.ly/pio-memory-usage
DATA:    [=====     ]  49.5% (used 4053 bytes from 8192 bytes)
PROGRAM: [====      ]  41.5% (used 105502 bytes from 253952 bytes)
============================================ [SUCCESS] Took 135.49 seconds ============================================

Environment           Status    Duration
--------------------  --------  ------------
megaatmega2560        SUCCESS   00:02:15.491
... snip ...

無事コンパイルできました。

メッセージに出ている通り、Alunar M508 の Marlin ファームウェア書き換えのための新しいイメージが以下のように出来ていました。

$ ls -la .pioenvs/megaatmega2560/firmware.hex
-rw-rw-rw- 1 worker worker 296769 Aug 31 21:57 .pioenvs/megaatmega2560/firmware.hex

参考

Alunar M508 の Marlin ファームウェア書き換えは Raspberry Pi で以下のようにやりました。

$ avrdude -p m2560 -c avrispmkII -P /dev/ttyACM0 -D -U flash:w:/some/where/firmware.hex:i

参考にしたサイト

2019年8月18日日曜日

3D プリンター Alunar M508 の Marlin を 1.1.9 にバージョンアップするためにソースコードを修正

はじめに

私が使っている 3D プリンター Alunar M508 のファームウェアは購入時は Marlin version 1.1.1 でしたが、これをバージョンアップするためにオリジナルの 1.1.9 のソースコードを修正してみました。

実際に 1.1.9 にバージョンアップしてうまく 3D プリンターが動いたので備忘録としてこのブログに残しておきます。

なお、最終的には M508 でオートレベリングをするつもりなので更に修正が必要ですが、今回はオートレベリングのための設定は適用していません。

実際に修正

3D プリンター Alunar-M508 Marlin ソースコードの修正箇所確認」で Marlin 1.1.1 の場合の M508 に適用するための修正箇所が確認できたので、これを元にオリジナルの 1.1.9 を M508 用に修正しました。

オリジナルの Marlin 1.1.9 のソースコードの最新版は GitHub https://github.com/MarlinFirmware/Marlin で公開されていたので、2019/08/15 時点で最新の 1.1.9 (f94c3210b67e63167e8a8ef6682af631b980e1e5) を Fork して修正しました。

補足

Marlin/Configuration.h の「#define MOTHERBOARD BOARD_MKS_BASE」について

Marlin/boards.h で BOARD_MKS_BASE が定義されていることを確認しました。 ここに定義されていないものを指定した場合はエラーになると思われます。

$ grep ' BOARD_MKS_BASE ' Marlin/boards.h
#define BOARD_MKS_BASE          40    // MKS BASE v1.0

Marlin/Configuration_adv.h の「#define FILAMENT_CHANGE_FEATURE」について

1.1.9 のソースコードには FILAMENT_CHANGE_FEATURE が存在しないようでした。 1.1.9 のソースコードでこの文字列を探してみたところ、

$ find ./ -type f -print0 | xargs -0 grep FILAMENT_CHANGE_FEATURE
./Marlin/SanityCheck.h:#elif ENABLED(FILAMENT_CHANGE_FEATURE)
./Marlin/SanityCheck.h:  #error "FILAMENT_CHANGE_FEATURE is now ADVANCED_PAUSE_FEATURE. Please update your configuration."

というのがあり、Marlin/Configuration_adv.h の ADVANCED_PAUSE_FEATURE に変更されたようです。 フィラメント交換は今まで使ったことがなかったので、とりあえず「//#define ADVANCED_PAUSE_FEATURE」は修正せず無効のままとしました。

Marlin/Version.h の「#define WEBSITE_URL ""」について

1.1.1 では

-  #define WEBSITE_URL "http://marlinfw.org"
+  #define WEBSITE_URL ""

と修正さてていましたが、機能とは関係なさそうなので「#define WEBSITE_URL "http://marlinfw.org"」のままとしました。

Marlin/ultralcd_impl_HD44780.h の修正箇所について

1.1.1 では

-    lcd.setCursor(indent, 0); lcd.print('\x00'); lcd_printPGM(PSTR( "------" ));  lcd.print('\x01');
-    lcd.setCursor(indent, 1);                    lcd_printPGM(PSTR("|Marlin|"));  lcd_printPGM(extra);
-    lcd.setCursor(indent, 2); lcd.print('\x02'); lcd_printPGM(PSTR( "------" ));  lcd.print('\x03');
+    lcd.setCursor(indent, 0);                      lcd_printPGM(PSTR( "   welcome" ));
+   // lcd.setCursor(indent, 1);                    lcd_printPGM(PSTR("|Marlin|"));  lcd_printPGM(extra);
+   // lcd.setCursor(indent, 2); lcd.print('\x02'); lcd_printPGM(PSTR( "------" ));  lcd.print('\x03');

と修正されていましたが、これは M508 電源投入時の液晶ディスプレイの表示を変更するもののようです。機能とは関係なさそうなので修正しませんでした。

language_cn.h について

3D プリンタ ALUNAR M508 のファームウェアを最新のものにする」を読むと、language_cn.h に含まれている !!! という文字列が原因でうまくバージョンアップできない不具合があるようです。

リンク先に書かれている通り、私の場合も中国語は使わないし、英語表記であれば問題無いので念のためこのファイル削除しました。

なお、「ALUNAR M508 メインボードのファームウェアをアップデートして !!! バグに対応する」に書かれているように M508 制御基板の ATmega16U4 をアップデートするとこの不具合が解消されるようです。(今回はこれやってません)

その他

Arduino IDE で M508 の Marlin をバージョンアップしたときの手順もここに残しておきます。

  • Windows 10 でやりました。
  • Microsoft Store から Arduino IDE インストール
  • Marlin/Marlin.ino を開く
  • メニューの [ツール]
    • ボード: Arduino/Genuino Mega or Mega 2560
    • プロセッサ: ATmega2560 (Mega 2560)
    • 書込装置: AVRISP mkII
  • メニューの [ツール] - [検証・コンパイル]
    • 実際のコンパイルが開始され、しばらくするとコンパイル完了
  • USB を M508 に接続
  • メニューの [ツール]
    • シリアルポート: COM3 (Arduino/Genuino Mega or Mega 2560)
  • メニューの [スケッチ] - [マイコンボードに書き込む]
    • 再度コンパイル (最初にやったコンパイルは必要なかったかも)
    • コンパイル終わって自動的に書き込みが始まった
    • 書き込み終了して、自動的に M508 の Marlin 再起動した
  • M508 の Marlin 起動時の液晶ディスプレイに修正後のものが表示された

参考

  • https://damelog.com/computer/hardware/update-alunar-m508-firmware-to-the-latest/
  • https://damelog.com/computer/hardware/update-bootloader-alunar-m508-to-mitigate-exclamation-bug/

2019年8月12日月曜日

3D プリンター Alunar-M508 Marlin ソースコードの修正箇所確認

はじめに

3D プリンター Alunar-M508 のファームウェア Marlin と、GitHub で公開されてるオリジナル Marlin のソースコードの違いを確認してみました。

なお、この Alunar-M508 は 2018年 5月頃に Amazon で購入しました。購入先や時期により修正箇所に違いがあるかもしれないので注意が必要です。

M508 のファームウェアのバージョン確認

OctoPrint で M508 に接続した時のコンソール出力を確認すると Marlin version 1.1.1 でした。

また M508 を購入した時に SD カードが付属しており、この中に入っていた Marlin ソースコードのバージョンも 1.1.1 でした。このソースコードと GitHub で公開されているオリジナル Marlin version 1.1.1 のソースコードを比較してみました。

比較方法

まず以下のように GitHub で公開されているソースコードと SD カードの中の M508 Marlin ソースコードを同じディレクトリに置きました。

$ ls -l
total 0
drwxrwxr-x 1 worker worker 4096 May 12  2017 Marlin-1.1.1
drwx------ 1 worker worker 4096 Dec 21  2017 Marlin-alunar-m508-1.1.1

このディレクトリで diff コマンドで再帰的に比較してみました。

$ diff -NarU 0 Marlin-1.1.1/ Marlin-alunar-m508-1.1.1/

比較結果

以下が diff コマンドの出力結果の内容です。ソースコードの該当箇所を参照すると各設定内容に関する説明がコメントして書かれていました。

Marlin/Configuration.h

@@ -121 +121 @@
-  #define MOTHERBOARD BOARD_RAMPS_14_EFB
+  #define MOTHERBOARD BOARD_MKS_BASE

@@ -243 +243 @@
-#define TEMP_SENSOR_BED 0
+#define TEMP_SENSOR_BED 1

@@ -308 +308 @@
-  #define  DEFAULT_Kd 114
+  #define  DEFAULT_Kd 144

@@ -442,3 +442,3 @@
-#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
-#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
-#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
+#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
+#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
+#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.

@@ -479 +479 @@
-#define DEFAULT_AXIS_STEPS_PER_UNIT   { 80, 80, 4000, 500 }
+#define DEFAULT_AXIS_STEPS_PER_UNIT   { 100, 100  , 400, 96 }

@@ -697 +697 @@
-#define INVERT_X_DIR false
+#define INVERT_X_DIR true

@@ -707 +707 @@
-#define INVERT_E0_DIR false
+#define INVERT_E0_DIR true

@@ -727,2 +727,2 @@
-#define X_MIN_POS 0
-#define Y_MIN_POS 0
+#define X_MIN_POS -10
+#define Y_MIN_POS -15

@@ -991,2 +991,2 @@
-#define PREHEAT_1_TEMP_HOTEND 180
-#define PREHEAT_1_TEMP_BED     70
+#define PREHEAT_1_TEMP_HOTEND 200
+#define PREHEAT_1_TEMP_BED     50

@@ -995 +995 @@
-#define PREHEAT_2_TEMP_HOTEND 240
+#define PREHEAT_2_TEMP_HOTEND 250

@@ -1172 +1172 @@
-//#define SDSUPPORT
+#define SDSUPPORT

@@ -1316 +1316 @@
-//#define REPRAP_DISCOUNT_SMART_CONTROLLER
+#define REPRAP_DISCOUNT_SMART_CONTROLLER

Marlin/Configuration_adv.h

@@ -85,2 +85,2 @@
-  #define THERMAL_PROTECTION_BED_PERIOD 20    // Seconds
-  #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius
+  #define THERMAL_PROTECTION_BED_PERIOD 180    // Seconds
+  #define THERMAL_PROTECTION_BED_HYSTERESIS 5 // Degrees Celsius

@@ -771 +771 @@
-//#define FILAMENT_CHANGE_FEATURE
+  #define FILAMENT_CHANGE_FEATURE

Marlin/Version.h

@@ -92 +92 @@
-  #define WEBSITE_URL "http://marlinfw.org"
+  #define WEBSITE_URL ""

Marlin/ultralcd_impl_HD44780.h

@@ -416,3 +416,3 @@
-    lcd.setCursor(indent, 0); lcd.print('\x00'); lcd_printPGM(PSTR( "------" ));  lcd.print('\x01');
-    lcd.setCursor(indent, 1);                    lcd_printPGM(PSTR("|Marlin|"));  lcd_printPGM(extra);
-    lcd.setCursor(indent, 2); lcd.print('\x02'); lcd_printPGM(PSTR( "------" ));  lcd.print('\x03');
+    lcd.setCursor(indent, 0);                      lcd_printPGM(PSTR( "   welcome" ));
+   // lcd.setCursor(indent, 1);                    lcd_printPGM(PSTR("|Marlin|"));  lcd_printPGM(extra);
+   // lcd.setCursor(indent, 2); lcd.print('\x02'); lcd_printPGM(PSTR( "------" ));  lcd.print('\x03');
  • M508 電源投入時に LCD に「welcome」って表示されるんですが、これで変更できるかな。。。

その他

M508 SD カードのソースコードには以下のファイルが含まれていたんですが、GitHub のオリジナルソースコードには含まれておらず、とりあえず無視しました

  • Marlin/Marlin.ino.mega.hex
  • Marlin/Marlin.ino.with_bootloader.mega.hex

参考

  • http://www.handy-dandy.net/archives/3562.html