Release 2018.4.18

(日本語) マルチファンクションスイッチ 小型の3方向スイッチ

Sorry, this entry is only available in Japanese. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

Sorry, this entry is only available in Japanese. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

aitendoさんで購入した小型のマルチファンクションスイッチ。これを扱うコードを書いてみました。

マルチファンクションスイッチ

「右/前」と「左/後」、そして「押す」の3動作を認識するスイッチです。平たく言えば、1次元上のジョイスティックっていう感じです。ただ、以前扱ったのとは違い、単純に倒れたかどうかのON・OFFしか識別しないので、繊細な操作をするのには向きません。カーソル移動や数値の増減操作なんかには都合がよさそうで、似たモノをビデオカメラなんかの家電機器系で良く見る気がします。

何より、パーツ自体が指にスッポリ収まるくらいのサイズなので、Arduinoを使った製作物で、「何かしらの操作」用パーツを組み込もうとした時、都合が良いかなと思います。

aitendoさんでは、パーツそのものから2.54mmピッチの変換基板付きまで、いくつか種類違いがあるんですが、ここでは変換基板付きのものを扱っていきます。

スイッチの構造

パーツ右横にあるコネクタ部分が「共通」となっていて、動作によってそれぞれが「共通」とショートする3点切替のスイッチ、という構造になってます(左横の結線がどうもよく分からなかったので、no connectionとしてます)。

 押した時 左へ傾けた時 右へ傾けた時 パーツ裏面

「右か左か」は見る角度によって違うって話もありますが(苦)、ここでは写真の様に見たときでの左右という事でお願いします。

サンプルスケッチ

接点のON・OFFで動作する単純なものと、接点が繋がっている長さで振る舞いを変えるもの2種類のサンプルコードを書いてみました。勿論、今までに倣い、チャタリング対策にゲージ判定を使っています。

回路図

シリアルモニタに数値等の返しがくるので、ボーレートを38400で開き、挙動を確認してください。

1. 3方向別で動作を分ける

単純に、「左右の傾き」で特定の数値(value)が増減し、「押す」と数値(value)がリセットされるスケッチです。

ざっくり説明すると、SW_GAUGE(sw_numの順番)関数でピン状態を読みに行き、PUSH_SHORTの閾値を越えるとTrueを返してきます。そこでsw_status(sw_numの順番)の状態を見て、「接点が離れた後(STAT_RELES)」だと識別すれば、任意のアクションをし、最後にステータスをリセット、という流れになっています。

おなじみのゲージ判定でチャタリング対策していますが、ピンを読みに行った時「押されている時だけ、読み取りの繰り返しを増やす」よう工夫を入れてみました。こうすれば、押さない限り他のタスクを邪魔しないかな、と。

temp_gauge変数に押した時のゲージ量が入るようにしているので、閾値設定の参考にしてください。

2. 押し時間で動作を変える

スイッチがショートしている時間の長さで数値の増減具合が変わります。左右の傾き時間が短いと+-1、中ぐらいの長さだと連続して+-1、長いと+-10で増減します。

また、数値をA,B(values)と2種類用意し、「押す」と増減先が変更、「長押し」すると選択している数値がリセットされるようになっています。

D13ピンにLEDをつけて、挙動によって点滅するようにもしてます(少々、ごちゃごちゃした書き方になってしまいましたが…)。Arduino本体でも視認出来ますが、余力があれば独自にLEDをつけてみてください。

今度はSW_READ()という関数を作り、状態を数字で返すようにしました。sw_statusのビット値をそのまま拾っても良かったんですが、こうした方がif分岐を書くとき混乱しないかな、と。

SW_READ(sw_numの順番)関数は以下のような返り値にしています。

  初回確認 1回確認済み スイッチ離した スイッチ離した
(1回確認済み)
PUSH_SHORT 1 11 101 111
PUSH_MID 2 12 102 112
PUSH_LONG 3 13 103 113

上記を参考にすれば、if分岐で振る舞いを分けたスケッチが構築できるかと思います。

もう一つ付け加えると、結局これらは単純にスイッチに対するスケッチなんで、普通に「スイッチでの数値操作」用としても使えます。別に普通のタクトスイッチ3つでもいいし、冒頭のスイッチ定義周りをちょっといじれば、個数も好きに増やせたり。(ただし、digitalReadを使っていないのと、内部プルアップの負論理も反転している事に注意)。

まあ、役立つようなら、書き換えてご活用ください。

参照リンク

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.