これまでのあらすじ:
2016年3月、フェルト生地を手で裁断している際にレーザーカッターがあれば複雑なカットが容易にできるなあと思って、安価になってきたレーザーカッターを購入しようと思ったのがきっかけ。調べていくうちに、合板も切れたほうがいいと思うようになって、CNCルーター(CNCミリング)についても考えるようになった。
Arduinoは以前から使っており、CNCシールドがあると気付いて自作も可能と思うようになった。当初はShapeOkoやX-CARVEを参考にMakerSlide、OpenRail、V-Wheel、2GTタイミングベルトなどで5万円くらいで自作しようと思っていた。AliExpressでも部品が安く買えることが分かって、しばらくは部品探し。探せば探すほど安くて本格的な部品も見つかってくるので、そんなにケチらなくてもいいのではないかと徐々にスペックアップ。最終的には剛性や精度のことも考えてボールスクリューやリニアスライドを使うことになり、予想以上に重厚な3軸CNCマシンをつくることに(約7万円)。
構想から約5週間(制作約3週間)でルーターとレーザーともに使えるようになり、現在はgrbl1.1+Arduino CNCシールドV3.5+bCNCを使用中(Macで)。余っていたBluetoothモジュールをつけてワイヤレス化。bCNCのPendant機能でスマホやタブレット上のブラウザからもワイヤレス操作可能。


CNCマシン全般について:
国内レーザー加工機と中国製レーザー加工機の比較
中国製レーザーダイオードについて
CNCミリングマシンとCNCルーターマシンいろいろ
その他:
利用例や付加機能など:
CNCルーター関係:

*CNCマシンの制作記録は2016/04/10〜の投稿に書いてあります。


2017年2月16日木曜日

Grbl1.1の$コマンドやGコードについて

Gコードについてはまだまとめていないので、とりあえず覚書程度に書いておこうと思います。
普段Gコードや$コマンドについては、やっているうちに覚えるだろうと思って、それほど深く勉強はしていません。作業の効率化が必要というほどでもないので、だいたい動けば問題ないという程度です。全て覚えようとすると大変なので、いつも使っているGコードや$コマンド(よく使うものや設定の際に必要そうなもの)についてです。

参考としているのは、
・Grbl:CommandsページConfigurationページ
LinuxCNC/クイックリファレンス
・一般的なNCコード(ここがわかりやすい

まずは$コマンド(Grbl用)から:
$$
CNCマシンの各設定を表示させるコマンド。$$と入力。一度設定してしまえば、あまり用はないかもしれませんが、たまに間違って設定したままになっていることがあります。レーザーモード($32=0または$32=1)をオンにし忘れていたなど。とりあえず通信できているか確認する時にもよく使います。

$I
Grblのバージョンを確認するコマンド。$Iと入力。
入力すると、[VER:1.1e.20161208:]などと表示され、バージョン1.1、2016年12月8日ビルドということがわかります。古いバージョンだとバグが直っていなかったりするので、最新の方がいいと思います。問題がありそうなら最新バージョンにしてみるというのも解決策だったりします。特に問題なく動いているのであれば、そのままの方がいいかもしれません。

$X
ロック解除。$Xと入力。最初にCNCマシンと接続開始すると、このコマンド(あるいは専用ボタン)を押さないと、その後の操作ができないようになっています。また作業中に異変があって自動停止したあと再開する時も入力する必要があります。

$H
$Hを入力するとホーミングサイクルが開始します。ただし事前に$22=1で設定をオンにしておく必要があります。ホーミングサイクルによってリミットスイッチを頼りに機械原点を探しに動き始めます。
リミットスイッチの設置や事前の設定がなされていない場合は、$22=1にしたり、$Hに相当するボタンなど押さないよう注意した方がいいと思います。

$G
$Gと入力すると(あるいは毎回表示される)、現在アクティブになっている設定モードが出てきます。
[GC:G0 G54 G17 G21 G90 G94 M0 M5 M9 T0 S0.0 F500.0]
それぞれ何なのか、最低限これくらいを覚えればいいと思います。
G0は位置決め用の早送りモード(G1に変更しない限り移動速度は一定)、G21で単位はmm、G90で絶対座標を使用中など。
例えば、この設定の状態のまま[G0の速度($110で設定)で、単位はmm(インチではなく)、絶対座標(G90)]、X10とだけ入力するとX軸座標10mmの位置へ動くことになります。最後の項目でF500.0が設定されていますが、G0になっているため$110で設定した速度が優先されます。もしF500の速度を反映したい場合はG0をG1へ切り替えます(G1と入力)。

$J=
ジョグ操作コマンド。
$J=G91X10F100入力で、現在地からXを10mm分F100の速度で動かすというジョグコマンド。これはGrbl1.1からの新機能で、従来まで(Grbl0.9)は、$Gにある設定モードに左右された入力方法になっていましたが、それとは無関係に入力できるようになりました。例えば、$G内で早送りモード(G0)かつ絶対座標設定(G90)になっているときに、相対座標(G91)でゆっくり(G1)ジョグ操作したい時には、今までは設定を変えてからジョグ操作し、それが終わればまた元の設定に戻すということでしたが、元のモードに戻さなくても$Gの内容はキープされたままというわけです。
ペンダント(ジョグダイヤルやジョイスティックなど)で操作する場合は、これを使った方がいいらしいです。フィードが設定されていないと動かないのでFも入力必要。

$3
XYZ軸の移動向きの設定。配線したものの、実際動かしてみるとY軸だけ逆の動きになっていたという場合は、ここで向きを反転設定できます。
$3=0 (N/N/N:X軸/Y軸/Z軸:デフォルト値)
$3=1 (Y/N/N:デフォルト値に対してX軸だけ反転)
$3=2 (N/Y/N:デフォルト値に対してY軸だけ反転)
$3=3 (Y/Y/N:デフォルト値に対してX軸とY軸を反転)
$3=4 (N/N/Y:デフォルト値に対してZ軸だけ反転)
$3=5 (Y/N/Y:デフォルト値に対してX軸とZ軸を反転)
$3=6 (N/Y/Y:デフォルト値に対してY軸とZ軸を反転)
$3=7 (Y/Y/Y:デフォルト値に対してすべて反転)
例えば、Y軸だけ反転したいのであれば、$3=2を入力


$10
現在のマシンのステータスを知らせる設定。$10=1になっていないと、使っているG Code Senderに現在の座標値MPosやWPosが表示されなくなります。$10=2にすることでバッファの内容を表示することもできるようですが、通常は$10=1でいいと思います。たまにMPosやWPosが表示されなくなったというときはここをチェックしてみるといいと思います。

$13
$13=0で作業単位mm、$13=1でインチ。

$20
ソフトリミット設定。$20=0でオフ、$20=1でオン。
$130、$131、$132で、そのCNCマシンのXYZ軸の最大移動距離を設定できます。ソフトリミットをオンにしておけば、この設定距離を超えると自動停止してくれます。$Xで再開。

$21
ハードリミット設定。$21=0でオフ、$21=1でオン。
リミットスイッチを各軸につけておけば、$21=1にすることでリミットスイッチが押された時に自動停止してくれます。$Xで再開。

$22
ホーミングサイクル設定。$22=0でオフ、$22=1でオン。
ホーミングサイクルを可能にするには、各軸にリミットスイッチを接続する必要があります。
$Hをコマンド入力(あるいは専用ボタン)すると、ホーミングサイクル開始となり、Z軸が+方向へ、続いてXとY軸も+方向へ移動し、リミットスイッチを感知して機械原点MPos(0,0,0)を見つけ出します。通常は左奥上が機械原点MPos(0,0,0)となり、作業エリアはWPos座標上では全てマイナス座標となります。毎回作業前に、ホーミングサイクルを行えば、CNCマシンは機械原点を覚えるので、その後座標をずらしても常にどこにいるのか把握できます。
しかし、実際の作業はMPosとは別に作業用の原点WPos(0,0,0)を任意の位置に設定し(G92で)、WPosを元に位置を割り出すので、MPosがなくても問題ありません。ただ、複数の部品を複数の座標系を使って作業するときなどは、MPosが絶対座標となってくれるのであった方がいいとはおもいますが、個人的にはホーミングやMPosは毎回使っていません。

$23
ホーミングの際のXYZ軸の動く方向の設定。通常は右奥上ですが、使いやすいように左前上に設定する人もいます。$3の反転設定の表を同じで、デフォルト($23=0)に対してY軸だけ反転したい場合は$23=2を入力。

$24
ホーミングの際にリミットスイッチ手前で位置合わせする移動速度。正確に位置合わせをするためにゆっくりめの速度にしておく。20〜50mm/minなど。$24=25などと入力。

$25
ホーミングでリミットスイッチを探しに行く際の移動速度。最高速よりは遅めで。
$25=600などと入力で600mm/minで移動開始します。

$26
ホーミング中にリミットスイッチ押した際のデバウンス/チャタリング(特に機械式スイッチ)防止用のディレイ時間。20〜250msec程度。$25=50と入力でディレイ時間50msecに設定。

$27
ホーミング終了後、安全のためリミットスイッチから少しだけ離れておく距離の設定。1〜5mm程度。例えば、$27=3.0と入力でリミットスイッチが押されたポイントから3mm戻った位置に止まるように設定。

$32
レーザーモードの設定。$32=0でオフ、$32でオン。
Grbl1.1からはレーザモード機能が追加され、主にはダイナミックレーザーモード(M4)というヘッドの移動速度に応じてレーザー出力を微調整する機能があります。
従来までは、$32=0のまま、M3S500(レーザーオン、出力50%)などと入力していましたが、$32=1にするならば、M4S500となります。
レーザーを使わないのであれば、$32=0にしておいた方がいいと思います。

$100、$101、$102
XYZ軸のsteps/mm設定。CNCマシンのスペックに応じて設定する必要があります。
以下の条件であれば:
・ステッピングモーター:1回転200ステップ
・ステッピングモータードライバのマイクロステッピング設定:1/8
・送りネジの1回転で進む量:5mm
1/8のきめ細かさでマイクロステップすることになるので、ステッピングモーターは200x8で1回転するには1600ステップ、1回転で送りネジが5mm進むので、1600/5=320steps/mmとなります。$100=320などと入力。
ここは最初に設定すれば、もう変えることもないでしょう。

$110、$111、$112
XYZ軸の最高速度設定。mm/min。
例えば、$110=1000を入力でX軸を1000mm/minに設定。
これらの値は、G0の速度に適用されます。

$130、$131、$132
XYZ軸の最大移動距離。
そのCNCマシンの各軸の移動可能な距離を入力しておくことで、$20=1でソフトリミットをオンにした時にこの値を越えれば非常停止するようになります。
例えば、$130=600を入力でX軸の移動可能な距離を600mmまでと設定。

おそらく初期設定で必要な$コマンドはこのくらいでしょうか。その他の設定はデフォルトのままでも大丈夫かと思います。

ここからGコード:
G0
位置決め用の移動速度モード(速め:一定速度)。
最初はG0になっていますが、G0またはG1のどちらかにモードを切り替え指定します。
$$で表示される$110、$111、$112(XYZ軸の各最高移動速度)に設定してある一定速度で動く。速度を設定し直したい場合、$110=800などと入力し直す。
ジョグボタンで移動する場合は、この移動速度が適用されます。G0のままF100などフィードを入力設定しても移動速度はG0($110〜$112)の速度になってしまいます。一時的に速度を変えて動かしたい場合は次のG1を入力してモードを変えるか、ジョグ操作であれば$J=を使うといいと思います。
ある地点へ斜め方向に移動する場合、X軸もY軸も固定速度($110〜$112で設定した速度)で動くため、例えばX軸が目標となるX座標へたどり着いたら、Y軸だけがまだ動き続けているという現象になることがあります。最短距離で目標地点に動くのではなく、各軸の固定速度で動くために折れ曲がった軌道を描くことから加工作業には適していないようです。

G1
フィード(F)設定による移動モード。G0とは違って、その都度設定したフィードで動きます。主に加工用のモードです。モードがG0になっている場合は、G1を入力することで、このモードに切り替わります。
加工条件に合わせたフィード設定が必要となります。F値が設定してない場合(F=0になっている場合)は、移動コマンドを入力してもフィード未設定というエラーが出るので、F値も忘れずに入力。

G2、G3
円弧を描く移動モード。G2が時計回り、G3が反時計回り。
G0とG1が直線なのに対し、G2とG3が円弧で動くという程度で覚えておけばいいと思います。円を描く際には、このほかI、J、K、Rなどの値も設定しなければいけないのですが、わかりにくいのでCADなどで描いてGコード化した方が早いかもしれません。
G2 X0 Y0 I0 J-20 F300
これは以前実験のために使った円を描くGコード(現在地から時計回りに半径20mmの円を描く)ですが、直感的にわかりにくいです。
G2(円弧時計回り)、X0 Y0(終点座標/開始点でもあるけど)、I0 J-20(現在地からの中心座標の差分)、F300(300mm/minのfeed速度設定)。
IはXに、JはYに対応しており、J-20の部分は、現在地からY軸方向へ20mm下がったところに中心点があるという意味になります。
この程度の試運転用Gコードであるならば、覚えるというよりも、コードを記録しておいてコピペして使ったり、ソフトのボタンなどに割り当てておけばいいと思います。

G17
作業がXY平面という設定。これも変えたことがない。G18(XZ平面)、G19(YZ平面)らしい。おそらくXY平面が基本となることがほとんどなので、これもこのままでいいかと。

G21
作業の単位がmm。G20でインチへ変更可能。これも大抵はmmなので、このままでいいかと。動きが変だと思ったら一応チェックする程度。G20かG21で切り替え。

G54
これは変えたことがない。G54〜G59までの6種類の異なる加工用の座標系を登録しておくことができるようです。その都度単体のものしか加工しないのであれば、おそらくずっとG54のままで大丈夫かと。大量生産や異なる部品を複数作業台に並べて加工するときは、それに合わせて複数の座標系があったほうが便利なので、そのうち使うかもしれないという程度。

G90
絶対座標系。これは位置調整するときに、よく使うかもしれません。G90X10Y20Z10などと入力。
絶対座標なので、X10という移動コマンドは座標上のX軸10mmの位置へ移動ということ。10mm右へ(X軸上に)動かすというのと混同するので要注意。
よく勘違いしていたのは、G90のままX10を入力して右へ10mm動いた後、再度X10を入力してさらに10mm右へ動かそうとしたのに動かないという現象。この場合は次の相対座標(インクリメンタル/増加分)の設定にしないといけない。
ちなみにG90のままX0Y0Z0と入力すれば、原点に移動ということになります。
G90を入力して、一旦絶対座標に切り替えると、変更しない限りこのモードは持続します。

G91
相対座標系(インクリメンタル/増加分)。G90と比べればわかると思いますが、G91を入力してX10を入力すれば、現在地から10mm右へ動きます。再度X10を入力すれば、さらに右へ10mm動きます。人によっても違うと思いますが、直感的に絶対座標の方がイメージしやすい場合と相対座標の方がイメージしやすい場合があると思います。10mm右へ移動した後、あと5mm右へ移動したいと思うか、それとも15mmの位置へ移動したいと思うかの違いです。
よくあるミスとしては、あと5mm右へ動かそうと思って(相対座標系でのイメージ)X5を入力したら、G91ではなくG90になっており、いきなり原点近く(座標上のX5mmの位置)まで戻ってしまったという現象。移動途中に障害物などなければいいのですが、材料固定用金具にぶつかってしまったり、場合によっては作業エリアをはみ出るまで動こうとしたりするのでかなり危険です。
なので、毎回G91X10と入力すれば、その勘違いも防げると思います。

G92
座標系の設定コマンド。現在地の座標を任意の座標値にセットするコマンド。
例えば現在地でG92X0Y0Z0を入力すると、そこがWPos(0,0,0)に変更されます。また、G92Z20と入力すれば、現在のZ軸の高さが20mmという設定になり、プローブなど使ってZ軸の位置を設定する際に使います。
大抵は、材料に対してのスピンドルの位置決め(加工原点出し)の時に使います。
ソフトによっては、「X=0」というような現在の位置を原点にしてくれるボタンもありますが、同じコマンドを使っているというわけです。

G94
毎分送りというフィードの単位設定。F800mm/minやF20inch/mmという〜/mm。これもこのまま。
このほかG95なら毎回転送り〜/revolutionらしい。G93だとInverse Timeモードと言ってF2.0なら1min/2.0つまりその工程を30秒で終わらせる速度となるみたいです。ここまでは覚えなくても良さそう。

M0
プログラム一時停止。起動させれば、残りの工程を再開。このほかM1も一時停止。

M3
スピンドル出力オン(時計回り)。Grblでスピンドルを制御している場合。ただしM3S1000などと、S値も入力しないといけない。M3S0ならスピンドルオンだけれど出力ゼロ。Grblの場合、S0で出力0%、S1000で100%。
ルーターやミリングでは、加工中にあまりオンオフはしないけれども(Z軸の昇降で切削するかしないかなので)、レーザーなら常に加工中はオンオフしたりS値で出力の強弱をつけたりします。ただし、Grbl1.1からはレーザモードが導入されたため、M3(従来の方法)ではなく、M4を使う方が便利かもしれません。

M4
スピンドル出力オン(反時計回り)。Grblでスピンドルを制御している場合。これもS値が必要。M4S1000などと入力。
Grbl1.1の場合、M4はレーザーモードとして機能が割り当てられています。M3でもレーザー可変出力加工は可能ですが(Grbl0.9の方法)、M4のレーザーモードにするとヘッドの移動速度に応じてレーザー出力を微調整してくれます。その結果、移動開始直後やパスの折り返し地点などの速度が変わる箇所の焦げムラが少なくなります(かなり効果あります)。ただし、M4を使うには事前に$32=1でレーザーモードをオンにしておく必要があります。

S
スピンドルの出力値。GrblならS0で0%、S500で50%、S1000で100%。現在は8bitの設定になっているようでS0~1000とは言っても256段階しかないようです。Arduino Unoの11番ピン(PWM)を使っており、そのピンならtimer2で16bit出力も可能ですがそうはなっていないようです。cpu_map.h内でPWM周波数を変えることができます。デフォルトは0.98kHz。
ルーターやミリングならスピンドルモーターの可変制御を可能にしてくれるTTLモータードライバをCNCシールドのSpnEn(pwm)へ接続する必要があります。
レーザーならレーザー用TTLドライバを接続し、可変出力制御が可能になります。
オンオフしかできないリレーを使っている場合は、S0(オフ)かS1000(オン:Max値)に設定することになります。

M5
スピンドル停止。Grblでスピンドルを制御している場合。特にレーザーの場合はM5でオフにするかS0で出力ゼロにしないと危険。

M9
クーラント停止。冷却装置をつなげていなければ関係なし。

M30
プログラム終了。Gコードの最後につけることで、作業の終了ということを告げます。生成したGコードファイルをエディタなどで見てみると、たまにM30がない時もあるので、書き足しておくといいと思います。

T0, M6
ツールチェンジ。Tはツールの種類。M6で加工作業中で異なる刃に変えるときのコマンド。これも使わないかと。オートツールチェンジャがあって、自動で刃先を変えてくれるなら必要かもしれませんが、普通は加工中断して手で変えることになると思います。加工途中でのツール交換すらあまりしないし、したことはないです。

F
フィード。送り速度。G1(加工用の移動速度)で必要なフィードを設定します。単位は大抵はmm/minですが、たまにmm/secになっているソフトもあったりします。
個人的には、F600(10mm/sec)くらいがゆっくりめのちょうどいい速度という感じがします。
素材や加工方法に応じて、この速度を設定しなければいけません(詳しくはこちらなどで)。
X10Y20F600などと入力すれば、X軸10mm、Y軸20mmへ600mm/minで移動します。


このうち実際使うのは、$$、$X、M3、M4、S、G90、G91くらいでしょうか。あとはだいたいソフトのボタン操作になるので、それほど覚える必要はないと思います。ただ、ちょっとした動きを確認したり、トラブルがあった時に、コンソール画面のコマンドを多少読めた方がいいというくらいです。
当初はGコードも覚えないとダメなのかなと思っていましたが、ソフトでGコードを自動生成してくれるので、ほとんど覚えなくても作業上問題ないという感じです。
Gコードを入力するとエラーが出る場合は、このページにエラーコード表があるので見てみるといいと思います。設定や入力の仕方が間違っている場合があります。

実際の使用例(接続から加工までの流れ):
・CNCマシンと接続(ソフト上のOpenボタン押す)
・$Xで初期ロック状態解除(Unlockボタンでも可)
・$$で設定内容表示(一応確認)
・ジョグボタンで動作確認(少し動かしてみる)
・必要であれば、ここでホーミングサイクル($H)、機械原点MPos(0,0,0)のセット
・材料を作業エリアに固定する
・Gコードファイルの読み込み(ファイル読み込みボタンなど押す)
・ジョグボタンで材料左手前角に移動(XY軸のみ)
・ジョグボタンでZ軸(刃先)を材料上面ぴったりまで下げる(移動量0.01〜0.1mmボタン使用)
・この位置を加工原点WPos(0,0,0)にセットする(「X=0」ボタンなど押す、もしくはG92X0Y0Z0)
・Z軸を材料上面から少し上げておく(5mm程度の逃げ)
・加工スタート
・加工終了
という感じで、Gコードファイルを読み込ませて加工するときは、Gコード手入力はほとんど使いません。ボタンがソフト側にもついているので、それらのボタンで済んでしまいます。ホーミングサイクル($H)も普段はやりません。MPosではなくWPosで位置決めするという感じです。

このほかG41とG42のオフセット(工具径補正)機能もあるようなのですが、Grblには実装されていないようです。G41(左へオフセット)とG42(右へオフセット)のモードをキャンセルするG40は入っているみたいなので、将来的に実装されるのかもしれません。ただ、Arduino UNO(ATmega328)では、もうメモリに余裕がないので、Arduino MegaやArm CoreのArduino などになってしまうと思います。
ちなみにオフセット加工については、Jscutbcnc、あるいはIncscapeでも可能です。



さらに追記していく予定です。曖昧な部分もあるので、知っている方いらっしゃったらコメントお願いします。

2017年2月9日木曜日

IPカメラによる加工状況の監視(bCNCのIPカメラ化)

現在Bluetoothで、MacBook上のbCNCからCNCマシンを操作しています。同時にbCNCのPendant機能でスマホからも操作ができるので便利です。
あとは、加工中の状況(特にレーザー加工/目に危険なので)をカメラで監視できればいいと思って、Webカメラを設置できないかと考えていました。
USBケーブルでCNCマシンとMacBookをつなげていれば、Webカメラ(USB接続)で監視が可能です。例えば、以下のようなもの、

USBエンドスコープ:
AliExpress.com Product - Waterproof 5m Mini USB Endoscope Inspection Camera 6 White LEDs 1/9 CMOS 7mm Lens Borescope Snake Tube Camera with P2PUSBエンドスコープ(内視鏡):750円(送料込み)、直径7mm、ケーブル5m長いケーブル先端に直径7mmのカメラがついており、CNCマシンに取り付けやすいと思います。加工スポットをズームアップして監視したいので、こんな感じがいいのですが、ワイヤレスではないのが少し残念。そうなると、以下のようなもの。

AliExpress.com Product - Free shipping! 6LED HD 720P 1M / 2M / 5M WiFi Endoscope Waterproof Inspection Camera for ios and Android PCWifiエンドスコープ:2571円(1m)、2713円(2m)、2929円(5m)、送料無料。Wifiモジュールがついているので便利そうです。Wifiモジュールから外せばUSBカメラとしても使えると思います。
全体がコンパクトなWifiカメラなら、 AliExpress.com Product - 20pcs Mini DV Wifi Camera Q7 Cam 720P HD DVR Wireless IP Camera Video With IR LED Pocket-Size Remote By Phone Wholesale 1840円(送料込み)幅23mm、高さ43mmくらいなのでCNCマシンのどこにでも設置できそうです。
bCNCのカメラ機能:ひとつ気になるのは、bCNCにはOpenCVを使ったカメラ機能があり、パソコンとUSBカメラで接続していないと使えません。つまりWifiエンドスコープからbCNCには取り込めないということです。単なる監視として使うならWifiエンドスコープがとても便利そうですが、少し残念。

BluetoothカメラやワイヤレスUSB:そうなると、BluetoothカメラがあればワイヤレスかつbCNCにも取り込めるのではないかと探しましたが案外ない。Bluetoothも進化しているようですが、カメラなどのストリーミング映像には向いていないらしい。どちらかというとストリーミング映像はWifiが得意らしいです。通信速度の違いだと思います。Bluetooth3.0から通信速度が上がったので不可能ではないようですが、あまり機器類を見かけないし、当然安価にもならないはず。同様に、ワイヤレスUSBも数年前にはありましたが、下火になったようで、これも機器類を探すこと自体難しい。
やっぱりWifiカメラ:ワイヤレスのカメラといえば、現在はWifiが主流となってしまいます。例えば、スマホのカメラから、パソコンにwifiを通して映像を流すということも、アプリがあればすぐにできます。以前、スマホからパソコンに映像を送るだけなら、AirMoreというので簡単にできました。
パソコンのブラウザ上ではこんな画面。いわゆるスマホ画面のミラーリングという機能です。このほかにもスマホからいろんなデータ転送もできるので便利です。
スマホにアプリをインストールして、あとはパソコンのブラウザでWifi通信という感じです。

いくつかアプリを試しましたが、以下のIP Webcam(Android版)というアプリが便利そうでした。
これはタブレット(スマホも可)から流している映像をパソコンのブラウザ上で見ているところです。
操作画面は先ほどのAirMoreに比べるとシンプルです。このアプリはどちらかというとカメラに重点が置かれているようで、画質などいろんな設定が可能です。



解像度、前面背面カメラ切り替え、露出、ズーム、フォーカス、上下左右反転など様々なことがパソコンからも操作できます。また、ローカルネットワークだけでなく、外出先からも見る設定もできるようです。さらに便利なのは、

このように直接アクセス可能なアドレスが載っており、ストリーミング映像ならIPアドレス:ポート/videoというところへアクセスすればMJPEG、連続したJPEG画像取得するなら、IPアドレス:ポート/shot.jpgへアクセスということです。ブラウザで192.168.3.2:8080/shot.jpgにアクセスして見ると、
こんな感じで、シンプルに画像だけ取り出すことができます。これはJPEG画像ですが、画面を更新し続ければ動画にもなるようでした。おそらくスマホでの動画をブラウザからリクエストしてその都度最新画像を読み込んでいるということだと思います。
状況的にはこんな感じ。タブレットをバイスに立てかけています(はさみこんではいません)。ワイヤレスなので好きなところに置くことができますが、できれば本体に取り付けたい。映像については連続するJPEG画像なので、Pythonで読み込むプログラムも難しくなさそう。もしかしたらbCNCへも取り込めるかもしれないという可能性がアップしてきました。

Python-OpenCVで実験:bCNCはPythonで書かれているため、そしてbCNCのカメラ機能はOpenCVを使っているため、Python-OpenCVで先ほどのストーリミング画像を取り込めないか試して見ました。多少PythonもOpenCVも触ったことはあるのですが、基本的にどちらも初心者です。とりあえず、Python-OpenCVのGetting Startedから見てみることにしました。いくつかのチュートリアルがあり、まずは静止画像の読み込みと表示方法、そして動画の読み込みと表示方法という感じです。
import numpy as np
import cv2

img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()
どうやらcv2.imread()とcv2.imshow()でできるようです。画像ソースをcv2.imread()に入れればいいだけのようで、そのまま先ほどのhttp://192.168.3.2:8080/shot.jpgを入れてcv2.imshow()で表示しようとしたのですがダメです。
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
VideoCaptureクラスの方でも試して見ると、やはりcv2.VideoCapture()にIPアドレスを入れてもエラーが出ます。Python2.7なのでOpenCV2.4を使用中。というのは、bCNCがPython3に対応していないため。どうやらOpenCV3にすれば、URLを入れても大丈夫らしい。惜しい。色々調べて見ると、OpenCV2.4ではネットワーク上の画像などを読み込むには、この方法ではダメらしい。
# coding: UTF-8import cv2import numpy as npimport urllibimport sys
ipAddress='http://192.168.3.2:8080/shot.jpg'
def readImg(ip): req=urllib.urlopen(ip) data=req.read() byteData=bytearray(data) arr=np.asarray(byteData, dtype=np.uint8) return cv2.imdecode(arr,1)
while True: img = readImg(ipAddress) if len(img) > 0: h, w = img.shape[:2] halfImg = cv2.resize(img, (w/2,h/2)) cv2.imshow('IMAGE',halfImg) else: print 'no image' sys.exit() break if cv2.waitKey(1) & 0xFF == ord('q'): break
cv2.destroyAllWindows()

その後、いろいろエラー続出でかなり悩みましたが、なんとかIPカメラから画像を取り込んでPythonで表示することができました(上記コード)。たったこれだけのコードですが、外部から取り込んだデータをデコードする必要があるみたいで、その方法に気づくのに時間がかかり、なおかつ普通の読み込みではしないような手順があったり、一行ずつ確かめては書き直したりしていました。
追記:
その後もPythonをいじってましたが、Pythonではdefの外側の変数(グローバル変数)は、def内にはそのままでは通らないようで、def内でglobalを書かないといけないということがわかりました。Pythonはちょっと癖があっていちいち調べないといけないので難しいです。

これはPython-OpenCVによる映像の読込み/表示画面。シンプルに映像だけ取り出せることができました。

手順としては、VideoCapture()の代わりに、urllib.urlopen()でインターネットなどネットワーク上にあるデータをリクエストして受け取り、その配列データをバイトデータ配列へ、そして符号なし8ビット配列、さらにはデコードもして映像画素に合わせた行列に変換して、ようやく読み込める状態になるようです。普通ならimread()など読み込むための関数一発でいけそうですが、そうではないという面倒な手順になっています。しかしデコードする関数などはPythonにあるため、手順を踏めばそれほど難しくはありません。しかし、それぞれが何をしているのか、パラメータは何なのかなど、Documentationも見ながら理解していかないとエラーばかり出てしまいます。
*尚、このようなことを可能にするには、PythonのほかOpenCV、NumPyなどのインストールが必要です。

bCNCへ取り込み:
次は、これを元にbCNCのコードを改造していかなければなりません。bCNCのCamera.pyを開いて見ると、基本的にUSBカメラから映像を取り込んでいるためか、OpenCVのVideoCaptureを使っていました。これは先ほどの動画に関するチュートリアルでも見た方法ですが、今回はVideoCaptureを使わないで、映像(連続するJPEG画像)を取り込む方法(上のコード)でやりたいと思います。というか、その方法しかまだ知らないので。VideoCaptureを使ってMJPEGを取り込めれば簡単そうだけど、OpenCV2.4だと多分できない。
だいたいこの辺のQ&AサイトGitのここなどを参考に試行錯誤していました。
追記:
MPEGの場合、IPアドレス:ポート/video?.mpegにアクセスすればいいようで、このサイトに書いてありました。mpegやjpegは1フレームごとに開始マーカー、終了マーカーがあり、それを手掛かりにデータを読み取るようです。
これが、bCNCのCamera.pyの中身です。いろいろいじっている最中。当然バックアップは取ってあります。IPアドレスからの画像取り込みのため、手順が違ってちょっと面倒です。すぐエラーが出ます。

数時間後、とりあえず画像を取り込む所まではできました(やや強引に)。
もともと、bCNCのPendant機能でカメラ映像を他の端末でモニタリングできるのですが、それも可能でした。つまり、IPカメラ(スマホ)の映像をbCNCを通してMacBookに橋渡しさせ、また別の端末(タブレット)からMacBookのIPアドレスにアクセスして、その映像を見るということです。当然、映像配信元のIPカメラ(スマホ)のIPアドレスに直接アクセスして見ることもできます。
まだ、bCNC内の画像調整(画像サイズや角度)のパラメータとはつなげられていないので、きちんとは機能していません。
bCNCのProbe Camera Alignment(OpenCVを使った位置決め機能)を試したことはないのですが、できればこの機能にUSBカメラのみならずIPカメラも接続可能にして使えればと思っています。もう少しプログラムの改造には時間かかりそうです。というか、Pythonに慣れていないので、かなり疲れてきたという感じです。
予定としては、
・bCNCにおいてIPカメラからの映像を読み込めるようにする(現在ここ)
・読み込んだ映像のサイズや角度の調整ができるようにbCNCのパラメータにつなげる
・USBカメラとIPカメラの両方を使えるようにする
・USBカメラとIPカメラ切り替えボタンやIPアドレス入力欄をつくる
ここまでできれば便利だけど、かなりめんどくさそう。

IPカメラについて:
プログラムの方は少しずつ改造していきますが、IPカメラの方も考えています。とりあえず手っ取り早いのが、スマホやタブレットをCNCマシンのヘッド近くに置いておくことですが、できれば小型なカメラを設置したいと思っています。WifiといえばESP8266が安価なので、それにカメラモジュールをつけて、スピンドル先端付近に取り付けられるのが理想です。

AliExpress.com Product - V3 4 M bytes (32 Mbits) FLASH Lua NodeMcu placa de desarrollo de Redes WIFI Basado ESP8266 con firmwareESP8266:341円(送料込み)これに以下のようなカメラモジュールをつければ、Wifiカメラとして使えます。

AliExpress.com Product - New OV7670 VGA Camera Module Lens CMOS 640X480 SCCB w I2C Interface Auto Exposure Control Display Active384円(送料込み):これは前回調べましたが、AudCamのGitにArduino用ライブラリなどあります。あるいはInstructables
 
AliExpress.com Product - Free shipping ESP32-T Shield ESP32-Bit Development Board Compatible For ESP-32S Bluetooth WiFi Module ESP32S Wireless Board810円(送料込み)、追記:これはシールドだけでした。さらにこのESP32はWifiだけでなくBluetoothもついているようなので、もしかするとBluetoothカメラも可能かもしれません。ESP8266の上位機種といったところ。少し高価ですが、スペックに対してはかなり安い。秋月にもチップだけ700円で売っています
IPカメラ化についてはまた作業が進んだら報告します。

memo:Reading and Writing images and Video(OpenCV)python-opencv-ipcam.pyTo get mjpeg from "http://192.168.3.2:8080/video?.mjpeg"  To get images from "http://192.168.3.2:8080/video?action=stream"   pip install requests

2017年2月5日日曜日

Android GRBL Controller(スマホアプリ)

Android用スマホアプリのGRBL Controllerを見つけたので試してみました。
Instructablesに使い方が載っています(これを見るとこのアプリはGrbl0.9用?)。

まだBETA版のようです。スマホなので当然ワイヤレスですが、WifiではなくBluetooth通信のようです。以前CNCマシンにはBluetoothモジュールをつけておいたので、それを使って通信できそうです。
今はどちらかというとWifiモジュール(EPS8266など)が人気だと思います。数年前にワイヤレスUSBというのも一瞬でて、いつの間にか消えてしまいましたが、Bluetoothはまだいろんな機器に使われているので大丈夫そうです。
AliExpress.com Product - Free shipping! JY-MCU anti-reverse Bluetooth serial pass-through module, wireless serial, HC-05, master-slave 6pin for arduinoAliExpressだとBluetoothモジュールは341円(送料無料)で売ってますね。昔買った時の1/10以下の値段です。IoTによく使われているWifiのESP8266も300〜500円くらいです。いろんなテクノロジーがかなり安くなってきました。

接続開始:
まず、CNCマシンのBluetoothモジュールとスマホをペアリング。特にパスワードは設定してないのですが、パスワード(パスキー)要求画面が出てきて、設定していない場合は0000か1234を入れろと。0000はダメだったので1234を入れたらペアリング成功。

この画面をタップすると、スマホとペアリングしてあるBluetooth機器のリストが出てきて、その中から選択。この画面はもうすでに接続された状態です。

操作開始:

早速ジョグボタンを押してみると、UnlockもしくはMachine startを押せと出てきます。

Machine startを押すとロック解除、さらにこのように赤いEmergency Stopボタンになります。
そこでジョグボタンを押すと、あっさり動きました。おお、これはすごい。パソコンなしで、CNCマシンを動かしているということです。
下の方には、ホーミングなどのボタンもあります。
さらに上部にある他のタブを見ていくと、

ここは、Gコードファイルを読み込ませるところのようです。CloudにGコードファイルを上げて
おけば、すぐにここから作業ができそうです。ファイルの読み込ませ方はここに書いてありました。スマホのSD Cardにファイルを入れておかなければならないようです。しかもサブフォルダなどに入れず、ルートディレクトリ(トップの階層)に置かないといけないようです。
Single Blockボタンは、Gコードを1行ずつ実行するようです。Cycle Startは一気に最後までGコードを実行するようです。簡単なサンプルで試して見ると、Single Blockで1行ずつ実行させれば最後までいけましたが、Cycle Startだと途中で止まってしまいました。読み込みバッファあたりに問題があるのでしょうか?メモリー不足?

ここでは、Gコードを手入力できます。ためにし$$を入力するとGrblの設定が出てきました。しかし下の方にスクロールできない。

ここはGコードの中身を確認できるところのようですが、まだ使えないようです。

そして最後はマシン設定用画面です。先ほどのGコード入力画面でもできますが、ここで各項目に対応したパラメータを入力できるようになっています。

ということで、いまどきは何でもスマホという感じです。
bCNCのPendant機能やLaserweb3でもスマホから操作はできますが、パソコンがホストになる必要があるので、スマホはあくまでサブという位置付けです。しかし、このスマホアプリは、本当にスマホだけで操作できるというところがすごい。
画面が小さいので操作性は良くないかもしれないけれど、CNCも今やスマホゲームのような感覚で操作するということでしょうか。

6軸用アプリも:
さらには、6軸用のアプリもあります。新しいバージョンでしょうか?


しかしGRBLは3軸までしか対応していないけれど、本当に6軸も操作できるのでしょうか?

一応、操作画面には下の方にA Axis、B Axis、C Axisまであります。とりあえずソフト的には、6軸まで作っておいたということでしょうか。
まだこちらもBETA版なので、今後の進化に期待したいところです。

追記:
どうやらこの6軸アプリは、ArduinoMega2560用(6軸GRBLファームウェア搭載)に対応しているようです。
6軸ファームウェアをXloader(Win)、HexUploader(Mac)、Easy Flash Script(Linux)を使ってArduinoMega2560にアップロードすれば6軸CNCとして使えるようです(こちらに書いてあります)。
そもそもGrblControllerを開発していたZapmaker.orgがArduinoMega2560用に4軸用Grbl0.8〜も開発していたようです。Zapmakerの4軸用ファームウェア(Mega2560用)は、2014年を最後にGrbl-0.845までアップデートされています。おそらく、3軸では物足りない人たちのために、この6軸用ファームウェアが引き継いだ感じになったのかもしれません。

AliExpress.com Product - Free Shipping hc-06 HC 06 RF Wireless Bluetooth Transceiver Slave Module RS232 / TTL to UART converter and adapterもう少し安いBluetoothモジュールありました。327円(送料こみ)。
Bluetoothの親機と子機について:よくみるとこれはSlave(子機専用)かもしれません。多分、スマホが親機になればいいので大丈夫だとは思いますが、このページ上の方にあるBluetoothモジュール(341円)はMaster-Slaveと書いてあるので、親機・子機兼用なのかもしれません。調べて見ると、HC-05というのが親機にもなるタイプ、HC-06は子機専用らしいです。親子なら通信可能だけれども、おそらく子機同士は通信できないのかもしれません。スマホはBluetoothイヤホンなど接続できることから親機だと思うので、子機(HC-06)と通信はできるはずです。ただし、どちらも技適は通ってないので、原則的に国内での使用は認められていないということです(個人的に狭い範囲で使うなら大丈夫でしょう、まあよくある自己責任でということです)。 Amazonでも似たようなBluetoothモジュールが売ってます。これも中国からの配送だとは思いますが。
BluetoothモジュールとCNCシールドとの接続方法:
これは以前CNCシールドにBluetoothを接続実験した時の画像です。基本的に4本線で、CNCシールドTX端子---BluetoothRX端子(送信/受信)CNCシールドRX端子---BluetoothTX端子(受信/送信)CNCシールド5V端子---BluetoothVcc端子(電源:5V)CNCシールドGND端子---BluetoothGND端子(電源:GND)という感じでつなぎます。注意するところは、送信と受信という組み合わせになるようにTXとRXをクロス接続するところです。あとは、BluetoothモジュールがCNCシールドからの5V電源で大丈夫かどうか(3.3Vだったりしないか)。Grbl1.1のBaudrateが115200なので、それも合わせておいた方がいいのかもしれません。このアプリは実際のところGrbl0.9用で、InstructablesにはBaudrateを9600に変えろと書いてありますが、デフォルトのBluetoothモジュールを使う場合ということでした(BluetoothのBaudrateを115200に変えるにはATコマンドを使って設定し直します)。
接続するには、Gコード送信ソフトでBluetoothモジュールのシリアルポートを選ぶだけです。通信自体はUSBケーブル接続の時と同様にシリアル通信なので同じように通信するだけです。ただし、BluetoothのTXとRX端子は、Arduino UnoのD0とD1端子と接続することになるので、Arduino UnoとパソコンをUSB接続してシリアル通信するときに干渉してしまいます(同じピンを使っているため)。Arduino UnoとパソコンがUSBケーブルを通して通信しあうときは、BluetoothのTXとRX端子を抜くか電源を抜いた方がいいと思います。また、通常Arduino UnoはUSBケーブルでパソコンから電源供給されているので、パソコンと切り離すと別途外部電源(DC7〜12V/1A程度のACアダプターなど)が必要となります。

2017年2月2日木曜日

Xbox360ワイヤレスコントローラーでジョグ操作(Mac版)

ゲーム用ジョイスティックで、CNCマシンのジョグ操作をするというのをネットでたまに見かけます。確かにパソコン以外にもジョグ操作できる装置があると便利です。
現状ではbCNCのPendant機能でWifiを介してスマホから遠隔操作可能ですが、たまたま昔購入したXbox360ワイヤレスコントローラー(Xbox本体は持っていない)があるのを思い出して、試しにできるかどうかやってみました。
ワイヤレスなのでCNCマシンのペンダントとしては便利そう。右側のドングルをMacBookにUSB接続して使います。MacだとMicroSoftのXboxとは相性悪そうですが、ネットで調べるとMac用のドライバもいくつかありました。Windowsならかなりあるはず。


いまだにAmazonでも売っているんですね。XboxOneというのは新しいタイプでしょうか。意外に高い。

ちなみにAliExpressでCNC用リモートペンダントを探すと以下のような感じ。
AliExpress.com Product - Free shipping Hot sell cnc part Manual Pulse Generator Ncstudio CNC Wireless Handwheel CNC RF Electronic Remote Pendant8226円(送料込み)、これは比較的安い方。大体は1万円以上。Macで使えるかは不明(たぶん無理)。Mach3用が多い。

Mac版ジョイスティック用ドライバ+キーマッピングソフト:
Xbox360コントローラーを認識させるドライバはあるのですが、キーマッピングでXbox360コントローラーをマウスやキーボードとして使ったり、さらには複合的なキー入力の使い方ができるものとなると少ない。それと、結構古いコントローラーでもあるので、ドライバも古かったりして現在のOSバージョンに対応していないなど。

360Controller
ここは現在でも更新してありGitにソースが置いてあることからも良さそう。

しかし、目的としていた複雑なキーマッピングまではできないみたい。オープンソースなので、ファイルを開いてコードを改造すればいいのかもしれないけど、もう少し探してみることに。
普通にゲームするには問題ないと思う。

Joystick Mapper
これは有料(600円)、説明など見る限りいろいろできそう。
プレステのコントローラでもいいかもしれないけど持っていない。

bCNCのPendant機能でスマホから遠隔操作できるので、必ずしも今回Xbox360コントローラで操作する必要もないということで、有料ソフトは保留。
しかし、無料ソフトだとやはり単純なものしかない。

次に見つけたのはこのソフト「ControllerMate」。無料ソフトだとらちがあかないので試しに、この有料ソフト($24.95)をダウンロードしてみました。おそらくトライアルか無料利用だと何かしらの制限があるはず。
説明を見る限りは、かなり複雑な設定ができるみたい。しかもアップデートも最近までされています。
こんな感じで、単純なモジュールを線でつないで複雑化していくタイプ。期待できそう。
ということでインストールして試してみました。

ControllerMateの使い方:
まず、Xbox360コントローラーには2個のアナログスティックと十字キー、そしてたくさんのボタンがあります。今回はせいぜい、
・アナログスティックでXY軸の移動(G91X10、G91Y10など)
・ボタンでロック解除($X)
というくらいでしょうか(以下)。

当然ホーミング($H)や加工原点復帰(G92X0Y0Z0)なども設定していいのですが、まだ本気で使うつもりもないので、とりあえず動けばいいという程度で。というのも、今まで通りbCNCのPendant機能で十分間に合うので。

この手の入力の場合、ボタンを押すと「$X(リターン)」という設定ができないといけない。通常のゲームパッド用ソフトだと、「Start」ボタン=「s」キー(キーボード上の)という1対1対応になっていて、連続した任意の文字列を入力設定できないものが多い。しかし、このControllerMateは、文字列も入力できるらしい。こんなのを探していました。無料でも一応使えるようです。対応機種コントローラーはここに書いてあります。Xbox以外にもたくさんあります。

設定方法:
まずプロジェクトの開始は、右側にあるProgramming Itemsの歯車マークのプルダウンメニューで、Create Programming Pageを選択。

そうすると、以下のようにNew Page1が出来上がり、グリッドの作業エリアが出てきます。

次に、接続してあるコントローラーのジョイスティックを動かすと、右側にあるモジュールが光って、対応するジョイスティックやボタンがどれなのかわかります。一つのジョイスティックはX軸とY軸の二つのモジュールに分かれてあります。それぞれをドラッグして作業エリア上にのせます。

最終的には、X軸だけをみると以下のようになります。それほど複雑ではありません。というかやっていること自体が単純なので。左に倒すと「G91X-10(リターン)」、右に倒すと「G91X10(リターン)」という内容です。
これらのモジュールは作業エリア上で右クリックをするとタブが出てくるので、その中から選んで配置していきます。以下から、それぞれのモジュールの説明です。

「Controller X-Axis」:
まず、これがコントローラのボタンやジョイスティックのどの部分かというモジュール。これに機能のモジュールを色々ぶら下げて行く感じ。コントローラーを接続しないと右側のリストに出てこないかもしれません。

「Range(ジョイスティック範囲設定)」:
これは、ジョイスティックをどのくらい倒すと(条件)どうしたいか(結果:出力)という入力範囲の設定(条件設定)。右クリックで以下のタブから選ぶと作業エリアに出てきます。

作業エリア上の「Range」モジュールを選択して画面右にあるInspector画面で内容を設定します。
これは、ジョイスティックX軸:左側に倒した時の設定です(縦:Y軸方向に動かす設定はまた別のモジュールでする必要があります)。左に倒したら、CNCマシンのヘッドも左に動くという前提とします。倒した量によってスピードが変わるようにしてもいいのですが、このジョイスティックではあまり細かく操作できないので、倒したら「G91X-10」で左に10mm移動するコマンドを一回投げるという設定にしようと思います。20mm動かしたいときは2回倒すということです。
青い水平バーで反応する範囲を調整します。中央付近は無反応にして、左側-32768〜-10000の時だけ反応する設定にしておきます。このジョイスティックはぴったり中央で止まることがないので、かなりゆとりを持って中央の無反応範囲をとっておきました。
同じように、今度は右側に倒した時の設定も必要になります。そのため「Range」モジュールが二つあります。
もちろん倒した量によって1mm、もう少し倒すと5mm、めいっぱい倒すと10mmという感じで細かく範囲を設定してもいいとは思います。そうすると、「Range」モジュールだけでも3つ、両側も含めて合計6個を「Controller X-Axis」モジュールにつなげることになります。ただ、無料だとモジュール数の制限があって、そこまで複雑化するには有料にしないとダメかもしれません。

「T(テキスト出力)」設定:(追記:改良策「Keystrokes」を使う方法はページ最後の方にあります)
次に、「Range」モジュールの反応範囲の時に出すコマンドを「T(テキスト出力)」モジュールで設定します。つまり、ジョイスティックを左に倒したら「G91X-10」という文字列を書き出すプログラムになるということです。
「T(テキスト出力)」モジュールは右クリックでこの場所↑にあります。また「T」モジュールを選択して、Inspector画面で設定します。
こんな感じで、空白欄に「G91X-10」と入れておきます。ONタブは、これがONになったら「G91X-10」が出力されるということです。OFFの設定は特にないのでスキップ。

Speedタブの方では、as fast as possibleにして、出力速めにしておきます。
このテキスト出力設定では、最後のリターンキーの入力ができないので、それは次の設定で。ラインフィードやキャリッジリターン記号を入れればいいのかもしれませんが、そのまま書き出しそうなので、以下の設定でやることにします。

「Single Key」設定:
「G91X-10」のあと「リターン」を押してGコード入力終了となるで、このリターンキーも忘れずに設定しておきます。
「Single Key」はこの場所にあります。
そしてまたInspector画面で設定します。
BehaviorはOne Shotで一回だけの出力にしておきます。Press and Holdにしてしまうと、リターンキーを連続出力してしまいます。
Open Keystrokes Paletteを押すと、小さいキーボード画面が出てきて、この中からリターンキーを選んで作業エリアにドラッグします。
これでモジュールは全部揃ったので、あとはモジュールの端子のような部分をドラッグして相手のモジュールにくっつけるだけです。同様にY軸方向も設定もします。

それと、最終的には画面左上にあるMaster Enable: ON、Helper: Runningにしないと機能しないかもしれません。クリックすれば、赤→緑に変わります。

出来上がり:
最終的には、ボタンでロック解除($X)もつけて、以下のようになりました。

無料利用の場合の制限:
無料利用の場合は以下のような制限があります。出力系のモジュール(building block)は10個までらしい。そのほかは無制限。今回の場合は、テキスト出力とリターンキー出力だけで10個あるので、これが限界っぽい。

それと無料の場合は、このソフトがバックグラウンドで動いている場合(他のソフトを使っている場合)20分で切れてしまうようです。フォアグラウンドにしていれば無制限。

Grbl1.1なら$J=コマンドでジョグ操作:
今回はGコードを使って「G91X-10(リターン)」:相対座標でX軸を-10mm移動させましたが、Grbl1.1からは、ジョグ操作は$J=コマンドでやった方がいいかもしれません。$J=コマンドはGコードとは別に制御されるので、実際のペンダントを使ってのジョグ操作に適しています。
$J=X10F800
という感じです。
単に、
$JX10
を入力すると(最後にフィードをつけないと)、error:22が出ました。error:22はフィード未設定のエラーのようです。
また、$J=X10F800と入力しても、事前に設定してあるG90(絶対座標)かG91(相対座標)によって、
G90ならX座標10mmのところへ移動(WPosのX:10mmの位置)
G91なら現在地から10mmX軸方向へ移動(+10mm右へ動かす)
となるようです。

まとめ:
実際にbCNC上で試してみました。bCNCのコマンド入力欄を一度クリックしておいて(フォーカスを与えておいて)、あとはXbox360ワイヤレスコントローラーのジョイスティックでジョグ操作。特に問題なし。順調でした。
ただ、bCNCのPendant機能があるので、わざわざXbox360ワイヤレスコントローラーを使ってまでしてジョグ操作しなくてもいいという感じです。Laserweb3の場合もスマホからホストのIPアドレスにアクセスすれば遠隔操作可能なので、bCNCとLaserweb3以外で作業する時、ペンダントがないのであれば、余っているゲームパッドを利用することはありえるのかもしれません。
とりあえず、できるということが分かったので、もし今後使うようなことがあればという感じでしょうか。

追記:「Keystrokes」を使って改良
その後、コマンド入力(特にリターンキー入力)のところを改行コード(キャリッジリターンやラインフィード)を使ってやってみましたが、そのまま改行記号を出力してしまうのでダメでした。
そして、「T」や「Single Key」の代わりに「Keystrokes」という複数のキー入力を可能にするモジュールで試してみると、それなら大丈夫でした。
この画像にあるように、前回は左側の「Range」「T」「Single Key(改行)」でしたが、改良した右側は「Range」「Keystrokes」だけで済みます。Output系のモジュールは無料利用の場合10個までしか使えないので、一つ減らすことができたという感じです。
「Keystroke」の場合、Inspector画面で以下のように設定します。
Open Keystrokes Paletteボタンでミニキーボードを表示します。そしてWhen turned ON:の欄にキーを出力したい順番で入れていきます。今回出力したい内容は「G91X10(リターン)」ですが小文字「g91x10(リターン)」でも問題ありません。
キーボードからドラッグすると、黒と白の2個のキーが出てきます。黒がキーを押す、白がキーを離すという意味です。通常なら、g(押す)、g(離す)でgの文字一つを入力したことになります。その要領で、「g91x10(リターン)」をキー入力すると、
こんな感じで長くなりますが、この「Keystrokes」を使うことで一応最後のリターンまで押すことができます。Open Keystrokes Paletteボタンのミニキーボードを使う代わりに、Captureボタンを押せば、実際のパソコンのキーボードで入力した結果が画面に出てきます。
シフトキーを押しながらキー入力するような「$」は、「shift(押す)」「4(押す)」「4(離す)」、「shift(離す)」という順番になりますが(以下)、Captureボタンでやったほうが間違わないかもしれません。

ということで「Keystorkes」を使えば、連続した文字列(リターンキーなども含め)が出力できるのでOutput系のモジュールを節約できるという感じです。前回の方法だと10個使ってしまいましたが、今回は5個で済みました。残り5個あるので、他の機能を追加することができそうです。
しかしながら、bCNCのPendant機能の方が便利なので、おそらくXbox360コントローラを使ってのジョグ操作は使用しないと思います。ちょっと残念。まあ、きっと何かに応用できるでしょう。