PR

GRBLで「Check Door」が誤発生する原因と対策|Gコードの日本語コメント(UTF-8)の罠【自作CNC第7回】

CNC自作

自作CNCシリーズ 第7回

スポンサーリンク

はじめに:ノイズ対策をしても消えない「Check Door」

こんにちは。ニンジンです🥕

本番用アルミフレーム筐体の部品がようやく揃い、実験用XYテーブルからの移行を進めました。新しい筐体は剛性が段違いで、X350mm × Y340mmの広い稼働領域を確保できています。

さっそくペンを持たせてプロッター化しようとしたところ、Gコードを走らせるたびにマシンが止まり、コンソールに [MSG:Check Door] が連発しました。外部プルアップ・RCフィルタ・フェライトコアとハードのノイズ対策を徹底しても消えず、真犯人はGコードのカッコ内に書いた日本語コメントでした。この記事では、その仕組みと対策、そして筐体移行に伴うGRBLの再設定($3 ビットマスク・step/mm 再計算・加速度 $120)までをまとめます。

この記事で分かること

  • プーリーを32歯→20歯に変えたときの step/mm$100/$101)の再計算式
  • X軸だけ回転方向が逆になったときの $3(Step direction invert)ビットマスクの考え方
  • 動作が「10倍遅い」ときに疑う加速度設定 $120〜$122
  • [MSG:Check Door](Safety Door)が実機に扉がないのに誤作動する理由
  • 「径」などの漢字のUTF-8バイト列に含まれる 0x84 がGRBLのリアルタイムコマンドと誤認される仕組みと対策

スポンサーリンク

アルミ筐体への移行とGRBLの再設定(・step/mm)

組み上がった本番用アルミフレームCNC筐体の全体像

新しいアルミフレーム筐体は、実験用XYテーブルとは比べ物にならない剛性があり、X350mm × Y340mmの稼働領域を確保しています。物理的な動作環境が変わったので、まず筐体に合わせてGRBLの設定値を書き換えます。

X軸の回転方向反転( のビットマスク再計算)

筐体に組み込んだことで、X軸の正回転が実験時と逆になりました。X軸だけ反転させるため $3(Step direction invert)のビットマスクを再計算します。Y軸(2)+Z軸(4)の反転に、新たにX軸(1)を足して $3=7 に設定しました。

プーリー変更に伴う移動量(step/mm)の再計算

2GT 20歯 タイミングプーリー(ベルト幅6mm対応)
本番用の2GT 20歯タイミングプーリー
2GT 歯なしアイドラプーリー
2GT アイドラプーリー(歯なし)

プーリーを「2GT・32歯」から本番用の「2GT・20歯(ベルト幅6mm対応)」へ変更しました。歯数が減ることでトルクと分解能が向上します。使用モーターは1.8度(1回転200ステップ)、ドライバはマイクロステップ16分割なので、計算式は次の通りです。

  • 理論値:(200 × 16) ÷ (2mmピッチ × 20歯) = 80 step/mm

この結果をもとに $100=80.000$101=80.000 に更新し、最大移動量($130/$131)も新しい稼働領域に合わせて書き換えました。


スポンサーリンク

初動テストで動作が極端に遅い:加速度 0〜2 の初期値

まず刃物を持たせず「空切り(Air Cut)」で正方形や円を描くGコードを流しました。動いた感動も束の間、「10倍くらい動きが遅い」

送り速度は F500(500mm/min)を指定しているのに、常にモッサリした動き。原因は、GRBLの加速度設定($120〜$122)が初期値の 10 と極端に低かったことでした。これを 100 に引き上げると、本来のキビキビした動きに戻りました。


スポンサーリンク

「Check Door」が連発:まずノイズを疑って対策する

速度の問題が解決した後、Gコードを走らせた直後にマシンがピタッと止まり、コンソールに次が表示されました。

[MSG:Check Door]

これはGRBLの安全扉(Safety Door)機能が働き、強制的に一時停止させられている状態です。しかし自作CNCに扉は付けていません。1回目・2回目でこのエラーが出て、なぜか3回目で動き出す、という挙動でした。

ArduinoのA1ピンまわりに外部プルアップ抵抗・セラミックコンデンサ・フェライトコアを追加したノイズ対策の様子

「強烈な電気的ノイズだろう」と考え、ハードのノイズ対策を徹底しました。

  • 外部プルアップ:A1(Hold)ピンと5Vの間に6.8kΩ抵抗を入れ、電圧を5Vに固定
  • RCフィルタ:A1ピンとGNDの間に104(0.1μF)のセラミックコンデンサを入れてノイズ吸収
  • フェライトコア:各種ケーブルにノイズ吸収用コアを装着

十分に対策したつもりでしたが「Check Door」は消えませんでした。モーター電源を抜いてUSB給電だけにしても発生するため、ノイズが原因ではない可能性が高まりました。


スポンサーリンク

真犯人はGコード内の日本語コメント(UTF-8の 0x84)

ノイズでないなら何か。原因は送っていたGコードそのものにありました。

Check Doorの原因だったテスト用Gコード(抜粋)

(2. 真円を描画 - 直径200mm)
G0 Z10.0 (Zを上げる)
G0 X100.0 Y0.0 (円のスタート地点、底辺の中央へ)
G1 Z0.0 F150.0 (Z軸を下ろす)
(現在地 X100.0 Y0.0 から、中心座標 X100.0 Y100.0 を軸に円を描く)
G3 X100.0 Y0.0 I0.0 J100.0 F500.0 (反時計回りに円を描画)

このコードでは、分かりやすいように「(2. 真円を描画 – 直径200mm)」のような日本語コメントをカッコ書きで入れていました。

GRBLには、緊急停止や扉の開閉を即座に処理する「リアルタイムコマンド(1バイト)」という仕様があり、Safety Doorには 0x84 が割り当てられています。

そして、コメントに入っていた「径」という漢字をUTF-8に変換すると E5 BE 84 になります。GRBLはコメントのカッコ内であっても、バイト列に含まれる 84 を「リアルタイムコマンド」として拾い、「今、扉が開けられた(0x84)」と勘違いして緊急停止していたのです。

解決策はシンプルで、Gコード内の日本語コメントをすべて削除するだけ。あれだけ苦労した抵抗やコンデンサを外し、コメントなしのGコードを実行すると、エラーは一度も出ず最後まで走り切りました。

対策のまとめ:Gコードのコメントは半角英数字のみにする。CAM・エディタの文字コードをUTF-8以外にしても回避できることがあるが、コメントを英数字にするのが最も確実。


スポンサーリンク

ペンプロッターとして図形を描画(動作テスト成功)

「Check Door」から解放されたCNCにペンを固定し、実際の紙へ200mm角サイズの描画テストを行いました。

結果は成功。ぴったり収まる真円(●)と、斜めの追従性が試される星型(★)が、ガタつきやズレもなく一筆書きで描かれました。本番用アルミフレームの剛性が証明された瞬間です。

実行したテストコード(test_plot.nc)

G21
G90
G17
G94

G0 Z10.0
G0 X0.0 Y0.0

(2.)
G0 X100.0 Y0.0
G1 Z0.0 F350.0
G3 X100.0 Y0.0 I0.0 J100.0 F500.0

(3.)
G0 Z10.0
G0 X100.0 Y200.0
G1 Z0.0 F350.0
G1 X158.78 Y19.10 F500.0
G1 X4.89 Y130.90
G1 X195.11 Y130.90
G1 X41.22 Y19.10
G1 X100.0 Y200.0

G0 Z20.0
G0 X0.0 Y0.0
M30

スポンサーリンク

まとめと次回予告:1064nm赤外線レーザーモジュールの搭載へ

筐体の移行と、文字コードに起因する特殊なエラーを解決し、ペンプロッターとしての基盤が仕上がりました。次回・第8回では、手配した「LASER TREE製 1064nm赤外線レーザーモジュール」をこの筐体に搭載し、金属への刻印テストに進みます。

次に読む記事

🔴 次回はこちら(第8回) 自作CNCに1064nm赤外線レーザーで金属刻印|GRBL設定($32=1)とLightBurn素材テスト レーザーモジュールの配線、$32=1などの必須設定、アルミ板への刻印テストとLightBurnの使い方。 🚨 前回はこちら(第6回) GRBLホーミング失敗「ALARM:8」の原因と対策|4ステップ動作とプルオフ設定 ホーミングの4ステップ動作と、Z軸未連動でのALARM:8突破方法。 🗺️ シリーズ全体像 ゼロから自作するCNCの全手順ロードマップ|Arduino・GRBL・CNCjsでレーザー刻印機を作る 第1回〜第10回の全工程をまとめたロードマップ。

スポンサーリンク

よくある質問(FAQ)

QGRBLで [MSG:Check Door] が出て止まります。扉は付けていません。

ASafety Door機能の誤作動です。実機に扉がなくても、Gコードのコメントに日本語(マルチバイト文字)が含まれていると発生することがあります。漢字のUTF-8バイト列にSafetyDoorのリアルタイムコマンド 0x84 と同じバイトが含まれ、GRBLがそれを拾ってしまうためです。コメントを半角英数字だけにすると解決します。

Qなぜ「径」という漢字が原因になるのですか?

A「径」をUTF-8でエンコードすると E5 BE 84 という3バイトになります。GRBLはリアルタイムコマンドを1バイト単位で先読み処理するため、コメント内であっても末尾の 0x84(Safety Door)を実行コマンドとして解釈し、緊急停止を発動します。

Qノイズ対策(抵抗・コンデンサ・フェライトコア)は無駄でしたか?

A今回の Check Door の原因ではありませんでしたが、CNCのリミット/コントロール入力のチャタリングやノイズ対策としては有効です。原因の切り分け(USB給電のみでも再現する→ノイズではない)ができた点に意味がありました。

Qプーリーを20歯に変えたら step/mm はいくつになりますか?

A(モーター200ステップ × マイクロステップ16) ÷ (ベルトピッチ2mm × 歯数20) = 80 step/mm です。$100 と $101 を 80.000 に設定します。歯数32のときは50 step/mmでした。

QX軸だけ回転が逆です。$3 は何に設定しますか?

A$3 は軸ごとのビットマスクで、X=1・Y=2・Z=4を足し合わせます。すでにY・Zを反転していて $3=6 なら、X(1)を足して $3=7 にします。配線を差し替えずソフトだけで直せます。

Q動作が異常に遅いです。F値は上げています。

A加速度 $120〜$122 が初期値の10前後になっていないか確認してください。端で減速・加速するのに時間がかかり、指定した送り速度に到達できません。100程度に引き上げると改善します。最大速度 $110/$111 の頭打ちも併せて確認します。



ニンジン🥕アイコン

Follow me on X

本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕

@ninjin_py_vba をフォロー

この記事が役に立ったら、シェアしてもらえると嬉しいです🥕

Xでポスト はてブ LINE Pocket

PROJECT LOG — SERIES INDEX
スポンサーリンク

シリーズ記事一覧

電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。


超音波距離センサーHC-SR04をRaspberry Pi Picoで使う|仕組み・配線・精度検証
.uds1-block { position: relative; overflow: hidden; border-radius: 12px; border: 1px solid #f0cba8; background: linear-g…
今週の注目ガジェット〜09/07週〜|電子工作・自作向け新製品まとめ(TickrCast/Radxa Linkr ほか)
ニンジンのガジェット通信 09/07週。ESP32-P4の自作気象モニター、極小IP-KVM「Radxa Linkr」、ESP32のDINレール型PLC、LTE開発キットなど、電子工作で使えそうな新製品5つを解説。
サーボモータの角度をタクトスイッチで可変|OLED(SSD1306)に現在角度をリアルタイム表示
Raspberry Pi Pico 2W×MG996RにタクトスイッチとOLED(SSD1306)を追加。ボタンで角度を可変しながら現在角度をリアルタイム表示するMicroPython実装を、framebufの文字拡大やサーボの遊び対策まで実機ベースで解説します。
MG996RサーボモーターをRaspberry Pi Pico 2Wで動かす:PWM制御とキャリブレーション実践
MG996RサーボモーターをRaspberry Pi Pico 2Wで動かす方法を解説。公称180度のはずが実測198度だった個体差の原因究明から、ホーンのズレ補正、タクトスイッチでの角度制御まで実機検証の様子を紹介します。
Tapo P110Mの消費電力をExcelレポート化する【年次集計・電気代試算・セキュリティ判断編】
FastAPI+openpyxlでTapo P110Mの消費電力をExcelレポート化。15秒間隔の生ログを日次集計する設計や、31円/kWhでの電気代試算、外部公開を見送った理由まで解説します。

コメント