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

同じことを考えた人はいたようで、Grbl_ESP32 の Issue に投げてあります。余り良いアイデアではなかった様子。

オリジナルのソースからも espduino.h は削除されています。
https://github.com/bdring/Grbl_Esp32/blob/master/Grbl_Esp32/Machines/espduino.h

なお、CNC Shield を ESPDuino で使うなら Stepper Enable/Disable に向う3.3V に対する昇圧用プルアップ抵抗は外しておけとのアドバイス有り。

https://www.gitmemory.com/issue/bdring/Grbl_Esp32/369/609116523
https://forum.protoneer.co.nz/viewtopic.php?t=7478

以下には EN/GND をショートさせる話が出て来ます

検索するといろいろな情報がありましたが、それぞれの正誤についてできる範囲で裏付けを取ってみます。

Stepper Enable/Disable に向う3.3V に対する昇圧用プルアップ抵抗の排除/バイパス

必要

おすすめできない。

  • STEPPERS_DISABLE_PIN を EN に電気的に接続しない場合
    • →プルアップ抵抗と EN/GND のショートで運用
  • STEPPERS_DISABLE_PIN を EN に電気的に接続する場合
    • EN/GND はショートさせず、プルアップ抵抗を外し Grbl_ESP32 から STEPPERS_DISABLE_PIN の High と Low を制御させ運用

これ以外でも信号線に 5V が来そうな部分には対策が必要と思われる

ESPDuino 向け CNC Shield はボードにおける 5V ピンと 3.3V ピンの役割を入れ替えて書いてみます。

5V の給電ラインが放置されたままであり、根本解決とはならない。
ESP32 では Arduino UNO で 5V を利用していた箇所は 3.3V を使うよう書き換えること(ESP32 と繋げない経路の 5V は変更しないで良い)。

例えば
Screenshot_2021-06-26 Arduino-CNC-Shield-Scematics-V3 XX_ jpg (JPEG 画像, 1224x801 px)
↑これを↓このように変更

給電電圧 最低 標準 最高
VDD 3.0 3.3 3.6
Vhi=VDD+0.3 3.3 3.6 3.9

データシートから判断すると、信号入力時、3.9Vを超える入力はESP32を破壊する可能性があるとのことです。でも意外と壊れないらしい

※ 自分の環境では、プルアップ抵抗を外すのみでショートさせない場合、WebUI は立ち上がるもののシリアルからの表示が壊れました(抵抗を戻すと直りました)。

5V の入力に関しては後のポストで述べるように 3.3V への差し替えが必要と思われます。

出典

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf#page=42
https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32e_esp32-wroom-32ue_datasheet_en.pdf#page=14
https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf#page=15

関連
https://esp32.com/viewtopic.php?t=11904
https://rikoubou.hatenablog.com/entry/2017/06/08/134343
https://ht-deko.com/arduino/esp-wroom-32.html

EN/GNDのジャンパによるショート

不明
→なぜエラーを回避出来るのかよくわからない(よくわからないので回避策としておすすめできない)。

こちらも 5V 給電が放置されたまま。回避策としても余り良いとは思えず。

EN:High⇒Disableであるため、ステッピングモーターを動かす際は Low にする必要有り。

CNC Shield の ENが IO12 に繋がってしまう ESPDuino ボードを使っている場合、EN/GND を 10kΩ等の抵抗を介してショートさせる(プルダウン抵抗を用いる)ことで BuiltinBASIC の起動手順との衝突を回避可能でした。なお、例えば「Wi-Fiアルデュイーノ IoT Express」は CNC Shield の EN が IO17 に繋るため、この問題は起こらないものと思います。

度々ごめんなさい。通常の使用では EN/GND はショートさせず Grbl_ESP32 から制御します。常時ロックがかかるようにしたければ $1=255 を、一時的にフリーにしたければ $SLP をそれぞれ使います。

詳細は

または

もしくは

をご覧下さい。

EN/GND をショートさせた場合に流れる電流をテスターで測定したところ 45.1mA。そこそこありました。

上記の morih さんの投稿で分かりましたが、原因は STEPPERS_DISABLE_PIN とプルアップ抵抗の役割の重複でした。

そこでとりあえず 10kΩ の抵抗を介して EN/GND をショートさせたところ、High は上手くいくことに。なお、結果的に EN に対してプルダウン抵抗とプルアップ抵抗の双方が繋るという変な回路になっています。ショートさせずに Low にする場合は許容電流の大きい抵抗値の小さいレジスタ(通常のプルダウン抵抗)を繋ぐのが良さそうです(むかし許容電流を考えずにボリュームを 12V に直結させ抵抗値を下げたところ、ボリュームを発火させてしまいました。アーク放電を伴い燃えるカーボンが儚くも美しかった)。

※ 検索するとCMOS は、ハイを与える場合に、直接電源に接続しても構いません。ローを与える場合は TTL も CMOS もグラウンドに直接接続して構いません。との記述に出会いました。

出典:プルアップとプルダウン抵抗の値ってどうやって求めるの? - 半導体事業 - マクニカ

ですが、CNC Shield + ESPDuino の本回路では測ってみると接地時の電流がそこそこあったので少し絞っておきたいと考えました。

CNC Shield の使い方を間違えていました。

ボード公式サイト

https://info.protoneer.com/1

https://translate.google.com/translate?hl=&sl=en&tl=ja&u=https%3A%2F%2Fblog.protoneer.co.nz%2Farduino-cnc-shield-v3-00-assembly-guide%2F%23comment-662

EN が“エネーブル”なので、上記の内容と併せて、EN/GND のショートは外部ステッパードライバー(外部ステッピングモータドライバ)の有効無効の切り替え。 ENより下のピンは外部のステッパードライバからの入力受け付けと推測。

何故自分の環境で EN/GND をショートしないと Grbl_ESP32 が再起動のループに陥ったのかはここからだけでは読み取れませんでした。ソースコードの Machines でピンアサインを間違ったとかでしょうか。

原因(おそらく)判明。 やはり、BuiltinBASIC の立ち上げ手順と衝突しています(ht-deko 氏の ESP32 の記事によると、BuiltinBASIC は IO12 を 10kΩ抵抗でプルアップした状態(IO12 と 3V3 を10kΩ抵抗で繋ぐ)でリセットまたは再起動し立ち上げるそうです)。かといって、完全にプルダウンしてしまうと今度はモータードライバへのENに支障があるかもしれません。よってモータードライバを立ち上げられ、かつ BuiltinBASIC は立ち上がらない程度の抵抗を介して EN/GND をショートするのが良さそうです。 モータドライバはソフトウェア側から制御するのが本来の姿のようです。EN/GND の開閉でドライバを ON-OFF したい場合は CNC Shield の IO12 に刺さっているピンを(切るなりして)物理的に無効化しておきます。

補足事項

サンプルコード内の 4axis ヘッダファイルは、ボードのジャンパを適切に設定した上でスピンドル用の信号線を流用してモーター A の制御に充てるものなので、そのままだとただの「4軸ステッパーモーターシールド」と化します。ESPDuino から別の信号線を引っ張り出さずにスピンドルを使いたい場合、3axis 用ヘッダファイルを用いて下さい。3axis の場合、モーターAの制御はジャンパ設定により、X,Y,Z のどれかの軸のコピー動作に設定出来ます。

「いいね!」 1

ESPDuino-32 の I/O まわり

waves ESPDuino-32 そのもののデータシートはまだ見つけられていませんが、改良元と思われるボードのデータシート/回路図です。www.doit.amESPDUINO-32をキーに検索しました。

waves のものではシルクが変更されており、IO35 → IO36 となっていました。また、TX0 及び RX0 の文字が消えていました。加えて、USB Type-B が USB micro Type-B に変更されています。

↓こちらのサイトでまとめられている wroom32 のピンアウトと比較してみると分かり易いです。
https://ht-deko.com/arduino/esp-wroom-32.html

↓データシートにピン毎の諸々の対応関係が載っています。
https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf#page=15

Grbl_ESP32 で使う場合、ESPDuino-32 系の基本的なレイアウトはほぼ共通っぽいですが、モノによって少しづつ PIN 配置が異なっているようですので購入した ESPDuino-32 に応じた変更を Grbl_Esp32/Grbl_Esp32/src/
で指定した Grbl_Esp32/Grbl_Esp32/src/Machines/Machine.h 内のヘッダに対して行う必要がありそうです。

おまけとして、waves の ESPDuino-32 のアマゾンのレビュー を参考に IO02 を出力に向け Lチカを行うと、外部の LED と同期して内蔵 LED がピンクに光りました。

IO15、IO33、IO32 及び SD2、SD3、CMD、CLK、SD0、SD1 は自分ではんだ付けすればラインを引っ張り出せる構造です。うまく組めば SD カードも行けそうですし、Grbl_ESP32 のプロトタイピング用と考えるとなかなか使い勝手が良いかも。

追伸

ht-deko さんのまとめを参考に CNC Shield をもう一度眺めると、IO12 に STEPPER ENABLE/DISABLE が繋がっていますが、IO12 は同時に BuiltinBASIC の起動に関連するピンだそうで、これが手元の CNC Shield で EN/GND のジャンパによるショートを行わないと再起動ループに陥ることに関連しているものと推測します。プルアップ抵抗を外すのと EN/GND をショートさせるのが似たような意味を持ったのかな?

以下は CNC Shield 公式より回路図とレイアウト


こちらは Grbl 公式より Arduino 側ピン配置

Grbl 0.8x

Grbl 0.9+

waves の ESPDuino-32 のピンと見比べると改造の際に分かりやすい

「いいね!」 1

諸々裏付けを得たかったので、CNCシールドの PCB パターンの表裏を見比べてみました。

※ 画像は CNC シールド公式より。

EN のラインを青で、5V のラインを赤で塗り分けたものが以下。

EN/GNDをジャンパで短絡させた場合に動作が安定したのは電圧降下が起きた為と予想。

改造計画


↑これを↓こうする

  • 10kΩ を切ってしまうのは EN の ON-OFF に関して回路の意味合いが変わってしまうので避けたい。
  • ESP32 側に 5V を流したくない。

よって、

  • 案1
    • 5Vピンを切断、給電されなくした上で 3.3V をバイパス。
    • 課題:低電圧によりステッピングモータドライバが正常動作しない可能性あり。
  • 案2
    • 10kΩ 抵抗の 5V 側を切断し、3.3V と繋ぐ。
    • 課題:5V 側のどこかで短絡が起こった場合に ESP 側に 5V が行くのが不安。

案1 がだめな場合、案2 を試してみます。

検索してみましたが、データシートを見る限りでは、ステッピングモータドライバ「A4988」は 3.3V 系で動きそうです。
https://www.pololu.com/file/0J450/a4988_DMOS_microstepping_driver_with_translator.pdf#page=4

種別 最低電圧 最高電圧
VDD 3.0V 5.5V

互換品のドライバユニットを使う場合、事前にデータシートで動作電圧の確認をしておくと安心です。

参考文献

Vcc,Vee,Vdd,Vssとは - 我孫子おもちゃ病院 壊れたおもちゃ無料で治療します。

FAQ 1008667 : 電源電圧 Vdd = -0.3~7.0(V)、入力電圧Vin = -0.3~Vdd+0.3(V)となっているので、 入力端子には -0.3~7.3(V)まで印加してよいのですね? | Renesas Customer Hub
https://ja-support.renesas.com/knowledgeBase/17793150

「いいね!」 2

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