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

やりましたー! :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 としてリリース出来れば面白そうなので、開発を続行します。