BBB と Machinekit (LinuxCNC/EMC2) での CNC 制御がようやく動いたので記録しておきます。
インターフェイスボードの製作
Beagle Bone Black の I/O は 3.3V かつかなり電流的に厳しいので、5V変換バッファを外部につけたほうがよさそうです。ということで、BBB とステッピングモータドライバの間にバッファをもうけました。やってることは単純で、バッファIC 74LVC541 で入出力をバッファしているだけです。5Vトレラントなバッファを使うことで電圧変換を同時に行います。
出力用に2つ、入力用に1つ使っています。入力用のICには 3.3V を供給し、入力側を5V でプルアップしています。出力用のICには5Vを供給し、BBB からは直接繋いでいます。あまり行儀良いとはいえなそうですが、これでインターフェイスは 5V に統一されています。
さらにフォトカプラとかで絶縁するとより良さそうですが、現状使っているステッピングモータドライバ (Sable-2015 付属のものです) にはフォトカプラが入っているっぽかったのでやっていません。
SOP の IC を使うつもりが、間違えて TSSOP のをいくつも買ってしまって諦めて TSSOP でなんとかしました。前に TSSOP をやったときは、かなりキツいと思いましたが、今回は思ったよりうまくできました。が、TSSOP 以外の部分で 0.25 幅の配線が2本ほど消滅してしまってリワークでなんとかしました。
というか後から調べてみたら 74*541 (非反転バッファ) で SOP の IC は秋月では取り扱いがないみたいですね。74*540 ならありました。反転でもソフト側でなんとかなるのでどっちでもいいんですが……
1608 (1.6x0.8mm) の抵抗の下を一本通すみたいなパターンにせざるを得なかったですが、なんとかなりました。といっても、特にチップ抵抗使う意味はなかったので、普通にリード部品にして安全に実装しても良かったかと思いました。今回はここの部分では特に問題が起きなくて良かったです。
(これらの切削は Grbl でやったものです)
HAL ファイルの設定
レポジトリ: https://github.com/cho45/machinekit-configs
HAL manual を一通り読んでも設定できるぐらいの知識はつかなくて、既存の他の設定ファイルや、ドライバのソースコードを読んだりしないと正確に設定することはできません……
とりあえず .hal での設定の流れですが以下のような感じです。
- loadusr コマンドで実行に必要な外部プログラムをロードする
- loadusr -w だとコマンドの終了を待つ (初期設定を外部コマンドでやるために必要)
- loadusr -W だとコマンドが起動するまで待つ
- loadrt コマンドで必要なコンポーネントをロード・設定する
- addf でコンポーネントの関数を実行スレッドに追加する
- setp でコンポーネントのパラメータ設定をする
- net でコンポーネント間を接続する
net コマンドがいちばんややこしい です。既存の設定ファイルだと、source target の形式になってないものが多いような気がするんですが、なんで動いてるんでしょうね?
基本的には既存の設定のコピペでなんとかなるのですが、自分の環境にあわせてピン名などはあわせこまないといけません。
ちなみに [xxx]foo みたいな文法は .ini ファイルの値を参照していているだけです。
BBB での設定
BBB で使う重要なモジュールはふたつあります。
hal_bb_gpio
GPIO 全般のI/Oを HAL の pin として扱うことができるようになります。外部ボタンとか、マシンステータスとか、servo-thread (遅いスレッド) でやるので十分なものはこちらで全て処理します。pin なので直接他のコンポーネントと net することができます。
loadrt hal_bb_gpio output_pins=107,115,119,126,214 input_pins=109,110,114,116,118
以上のような設定をすると。BBB のピンヘッダ8のうち 7,15,19,26、ピンヘッダ9のうち14が出力ピンに。同様にピンヘッダ8のうち9,10,14,16,18が入力ピンとして定義され、hal ファイル内で bb_gpio.p8.in-16 という形で参照できるようになります。1xx がピンヘッダ8、2xxがピンヘッダ9に対応しています。
hal_pru_generic
PRU でやることを設定します。スレッピングモーターのシグナル・PWM・エンコーダー入力など、普通の Linux だと base-thread でやることをすべてこのコンポーネントで行うようになっています。
loadrt hal_pru_generic prucode=$(HAL_RTMOD_DIR)/xenomai/pru_generic.bin pru=1 num_stepgens=3 num_pwmgens=1 halname=hpg
この例では PRU1 (BBBにはPRUが2機あるので) で stepgen を3つ、pwmgen を 1つ動かすことになります。これにより、hpg.stepgen.00, hpg.stepgen.01, hpg.stepgen.02 と hpg.pwmgen.00 が HAL に定義されます。
PRU で使うピンは hal_bb_gpio とは独立しており、setp で別途指定する必要があります。
# P9.27 setp hpg.stepgen.01.dirpin 147 # P9.28 setp hpg.stepgen.01.steppin 145
ここの数字は hal_bb_gpio とは関係ありません。上の例ではbeaglebone_pinmap.h の値をそのまま書いています。これは変換メソッドがちゃんと動いてるか不安でバイパスしたかったから以外の意味は特にありません。
ピンナンバーには hal_pru_generic.cのfixup_pin()で変換がかかるので以下のように書くことができるようです。ただ、実際には試してません。
# P9.27 GPIO 927 # P8.11 PRU OUT 1811 # P8.15 PRU IN 2815
.ini ファイルの設定
各軸の MAX_VELOCITY, MAX_ACCELERATION, SCALE, MIN_LIMIT, MAX_LIMIT はすくなくとも必ず理解して確実に設定しなければなりません。これらの項目はマシンごとに異なるのでコピペではどうにもならないからです。
参考までに自分が Grbl に設定していた項目 の一部をコピペしてくると
$0=10 (step pulse, usec) $1=25 (step idle delay, msec) $100=1066.667 (x, step/mm) $101=1066.667 (y, step/mm) $102=1066.667 (z, step/mm) $110=800.000 (x max rate, mm/min) $111=800.000 (y max rate, mm/min) $112=800.000 (z max rate, mm/min) $120=150.000 (x accel, mm/sec^2) $121=150.000 (y accel, mm/sec^2) $122=100.000 (z accel, mm/sec^2) $130=200.000 (x max travel, mm) $131=150.000 (y max travel, mm) $132=60.000 (z max travel, mm)
としていました。この設定を Machinekit に置き換える場合、単位が全て単位時間あたりのものになっているので、そこをまず気をつける必要があります。
X軸の最大速度が 800mm/min なら [AXIS_0] で MAX_VELOCITY = 13.4 と指定する必要があります。加速度は単位が同じなのでそのまま MAX_ACCELERATION = 150。
SCALE は step/mm なのでこれもそのまま指定できます。(備考ですが、Sable-2015 のウェブの設定を見ると4マイクロステップ時のものになっています。実際には8ステップでしたので、2倍にしてあります)
自力で計算しなおす場合 200steps/rev, 8microsteps, 1.5mm/rev という環境なら
という感じで計算できます。
実行して調整する
実際設定一発で完璧に動かせるわけがないので、何度か調整する必要があります。
まず .hal の設定を変えてる場合は、意図したピンから出力がでていることをオシロで確認することが必要です。また入力も halmeter とかで必ず確認します。インターフェイス基板がちゃんと動いているかとかも含めて、動かす前に必ず電圧と波形をすべて確認します。
あとは
- 軸の移動方向が逆
- SCALE の符号を逆にする
- ホーミング時に動く方向が逆
- HOME_SEARCH_VEL の符号を逆にする
- 原点と逆方向にホームスイッチつけてんだけど?
- HOME_OFFSET が「原点からホームスイッチまでの距離」を表わすので、これをテーブルサイズに設定する
- ホーミング後にものすごい動くんだけど?
- ホーミング後は HOME で指定した座標まで移動する。HOME_OFFSET - 3 ぐらいに設定しとくのが良い
という感じで設定を詰めていきました。
備考:自分の環境 (Sable-2015)
上記設定ファイルはあくまで自分の環境用のもです。特にホーミングまわりや、軸方向などは設置状況に応じてそれぞれだと思います。
参考までにどんな環境で設定したかを書いておきます
- リミットスイッチは Sable-2015 を正面からみて、以下のようについています。片側だけです。ホーミングとリミットのスイッチを兼ねています。
- Xは右側
- Yは奥側
- Zは上側
- X/Y 軸の原点は左手前
- テーブルの右に行くにしたがってXが増える
- テーブルの奥に行くにしたがってYが増える
- Z軸
- スピンドルが下に行くにしたがってZが減る
- スッテピングモータードライバは付属のもの。
- 8 マイクロステッピング設定
- 特に改造していません
備考:内部コンポーネント
マニュアルは http://www.machinekit.io/docs/man/man9/ にありますm
ソースコードは src/hal/i_components にあります。謎のファイル形式にみえますが、instcompでコンパイル・インストールできるようになっているらしいく、実体はプリプロセッサで面倒な部分が隠してあるCのファイルです。