えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

M5Dialを買ったところ、非常停止スイッチに見えたので作ってみた

MFT2023に行ってきました - えいあーるれいの技術日記の続きです。

最近、M5Dialという新しいM5Stack製品が出たのはご存じでしょうか?

M5DialはM5Stackの派生製品で、従来のM5Stackと同じようなディスプレイやボタンを持ったデバイスです。

新製品が売られたらすぐに入手したいところでしたが、M5Stackは学生やメイカー系コミュニティにとても人気のデバイスシリーズなので、新製品が出たらすぐに売り切れてしまいます。

しかし、今回は特別です。M5Stack製品を取り扱っているスイッチサイエンスはメイカーフェアの企業ブースに出展・出店されており、こちらでも購入することができました。時間割で小出ししてあり、在庫にも余裕がありそうな雰囲気でした。

イカーフェアの会場では独創的で魅力的な作品で溢れており、ものづくりのモチベを爆上げしたのでとりあえず1つ買って帰ることにしました。

M5Dialとは?

M5Stack社が新しく販売を開始したM5Dialはこれまでの四角いM5Stackとかなりイメージが異なる製品です。

まず目を引くのがこの円形のデザイン。

これまでのM5Stackと同様に画面はタッチ可能な240x240のディスプレイとなっています。

一方で、灰色の外周はエンコーダとなっており、ダイヤルを回すことで回転量をカウントすることができます。

また、エンコーダ部分はボタンとなっており、押し込むことでタクトスイッチのような入力ができます。このボタンは押し込める場所を探すのが少々大変なので、目印をつけると良さそうです。

もう一つ特徴的なのはチップの実装です。

これまでのM5Stackと異なり、裏面にM5StampS3という別製品が載っています。

そのため、M5Stampを交換したりIOを引き出して他のデバイスに繋げたり…という改造もしやすくなっていそうです。


非常停止スイッチ…?

話が変わりますが、秋になると高専ロボコンという高専生がテーマに沿って作ったロボットを競わせる大会が毎週各地区で行われるようになり、私は毎週見ています。

地区によって雰囲気は異なりますが、どこのチームもルール発表から半年でかなりのクオリティに仕上げてくるのでかなり見応えがあります。

全国大会は例年12月頃に行われるのでこちらも楽しみです。


そんな高専ロボコンですが、他のロボット競技と少し異なるのが、安全対策でしょう。

ロボコンの安全対策はプロと比べるとすっぽんのようなものですが、仕様書を書かせたり安全装置を規定の場所に取り付けたりとやたらうるさい傾向にあります。

黄色の外枠と赤い丸状のボタンがついている非常停止スイッチはどのロボットにも取り付けられているので一際目立ちます。(そして景観を損ねる)

実際の工作機械や自動機には必ず取り付けられており、身近なところだと駅のホームについていたりします。


さて、M5Dialに戻ると、中央のOLEDは赤く光りますし、ダイヤルは非常停止スイッチの解除を想起させます(?)

…あれ?これ非常停止スイッチを作れと言っているようなものではないか?と思い、とりあえず作ってみました。

platformio.iniの書き方

本来は環境構築も個別に書く予定でしたが、思ったより簡単で非常停止ネタもできたのでここでまとめて載せます。

PlatformIO(Arduino) + M5stackの組み合わせはESP-IDFと並んでM5Stack開発の定番なのでここでは設定のみ載せます。


M5Stackシリーズにはインタフェースの互換性を保つためのライブラリ「M5Unified」と「M5GFX」があり、同じソースコードで別のM5Stackを動作させることができるすごいソフトウェア資産があります。

今回はそれらのライブラリを活用します。

以下はPlatformIOを使用した設定ファイルです。使用する際は開発用ライブラリのルートディレクトリに platformio.ini を作成します。

[env:m5dial]
platform = https://github.com/platformio/platform-espressif32.git#v6.4.0
board = m5stack-stamps3
framework = arduino

monitor_speed = 115200
upload_speed = 115200
upload_device = /dev/ttyACM0

lib_deps =
    https://github.com/m5stack/M5Dial@^1.0.0
    https://github.com/m5stack/M5GFX@^0.1.10
    https://github.com/m5stack/M5Unified@^0.1.10

platform_packages =
  framework-arduinoespressif32@https://github.com/espressif/arduino-esp32.git#2.0.14


実際作成した機能

ソースコード自体はGitHubにアップしているので以下のURLを参照してください。

github.com

全ての機能をスレッド分けして encReadTask をCORE0で、それ以外をCORE1で処理しています。

  • encReadTask:エンコーダの読み取りを行うタスク
  • outputStatusTask:現在の状態を読み取って画面を更新するタスク
  • updateStatusTask:ボタン操作などで状態遷移を行うタスク
  • buzzerTask:ブザーを鳴らすタスク


操作はシンプルで、ボタン押下待ち状態(赤画面)の時にボタンを押すと非常停止状態になり、ブザーが鳴ります。非常停止状態の時にダイヤルを回すと解除できます。

最初は45°くらい回して解除にしようと思っていましたが、エンコーダ自体に抵抗があるので、1クリックで解除できるようにしました。

外装をつけたらもはや非常停止スイッチ(¥5500)ですね😇

このスイッチは押しにくい上に、非常停止スイッチ自体はモノタロウで探せば駆動電源を切断できるやつが3000円くらいで売られているので代替にならないということだけはご留意ください。

ロボコンだと無線非常停止スイッチが必要だとのことなのでもしかしたら需要あるかもですね🙃(実装自体はApache2.0なのでご自由にパクッてください)