Limgのアイコン画像
Limg 2020年05月04日作成 (2020年05月06日更新)
製作品 製作品 閲覧数 6414
Limg 2020年05月04日作成 (2020年05月06日更新) 製作品 製作品 閲覧数 6414

Arduino で緊急停止ボタンを作ってLチカ

PC用USB緊急停止ボタン

何かの物理システムを作ってると、安全対策に緊急停止ボタンが欲しくなるときがある。
特に、動き出すモータや熱くなるヒータを扱うときは、付けた方が身のためである。

PCを中心としたシステムであれば、PCに通知できれば、他はPCから他を落とせば良い。
となれば手頃なのはUSB入力で、シリアル通信さえできれば良いので開発言語を自由に選べる。

要はこう言うのを作りたい。
完成像

材料

まごの手式フットスイッチ

緊急停止ボタンと言えば、赤いこの類である。
Google 画像検索で「緊急停止ボタン」を検索した結果
このタイプは安全ではあるが、復帰する際に回す必要があって、ひと手間である。
良く失敗するので、個人用ではもう少し手軽に押せるトグルボタンが欲しい。

また、緊急時って焦るものだから、脊髄反射任せで乱暴に叩ける強度が求められる。
このため、自作よりは既製品を改造した方が望ましい。
そこで Panasnic の 「まごの手フットスイッチ」。

https://panasonic.jp/tap/p-db/WH2711KWP.html

これは 100V を直接スイッチする商品であり、半田ゴテなどの外付け電源スイッチに丁度良い。
今回は 100V ではなく、USB に繋げて使うため、ボタンだけの「10Aフットスイッチ」でも良い。

まごの手フットスイッチ WH2711KWP

【まごの手フットスイッチ】WH2711KWP(ボタン&コード)
Panasonic: https://panasonic.jp/tap/p-db/WH2711KWP.html
Amazon .co.jp: 973 円
https://www.amazon.co.jp/パナソニック-Panasonic-まごの手式フットスイッチ-ホワイト-WH2711KWP/dp/B000J3ORUM/

【10Aフットスイッチ ホワイト】WH5709KWP(ボタンのみ)
Panasonic: https://panasonic.jp/tap/p-db/WH5709KWP.html
Amazon .co.jp: 636 円
https://www.amazon.co.jp/パナソニック-Panasonic-10Aフットスイッチ-WH5709KWP-【純正パッケージ品】/dp/B0027WTTU6/

Arduino Pro Mini

当初は Arduino Nano でも使ってコードの途中に別箱を挟んだ構成を考えたが、
フットスイッチを開けてみたら、意外に空間があったので中に埋め込むことにした。
埋め込めた方がスッキリするし、Lチカなどの改造も容易になる。(←本題)

ところが、Arduino Nanoでは、本体がギリギリ入ってもコネクタで入らなくなる。
そこで、より小さい Arduino Pro Mini を試したら、余裕で入るようになった。
今回は秋月で売られている上位互換の AE-ATMEGA328-MINI を使った。
ピンを半田付けしてないので、極力小さくしたい今回の用途では丁度良い。

【AE-ATMEGA328-MINI】(5V 16MHz)
秋月電子通商: 780円
http://akizukidenshi.com/catalog/g/gK-10347/

【Arduino Pro Mini 328 5V 16MHz】
スイッチサイエンス: 1266円
https://www.switch-science.com/catalog/946/

AE-ATMEGA328-MINI とAE-TTL-232R の標準的な接続

USB シリアル変換モジュール FT232RQ on AE-TTL-232R

Arduino Pro Mini を使うには、別途 USB シリアル変換モジュールが必要になる。
Arduino Pro Mini は USB 出力が要らない代わりに小さくしたい用途で使われる。
今回は、USB を使うため構成的には Arduino Nano が良かったが、
Arduino Pro Mini に USB変換を別モジュールを外付けして使うスタイルになる。

今回は秋月で売られている FT232RQ のキット AE-TTL-232R を使った。
AE-ATMEGA328-MINI の説明に接続例まで出ていて、相性が保証されている。

【FT232RQ USBシリアル変換モジュール AE-TTL-232R】
秋月電子通商: 850円
http://akizukidenshi.com/catalog/g/gK-09951/

USB ケーブル

USB ケーブルは 変換モジュールの要請で USB 2.0 microB であれば良いが、
結果的に変換モジュールを使ってもコネクタが小型のを使う必要があった。
結果的に Nakabayashi Digio² から出している ZUH-MR2A20 が丁度良かった。

【Digio2 microUSB 急速充電通信ケーブル 2.1A対応 2.0m 白 ZUH-MR2A20W】
amazon .co.jp:
https://www.amazon.co.jp/NAKABAYASHI-Digio2-microUSB-ケーブル-ZUH-MR2A01BK/dp/B00M92T5QW?th=1

Digio² ZUH-MR2A20W

設計

Arduino を USB シリアル変換に直結し、USB 経由で PC と接続する。
基本機能は、スイッチを監視し、100ms 周期で状態を PC に送るようにする。
また、完成品でも Arduino の書き換えを可能とする。

ハードウェア

回路図

ハードウェア疑似コード

module EmergSwitch(USB usb) { ArduinoProMini arduino; AeTtl232R serial; serial.USB = usb; arduino.DTR = serial.RTS arduino.TX = serial.RX arduino.RX = serial.TX arduino.5V = serial.5V arduino.GND = serial.CTS arduino.GND = serial.GND arduino.D2 = R[1MΩ](arduino.5V) = SW(arduino.GND); node A = R[2.2kΩ](arduino.GND); D[#F00](A, arduino.D3); D[#0F0](A, arduino.D4); }

USB 接続は製品選定で解決し、標準的な接続で通信と書き換えを実現する。

スイッチの監視に D10 pin を使い、スイッチを介して GND と接続する。
また、D10 を 1MΩ のプルアップ抵抗を介して 5V に接続する。
処理はソフトウェアに任せる。

通常は 10 kΩ のプルアップ抵抗を使うが、消費電力を抑えるため1MΩとした。
安全性を高めるよう、スイッチは負論理とし、ONを常時、OFFを非常時とする。
常に電流が流れる仕様になるため、大きめの抵抗を入れてみた。
勿論、一般的な 10 kΩ を使っても問題ない。

指示灯には元々ネオン管が入っていたが、AC100V 用のため、DC5V では光らない。
代わりに、LED を使って状態を直接視認できるようにするが、
せっかく Arduino を内蔵させるので、2色とした。

  • 無点灯: 未接続、または接続直後の初期化中。
  • 緑点灯: 平常時。
  • 赤点滅: 緊急停止時。

今回使うボタンはトグル方式であり、ON と OFF では外観が同じである。
あくまでも内側のボタンが状態を持っていて、利用者は中を覗けない。
そのため、LED の表示が唯一の確認方法である。

赤点滅としたのは、非常時の演出と、色弱への対策の試み。
完成後も Arudino のプログラムを書き換えることで LED を自由に制御できる。
もしかしたら、RGBフルカラーの LED を1本埋めた方が便利かもしれない。

なお、今回使う LED は赤も緑もほぼ同じ電気特性・発光特性であり、
GND 側に共通の抵抗 2.2kΩ を繋げる。
ボタン越しでは少々暗いので、1.0 kΩ にしても良かった。

ソフトウェア

ほぼ 100ms 周期の監視は、delay(100) で簡易に実現する。
今回は手動入力インタフェースなため、数ms のズレでも許容できる。

スイッチONのときはに "N" を、スイッチOFFまたは断線時には "E" を、
Serial を経由で外部に送ることとした。
常に何かを送っているのは、死活監視も兼ねている。

Arduinoコード

int iSwitch = 10; int oLedEmerg = 2; int oLedNormal = 3; void setup(){ pinMode(iSwitch , INPUT); pinMode(oLedNormal, OUTPUT); pinMode(oLedEmerg , OUTPUT); Serial.begin(9600); Serial.println("Emerg Switch Start"); } void loop(){ static bool vBlink; bool vIsEmerge = HIGH == digitalRead(iSwitch); Serial.println(vIsEmerge ? "E" : "N"); vBlink = !vBlink; digitalWrite(oLedEmerg , vIsEmerge && vBlink ? HIGH : LOW); digitalWrite(oLedNormal, !vIsEmerge ? HIGH : LOW); delay(100); }

受信側コード(Python with pyserial)

PCで実行する受信側の実装例として、python 実装を以下に示す。
python は pyserial を使えばシリアル通信を比較的容易に実装できる。
基本的にポートを監視し、ヘッダーや"N"以外が流れたら緊急停止、
接続が切断されるなど例外が発生したら緊急停止、という仕様にすれば良い。

受信コード(EmergSwitchReciver.py)

#need pyserial: # $> pip install pyserial import sys import serial args = sys.argv if len(args) < 2: print("Format: EmergSwitchReciver port !!") quit() port = args[1] seri = serial.Serial(port, 9600, timeout=1000) print("Open [{}]".format(seri)) try: while True: line = seri.readline().strip(); if line == b'Emerg Switch Start': print(line) continue; if line != b'N': print("Emergency Stop!") break except: print("Error Stop!!") finally: seri.close()

実行はシリアルポートを第1引数にスクリプトを呼び出せば良い。
例えば、COM6 を使う場合は、

実行コマンド

python EmergSwitchReciever.py COM6

実装

スイッチを分解

フットスイッチ裏側にあるネジ2本を外すと、裏蓋が簡単に取れる。
真ん中の四角いボックスが中のスイッチ本体。
以後、便宜的にこれをコアスイッチと呼ぶ。

裏蓋を開けた状態

コアスイッチのネジを外すことで、ケーブルを取り外せる。
コアスイッチに掛かるフックを抉じ開けると、コアスイッチも取れる。

コアスイッチを取り出した状態

コアスイッチには交流 100V 用のネオン管が付いているが、
直流 5V ではまず点灯しないので、台座を LED に譲る。
ただ、取ってしまっても勿体ないので、とりあえず台座の外側に退避させた。

ネオン管を台座から退避させた状態

Arduino と Serial 変換モジュールをコアスイッチの抜け殻に仮配置してみるとこうなる。
左側同士をワイヤーで繋ぎ、USB ケーブルを下のモジュールに差し込んで右から外に出す。

ArduinoとSerial変換モジュールの仮配置

半田付け

まずは一番簡単そうな Arduion ⇔ Serial の線を半田付けする。
ボタンの可動部を避けるため、6本の線を片側に寄せる必要がある。
綺麗に揃うように長さを測って行くが、ちゃんと測ったのはこれが最初で最後。

今回は基板を入れる余裕が無いので、配線は全て空中配線で行く。
基板と配線の仮固定も難しく、半田付けも基本的に空中で行うことになった。
固定クリップが大活躍。

Serialモジュールの半田付け

Arduino 側も同様に半田付けして、導通テスト。
Arduino Pro Mini は USB I/O がないため、ここまで繋げて初めてプログラムを書き込めるようになる。
書き込み成功、Sirial 通信も確立っと。

Arduino を半田付けした状態

続けて、LEDのマイナス側を纏めて半田付けして、足を上手く折り曲げて台座に嵌める。
後は、抵抗とArduinoを繋げば LED が光るようになる。

LED を半田付け

コアスイッチを付けたら半田付け終了。
コアスイッチは圧着端子だったので、再改造に備えてワイヤでリングを作って圧着させている。

コアスイッチを半田付け

USB ケーブルの引き回し

最後は、全てを本体に押し込め、USB ケーブルを繋げて、蓋を締められたら完成になる。
そのため、ケーブルの根本に掛かる仕切りを切っておく必要がある。
仕切り自体が柔かいため、ニッパとラジオベンチでサクサク切り込める。
最後は半田ゴテで滑らかに舐めれば、他は既存の穴をそのまま通せる。

USBケーブルの引き回し

と言うわけで完成。
緊急停止ボタンでの Lチカ なりき。

完成形

付録

失敗事例 1: FT234X on AE-FT234X

同じく USB シリアル変換モジュールである AE-FT234X では失敗した。
こちらの方が小型であるため、真っ先に試したけど、最終的にNGとした。

【FT234X 超小型USBシリアル変換モジュール AE-FT234X】
秋月電子通商: 600円
http://akizukidenshi.com/catalog/g/gM-08461/

まず、シリアル変換機能自体は問題ない。
このため、Arduino の実行時におけるシリアル通信用途なら満足に使える。

問題は、開発時において Arduino にプログラムを書き込むときである。
FT234X のキットは RX, TX, GND, 5V の 4 pin 出ていて、通常なら十分である。
しかし、Arduino Pro Mini は DTR, TX, RX, 5V, GND, GND の 6 pin で、
プログラムを書き込む際に DTR で Arduino をリセットする必要がある。
FT234X のキットではこのリセットができない。

回避策は既に確立されていている。
メダデン:
「超小型USBシリアル変換モジュールをArduinoとして使う方法」
https://b.eax.jp/eh/arduino/13744/

FT234X のキットからリセット信号を取り出す改造が細かすぎて大変そうで、
緊急停止ボタンはちょくちょく作る予定もあり、保留にして代案を探した。

次善策として、手動リセットも確立されている。
Qiita @chrhsmt:
「超小型USBシリアル変換モジュール(AE-FT234X)をArduino互換機で使う」
https://qiita.com/chrhsmt/items/e6bfc624d2bacdd7684d

リセットを自動に掛けられないなら、手動で掛けようという作戦である。
Arudino IDE でログを詳細に出すように設定すると、
書き込み途中にリセットすべきタイミングが見て分かるようになる。
そこで、Arduino のリセットボタンを物理的に押せばリセットが掛かる。

なお、設定の方法は、

  • メニューから「ファイル」→「環境設定」
  • 「より詳細な情報を表示する」の「書き込み」にチェックを入れる。
  • 「OK」で決定。

この方法で書き込み自体は成功し、開発も進められた。
通常の開発であれば、Arduino が手元にあるのでこれで十分である。
しかし今回はボタンに埋め込んだ状態でも書き換えられたら便利そうで、
結果的には不採用となり、FT232RQ を探した次第である。

失敗事例 2: CP2102 on JYE119

秋月から CP2102 を使ったキットも販売されいている。
上で紹介したキットの半分以下の面積で、ほぼ限界まで小さくしている。

【USBシリアル変換モジュール CP2102使用(microB)JYE119】
秋月電子通商:
http://akizukidenshi.com/catalog/g/gK-14993/

こちらも実行時における通常のシリアル通信用途なら問題無く使える。
しかし、データシートを見た限りでは、リセットピンが無く、
開発時におけるプログラム書き換え用途では困る事態が予想できる。

秋月が公開しているデータシートはチップのものであり、
チップには確かに DTR が出ている。
しかし、基板に関する情報が分からず、写真を見ても DTR は無さそう。
http://akizukidenshi.com/download/ds/siliconlaboratories/cp2102.pdf

キットのデータシートは製造元である Jyetech が公開している。
チップの DTR が捨てられているのが分かる。
よって、これはチップの足から直で引き出さないと自動リセットは無理。
https://jyetech.com/Products/119/Manual_119.pdf

────────

1
Limgのアイコン画像
Arduinoを使った電子工作をしています。 elchika は Leafony 欲しさに始めました。 elchika 記事の方向性はまだ模索中ですが、 電子工作を中心としたAR/VR/IoTデバイス連携や鉄道模型工作に向かう可能性が高いです。
ログインしてコメントを投稿する