ESPDuino で CNC Shield と Grbl_ESP32 を併用してみる

御指摘でだいぶ視界が開けて来ました。ありがとうございます。

確認したところ、下のコード、 Grbl_ESP32 の Motors.cpp により IO12 が OUTPUT に指定されていました。ハイレベルの指定もこのあたりのコードから来ているものと思います。

    if (STEPPERS_DISABLE_PIN != UNDEFINED_PIN) {
        pinMode(STEPPERS_DISABLE_PIN, OUTPUT);  // global motor enable pin
        grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Global stepper disable pin:%s", pinName(STEPPERS_DISABLE_PIN));
    }

以下、問題を切り分けてみます。

1.「5V」と「3.3V」の問題

  • 本来 Arduino UNO と共に用いる CNC Shield は 5V で運用する設計である一方、ESP32 は 3.3V で運用する。

  • ステッパードライバが 3.3V に対応可能なものを用いる場合、制御は全て 3.3V 系に切り換えるのが無難。

2.IO12 と BuiltinBASIC 起動の問題

  • ESP32 の IO12 は起動時にプルアップされていると BuiltinBAIC を起動しようとする。

  • CNC Shield を載せると IO12 にプルアップ抵抗がぶつかり、動作に異常をきたす。

3.仕様と運用の問題

  • 資料によっては EN/GND を短絡させ CNC Shield を有効化するとあるが、ここのジャンパは本来 Shield 自身の有効無効切り替え用ではない模様。

  • EN/GND のショートは用いず、Grbl/Grbl_ESP32 側で Stepper Enable/Disable PIN(Shield 無改造の場合 IO12)の High Low を切り替えて Stepper Driver の Enable/Disable を切り換えるのが本来の運用と思われる。

  • Grbl_ESP32 のステッピングモータドライバの使われ方として、「モータ動作時間+遅延時間」分だけ Enable が入り、普段は Disable。

  • シリアルコマンドでは $1 や $4 や $SLP が、Gコードでは M17 や M18 や M84 がこれに関係。

  • Motors.cpp から推測し、Grbl_ESP32 のスケッチのコンパイル時、src/Machines 配下のヘッダファイルで STEPPERS ENABLE/DISABLE PIN に IO12 等のいずれかのIOを割り当てなければここは UNDEFINED_PIN となり High にならない⇒ステッパードライバ常時 ON と予想する。

※ ドキュメントやヘッダファイルに記載がないので、Grbl では M17,M18,M84 は使わないのかもしれません。

※ $SLP ⇒ Grbl v1.1 Commands · gnea/grbl Wiki · GitHub

参考文献

M17:全てのステッパーモーターの電源を入れる

M18:全てのステッパーモーターの電源をオフ or 回転をオフ

↓モータドライバの Enable/Disable 切り替えについての議論

上記「問題3」についての詳細

IO12

OUTPUT に指定されていました。

    if (STEPPERS_DISABLE_PIN != UNDEFINED_PIN) {
        pinMode(STEPPERS_DISABLE_PIN, OUTPUT);  // global motor enable pin
        grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Global stepper disable pin:%s", pinName(STEPPERS_DISABLE_PIN));
    }

使われないピンには UNDEFINED_PIN が割り当てられるようです。

参考文献

https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/

http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2014

https://www.arduino.cc/en/Tutorial/Foundations/DigitalPins

PINの割り当て方

原文

Note: All ESP32 I/O pins are 3.3V, not 5V tolerant, and the current capability is rather low. They cannot directly drive relays, solenoids, etc. In some cases they can directly drive optocouplers for external stepper drivers, but it is usually best to buffer them with an external chip or transistor. They can directly drive the control pins on “Pololu module” stepper drivers. You must not feed any 5V signals into an ESP32 input - limit switches and the like must use 3.3V signaling.

Google翻訳

注:すべてのESP32 I / Oピンは3.3Vであり、5Vトレラントではなく、電流容量はかなり低くなっています。リレーやソレノイドなどを直接駆動することはできません。外部ステッパードライバー用のオプトカプラーを直接駆動できる場合もありますが、通常は外部チップまたはトランジスタでバッファリングするのが最適です。 「Pololuモジュール」ステッピングドライバーの制御ピンを直接駆動できます。 5V信号をESP32入力に供給してはなりません。リミットスイッチなどは3.3V信号を使用する必要があります。

$4 の設定値

原文

By default, the stepper enable pin is high to disable and low to enable. If your setup needs the opposite, just invert the stepper enable pin by typing $4=1. Disable with $4=0. (May need a power cycle to load the change.)

Google翻訳

デフォルトでは、ステッパーイネーブルピンは無効の場合はハイ、有効の場合はローです。セットアップで反対のことが必要な場合は、$ 4 = 1と入力してステッパーイネーブルピンを反転します。 $ 4 = 0で無効にします。 (変更をロードするには、電源を入れ直す必要がある場合があります。)

ステッパードライバの Enable Disable をソフトウェア的に行う必要や利点

以下の参考文献を読むまでは思い至りませんでしたが、機能の必要性としては、ステッパードライバの「発熱対策」「ノイズ対策」「消費電力対策」があるようです。Stepper Enable/Disable Pin の出力が、指定された「ディレイタイム」を過ぎると High⇒Disable となり、CNC 作動時は Low⇒Enable となることで必要な時間のみ動かし、発熱やノイズ、電力消費を抑制する仕組みであると想像します。

Grbl_ESP32 の場合、$1=255 を指定することでディレイのかわりに「電力を消費しながら現在の状態で停止し続けさせる」ことが出来るそうです。

加えて、$SLP コマンドによりステッパードライバを Disable にしてモーターを空回りする状態にも変更可能とのことです。

参考文献