2019年12月7日土曜日

3DTouch の画像ファイルから Fritzing パーツ作成

■はじめに

Fritzing で 3DTouch の画像からパーツを作成してみました。

今回は Fritzing に最初から用意されているピンソケットパーツのブレッドボードビューのみを 3DTouch の SVG 画像に変更して作成しているので、作成したパーツのブレッドボードビュー以外のアイコンや回路図、PCB ビューの画像はピンヘッダーのもののままです。

■環境

  • Windows 10
  • Inkscape 0.92
  • Fritzing 0.9.4

■部品として使用する 3DTouch の画像を準備

[Geeetech のサイト] から 3DTocuch の画像をダウンロードし、https://howpon.com/2044 を参考にGIMP を使って以下のように 3DTouch を切り抜いた画像を用意しました。

本体が白基調で背景も白で見にくいですが、とりあえずこれでいきます。

■3DTouch の画像を SVG ファイルに変換

Fitzing のパーツに登録できるように画像ファイルを Inkscape を使って SVG 形式に変換しました。

https://www.youtube.com/watch?time_continue=147&v=0RDrw8WvYNQ&feature=emb_logo」 を参考にしてやってみました。

Inkscape で画像を開きました。開く時のオプションはデフォルトのまま。

  • 画像のインポート形式: 埋め込み
  • 画像 DPI: ファイルから
  • 画像のレンダリングモード: なし (自動)

ドックでビットマップのトレースオブジェクトを作成

メニューで [オブジェクト] - [objects] を選択し [objects]ドック を表示

画像を選択し、メニューで [パス] - [ビットマップのトレース]

[ビットマップのトレース] 画面で [更新] をクリックすると荒い感じのプレビューが表示されました。

パラメーターをいじりながら [更新] を押してプレビューを確認して、以下の設定でいくことにして [OK] を押しました。

objects ドックでビットマップのトレースオブジェクトが挿入されていることがわかります。g4386 がビットマップのトレースオブジェクト、image3721 が最初に開いた画像オブジェクトです。

[ビットマップのトレース] 画面の右上の [X] を押し閉じました。

最初に開いた画像オブジェクト image3721 は不要のようなので削除

ビットマップのトレースオブジェクトのサイズを変更

メニューで [オブジェクト] - [変形] を選択し [変形]ドック を表示

[変形 ドック] の [拡大縮小] タブで [比率を維持して拡大縮小] をチェック

3DTouch の高さはだいたい 50mm くらいなので [高さ] に 50 を入力して単位を % -> mm に変更して [適用]

ビットマップのトレースオブジェクトのサイズをインチ単位で確認

Fritzing のグリッド間隔はデフォルトで 0.1インチ単位なので Inkscape でもグリッド間隔やドキュメントサイズは 0.1インチの倍数にした方がずれが発生せず都合が良いようです。

そのため、まずはビットマップのトレースオブジェクトのサイズをインチ単位で確認しました。

ビットマップのトレースオブジェクトを選択

メニューで [オブジェクト] - [変形] で [変形]ドックを表示し

[拡大縮小]タブで単位に [in] (インチ) を選択するとインチ単位で幅と高さを確認できます。今回は以下のようでした。

  • 幅: 1.134インチ
  • 高さ: 1.969インチ

SVG ドキュメントのサイズを変更

上で述べたようにドキュメントサイズは 0.1インチの倍数にすると Fritzing に取り込んだときに都合が良いようです。

今回はビットマップのトレースオブジェクトのサイズが 1.134 x 1.969 なのでこれより大きい 0.1インチの倍数で 1.2 x 2.0 インチとします。

メニューで [ファイル] - [ドキュメントのプロパティ]

[ページ]タブの [カスタムサイズ] 欄で単位に [in] (インチ) を選択

幅に 1.2、高さに 2.0 を指定

SVG ドキュメントの中央にビットマップのトレースオブジェクトを移動

オブジェクトを選択してメニューで [オブジェクト] - [整列と配置] を選択し [整列と配置]ドックを表示

整列の [基準] に [ページ] を選択

下図の[中心を垂直軸に合わせる]アイコンと [水平軸の中心に揃える]アイコンをを押して中央に移動

SVG ドキュメントのグリッドを設定

メニューで [ファイル] - [ドキュメントのプロパティ]

[グリッド]タブで [矩形グリッド] を選択して [新規]

[グリッドの単位] で [in] (インチ) を選択

[X方向の間隔]、[Y方向の間隔] のどちらも 0.1 (インチ) を指定

コネクタピンを置きたい位置にグリッド点が来るように [開始位置X]、[開始位置Y] を指定

コネクタピンを配置

コネクタピン用の 1mm x 1mm の矩形を作成。色はお手本と同じ黄色にしてみました。

以下のように配置。[オブジェクトの中心をスナップ] をオンにすると XY グリッド線の交点にコネクタピンの中心を設定できました。

※ 図ではグリッドが長方形になっていますが、上の記述に従うと実際のグリッドは正方形になります。

コネクタピンのオブジェクト ID を設定

コネクタピンオブジェクトを選択し右クリックで [オブジェクトのプロパティ]

5個のコネクタピンの ID をそれぞれ以下の通り設定

  • connector0pin
  • connector1pin
  • connector2pin
  • connector3pin
  • connector4pin

これにしておくと、後工程で Fritzing に取り込んだ時にコネクタピンとして認識してくれるようです。

メニューの [編集] - [XML エディター] で念のため対象のコネクタピンオブジェクトの ID が設定されていること確認

プレーン SVG 形式で保存

Fritzing にインポートするために プレーン SVG 形式で保存する必要があるようです。

メニューで [ファイル] - [名前を付けて保存]

[ファイルの種類] で [プレーン SVG] を選択

[保存] を押して保存

■Fritzing で 3DTouch パーツを作成

元にするパーツを配置

Fritzing 用の 3DTouch パーツを作成するにあたり、[Generic female header - 2 pins]パーツを元とするので、まずはこのパーツを配置しました。

Fritzing を起動し、[ブレッドボード]レイヤを表示

[Core Parts] の [Generic female header - 2 pins] を [ブレッドボード]レイヤに Drag & Drop で配置

オブジェクトを選択し、[インスペクター] の [pins] を 5に変更するとオブジェクトのピン数も 5個に増えました。

パーツエディターを起動

オブジェクトを選択

メニューで [パーツ] - [Edit (new parts editor)] を選択しパーツエディターを起動

ブレッドボードビュー用の SVG をロード

[ブレッドボード]タブを表示

メニューで [ファイル] - [Load image for view]

上で保存した SVG ファイルを指定

ブレッドボードビューのパーツ画像が 3DTouch になりました

5個のピンはしっかりとグリッド上にあり、[コネクター]ドックの pin1 ~ pin5 にもチェックが入っていて画像上の 5個のピンと対応できていました。

パーツを保存

メニューで [ファイル] - [Save as new part]

[Filename prefix] に [3DTouch] と入力

作成された 3DTouch パーツを確認

パーツエディターを閉じて Fritzing 本体に戻ると、[My Parts] に 3DTouch パーツが追加されていました。

ただし、アイコン画像 (その他、回路図や PCB の画像も) は変更していないのでピンソケットの画像のままとなっていました。

ブレッドボードビューに Drag & Drop すると 3DTouch パーツが配置され、ワイヤーケーブルもコネクタに配線できました。

■参考

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

2019年7月8日月曜日

OctoPrint の API で Python で 3D プリンターの位置情報を取得

はじめに

OctoPrint の API を使って Python で 3D プリンターの現在位置を取得したいのですが、素直には取得できませんでした。

現在位置を取得する G-code M114 を OctoPrint の API から 3D プリンターの Marlin ファームウェアに送っても結果は API には返ってこず、OctoPrint の Terminal に以下のような位置情報が表示されるだけでした。

Recv: X:-10.00 Y:-15.00 Z:0.00 E:0.00 Count X:-1000 Y:-1500 Z:0

そこで、OctoPrint の PositionUpdate イベントを使って OctoPrint が M114 の結果を受け取った時に位置情報をファイルに書き出すようにしてみました。

環境

  • Raspberry Pi 3 model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • Python 3.5.3
  • OctoPrint 1.3.9
  • 3D プリンター Alunar M508
  • Marlin 1.1.1

現在位置をファイルに書き出すスクリプト準備

以下の内容の /some/where/get-3dp-pos.py を設置しました。

#!/usr/bin/env python3

import argparse
import json

POS_FILE = '/tmp/3dp-pos'

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--now'  , type=str)
    parser.add_argument('--data' , type=str)
    parser.add_argument('-x'     , type=str)
    parser.add_argument('-y'     , type=str)
    parser.add_argument('-z'     , type=str)
    parser.add_argument('-e'     , type=str)
    parser.add_argument('-t'     , type=str)
    parser.add_argument('-f'     , type=str)
    args = parser.parse_args()

    with open(POS_FILE, 'w') as f:
        f.write('{}\n'.format(json.dumps(vars(args), sort_keys=True, indent=4)))

if __name__ == '__main__':
    main()

ファイルに実行権限を付けました。

$ sudo chmod +x /some/where/get-3dp-pos.py

OctPrint にイベントを登録

OctoPrint の設定ファイル config.yaml に PositionUpdate イベントを登録しました。

$ diff -U 0 config.yaml{.org,}
--- config.yaml.org     2019-07-08 17:33:42.532568347 +0900
+++ config.yaml 2019-07-08 17:33:42.512568302 +0900
@@ -58,0 +59,7 @@
+events:
+  enabled: true
+  subscriptions:
+  - event: PositionUpdate
+    command: /some/where/get-3dp-pos.py --now '{__now}' --data '{__data}' -x {x} -y {y} -z {z} -e {e} -t {t} -f {f}
+    type: system
+

動作確認

config.yaml を変更したので、まずは OctoPrint を再起動しました。

位置情報を取得する G-code M114 を 3D プリンターに送ると以下のようにファイルに位置情報が書き込まれました。

$ cat /tmp/3dp-pos
{
    "data": "{reason: None, e: 0.0, t: 0, f: 200.0, y: 45.0, x: 30.0, z: 0.0}",
    "e": "0.0",
    "f": "200.0",
    "now": "2019-07-08T19:26:16.670214",
    "t": "0",
    "x": "30.0",
    "y": "45.0",
    "z": "0.0"
}

なお、ヘッドが移動中に M114 を送った場合は OctoPrint のターミナルに

Recv: echo:busy: processing

と表示され、ヘッドの移動が完了した時に位置情報がファイルに書き込まれました。

2019年6月16日日曜日

Raspberry Pi の GPIO で 3DTouch を直接操作

3DTouch

3DTouch

はじめに

3D Touch は 3D プリンターのオートレベリング用タッチセンサーで、通常は 3D プリンターの制御基板に直接接続して使用します。

しかし、今回は Raspberry Pi の GPIO に 3D Touch を接続して Python スクリプトから PWM で 3D Touch を制御してみました。

環境

  • Raspberry Pi 3 model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • Python 3.5.3

ケーブル配線の確認

3DTouch からはサーボ用と思われるケーブルが 3本とスイッチ用と思われるケーブルが 2本の合計 5本出ています。

それぞれのケーブルの配線は [ Geeetech 3DTouch auto bed leveling sensor for 3D printer ] を確認すると以下のようです。

サーボ用と思われるケーブル 3本

  • 茶色: GND
  • 赤色: +5V
  • 橙色: control signal

スイッチ用と思われるケーブル 2本

  • 黒色: GND
  • 白色: Z min

サーボを PWM で制御するための周期と周波数の確認

ググっても 3DTouch の PWM 周波数を見つけられませんでした。オープンソースの 3D プリンター制御基板は Arudino を使用している場合が多いので、まずは Arudino の Servo ライブラリを確認してみました。

https://forum.arduino.cc/index.php?topic=151645.0 を眺めてみると、Servo ライブラリソースコードの Servo.h で以下のように定義されており、

#define REFRESH_INTERVAL    20000     // minumim time to refresh servos in microseconds

周期は 20,000 μs でよさそうです。周波数は 1,000,000 μs / 20,000 μs = 50 Hz となります。

更に、オープンソースの 3D プリンター制御基板のファームウェア Marlin のソースコードを見てみても Marlin/servo.h に同じ定義がされているので 50 Hz であっているようです。

サーボを PWM で制御するための Duty 比の確認

3DTouch のプッシュピンを上げ下げするための Duty 比もググって見つけることができませんでした。しかし、3DTouch とほぼ同じ仕様と思われる BLTouch の仕様が https://reprap.org/forum/read.php?1,823443 に記載されていたのでこれを参考にしました。

3DTouch の動作 PWM オンと思われる時間 duty 比 ※
Push-pin Down 700μs 0.035
Push-pin Up 1,500us 0.075
Self-test 1,800μs 0.09
Alarm Release 2,200μs 0.11

※ (PWM オンと思われる時間 μs) / (周期 20,000 μs) で計算

Raspberry Pi の GPIO で 3DTouch を操作

周波数と duty 比がわかったので Raspberry Pi の Python で 3DTouch を操作してみました。

まずは、pigpiod を起動しました。

$ sudo pigpiod

python3 の対話モード インタープリターを起動しました。

$ python3

以降は Pytho3 の対話モード インタープリターで実行しました。

PWM に使用する GPIO を定義しました。

>>> GPIO_PWM = 18
  • 今回は GPIO 18 を 3DToch の control signal に接続しています。

周波数を設定しました

>>> PWM_FREQ = 50

3DTouch の各動作に対応する duty 比を設定しました。

>>> DUTY_PP_DOWN       =  35000
>>> DUTY_PP_UP         =  75000
>>> DUTY_TEST          =  90000
>>> DUTY_ALARM_RELEASE = 110000
  • pigpio は引数として duty 比に 1,000,000 を掛けた値を渡すようです。

pigpio モジュールのインポートやその他初期化をしました。

>>> import pigpio
>>> pi = pigpio.pi()
>>> pi.set_mode(GPIO_PWM, pigpio.OUTPUT)

試しにプッシュピンを下げてみました。

>>> pi.hardware_PWM(GPIO_PWM, PWM_FREQ, DUTY_PP_DOWN)

最後に pigpio リソースを開放して終了しました。

>>> pi.stop()

2019年5月2日木曜日

systemd に Python スクリプトをサービスとして登録

systemd に Python スクリプトをサービスとして登録する方法が https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff にあったのでやってみました。

環境

  • Raspberry Pi 3 model B
  • Raspbian GNU/Linux 9.4 (stretch)

サービスとして登録する Python スクリプト用意

L チカする Python スクリプトです。

$ cat /some/where/test.py
#!/usr/bin/env python3

import RPi.GPIO as GPIO
import time

GPIO_LED = 21

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_LED, GPIO.OUT)

while True:
    GPIO.output(GPIO_LED, GPIO.HIGH)
    time.sleep(1)

    GPIO.output(GPIO_LED, GPIO.LOW)
    time.sleep(0.1)

実行権付与しました。

$ sudo chmod +x /some/where/test.py

Unit定義ファイル作成

$ cat /etc/systemd/system/test.service
[Unit]
Description = test daemon

[Service]
ExecStart = /some/where/test.py
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

サービスとして認識されたか確認

$ sudo systemctl list-unit-files --type=service | grep ^test
test.service                           disabled

自動起動 On

$ sudo systemctl enable test
Created symlink /etc/systemd/system/multi-user.target.wants/test.service → /etc/systemd/system/test.service.

こんな感じでシンボリックリンクがはられました。

$ ls -la /etc/systemd/system/multi-user.target.wants/test.service
lrwxrwxrwx 1 root root 32 May  2 23:31 /etc/systemd/system/multi-user.target.wants/test.service -> /etc/systemd/system/test.service

起動しました。L チカもしました。

$ sudo systemctl start test

ステータス確認しました。

$ sudo systemctl status test
● test.service - test daemon
   Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-05-02 23:37:07 JST; 1min 42s ago
 Main PID: 15408 (python3)
   CGroup: /system.slice/test.service
           └─15408 python3 /some/where/test.py

May 02 23:37:07 raspberrypi systemd[1]: Started test daemon.

Raspbian を再起動すると test スクリプトも自動起動されました。

Python で OctoPrint で Marlin でステッピングモーター開放

#!/usr/bin/env python3

import urllib.request
import json

url = 'http://octoprint:5000/api/printer/command'
json_data = json.dumps(
    {
        'command': 'M18 X Y Z',
    }
).encode("utf-8")

with open('api-key') as f:
    api_key = f.read().rstrip()

req = urllib.request.Request(url)
req.add_header('X-Api-Key', api_key)
req.add_header('Content-Type', 'application/json')
req.data = json_data

with urllib.request.urlopen(req) as f:
    print(f.read().decode())

2019年4月29日月曜日

OctoPrint の API を試しに使ってみました

環境

API サーバー (OctoPrint) 側

  • Raspberry Pi 3 Model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • OctoPrint, version 1.3.9

API クライアント 側

  • Windows 10 Home 64Bit
  • Windows Subsystem for Linux: Ubuntu 18.04.2 LTS

まずは API キー無しでアクセスしてみた

OctoPrint と 3D プリンターの接続情報は今回の環境では以下の URL で取得できるようです。

http://octoprint:5000/api/connection

curl コマンドで API キー無しでこの URL にアクセスすると。。。

$ curl http://octoprint:5000/api/connection
No API key provided

というように、API キーが無いので取得できませんでした。

API キーを確認

ブラウザから OctoPrint の URL http://octoprint:5000/api にアクセスしました。

画面上部のスパナアイコンの Settings をクリックしました。

API タブで API キーを確認しました。今回は C14B4FA3BE854CAAA740A43BEAFD6FB3 でした。

API キーを指定してアクセスしてみた

以下のように curl コマンドで API キーを指定すると以下のように取得できました。 (今回は OctoPrint と 3D プリンターを接 続していないので "state": "Closed" となっていると思われます)

$ curl --header 'X-Api-Key: C14B4FA3BE854CAAA740A43BEAFD6FB3' http://octoprint:5000/api/connection
{
  "current": {
    "baudrate": null,
    "port": null,
    "printerProfile": "_default",
    "state": "Closed"
  },
  "options": {
    "baudratePreference": null,
    "baudrates": [
      250000,
      230400,
      115200,
      57600,
      38400,
      19200,
      9600
    ],
    "portPreference": null,
    "ports": [],
    "printerProfilePreference": "_default",
    "printerProfiles": [
      {
        "id": "_default",
        "name": "Default"
      }
    ]
  }
}

念のため、使用した API キーを無効化しておく

本来 API キーは公開せず秘密にしておくものですが、このブログで公開してしまったので無効にしておきます。

ブラウザで API キーを確認した画面で、更新のアイコンの Generate new API Key をクリックして新しい API キーを生成しました。これで今まで使っていた API キーは使えなくなるようです。

試しに更新前の API キーで API にアクセスしてみたところ。。。

$ curl --header 'X-Api-Key: C14B4FA3BE854CAAA740A43BEAFD6FB3' http://octoprint:5000/api/connecion
Invalid API key

というように期待通り情報を取得できませんでした。

参考

  • http://docs.octoprint.org/en/master/api/

2019年4月16日火曜日

Raspberry Pi 起動時に OctoPrint も自動起動

Raspberry Pi で OS 起動時に OctoPrint も自動で起動するように設定しました。といっても、 https://community.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian/2337 に書いてあることをほぼそのまま実施しただけです。

環境

  • Raspberry Pi 3 model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • OctoPrint version 1.3.9

テンポラリなディレクトリに以下のファイルをダウンロードしました。

$ wget https://github.com/foosel/OctoPrint/raw/master/scripts/octoprint.init
$ wget https://github.com/foosel/OctoPrint/raw/master/scripts/octoprint.default

ダウンロードした octoprint.default を以下のように修正しました。

$ diff -u octoprint.default{.org,}
--- octoprint.default.org       2019-04-13 20:46:49.355866063 +0900
+++ octoprint.default   2019-04-13 20:58:54.984395654 +0900
@@ -13,7 +13,7 @@
 PORT=5000

 # Path to the OctoPrint executable, you need to set this to match your installation!
-#DAEMON=/home/pi/OctoPrint/venv/bin/octoprint
+DAEMON=/home/pi/OctoPrint/venv/bin/octoprint

 # What arguments to pass to octoprint, usually no need to touch this
 DAEMON_ARGS="--port=$PORT"

octoprint.default の以下の項目はコメントアウトしたままにしてます

  • #BASEDIR=/home/pi/.octoprint
  • #CONFIGFILE=/home/pi/.octoprint/config.yaml

スクリプトのオーナーを root に変更しました。

$ sudo chown root:root octoprint.default
$ sudo chown root:root octoprint.init

スクリプトをインストールしました

$ sudo mv octoprint.init /etc/init.d/octoprint
$ sudo mv octoprint.default /etc/default/octoprint

/etc/init.d/octoprint に実行権限を付与しました

$ sudo chmod +x /etc/init.d/octoprint

オートスタートに登録しました

$ sudo update-rc.d octoprint defaults

OctoPrint を起動しました

$ sudo service octoprint start

OS 起動時に OctoPrint も自動的に起動しました。