2021年07月30日 更新

100均で作れる立派なタクトスイッチ

どうも、クラゲです。
100円ショップのダイソーで100円で売っていた「LEDミニタッチライト」のスイッチ部を改造しラズパイで入力できるようにしました。押している時間に応じて がスマホ画面に表示され、一定時間を超えると「長押し」と判定しています。

改造にあたっては、以下の工具・部品があればOK!

  • プラスドライバー
  • ハンダごて、ハンダ
  • ニッパー
  • ヤスリ
  • ジャンパー線(オスーメス)4本
  • 余っている線材1本

商品の動作確認

まず、商品そのものを見てみましょう。こんなパッケージに入っていました。

値段は100円で、単4電池3本別途必要です。
「タッチ」と書いてありますが、タッチセンサではなく普通の堅いスイッチなので実際は触れるだけではON/OFFしません。実際に動かしてみました。

動画の後半、LEDを点灯したまま電池を外し、また電池を入れています。このときLEDは消灯になっています。
勘の良い方ならお気づきかと思いますが、よく100均で売っているプッシュスイッチのLEDライトとは違い、スイッチは「タクトスイッチ」であり、電子回路によって制御が行われているということです。

上の写真は100均で良く売られている「プッシュスイッチ」のLEDライト。
こちらは電池を取り外して入れなおしてもLEDが点灯したままです。電子制御回路やICは入っていません。

分解

プラスドライバーで簡単に分解できます。
ビス4本と、3パーツに分解できました。

LEDが実装されているパーツには片面の基板が付いています。下は基板の拡大写真です。
タクトスイッチ1つ、6.2Ωの抵抗1つ、LED3つ、そして中央に6pinのICがあります。予想通り電子制御されていました。

目視とテスターによる確認で、クラゲが予想で回路図を書きました。

ICのSW端子は「GND」を検知すると、LED端子を「GND」と「OPEN」に交互で状態切り替えする仕様かと思います。「GND」のときはLED点灯、「OPEN」のときはLED消灯です。
また、IC起動時のLED端子は「OPEN」状態から始まります。

電気的な改造

必要な電子部品はタクトスイッチだけです。
タクトスイッチの足に線付けすれば良いのですが、パーツを組み合わせたときに基板に隙間なく密着している箇所などがあり、避ける必要があります。

クラゲは工夫しました。
電池端子のマイナス/プラスの2つそれぞれは、裏側にも繋がっており、線付けしてもパーツと干渉することはなさそうです。タクトスイッチの片側はマイナス端子に繋がっていますので、そのまま活用できます。
一方のプラス端子とタクトスイッチの端子をジャンパー線で繋げました。基板中央部は幸運なことにパーツとは干渉しません。

その他、回り込みなどが発生する懸念もあるため、ICと抵抗は削除しました。

やったことを箇条書きにします。

  • ICを削除
  • 抵抗を削除(写真では抵抗をずらしていますが、削除してOK)
  • ハンダ付けされていない電池端子を削除
  • タクトスイッチとプラス端子を余っている線材でショート(黄色い線)
  • プラス端子(基板外)にジャンパー線をハンダ付け
  • マイナス端子(基板外)にジャンパー線をハンダ付け

ジャンパー線は裏側に付けてもOKですが、クラゲは表面の写真の箇所(左右の電池端子)に付けています。ジャンパー線は外した電池端子の穴を通して表面に出しました。ジャンパー線のオス側をニッパ―で切って線を剥いてから付けています。
基板の内側までジャンパー線を伸ばして線付けしてしまうと、パーツと組合せ時に干渉するので注意してください。

機構的な改造

「LEDミニタッチライト」はパーツを組み合わせると、穴やスキマなどがなく完全に密封した状態です。
そこで、ヤスリを使ってジャンパー線が通れるくらいの切り欠きを作ります。
クラゲは、プラス端子側で、下の写真のように切り欠きを作りました。

白いパーツは、ジャンパー線2本が通るくらい、黒いパーツははめ込むときの回転も考慮して削ります。
パーツをはめ込むとこんな感じになります。

クラゲはちょっと、黒い部分を削り過ぎました

回路接続

ラズパイの端子に直結します。
見やすい結線図を添付します。非常にシンプルです。
一方をGNDに、他方をGPIO 18pinに接続しました。

ハンダ付けしたジャンパー線だけだと短いので、残りの2本を連結してラズパイに繋げます。

ソースコード

Python3で実行させています。

import time
import RPi.GPIO as GPIO

#GPIO18pinを入力モードとし、pull up設定とします
GPIO.setmode(GPIO.BCM)
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)

while True:
    GPIO.wait_for_edge(18, GPIO.FALLING)
    sw_counter = 0

    while True:
        sw_status = GPIO.input(18)
        if sw_status == 0:
            sw_counter = sw_counter + 1
            print('■', end = '')

            if sw_counter >= 50:
                print('\n', end = '')
                print('Long Press Detected!! ', end = '')
                break
        else:
            print('\n', end = '')
            #print('Short Press Detected ', end = '')
            break

        time.sleep(0.01)

    print(sw_counter)
    print('\n', end = '')

ポイントはprintで改行されないように、オプションで end = '' を付けている点です。

実行の様子

冒頭の動画ではVNC経由でスマホ表示させていますが、普通にターミナルで実行できます。
押している時間の長さに応じて とカウンター値が表示され、一定のカウンター値(ここでは50設定)を超えると Long Press Detected!! と表示します。

タクトスイッチとの比較

今回改造して作ったスイッチですが、機能的には下の写真のようなタクトスイッチ回路と全く同じです。

単にスイッチ入力を試したいだけならこれで十分です。しかし、操作しにくいのと、操作しているとすぐに外れそうです。
一方で、今回の100均のものは外装がしっかりしています。見た目もそれほど悪くないので、家で常設や展示会での使用などにも使えるかと思います。

以上、「100均で作れる立派なタクトスイッチ」でした!