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

USB to Serial

waves の ESPDuino-32 は「USB Serial 制御用に CH340 を積んでいるのでドライバ入れてね」とのこと。

こちらが Windows 向け

こちらが Linux 向け

こちらが macOS 向け

GitHub に転載されているもの

書き込みモードへの切り替え

自分が遭遇した奇妙な現象が、スケッチ書き込み時、Linux では自動書き込みに失敗し、Windows では成功するというものでした。Linux 版 Arduino Studio では書き込みに esptool を利用しないのかもしれません。

参考文献:
https://ht-deko.com/arduino/esp-wroom-32.html#24

自動書き込みに失敗する場合、手動で ESP32 の状態を書き込みモードに切り替えます。
具体的には、IO0(アイオーゼロ)とGNDを短絡しリセットボタンを1回押します(IO0 ボタンは ESPDuino-32 には付いていないため、グラウンドへの短絡を利用します)。

参考文献:
https://ht-deko.com/arduino/esp-wroom-32.html#04_02
https://www.amazon.co.jp/gp/customer-reviews/R3N5YS6W4Z5BE3/

いやー、動きました、動きました :smile:

基板を改造して動かしてみたところ、案1( 5Vピンを切断、給電されなくした上で 3.3V をバイパス)でステッピングモーターを動かすことが出来ました。どうやらこの方向性で問題なさそうです。


KiCad を学習しながらの作業になるので少し時間はかかると思いますが、こちらの方の CNC Shield をベースに 5V と 3.3V の経路に切り換えスイッチを入れて、Arduino UNO と ESPDuino の双方に対応可能なシールド用 PCB パターンを作ります。

5v3v_switch

加えて、プラグの接続部を抜け防止がついている、日本圧着端子の「XHシリーズ」のようなコネクタに変更することで、振動や引っ張りに対してもいくらか強く出来ると思います。

コネクタが密集している部分については、リボンケーブル(フロッピーディスクドライブやPATAで使われていたようなモノ)と脱落防止付きフラットケーブルコネクタで外に伸ばして、端子台のようなものに付ければ取り回しがしやすくなるはず。

ノイズキャンセリング部も端子台側基板に付けることで、CNC Shield 側基板の改造は最小限で抑える予定です。現在リミットスイッチ関連のノイズ対策には「フェライトコア」、「コンデンサ」、「光ファイバによる信号伝達」、「逆位相のノイズによる相殺」の4方式を考えています。後に行くほど大掛かりなので、出来ればフェライトコアで解決出来て欲しい。

このアイデアを形に出来た暁には、プロトタイピングでの使用を主目的としつつ、そこまでヘヴィではない、危険を伴わない用途でも使用可能な「Grbl_ESP32 入門機」として提案出来れば良いな、と思っています。

「いいね!」 1

Horus Ciclop のターンテーブルをドライバ Y で回してみました。

今回の流れ

CNC 流用の 3D スキャナーを作りたい

Grbl では拡張性が心もとないので Grbl-ESP32 で試したい

無茶な使い方をして壊しても財布と心の痛みが比較的小さくてすむ実験用のCNCボードが欲しい
→SDGsの時代ですし、そもそもボードがもったいないので破壊前提ではなく、フェイルセーフを施して出来る限り中枢パーツが死なない作り、やり方を目指します。

そうだ CNC Shield を使おう

5V 用じゃないか

改造すれば 3.3V 用として動かせるよ

どうせなら PCB パターンを新たに用意して新種のCNC Shield 作ろうぜ←イマココ

……もうね、アホかと。馬鹿かと。おまえどれだけ脱線するんだと。

ここから再び上へと辿っていき新型 3D スキャナへと至るグレートジャーニーが始まるのです

疲れてハイになっていたようです。適度な休息は大切ですね、失礼致しました。

冷静に考えてみると、好きにいじれる Grbl_ESP32 機は今後を考えれば是非とも開発しておきたいもので、CNC Shield の 5Vピンを切断、給電されなくした上で 3.3V をバイパス するやり方の確立により、一応の目的は果たされました(実際に行う際ははみ出したはんだでパターンをブリッジ、ショートさせないようご注意下さい)。

しかし、幾つかの改良を施すことで CNC Shield の使い勝手を向上させておくことは今後これを用いた開発を進める上で有用です。また、基本的には 5V と 3.3V の切り替えを入れるだけという今回の設計変更作業を通し KiCad や回路設計に慣れておくことは、この後予定しているスキャナプローブの設計と開発をスムーズに進める上で良い予行演習となるでしょう。短期的には遠回りですが、長い目で見るなら近道であると判断します。

ESPDuino で CNC Shield を利用される際は、念の為 Analog Input がシルク印刷通りか確認することをおすすめします。

ESPDuino の Analog Input のシルク印刷はモノによってはあてにならないようです。

※ 画像は waves の ESPDuino-32 の商品説明のスクリーンショット

手元の物だと IO36 と印刷されている箇所(IO4のとなり)が、商品説明では IO35 となっており、実際チェックすると商品説明画像が正しく IO35 でした。GitHub にあげたコードは手直ししておきます。

Abort:IO02
HOLD:IO04
RESUME:IO36→IO35
COOLANT:IO34
A4:IO36
A5:IO39

今回 A4 が余ったのでこちらを外部アタッチメントとの信号線として使えそうです(なお、拙作サンプルコードでは A5 をプローブに割り当てています)。

ピンを確認する際に気になったのがボード単体で試した際のノイズで、IO36 と IO39 では生じませんでしたが、IO35 と IO34 では変なノイズが乗ってきます。これはアナログ距離計を繋いで計測する際に障害となり得ます。よってこのノイズが個体差なのか ESPDuino に全般的に生じる問題なのか検証する必要が出てきました。

参考文献
【ESP32】analogReadする方法 - ソースに絡まるエスカルゴ
https://rikoubou.hatenablog.com/entry/2017/06/29/135819

「いいね!」 1

ESPDuino では SCK MISO MOSI SS には IO18 IO19 IO23 IO5 が割り当てられており、ここには CNC Shield から Spindle の制御や Z-axis と Y-Axis の Limit が繋がって来るため SD カードの増設は厳しいかもしれません。

ESPDuino-32 とその変種において増やせそうな PIN は IO15 IO32 IO33 の三つで、これはデータシートによると以下のようになっています。

ピン 役割
IO15 GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3
IO32 GPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input), ADC1_CH4, TOUCH9, RTC_GPIO9
IO33 GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output), ADC1_CH5, TOUCH8, RTC_GPIO8

※ IO32 と IO33 は crystal oscillator(=水晶発振子)の増設に使えるそうです。

なお、ランドが用意されている CLK SD0 SD1 SD2 SD3 CMD はそれぞれ IO6 IO7 IO8 IO9 IO10 IO11 に対応していると思われ、これは「WROOM-32 では内蔵 Flash で使うので別の用途に使わないで」とのことです。

  • Pins SCK/CLK, SDO/SD0, SDI/SD1, SHD/SD2, SWP/SD3 and SCS/CMD, namely, GPIO6 to GPIO11 are connected to the integrated SPI flash integrated on the module and are not recommended for other uses.

出典
https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf#page=9
https://ht-deko.com/arduino/esp-wroom-32.html#13_03
https://ht-deko.com/arduino/esp-wroom-32.html#15
https://ht-deko.com/arduino/esp-wroom-32.html#18

Wi-Fiアルデュイーノ IoT Express

https://toragi.cqpub.co.jp/tabid/848/Default.aspx

こちらを使う場合、はじめから microSD カードスロットが付いていますが、ピンのやりくりが必要である点は共通の課題として残ります。

※ 名前に「Wi-Fi アルデュイーノ」とありますが、ESP32 系です。

Grbl とステッピングモータドライバ「A4988」の EN について

EN/GND に 10kΩ を用いた短絡ではドライバの EN が High⇒Disable の状態でモーターを回すため、有信号時に回転こそ行われるものの、無信号時に踏ん張りませんでした。通常行うように抵抗値の小さい許容電流の大きい抵抗器を繋いで Low 側に引っ張るのが良さそうです(短絡させると45.1mAだったので R で少し絞りたい)。

EN/GND を短絡せず、Grbl_ESP32 で $1=255 と指定するとディレイの時間制限がなくなり、無信号時も EN が Low⇒Driver Enable のままで保たれます。

逆にフリーにする場合は $SLP を実行します。

参考文献

Grbl

3.3V-EN

High ⇒ Disable

  // Enable stepper drivers.
  if (bit_istrue(settings.flags,BITFLAG_INVERT_ST_ENABLE)) { STEPPERS_DISABLE_PORT |= (1<<STEPPERS_DISABLE_BIT); }
  else { STEPPERS_DISABLE_PORT &= ~(1<<STEPPERS_DISABLE_BIT); }
// Define stepper driver enable/disable output pin.
#define STEPPERS_DISABLE_DDR    DDRB
#define STEPPERS_DISABLE_PORT   PORTB
#define STEPPERS_DISABLE_BIT    0  // Uno Digital Pin 8
#define STEPPERS_DISABLE_MASK   (1<<STEPPERS_DISABLE_BIT)

A4988

High ⇒ Disable

https://www.pololu.com/file/0J450/a4988_DMOS_microstepping_driver_with_translator.pdf#page=10

Enable Input (ENABLE ). This input turns on or off all of the FET outputs. When set to a logic high, the outputs are disabled. When set to a logic low, the internal control enables the outputs as required. The translator inputs STEP, DIR, and MSx, as well as the internal sequencing logic, all remain active, independent of the ENABLE input state.

入力を有効にする(ENABLE)。 この入力は、すべてのFET出力をオンまたはオフにします。 ロジックハイに設定すると、出力は無効になります。 ロジックローに設定すると、内部制御により必要に応じて出力が有効になります。 トランスレータ入力STEP、DIR、MSx、および内部シーケンスロジックはすべて、ENABLE入力状態に関係なくアクティブのままです。(Google翻訳)

※ 最近の Google 先生の翻訳は本当に、恐いくらいに滑らかですね。

resister

左から、10Ω、100Ω、10kΩ の短絡用兼プルダウン用抵抗。

current

100Ω 経由で 45.1mA から 24.6mA 程に減少。10Ωでは電流減少は誤差レベル。そしてコードやリード線がスパゲッティ。なお、10kΩ では再起動/エラー地獄は解消するも、モータドライバ向けプルダウン抵抗としては使えず、です。

閑話

AVR 系の Arduino UNO(8bit)

ESP32 系の ESPDuino-32(32bit)

これに加えて、ルネサスの RL78 系(16bit)があると何かと多様で面白そうだと思いました。8bit、16bit、32bit ときれいに揃いますし。

実用面でも、例えば複数のハードに対して Grbl が移植出来ていればどれかの供給に問題が生じてもどれかは手に入るだろうと思います。

脱線ついでに将来的に RL78 による OSHW で 88 や 98 のオマージュ機、「PC-78」のようなものが作れたら楽しそう。

ところで、ルネサスコアが載ったマイコンの最上位シリーズが RX なので、いずれ RX-78 が出るんだろうなと予想します。自分は量産機スキーなので RGM-79 の方が好みですが。

閑話の最後に、ガンダム 40 周年であることですし、ルネサスには RL シリーズを RGM シリーズと改称して欲しいものです……冗談ですごめんなさい。

↓ボードの名前も考えてみました。

RXDuino-220-GM

  • レクスデュイーノ、にーにーぜろ、じーえむ
  • an Arduino like board based on Renesas RX220 for Gadget Makers
  • ジムの王 ※ Arduino って名称はイタリアの王様の名前が由来だったんですね、知りませんでした。

RLDuino-78-GF

  • ラルデュイーノ、ななはち、じーえふ
  • an Arduino like board based on Renesas RL78 for Gadget Fabricators
  • らるさん with グフ ※ 本来のグフのスペルは GOUF ですが、語呂合わせを思いつきませんでした。
「いいね!」 1

そもそもEnable信号はドライバーICの入力で、こんなものに電流が流れるわけがないのです。
LOWに固定するのであれば、最初からマイコンに繋がずにドライバーICのENABLEをGNDに落としておけば良いと思うのですが。

「いいね!」 1

ご指摘ありがとうございます。回路の保護にポリスイッチかヒューズを入れなくてはならないかと悩んでいたので助かりました。ここは電流があるべき場所ではないのですね。

仮に プルアップ抵抗から GND へ直接流したとしても、単純に計算すると 3.3V÷10kΩ=330μA となるはずで、45.1mA はその意味でも値が大き過ぎるようです。

手元 のCNC Shield 基盤がどこか短絡を起こしていないか、ESPDuino 側から電流が来ていないか、もしくはプルアップ抵抗の抵抗値を間違っていないか、あるいはテスターが故障していないか、このあたりを確認してみます。

御指摘の変更を、Arduino の「8番」 ⇒ ESPDuino の「IO12」の Stepper Enable/Disable を Grbl_ESP32 側で常時 Enable にした上で、Shield 側のピンもしくはパターンを切断、EN - 3.3V 間のプルアップ抵抗を切断、EN を GND にジャンパでショートという形で行ってみます。

この場合、ESP32 における IO12 の BuiltinBASIC にまつわる問題も生じなくなると予想されますし、ESPDuino 用 CNC Shield はこの方向で考えてみます。

加えて、この変更により IO12 も空きますし、うまく遣り繰りすれば SD カードを繋げるようになるかもしれません。本当にありがとうございます。

CNC Shield を加工、IO12 の Stepper Enable ピンを引っこ抜いて、SCK、MISO、MOSI、SS に対応する IO18、IO19、IO23、IO5 に刺さるはずのピンを上に向けました。上に向けたピンに IO12、IO15、IO32、IO33 を振り替えた上で、空いた IO を使い SD カードの読み書きを試す予定です。

この状態で EN と GND を繋げた際の電流が無視出来る程小さい場合はとりあえずプルアップ抵抗とジャンパによる内蔵ステッピングモータドライバの ON/OFF 機能を温存、ショートがないにも関わらず大きめの電流が流れる場合はドライバの ON/OFF 機能を取り除くことにします。

この ON/OFF 機能を外部に引っ張り出して石油ストーブに搭載されているような錘の慣性による地震/転倒検知装置と組み合わせると接点オープンで自動でドライバを Disable させられるのでは?と思いついたので、可能であれば温存させて安全装置に応用してみます(このメカニズムはかなり古い型の石油ストーブをバラした際にも見かけたので、特許関連は心配ないものと思います)。

参考:石油ストーブ 地震(揺れ)で自動消化する原理

改造品

改造後、EN と GND の短絡でおよそ 320μA でした。オームの法則で算出した、10kΩ を繋いだ場合の値とほぼ近いものが出ています。

よって、おかしな電流は IO12 が関係していると判断出来ます(ただし結論を確定するには他の ESPDuino と CNC Shield の組み合わせでも同じ問題が生じるか検証が必要)。

※ IO0/IO2/IO5/IO12/IO15 の 5 ポートは ESP32 の起動モードに関係するということで、どうやら取扱注意です。

参考文献:
https://ht-deko.com/arduino/esp-wroom-32.html#20

ところで、内蔵ステッピングモータドライバの ON/OFF 機能を振動検知を使って安全装置に使う場合、スピンドルのブレーキをどう用意するかという問題がありました。加えて、ドライバが切れるとステッピングモーターがフリーになるのが厄介です。CNCの構造にもよりますが、地震検知時の安全装置を組込む場合こちらにもブレーキが必要です。いいアイデアかと思ったのですが、思ったより使い勝手が良くありませんでした。

したがって、地震/転倒センサについてはソフトウェア的に処理させるやり方、もしくは完全な機械式で考えてみます。

他にドライバ ON/OFF を積極的に残す理由が思い浮ばないため、必要になれば再設計することにして、構造を単純化する意味でも ESPDuino 用 CNC Shield はモータドライバの EN を GND 直結として書いてみようかと思います。

余談
夢中になって半田付けしていたら、自分の手の位置をわすれていて軽くジュワっとやってしまいました。幸い指先の軽い水膨れだけで済みましたが、皆さんも半田付けの際には夢中になり過ぎないようご注意下さい :face_with_head_bandage:

回路の意図とかあまり見てないのですが、CPUに付いているプルアップ抵抗は

  1. スイッチなどを繋ぐ時に便利
  2. 入力ピンに設定された場合に静電気などで壊れにくくするため
    という意味があります。
    通常良くあるプルアップはオープンコレクターやオープンドレインで電流を吸い込む事しか出来ない出力を使うためですが、この場合は違います。

ショートしたときに40mAも流れると言う事はマイコンのピンが出力に設定されていてハイレベルを出力している事が考えれます。

「いいね!」 1

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

確認したところ、下のコード、 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:全てのステッパーモーターの電源を入れる
https://reprap.org/wiki/G-code#M17:_Enable.2FPower_all_stepper_motors

M18:全てのステッパーモーターの電源をオフ or 回転をオフ
https://reprap.org/wiki/G-code#M18:_Disable_all_stepper_motors

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

https://forum.protoneer.co.nz/viewtopic.php?t=267

上記「問題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

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 にしてモーターを空回りする状態にも変更可能とのことです。

参考文献

EN 3.3V 10kΩプルアップ抵抗有り
EN/GND をショートせず

STEPPERS_DISABLE_PIN→32
Enable時(⇔Low)→+322μA
Disable時(⇔High) →-129μA
※ EN - IO32 間の電流を測定
※ EN を テスターの+、IO32 をテスターの − に接続

上記配線で、Grbl_ESP32 側の設定により EN の ON/OFF が出来ました。
$1=255 にした場合に停止時もモーターがフリーにならないことも確認出来ました。

また、同じ条件でプルアップ抵抗のみ切断した回路では

Enable時(⇔Low)→0μA
Disable時(⇔High)→-132μA

となりました。

プルアップ抵抗有りだと、Low 側で OUTPUT に設定した IO に抵抗の経路分の電流が流れ込んでいるように見えます。

Versions

  • Version 3.10+
    • Added Support for GRBL 0.9v with PWM Spindle.
  • Version 3.00 (4 Axis)
    • Enlarged board to add a 4th Axis that can clone the X,Y or Z axis. With a 4th option to use pin D12-13 to control it.(Setting up the 4th Axis)
    • Added a breakout header for all the Axis’s.
    • Added a communication header for UART(Serail) and I2C.
    • Added the a connector for an optional fuse.(Fuse not supplies as it needs to be selected for the current that will be used.)
    • Capacitors are mounted horizontally giving more clearance between them and the stepper drivers. Good for ventilation.
    • Added a pull-up resistor on the axis enable pins. This prevents the pin from being in a floating state.
    • Added 2 mounting holes
  • Version 2.02 (3 Axis)
    • Fixed High Voltage label
    • Removed Diode D1.
    • Reduced the number of Via’s.
  • Version 2.01
    • Added a 5V Breakout
    • Filled in both sides with Ground Copper
    • Moved RX/TX pins to the side so that 26-Pin header can be used. Same as the headers on a Raspberry Pi.
    • Small Text Changes
  • Version 2.00
    • First official version of the CNC Shield.
    • All pins used by GRBL has been broken out.

やっとボード開発者の考えがわかりました。

Ver3.00 の Changelog で

Added a pull-up resistor on the axis enable pins. This prevents the pin from being in a floating state.

軸イネーブルピンにプルアップ抵抗を追加しました。 これにより、ピンがフローティング状態になるのを防ぎます。(Google翻訳)

の記載があります。これから推測すると、morih さんの提示された

を意図してのプルアップ抵抗だったようです。

STEPPERS_DISABLE_PIN を EN に電気的に接続しない場合はプルアップ抵抗が意味を持つと考えられますが、接続する場合 floating state 対策は不要であり、従ってこの抵抗も不要と判断します。

STEPPERS_DISABLE_PIN から High が来ている時点で pull-up resistor と役割が被っています。

「いいね!」 1

やりましたー! :grin:

  • 小型卓上 CNC を用いて実験。本装置(ESPDuino+改造CNC Shield)から 3 軸制御が可能であることを確認しました。

  • 加えて、3.3V 入力を持つ Arduino 用 SD カードリーダー(5V 入力のみのリーダーもあるので注意、自分は買って繋いでから気付きました)の取り付けと読み取りにも成功!

  • さらに、microUSB から ESPDuino に給電している場合、Bluetooth 経由であれば CNC の無線制御も行けました。

    • USB は携帯電話用アダプタから給電のみに使用、PC を繋がずに制御可能、Bluetooth 経由の ESPコマンドで SD カード内の G コードを読み取らせ、ヘッドを移動させることも出来ました。

自分が遭遇した問題

  • Wifi/WebUI 経由で動かそうとすると落ちる

  • DC プラグによる ESPDuino 給電時、動作が不安定

  • microUSB による ESPDuino 給電時、コネクタに少しでも触れると再起動する(接触不良?)

  • 余計な振動をあたえた、余計な力を加えた場合もフリーズ/再起動する

割と振動に弱いのをどうしたものか。とはいえおとなしい用途向けの実験用としては十分ではあるのですが:thinking:

今後の予定

  • GRBL-ESP32 をリビルドし、4 軸制御が可能か確認

  • Partition Scheme で “Huge APP” を選ばないとビルドが通らない原因を調査

    • You must select the Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) partition scheme under the Tools...Partition Scheme... menus, otherwise the firmware will not fit. との記載があるので、Minimal SPIFFS で行けるはずなのに上手く行きません。
  • Probe 接続部が来ている IO39 はアナログ入力可能→GRBL_ESP32 を経由するアナログ出力距離計の接続テスト

  • ESPDuino 専用 CNC Shield の開発

おまけ、GRBL_ESP32 with Bluetooth

公式ドキュメント
公式おすすめの Android アプリ

https://zeevy.github.io/grblcontroller/index.html

SDカード内データの動作確認に用いた G-Code

※ SDカードのルート(/)に test.gcode として保存。

実験時用いたコマンド

シリアルコンソール(USBシリアル)から

$Bluetooth/Name=ESP32_BT
$Radio/mode=BT
$System/Control=Restart

Wiki によると、ESP32 では Bluetooth と Wifi は排他的であり、BT と WLAN の併用は出来無いそうです。

  • Example: **$Bluetooth/Name=ESP32_BT**. This would set the Bluetooth name to "ESP32_BT".
  • Put the radio mode into Bluetooth mode with the **$Radio/mode=BT**. The ESP32 uses the same hardware for Wifi and Bluetooth, so only one can be used at a time.
  • A reboot is required to change radio modes. Reboot the ESP32 to turn on Bluetooth with that name. You can reboot by power cycling, pushing the reset button on the ESP32 module or sending the **$System/Control=Restart** command.

Grbl Controller(BTシリアル)から

$SD/Status
$SD/List
$SD/Run=/test.gcode

※ コマンド

  • $SD/Status:Get SD Card Status
  • $SD/List:Get SD Card Content
  • $SD/Run:Print SD file

再びシリアルコンソール(USBシリアル)から

$Radio/Mode=AP
$System/Control=Restart

※ Mode

  • AP:AP for WiFi Access Point mode
  • STA:STA for WiFi station mode
  • BT:BT for Bluetooth
  • NONE:OFF

Wiki の記述で $SD/Run が $#D/Run と書かれている箇所がありますが、恐らくは打ち間違え。$SD/Run=/test.gcodeで問題なく通りました。

※ SDカードから動かす場合、gcode ファイルや ncファイルの書き方によっては読み込みに失敗するようです。単なる G コードの羅列であれば割と上手く行く感触です。

※ 手元の iPad(第7世代)では GRBL_ESP32 の Bluetooth を拾ってくれませんでした。Windows 機も同様。Linux 機と Android スマホは行けました。

→SPP(Serial Port Profile)の取扱いについての OS 毎の差が原因と推測します。
参考

SPPでの接続方法とCOMポート番号の変更手順 | IODATA アイ・オー・データ機器
https://www.iodata.jp/support/qanda/answer/s30213.htm
Serial Port Profile - Bluetooth (Is it possible on iPhone?) | Apple Developer Forums
https://developer.apple.com/forums/thread/37608

追伸

うーん、SD 関連では色々難しい話があります。なんだかなぁ。

SD アソシエーションへの加入 - SD Association
https://members.sdcard.org/jp/join/

ねむいさんのぶろぐ | いろいろ試す25
http://nemuisan.blog.bai.ne.jp/?eid=220698

ESP32 ( ESP-WROOM-32 ) で micro SDHC メモリカードを使う場合の注意点 | mgo-tec電子工作
https://www.mgo-tec.com/blog-entry-esp32-wroom-micro-sdhc-01.html

MMC/SDCの使いかた
http://elm-chan.org/docs/mmc/mmc.html

Arduino IDE添付のSDライブラリの修正: 猫にコ・ン・バ・ン・ワ

とりあえず、MMC 対応だよん、と言っておけば大丈夫なのかな?

CMD1による初期化ルーチン が大切(from ねむいさんのぶろぐ)みたいっす。

↑こちらに CMD1 関連が入っているか確認してみます。

Arduino SD Library support for MMC Cards – A BIT OF MYSTERY

↑こちらの方のポストに SD Library for Arduino に “古代の” MMC へのサポートを加える具体的な話が載っていました。これを現行の SD Library に適用、手持ちの ancient な MMC を認識出来ることを確認することで、個人開発であっても何とか言い訳が出来そうです。

ねむいさんのぶろぐ | いろいろ試す26
http://nemuisan.blog.bai.ne.jp/?eid=220939
↑ふたたびねむいさんのブログを眺めると、実際の試行錯誤の過程が。

うーむ。実際に CMD1 初期化が通るカードを用意した上でこれらソースを元に色々試すとしますか。

「いいね!」 1

SDカードの著作権保護の仕組みが知りたい | 日経クロステック(xTECH)

守秘すべきは恐らく著作権保護機能で、個人開発者には高額な年会費もそれを担保する必要からであろうと想像します。

研究開発段階での利用

御社がまだSDアソシエーションに加入しておらず、かつ製品の研究開発段階においてSD規格を利用したい場合には、以下の手続きにより非会員のまま1年間の利用契約を結ぶことができます。

  1. SDアソシエーションと NDA(機密保持契約) を締結する
  2. SDアソシエーションに1,000米ドル支払う

なお、NDA(機密保持契約)の発効日から90日以内に御社がSDアソシエーションの会員となった場合は、支払い済の1,000米ドルは会費に充当されます。

出典:自社製品にSD規格を採用するには | SD Association

!!!実験用コード!!!実用しないこと!!!

かなり邪悪な方法を思いつきました。SD/src/utility/SdInfo.h で指定している

/** SD_SEND_OP_COMD - Sends host capacity support information and
    activates the card's initialization process */
uint8_t const ACMD41 = 0X29;

の ACMD41(0X29)コマンドの内実を CMD1(0X01) に書き換えてみます。

/** SD_SEND_OP_COMD - Sends host capacity support information and
    activates the card's initialization process */
uint8_t const ACMD41 = 0X01;

これで CMD1 対応のカード以外使えないはず。上手くいったら御喝采ということで。

※ Arduino の SdInfo.h

Grbl_Esp32 からの SdInfo.h 呼び出しまでの流れ

(Grbl_Esp32)
Grbl_Esp32/Grbl_Esp32/src/SDCard.h

(Arduino_official)
SD/src/SD.h

SD/src/utility/SdFat.h

SD/src/utility/Sd2Card.h

SD/src/utility/SdInfo.h

Grbl_Esp32 の SDCard.h

上記 uint8_t const ACMD41 = 0X01; の改変のみで済ませる場合、

  // check SD version
  if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) {
    type(SD_CARD_TYPE_SD1);
  } else {
    // only need last byte of r7 response
    for (uint8_t i = 0; i < 4; i++) {
      status_ = spiRec();
    }
    if (status_ != 0XAA) {
      error(SD_CARD_ERROR_CMD8);
      goto fail;
    }
    type(SD_CARD_TYPE_SD2);
  }

Sd2Card.cpp 内に SD と SDHC の判別があるので、MMC として運用する場合は容量 2GB 以下のバージョン 1 の SD カードを用意しておく必要がありそうです。

⑦MMCの初期化が通るSDカードはSDv1のカードのみで一般的に流通している
のは当時2GBが上限だった(例外はあるが)。当然4GB以上のSDHC(SDv2)は
CMD8による初期化必須なのでMMCとしての初期化は一切不可能。
ねむいさんのぶろぐ | いろいろ試す25 より引用

MMC 互換として製作物の一般公開を目指す場合、 A BIT OF MYSTERY さん(Mr.E さん)が行ったような Sd2Card.cpp 及び SdInfo.h を CMD1 に対応させる改変が正攻法であろうと認識します。

加えて、バージョン判別で SDHC 以上のカードは全て蹴るようにしておけばより安全かと。

ここまで徹底する必要があるのかと問われそうですがあなたがweb上で成果を発表したりmaker系イベント等で成果物を販売したいなんてときにSDカードのライセンスを盾に正義感をはき違えたハナクソ野郎に絡まrt 問題点を鋭く見つけ出し追及することに余念がない方の目に止まり貴重な時間を浪費しないためにも論理的防御策を講じておくのはとても重要なことです。
※ 再び ねむいさんのぶろぐ | いろいろ試す25 より引用

メイカームーブメントも文化として定着しつつある昨今、SD アソシエーションが個人開発者向けの 50〜100 ドル / 年(無料ならより嬉しい)程度の限定ライセンスを新設してくれないかなぁ、と期待しています。

なお、SD カードがライセンス的に厳しい場合は SPI 接続等で使えるメモリデバイスをその代用とする方法が考えられます。

参考文献

API 特許問題がやや恐いですが、必要性次第ではソフトウェア側から MMC に見えるメモリデバイスの自作を考えても良さそうです。

「いいね!」 1
  • GRBL-ESP32 をリビルドし、4 軸制御が可能か確認
    • →可能でした……が、チャンネルがいくつか潰れるのが辛い。

とりあえず、3V3 と 5V を入れ替えた「だけ」のやっつけ Shield を SB CNC Shield の改変で作成中です。EN まわりの抵抗も取り除かなくては。

注意点

  • 無線制御する場合は Bluetooth モード(Wifi モード時不安定)
  • 振動に弱いので揺れない用途推奨

Grbl-ESP32 及び ESP32Duino 向けの廉価版実験用 Shield としてリリース出来れば面白そうなので、開発を続行します。