2020年3月25日水曜日

JupyterLab で画像の穴のずれ具合を確認

from PIL import Image, ImageDraw
import numpy as np

水平になるように画像を回転

im = Image.open('IMG_20200302_210756-2.png')

im = im.rotate(-1.34)

draw = ImageDraw.Draw(im)
size = im.size
y = 2245
draw.line((0, y, size[0], y), fill=(255, 0, 0), width=10)
im

必要な部分の画像を切り取り

im_crop = im.crop((1050, 1350, 1600, 1900))
im_crop

丸の位置とサイズ確認

im_crop = im.crop((1050, 1350, 1600, 1900))
draw_crop = ImageDraw.Draw(im_crop)

width = 5
diff = 10

# 外丸
outer_center = np.array([292, 275])
outer_rad = 213

outer_color = (255, 0, 0)
draw_crop.ellipse([tuple(outer_center - outer_rad), tuple(outer_center + outer_rad)], outline=outer_color, width=width)
draw_crop.line(
    [
        tuple(outer_center - diff),
        tuple(outer_center + diff)
    ],
    fill=outer_color,
    width=width
)
draw_crop.line(
    [
        (
            outer_center[0] + diff,
            outer_center[1] - diff
        ),
        (
            outer_center[0] - diff,
            outer_center[1] + diff
        )
    ],
    fill=outer_color,
    width=width
)
im_crop

# 内丸
inner_center = np.array([315, 245])
inner_rad = 83

inner_color = (0, 0, 255)
draw_crop.ellipse([tuple(inner_center - inner_rad), tuple(inner_center + inner_rad)], outline=inner_color, width=width)
draw_crop.line(
    [
        tuple(inner_center - diff),
        tuple(inner_center + diff)
    ],
    fill=inner_color,
    width=width
)
draw_crop.line(
    [
        (
            inner_center[0] + diff,
            inner_center[1] - diff
        ),
        (
            inner_center[0] - diff,
            inner_center[1] + diff
        )
    ],
    fill=inner_color,
    width=width
)
im_crop

中心のずれ (ピクセル)

center_diff_pix = outer_center - inner_center
center_diff_pix
array([-23,  30])

中心のずれ (mm) => 内円の半径 1.5mm で計算

center_diff_mm = center_diff_pix * 1.5 / inner_rad
center_diff_mm
array([-0.41566265,  0.54216867])

2020年3月7日土曜日

Ansible で Ansible をバージョンアップ

2020年3月6日現在、PyPI の Ansible リポジトリ で確認すると Ansible の最新バージョンは 2.9.6 のようです。

一方、Raspbian Buster の apt コマンドで標準リポジトリからインストールする Ansible のバージョンは 2.7.7 で少々古いです。

また、Ansible の replace モジュールドキュメント を読むと As of Ansible 2.7.10, the combined use of before and after works properly. と書いてあり、裏を返すと replace モジュールの after と before を組み合わせて使う場合に 2.7.10 より前のバージョンでは適切に動かないようです。

今回はまずは Raspbian Buster の標準リポジトリから少々古い Ansible をインストールして、この Ansible を使って新しめの Ansible にバージョンアップしてみました。

■ 環境

  • Raspberry Pi 3 Model B
  • Raspbian GNU/Linux 10 (buster)

■ Raspbian Buster の標準リポジトリから少々古い Ansible をインストール

Ansible インストール

$ sudo apt udpate
$ sudo apt install ansible

バージョンを確認すると 2.7.7 でした。

$ ansible --version
ansible 2.7.7
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/pi/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.7.3 (default, Dec 20 2019, 18:57:59) [GCC 8.3.0]

■ Ansible で Ansible をバージョンアップ

今回は上の手順でインストールした古めの Ansible を使って、新しめのバージョンが用意されていると思われる Ubuntu 18.04 LTS 用 PPA リポジトリの Ansible にバージョンアップしてみました。

Playbook ファイルを準備

ansible-playbook 実行

$ ansible-playbook -i localhost, pbook-update-ansible.yaml

Ansible が 2.9.4 にバージョンアップされました。

$ ansible --version
ansible 2.9.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/pi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.16 (default, Oct 10 2019, 22:02:15) [GCC 8.3.0]

■ 参考

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

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