Machinekit にしたかった主な理由の一つがこれでした。事前に基板表面を一通り Probe し起伏のマトリクスを得て、これをもって補正しながら実際の切削動作を行う方法です。これにより 0.2mm ぐらいまでの細かいパターンを安定して切削できるようにできるというわけです。

# Autoleveling
software=LinuxCNC
al-back=true
al-probefeed=40
al-x=10
al-y=10

をオプションに加えるとオートレベリング用の gcode が同時に吐きだされます。この例だと 10mm ごとに Probe を行う設定です。

実際の動作

実行開始すると「Probe をつけろ」とメッセージが出て一時停止するので、Probe をつけて Resume する。

全部 Probe が終わると Probe を外せとでるので、外して Resume する。すると実際の切削が始まる。

めんどい点

一旦実行終了すると (回路が切られて各領域が絶縁されるので)、二度とオートレベリングできません。切削深さの微調整とかができないので悩ましい。

一回使った Probe データを使いまわせればよさそうですが……

備考: LinuxCNC の PROBEOPEN / PROBECLOSE

コメントのフォーマットで命令が書いてある。

(PROBEOPEN RawProbeLog.txt) と (PROBECLOSE) の間は probe 結果が指定したファイルに書き出される。

#[#101 * 3 + #102 + 500] = #5063 ( Save the probe in the correct parameter )   

が補正パラメータを変数に入れているところ。#5063 は probe の結果。#101 は X iterator / #102 は Y iterator、3 は加工範囲 / al-y - 1っぽい。500 は固定のオフセット。ということで #500 以降に補正データが入る。

なので、冒頭の probe プロセスを RawProbeLog.txt の結果を使って #500 以降への代入に置換すれば Probe データを再利用して再度切削できそう。

  1. トップ
  2. tech
  3. pcb2gcode のオートレベリングを使ってみる

これはかなり簡単な形状だと思うけど、むずかしかった。プラス端子側のモデリングのしかたがわからなくて試行錯誤したけど、あってるかよくわからない。

3D CAD で既存のをトレースするの思ったよりも面白いところがあって、例えば「ああここは面取りされてるな」みたいなのって、普段なに気なさすぎて気付かない。そういうのに気付けるのは面白い。一見しょぼい製品であっても、ちゃんと面取りされていることが多い。


いまいちわからないけど、今のところは「その部品がどういう作りかたで製造されるか」みたいなのをもっと想像したほうが良さそう。最初六角ナットの面とりのやりかたがわからなかった。正解は回転で削る、なのだけど、変なやりかたをしてしまったりした。むずかしい。

ブログに貼れる機能があって今時っぽい…… (スマフォで固まるのではずしました)

  1. トップ
  2. tech
  3. Fusion 360 の練習 RCA ジャック

寸法がわからないところは画像を下絵にトレースしてみた。

  1. トップ
  2. tech
  3. Fusion 360 の練習 非常停止ボタン

USB の規格的にはダメな気はするけど ebay でしばしば売っているパネルマウント可能な USB 延長ケーブルのコネクタ部分

結構慣れてきた気がする。ノギス片手に1時間ぐらいでモデリングできた (図面がないので)。

細かい部分、微妙に角度がついて折りまげられている部分を再現してない。どうやってやるのがいいのだろう……

  1. トップ
  2. tech
  3. Fusion 360 練習 パネルマウント USB コネクタ (USB 内部延長)

オートレベリング、つまり加工前に加工対象の表面を一通り Probe して起伏のマトリックスを作る場合、Probe の速度をできるだけあげたくなります。理論的にどれぐらいまであげられるのか計算しました。

前提

  • 1066.667steps/mm
  • 1ms サンプリング (Machinekit)

計算

1066.667steps/mm なので、約937.5nmが最小ステップ(加工精度の限界)。

Probe のサンプリング頻度は 1ms ごと、つまり1kHz。これは servo-thread の実行間隔なので、実際はもう少し膨らむ(周波数は低くなる)。

1msごとに937.5nm進む速度が最も正確にProbeできる限界になるので、937.5nm * 1kHz = 937.5um/sec = 56.25mm/min。

サンプリングスピードを上げるほど速度をあげられ、精度が上がるほど速度が下がります。

  1. トップ
  2. tech
  3. 最適な Probe 速度を計算する

これが Machinekit での初切削。今まで (Grbl) と同じやりかたで gcode を生成し、そのまま実行させたもの (なので特にオートレベリングなどしてない)。

Probe のとき G91 を一緒にいれてあげないと意図しない結果になる気がする。G91 G38.2 F10 Z-1 がよさそう。

Machinekit での全体のワークフロー

  1. 起動
  2. Home All
  3. ファイルを読みこむ
  4. 設定する原点位置までジョギングで移動 (X/Y)
  5. X軸とY軸をTouch Off
  6. Probe できる範囲まで Z 軸をジョギング (1mm以内にする)
  7. Probe 端子を接続
  8. Probe (G91 G38.2 F10 Z-1)
  9. Probe 端子を外す
  10. Z軸を Touch Off
  11. (確認プロセス) Z軸を10mmあげる (G91 G0 Z10)
  12. (確認プロセス) Z軸を Touch Off
  13. (確認プロセス) 実行開始して挙動を確認して適当に停止する
  14. (確認プロセス) 本来の原点に戻す (G90 G0 X0 Y0 Z-10)
  15. (確認プロセス) Z軸を Touch Off (本来の原点設定に)
  16. 実行開始

AXIS GUI の見方

ステータスバーの「Position: Relative Actual」が地味に重要

Relative のときは (マシン座標の代わりに) オフセット座標が使われている。この場合マシン座標原点はシアンで示される。上記スクリーンショットの場合 G54 でオフセットされた座標が X/Y/Z に表示されている。G54 X/G54 Y/G54 Z はオフセットを含んだマシン座標

Actual は機械動いた結果どこにいるかを示していますよってこと。Commanded の場合、どういう指示をしたかを示していますよってこと。

  1. トップ
  2. tech
  3. Beagle Bone Black + Machinekit での PCB Milling

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 での設定の流れですが以下のような感じです。

  1. loadusr コマンドで実行に必要な外部プログラムをロードする
    • loadusr -w だとコマンドの終了を待つ (初期設定を外部コマンドでやるために必要)
    • loadusr -W だとコマンドが起動するまで待つ
  2. loadrt コマンドで必要なコンポーネントをロード・設定する
  3. addf でコンポーネントの関数を実行スレッドに追加する
  4. setp でコンポーネントのパラメータ設定をする
  5. 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のファイルです。

  1. トップ
  2. tech
  3. Beagle Bone Black + Machinekit での CNC 制御 (Sable-2015)

ジョギング用のペンダントに USB の XBox コントローラを使う話です。

基本的には LinuxCNC Documentation Wiki: Simple Remote Pendant でいいんですが、これだけだとちょっと気に入らないので、結構がんばる必要があります。

仕様

  • 左アナログパッドに X/Y軸
  • 右アナログパッドに Z軸

が割り当てられています。これが基本ですが、事故防止のため左右のトリガーを押している間しか動作しないようになっています。

  • 左トリガーを押しながら軸操作をすると低速移動
  • 右トリガーを押しながら軸操作をすると高速移動

アナログパッド自体にも傾きによって速度調節が入りますので、トリガーの役割は「最大速度の設定」です。

また、X/Y軸が同一アナログパッドにある弊害として、このままだと意図せずに移動したい軸ではない軸を動かしてしまうという問題があります。これに対処するため、

  • Xボタンを押している間はX軸のみ動く (Y軸の移動が抑制される)
  • Yボタンを押している間はY軸のみ動く(X軸の移動が抑制される)

としてあります。Z軸は独立していて問題ないので、これで意図した軸を確実に動かせます。

まだ L, R, A, B, Back, Start ボタンと十字キーとスティック押し込みが余っています。probe はどこかに入れたいですが、残りは特に思いついてません。

.hal

# X-BOX USB コントローラジョギング設定
# abs-hat0x, abs-hat0y: デジタル十字キー 1 か 0 か  -1
# abs-rx, abs-ry: 右アナログスティック
# abs-rz: 右アナログトリガー (RT)
# abs-x, abs-y: 左アナログスティック
# abs-z: 左アナログトリガー (LT)
# btn-a: Aボタン
# btn-b: Bボタン
# btn-mode: XBox ボタン
# btn-select: BACK ボタン
# btn-start: スタートボタン
# btn-thumbl: 左スティック押し込み
# btn-thumbr: 右スティック押し込み
# btn-tl: 左上側ボタン (LB)
# btn-tr: 右上側ボタン (RB)
# btn-x: Xボタン
# btn-y: Yボタン

loadusr -W hal_input -KRAL 360

loadrt deadzone count=5
loadrt scale count=2
loadrt mux2 count=3
loadrt flipflop count=1

addf flipflop.0 servo-thread
addf mux2.0 servo-thread
addf mux2.1 servo-thread
addf mux2.2 servo-thread

addf deadzone.0 servo-thread
addf deadzone.1 servo-thread
addf deadzone.2 servo-thread
addf deadzone.3 servo-thread
addf deadzone.4 servo-thread
addf scale.0 servo-thread
addf scale.1 servo-thread

setp deadzone.0.center      0.0
setp deadzone.0.threshhold  0.2
setp deadzone.1.center      0.0
setp deadzone.1.threshhold  0.2
setp deadzone.2.center      0.0
setp deadzone.2.threshhold  0.2
setp deadzone.3.center      0.0
setp deadzone.3.threshhold  0.2
setp deadzone.4.center      0.0
setp deadzone.4.threshhold  0.2


# トリガーをひかない限り動かないようにする
# また、トリガーのアナログ値によって最大スピードを制限する
# 左トリガー
setp input.0.abs-z-offset 0
setp input.0.abs-z-scale 255
net joy-speed-jog-dead-l input.0.abs-z-position   deadzone.3.in
setp scale.0.gain 80
setp scale.0.offset 0
net joy-speed-jog-scale-l deadzone.3.out scale.0.in
net joy-speed-jog-final-l scale.0.out mux2.0.in0

# 右トリガー
setp input.0.abs-rz-offset 0
setp input.0.abs-rz-scale 255
net joy-speed-jog-dead-r input.0.abs-rz-position   deadzone.4.in
setp scale.1.gain 800
setp scale.1.offset 0
net joy-speed-jog-scale-r deadzone.4.out scale.1.in
net joy-speed-jog-final-r scale.1.out mux2.0.in1

# 左か右いずれかを有効にする。ただし左が優先
net joy-flipflop-reset input.0.abs-z-is-pos flipflop.0.reset
net joy-flipflop-set input.0.abs-rz-is-pos flipflop.0.set
net joy-select-maxspeed flipflop.0.out mux2.0.sel
net joy-selected-maxspeed mux2.0.out halui.jog-speed

# X-BOX のコントローラの Scale は 127.5 ではないので気をつけよう
# 軸方向反転の設定
# setp input.0.abs-rx-scale -32767.5
setp input.0.abs-ry-scale -32767.5
setp input.0.abs-y-scale -32767.5

# 左アナログパッドはX/Y軸
# 右アナログパッドはZ軸
net joy-x-jog-dead input.0.abs-x-position  deadzone.0.in
net joy-y-jog-dead input.0.abs-y-position  deadzone.1.in
net joy-z-jog-dead input.0.abs-ry-position   deadzone.2.in

# XボタンまたはYボタンを押しているときは、それぞれX軸またはY軸のみ移動可能にする
# 予め net はしておくが、ボタンが押されたときは他軸の移動を抑制する形
net joy-x-jog-mux deadzone.0.out mux2.1.in0
setp mux2.1.in1 0
net joy-y-jog-mux deadzone.1.out mux2.2.in0
setp mux2.2.in1 0

net joy-x-brake input.0.btn-y mux2.1.sel
net joy-y-brake input.0.btn-x mux2.2.sel

net joy-x-jog mux2.1.out halui.jog.0.analog
net joy-y-jog mux2.2.out halui.jog.1.analog
net joy-z-jog deadzone.2.out halui.jog.2.analog

# X-BOX ボタンでマシンが起動するぞ
net joy-btn-xbox input.0.btn-mode halui.machine.on

備考:deadzone の設定

アナログスティックを離していてもいずれかの方向に多少傾いていて入力されてしまうので、中央付近に不感帯をつくっておく必要があります。

備考:XBox コントローラのアナログスティック類は 16bit

なので各種 scale に入ってる値が 32767.5 になっている。うっかり符号を変えようとして -127.5 とか入れると大変なことになるので注意が必要。

XBox コントローラは、2つの2軸アナログパッドと、2つのトリガーが16bitアナログなため、合計で6つのアナログ入力があります。

マイクロソフト ゲームコントローラー 有線/Xbox/Windows対応 ブラック Xbox360 Controller for Windows 52A-00006 -

5.0 / 5.0

  1. トップ
  2. tech
  3. Machinekit (LinuxCNC) を XBox コントローラを使って機械を動かす。