Software

【XY-Plotter】Part5:SVGデータとGコード作成とお絵描き

はじめに

本当はチューニングやレーザー加工モジュールの話に進もうかと思っていたけれど,ペンプロッタ界のパイオニアいしかわきょーすけさんがどこかのイベントでペンプロッタで描くコンテンツも大切という趣旨の話をされているのを見て気が変わったので,今回は改めてペンプロッタを扱う上でなくてはならないGコードやSVGデータについて重点的に書いておく.YouTubeだったと思うんだけど,動画迷子になってしまった.

XY-Plotter
「XY-Plotter」の記事一覧です。

昨今のインターネット上では,めちゃくちゃコンパクトだったり,めちゃくちゃ高速に描画できたり,なぜか自走したり,特殊ギミック満載のかっこいいペンプロッタを見かけることが増えた気がする.自分で実装したものが目の前で動くのは非常に楽しいことなんだけれど,どんなにかっこいいマシンであろうと完成したら終わりではなくて,マシンを使って絵を描いてこそのペンプロッタである.

私も前々からコンテンツ部分があまりにも弱いと思っていて,一般的なプリンタに比べて全く使い勝手のよくないペンプロッタの導入ないしは実装ハードルが非常に高い中で,一般的なプリンタのようにお手軽に印刷できるわけでもなく,ペンプロッタ用のSVGデータが普及しているわけでもなく,描きたい絵を自分で用意して自分のマシンに最適化されたGコードへ変換しなといけない.世間一般的に考えたら,ペンプロッタの実装からコンテンツ作成まで,入門するハードルはとてつもなく高いと思う.

ということで,どんな風にペンプロッタ用お絵描きデータを作っているのかの参考にどうぞ.むしろ他の方々がどうやってお絵描きデータを作ってるのか私が聞きたい.

Gコード

ペンプロッタは基本的にGコードを使って動作の指示を記述する.Gコードの簡単な例を示す.

G28 ; ヘッドをホームポジションへ移動する
G90 ; ホームポジションを原点とした絶対座標系で制御するよう設定

G1 X  50.0000 Y  30.0000 ; ヘッドを 50,30 に移動
G1 X  50.0000 Y 100.0000 ; ヘッドを 50,100 に移動
G1 X 200.0000 Y 100.0000 ; ヘッドを 200,100 に移動
G1 X 200.0000 Y  30.0000 ; ヘッドを 200,30 に移動
G1 X  50.0000 Y 30.0000  ; ヘッドを 50,30 に移動

G28 ; ヘッドをホームポジションへ移動する

この例では,ホームポジションを基準にした絶対座標系上でXY座標を指定して,長方形を描くようにヘッドを移動させる指示を行っている.このようなGコードを組み合わせることで複雑な絵を描くことができる.

Gコードはペンプロッタを制御しているソフトウェアによって若干の違いがある.制御ソフトやマシン特性の違いなどにより,誰かが作成したGコードを自分のペンプロッタでそのまま実行できるとは限らない.他にも色々あるけれど代表的なソフトウェアは次の通り.一昔前は主にCNCで利用されていたgrblほぼ一択だったような気がするが,3Dプリンタの普及に伴ってMarlinやKlipperといった高機能なソフトウェアも登場してきている.これらは本来CNCや3Dプリンタ用途に開発されたソフトウェアであるが,マシンの基本的な動作原理はペンプロッタと何一つ変わらない.

GitHub - grbl/grbl: An open source, embedded, high performance g-code-parser and CNC milling controller written in optimized C that will run on a straight Arduino
An open source, embedded, high performance g-code-parser and CNC milling controller written in optimized C that will run...
Home
Marlin Firmware - A Really Good 3D Printer Driver.
Welcome - Klipper documentation

ベクター画像

ベクター画像は,パスや線分等の図形を座標情報として扱うデータ形式である.詳細はWiki等を参照してもらうとして,絵を座標情報として表現できる点でGコードとの相性が非常に良い.

Scalable Vector Graphics - Wikipedia

Inkscape

前述の通りペンプロッタはGコードを使って様々な絵を描くことができるが,描きたい絵が複雑であるほどGコードも複雑になり,人間が直接Gコードを記述するのは現実的ではない.多くの場合は何らかのツールを用いてベクター画像からGコードを生成する.

3Dプリンタの場合はスライサと呼ばれるソフトウェアで3DオブジェクトをGコードへ変換して印刷をするが,ペンプロッタの場合は一般的にそのような専用ソフトウェアは現時点では普及していない.中には自前でペンプロッタ用Gコードを生成するソフトウェアを実装する猛者もいるようだけれど,一般的に多くのペンプロッタユーザが真っ先に必ずたどり着くのはベクター画像編集ソフトInkscapeとそのエクステンションGcodetoolsを使ってSVG画像からGコードを生成する方法だと思う.

Inkscape - Draw Freely. | Inkscape
Inkscape is professional vector graphics software which runs on Linux, macOS and Windows desktop computers.

以前私が書いた記事ではJ TechのInkscape Laser Tool Plug-Inを利用していたが,Gcodetoolsの方が多機能でペンプロッタとの相性も良さそう.

ただGcodetoolsでは今回実装したXY-Plotterの制御ソフトKlipperの仕様に対応していない点が多々あり,一度Gコードを生成してから置換処理するなどの手間が必要になる.このちょっとした手間も意外と心理的な障壁になったりして面倒に思うこともある.

これはホントはあまりオープンにするつもりはなくて,GitHubを覗きに来るような好事家はご自由にどうぞ程度にするつもりだったんだけれど,コンテンツ拡大の一助になればと言うことで,Klipperの仕様に合わせてGcodetoolsを改修したGcodetools2を紹介しておくことにする.

GitHub - HeavyMoon/inkscape-gcodetools
Contribute to HeavyMoon/inkscape-gcodetools development by creating an account on GitHub.

inkscape Gcodetools2 を使ったGコード生成の例

Inkscapeは高機能なベクタ画像編集ソフトウェアとして様々な機能を備えている.このソフトウェアをうまいこと活用することで,Inkscape上で自身でお絵描きしたものをペンプロッタで描くこともできるし,ビットマップ画像をベクター画像化してペンプロッタで描くこともできるし,ベクター画像として手書き風フォントで文書を作成すれば実際の筆記具で書かれた手書き風のドキュメントも描くことができる.さらば手書きレポート.

今回はちょうどよい教材があったので,それを利用してペンプロッタで絵を描くまでの流れを説明する.

Inkscapeの準備

Inkscapeを起動したら,ドキュメントのプロパティを開いて次の通り設定する.

  1. 表示タブを開いて
    • ドキュメントの幅と高さをペンプロッタの描画エリアに合わせて変更する
    • 表示単位をmmに設定
    • 尺度は1に設定
  2. グリッドタブを開いて特殊
    • 矩形グリッドを有効にする
    • グリッドの単位をmmに設定
    • X軸方向の間隔とY軸方向の間隔を1mmに設定
    • メジャーグリッドラインの頻度を10に設定

Gcodetools2の準備

ドキュメント上に基点を作成する.これはペンプロッタのホームポジションに相当する.XY軸のアスペクト比が維持された状態で利用するので,このまま適用する.適用するとドキュメント左下に基点が追加される.

続いてツールライブラリを開いて,グラフィティを指定して適用を押す.適用するとドキュメントに緑の四角でツールの設定情報が表示される.

自身の環境に合わせて設定値を変更する.ビットマップ形式の絵に慣れていると一見絵の中にただのテキスト情報が追加されただけに見えるが,ベクター画像ではこれらの情報がxml形式で保存されており,Gコード生成時の変数として扱われる.このテキスト文字列を直接書き換えることで,後々Gコード生成時のパラメータとして利用される.

Gcodetools2では,Klipperの仕様に合わせてコメントやGコードのフォーマット変更,デフォルト値変更といった修正を行っている.ペンの上下はPart4で紹介した設定ファイル内で設定しているマクロPEN_UP/PEN_DOWNを呼び出す.

この基点とツールの設定を追加したレイヤーを便宜上設定レイヤ(Config Layer)と呼ぶ.これとは別に絵を描くための描画レイヤ(Draw Layer)を追加しておく.このときDrawLayerはConfig Layerの下に配置すること.

ここまでの内容をInkscapeのテンプレート化しておくと,次回以降ここまでの設定をショートカットできるのでおすすめ.

Inkscapeで絵を描く

ペンプロッタゆる会記念ロゴ - nekdno - BOOTH
二重線verとシンプルな一重線verの2種類の線画データが入ったZIPファイルがダウンロードできます お持ちのペンプロッタで出力してもらえると嬉しいです! (追記)スキ!も教えてもらえると励みになります! 無料商品はダウンロード数がわからな...

今回は良い教材が落ちていたので,これを描画レイヤ(Draw Layer)にインポートして,描画したい位置に配置する.

もしも元画像がビットマップの場合はパスツールから「ビットマップのトレース」を実行してパスを作成する必要がある.文字を描画したい場合も文字オブジェクトではなくパスとして扱う必要があるため,「オブジェクトをパスへ」を実行してパスに変換する.

Gcodetools2でGcode生成

「パスからGcode」を開いて,環境設定を次の通り設定する.

  • ファイル:必要に応じて任意の出力ファイル名に変更
  • ディレクトリ:任意の出力先に変更
  • ログのフルパス:必要に応じて任意の出力ファイル名に変更

パスからGcodeタブを開いて適用を押すと設定した出力先にGcode特殊が生成される. オプションタブや環境設定タブを開いた状態だとGコードを生成できないので注意.

ペンプロッタで絵を描く

生成したGコードをそのままKlipperにアップロードする.KlipperではWEBの管理画面上からGコードのプレビューができるので,プレビューを見て問題なさそうなら実行する.

お絵描きするとこんな感じ.作ったものが動くのを見るのは楽しいね.

前回の小さいペンプロッタと比べるとかなり描画性能が高いので,Inkscapeを駆使するとペンプロッタでこんな感じの絵も結構きれいに描ける.

その他のにもこのペンプロッタで書いた絵をx.comに投稿しているので,興味があればどうぞ.

おわりに

今回はペンプロッタで絵を描く流れを説明した.せっかくGcodetools2を紹介をしたので,もしKlipperマシンを作成したら使ってみてどうぞ.プルリクも大歓迎です.

GitHub - HeavyMoon/inkscape-gcodetools
Contribute to HeavyMoon/inkscape-gcodetools development by creating an account on GitHub.

ここから先は私の独り言.

ここ数年で自作キーボード界隈が異常な盛り上がりを見せたのは,

  • コロナ禍によるデスクトップ環境への投資加速
  • 高品質な自作キットの流通とオープンソース制御ソフトの台頭
  • 遊舎工房などの専門店による入手性と信頼性の向上

といった要因があると思っていて,実装のサポートがあったり,完成品としても購入できたり,ハードウェアやソフトウェアに詳しくない人の入門ハードルをかなり下げることに成功したからだと思うんだ.

ただ,これと同じ現象がペンプロッタでも起こせるかというと,正直言ってかなり厳しいと思う.自作キーボードは,その名の通りキーボードを自作できるだけで,本質的には市販のキーボードと何ら変わりなく,どのコンピュータに接続しても利用できる入力インタフェースとして圧倒的な汎用性をQMKなどの高品質でオープンソースなファームウェアで実現している.ハードウェアの差異をソフトウェア的に吸収できる仕組みが完成している.ペンプロッタの仕組みは,私のような特殊な極々一部の人には確実に刺さるコンテンツである一方で,二次元的な印刷はインクジェットプリンタやレーザプリンタという圧倒的な完成度を誇る出力装置が既に安価に普及していて,各メーカーが製品ラインナップに合わせて専用のドライバを提供している.ペンプロッタ開発者個人が市販のプリンタの利便性に匹敵するドライバまで開発することはかなり難しい.

高品質な自作キットの流通自体は,おそらく今のペンプロッタトッププレイヤーの方々の頑張り次第でそこそこなんとかなる可能性もある気はする.3Dプリンタの普及も追い風にできる.一方で制御ソフトやプリント方法が標準化されていないことで,まだ出力装置インフラとして昇華できない.少なくとも,ペンプロッタ用プリンタドライバの実装,ペンプロッタ用OSの実装,ドライバとOS間の通信プロトコルの標準化が必要になってくると思う.おそらくOSの方はKlipper等の3Dプリンタ用OSから派生すれば比較的実装しやすいかもしれないが,プリンタドライバの方はたぶんまだ誰も実装していない.Gcodetools2のような間接的なツールでは,普及の一助としてはあまりにも心もとなさすぎる.このあたりの課題が解決できるとやっと普及のハードルが下がってくるかなという気がする.

ではペンプロッタの強みはどこにあるのかといえば,圧倒的な描画ツールの選択性にあると思う.

まさかボールペンで紙に絵を書いてくれるだけの機械だと思ってない?なんたって最近は自走するらしいからね.

ペンプロッタは一般的なプリンタのような特定メーカのインクトナーに縛られることはなく,ありとあらゆる筆記具がインクトナーの代替となり得る.鉛筆,ボールペン,筆,万年筆など,筆記具によって専用の制御方式が必要となる場合があるものの,市販されているほぼ全ての描画ツールを選択できる.市販のプリンタでは選択できないインビジブルインクを使用したペン発泡インクを使ったTペンなどの特殊インクだって選べる.印刷用紙だって普通紙だけでなく,画用紙,段ボール,布,金属等,筆記具や印刷物等の条件次第でありとあらゆるものにお絵描きできる.筆記具から更にツールの範囲を拡張すると,レーザ加工機だったり,CNCまで派生できてしまう.さらに,このアイディアはたぶんまだ誰も発信していないような気がするんだけど,ペンプロッタは点字プリンタとしても利用できる.市販されている点字プリンタは数十万から数百万円もする非常に高価な機械だけど,ペンプロッタを点字プリンタとして利用すれば圧倒的に安価に実装できる.点字分野においては価格面で圧倒的なアドバンテージがって,福祉の面でも活躍の場を獲得できるかもしれない(誰か実装したら教えて).少しのアイディアと使い方次第で,単に紙に描くだけにとどまらない無限のポテンシャルを秘めていると思うんだ.AIで誰もがお手軽にきれいなデジタル絵を描ける時代になったからこそ,アナログで描くということがより一層意味を持つ時代になってくるかもしれない.

だからこの先この分野で更にユーザを拡大していくための鍵はソフトウェアなんだ.と私は思うのです.

わざわざこの本編並みに長いただの独り言を最後まで読んでしまったそこの君!もしも私と同じものを作ってみたいと思ってくれたのなら,DMM.makeでこのペンプロッタのフレームキットを販売しているし,3Dプリンタを持っているのならthingiverseでも3Dモデルを順次公開している.その他に必要な部品は,各記事の材料一覧からアフィリンクを使って購入してくれると私の次の開発の原資にできる.Klipperの設定は私のブログからコピペすればいい.今回のマシンは多分特殊な加工は無いから,前回のマシンよりも多分実装の再現性もあると思うんだよね.私のマシンはあまりかっこいい特殊ギミックは無いけれど,同型マシンのユーザが増えると課題も共有できるようになって,みんなで一緒に改善できればみんなの利便性が上があがって,更にユーザも拡大できるかもしれない.Win-Win-Winだね.

コメント

タイトルとURLをコピーしました