Baumkuchen’s Workshop

バイオリンと電子工作、DIY、ジョギングなど。

作りかけの自作CNCを完成させます#3-コントロールソフト

制御基板(ハード)ができたので、コントローラソフトの製作に着手しています。 

baum-kuchen.hatenablog.com 

Gコード・センダー

また、ちょっと寄り道です。コントロールソフトができた暁には、GIUを担うGコードセンダーとの連接が必要になりますが、GitHubには複数のものが紹介されていますが、その中からいくつか試しに動かしてみました。これは、実際に作りこむコントローラソフトをどこまでGrblに準拠すればいいかの下調べと、デバッグ中の作動確認のために使うためというのもあります。Gコードセンダーの条件としては、Windowsで動いて、CNCの軌跡がビジュアル化できるもの程度。それと、Grblとのやりとりがモニタ出来ると良いですね。あとはイメージかな。

以下、GitHubからダウンロードしたものを紹介(ただし、途中の開発サンプルでの評価ですので、深いところまでは見ていませんので、あしからず)

Universal G code sender

シンプルなGコード(G1コマンドで円を書かせるもの)を読み込んだ状態。右の座標表示(Visualizer)もマウスで自由な角度から見られるので、割とイメージし易くてよいかと。難点としては、直接Gコードの修正ができないこと(PlugInを入れるとできるみたいですが)。あと、Grblとつないでないので、エラーになって何も動きませんが(これは他のものも同じ)。

f:id:Baum_kuchen:20210815155836p:plain

bCNC

pythonベースのソフト。表示部分のインターフェースが若干難。自由に回転できないのと表示中心の移動がメニューボタンを押してからでないとできないところ。良い所は、Gコードエディットが充実していて右の座標表示と連動しているので分かりやすいです。あと、ファイルアクセスが通常のWindowsのダイアログでなくて、C:ドライブしか見れません。何か設定があるのかもしれませんが、ファイルを一々myDocumentに移しながらの作業になりそうで面倒くさいです。

f:id:Baum_kuchen:20210815165756p:plain

Candle

Visualizeもマウスで簡単に操作できるので良い。各windowも位置、サイズを自由に変更できるのも良いかも。ただ、Gコード編集ができるものの、Visualizerからの選択などはできないところが若干残念。

f:id:Baum_kuchen:20210816092541p:plain

結局、どれも長短ありますが、コントロールソフトが少し出来上がったら、少し詳しく見てみます。(どのソフトも、Grblが立ち上がったことを認識できていないので、その後の動作も見られていないので)

Grblの構造解析

いきなりGrblを力業で移植するにしても、まずは、ソフトウェア全体構造の把握が必要と考えました。GitHub上に詳しい情報があるかなとか、有名なソフトなのでネット上にないだろうかとか、すこし検索してみましたが、これと言ったものは無しです。

どこかのQ&Aサイトに、”授業の演習でGrblをPICに移植する課題がでたけど良い情報ないか”といった質問が投げかけられていましたが、”無理じゃない”的な解答で終わってました*1

ということで、自力で解析します。といっても、手作業では時間ばかり掛かってしまうので、ソフトウェア構造解析ツール(ソフト)を使うことにしました。

Sourcetrail

少し調べたところでは、フリーソフトでSourcetrailというものがありましたので、それを使ってみます。

www.sourcetrail.com

ソースコード一式を登録して、”解析”をすると、宣言、変数、関数等の依存関係をビジュアル的に表示してくれるので、複数ファイルを渡り歩いて見る手間だけでもだいぶ楽になります。操作も、GUIベースで直感的に分かりやすくて良いです。

Sourcetrailを起動して、New Projectで解析用のプロジェクトを作ります。Projectの作り方は、以下の様な流れです。

  1. New Projectを押し、Sourcetrail Project Nameに適当なプロジェクト名、Sourcetrail Project Locationにプロジェクトの保存場所を入力し、Add source groupボタンを押す
  2. NEW SOURCE GROPUダイアログで出てくるので”Empty C Source Gropu”を選ぶ
  3. Files & Directories to Indexに、ファイルを登録(+ボタンを押してフォルダ内のファイルを全登録)
  4. Global Include Pathsに、ATmega用のインクルードファイルのありか(C:/Program Files (x86)/Microchip/xc8/v2.10/avr/avr/include)を登録。なお、これが無くても動きます。
  5. 最後にCreateボタンを押す
  6. これでプロジェクト登録は完了ですが、引き続きStart Indexingダイアログが出てくるので、All filesを選んでOKで解析完了です。

解析結果は、こんな感じ。

f:id:Baum_kuchen:20210816142541p:plain

Sourcetrailの解析によると、Grblは、49ファイル、388マクロ、12の構造体、149の関数、グローバル変数は33、5つの型定義があるそうです。

f:id:Baum_kuchen:20210816143028p:plain

例として、main関数から、protocol_mail_loop()への参照を確認しているものです。全体の構造が分かりやすいです。(中身の紐解きは、別ですが)

割り込み関係

移植する上で全体の構造を左右するであろ割り込みについて確認してみました。Aruduino に搭載しているATmega328のCコンパイラ(実はこれ、MicrochipのXC8でした。全然知りませんでした。ちなみに、全Grblのソースコードをビルドしたらアッサリビルドできてしまったので驚きです。知らないってことは、恐ろしいですね!!)では、ISR()で記述するので、Sourcetailで調べるとあっと言う間です。全部で6か所ありました。

  • system.c :システムレベルの割り込み(リアルタイムコマンド:リセット、サイクルスタート、フィードホールド、Safty Door)入出力ピンの変化検知
  • serial.c:シリアル入力あり、シリアル出力が空の2つ。USARTからの割り込み
  • stepper.c:Grblのメインの割り込み(whorkhorseとの表記あり)30KHzのタイマー割り込み 
  • limits.c:各軸がリミットSWがONになったとき発生。入出力ピンの変化検知

PICにも同様な割り込みはあるので、置き換え可能と考えられます。ただ、30KHzが実現できるかというと、何ともわからないですね。

Aruduino(ATmega328)依存部分

できるだけgrblのソースコードを修正しないで何とかしたいと思います。

IO定義は、cpu_map_atmega328p.hに殆ど記載してありすが、各関数内で直接IOを操作しているため、IO定義のみでPICに置き換えができない場合は、各関数の内部を直接修正する必要がありそうです。以下、IOの種類ごとに見ていきます。

・ディジタルIO

GrblのディジタルIOの使い方として、STEP、DIR、LIMITの種類毎に同じIOポートの異なるBITを使っているため、PICへの移植もIOの使い方を同様にしないと大改造になります。幸い、制御基板の設計のところでも書いたように、たまたま、そのような割付をしていたので、何とかなりそうです。ちなみに、左がAruduino、右がPICです。

   STEP: PORTD bit2,3,4 → PC bit0,4,6

   DIR: PORTD bit5,6,7 → PC bit1,5,7

   LIMIT: PORTB bit1,2,3 → PB bit5,6,7

   RESET/FEED HOLD/CYC START:PORTC bit0,1,2 → 未定(使わない?)

この他、DRIVEイネーブル、SPNDLイネーブル、COLANTは、1bit毎にPORT指定があるので問題なしです(SPNDLイネーブルしか使わないが)。

デジタルIOの設定も基本は、各ポート毎のレジスタで、chに対応するbitで入力/出力設定、同じく、対応するbitで入力or出力をするという形式は、AtmegaもPICも変わりがないのでうまくいくでしょう。

・タイマ/カウンタ

タイマーモードの設定と周期の設定が主ですが、これは、stepper_init()関数、st_go_idle()関数とsettper.c内のISR(割り込み)の中でダイレクトに記載されていました。よって、ここはPIC用に書き換えるのが早道のようです。

Grblは、タイマ0とタイマ1を使って、AMASS(Adaptive Multi-Axis Step-Smoothing)

という低速時にゆっくり動く側の軸がスムーズに動く仕組みを導入しているとのことで(stepper.cのコメントによる)、タイマの使い方が若干複雑になっているようです(まだ、ソースコードをよく読んでいないので、感触です)。

また、スピンドルを可変とする仕組みにPWMを使っていますが、これはタイマ2を使っています。spindle_control.cで直接PWM関連のレジスタを扱っており、Atmega固有なので、移植するときは注意が必要ですが、今回は、そこまでは出来ないだろうと思っています。構想としては、スピンドルの回転速度は段階的に行うくらい。

・シリアル入出力

今のところ、USBシリアルエミュレータを実装しているので、serial_init()、serial_read()、serial_write()関数は、完全書き換えと思ってます。ただ、プログラムメモリ容量の懸念があるので、USBデバイスを諦めたら真面目に考えますが、ぱっと見たところ修正は、初期設定を除けば、定義ファイル位で行けるかもしれません。所詮、受信割り込みと送信エンプティーの割り込みくらいですから。

・割り込み

これは、PIC用に書き換えないとだめでしょうね。ただ、割り込み許可を行うところ位は、マクロ定義で何とかならないかなと思ってますが、美しさを追及しなければ何とかなるでしょう。

ということで、ソースコード解析ツールを使って、Grblの中身(というか触り)をざっと見て回って、内部構造の細かいところはさておき、移植は可能かなといった感触を得ました。実際やってみると、そんな簡単にはいかないかなと思いますが。

今後について

次から、部分的に実装しては確認を繰り返していきます。まずは、手始めに、Gコードセンダーとのインターフェースを取りたいので、シリアル通信からGコードパーサまでをつないで、何かしら反応するようにしてみたいと思います。

今回も最後まで御覧いただきありがとうございました。かなり途中の説明を飛ばしているところがありますが、何かのお役に立てれば幸いです。

 

<お断り>Grblの中身の解析結果は、私の勝手な解釈ですので、内容を保証するものではありませんので、ご承知おき願います。

*1:ここGrbl to PIC18にあります