🔋

電池のリモートオンオフ装置をつくった

commits7 min read

乾電池で動作する機材のオンオフを、リモートで制御できないか検討したので紹介します。

💡やりたいこと

Image from Gyazo

  1. 利用者は、離れたところからトリガーをかける
  • 例:スイッチを押す、スマホからリクエストを送信するなど
  • 本記事でつくるものは、HTTPリクエストでON/OFFを送信
  1. 電池を導通させる
  • リレースイッチで導通を行う
  1. ターゲット(乾電池で動作する機材)が動作する

MaBeeeという製品を使うと、bluetoothを使って同様の制御が可能です。
後々の拡張を考えているため、今回は自作することにしました。

今回は、ESP32とリレースイッチを使って作ることにしました。

🏁デモ

こんな感じで動作させます。

https://twitter.com/tw_kotatu/status/1477287451324727301

🔧パーツ一覧

no 部品名 個数 備考
1 ESP32-DevKitC 1 秋月電子
2 ドライバ内蔵リレーモジュール 1 秋月電子
3 ジャンパー線 適量 -
4 電池ばね板 2 Amazon
5 単4->単3電池ケース 1 3Dプリンタで自作
6 ターゲット(ライト) 1 単三乾電池 x3で点灯

接続図

Image from Gyazo

単4->単3電池ケースは、↓のような感じです。

Image from Gyazo

ドライバ内蔵リレーモジュールは、はんだ付けが必要です。

ピンの接続

ESP32側

Pin リレーモジュール 備考
3.3V V -
27 INPUT -
GND GND 緑ケーブル

リレーモジュール側

リレーモジュール 接続先 備考
COM 電池ばね板 極性なし
NO 電池ばね板 極性なし
NC つながない -

💻環境

開発環境

  • ESP32
    • MicroPython1.17(esp32-20210902-v1.17.bin)

環境の構築は↓を参考にしてください。

https://zenn.dev/kotaproj/articles/d969fb39100da443f41f

モジュールの利用

今回、ON/OFFの制御をHTTPリクエストで通知します。
そこで、下記のtinyweb(web server)を利用すことにしました。

https://github.com/belyalov/tinyweb

また、↑のtinywebは、loggingモジュールが必要です。

micropython-loggingも合わせて使用します。

https://pypi.org/project/micropython-logging/

📝手順

ブラウザより、下記のようなアクセスをすると、ターゲットのオンオフができます。

  • ON
    • http://{IPaddress}:8001/gpio/1_on
  • OFF
    • http://{IPaddress}:8001/gpio/1_off

コード

下記のようなファイルの配置になっています。

ファイル/ディレクトリ 役割 備考
main.py wifi接続, GPIO制御, GETメソッド制御 下記に記載
tinyweb web server ディレクトリ
logging ログ用 ディレクトリ

SSID, PASSは、自身の環境に合わせてください。

main.py
import tinyweb
from machine import Pin
import network
import utime

SSID = "XXXXXXXXXXXXX"
PASS = "YYYYYYYYYYYYY"

db = {'1': {'pin_no': 27, 'pin': None},
      '2': {'pin_no': 26, 'pin': None},
      '3': {'pin_no': 25, 'pin': None}}


# Connect to WiFi
def connect_wifi(ssid=SSID, pwd=PASS):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, pwd)

    elapsed = 0
    while not wlan.isconnected() and elapsed < 10:
        utime.sleep(1)
        elapsed += 1

    for _ in range(10):
        if wlan.isconnected():
            break
        utime.sleep(1)
    else:
        print('Failed to connect: timed out')
        return False

    print('Successfully connected')
    print('network config:', wlan.ifconfig())
    return True


# Simple helper to return message and error code
def not_found():
    # Return message and HTTP response "404 Not Found"
    return {'message': 'no such service'}, 404


# Detailed information about given customer
class Gpio():
    
    def not_exists(self):
        return {'message': 'no such customer'}, 404

    def get(self, data, p_cmd):
        """Get detailed information about given customer"""
        # 1_on , 2_off
        if "_" in p_cmd:
            name, act = p_cmd.split("_")
            val = 1 if "on" in act else 0
            db[name]['pin'].value(val)
            pass
        else:
            return {'message': 'error'}
        print("p_cmd : ", p_cmd)
        return {'message': 'get_gpio'}

    def post(self, data, p_cmd):
        return {'message': 'post'}

    def put(self, data, p_cmd):
        return {'message': 'put'}

    def delete(self, data, p_cmd):
        """Delete customer"""
        return {'message': 'delete'}


def run():
    # hard init
    for key in db:
        db[key]["pin"] = Pin(int(db[key]['pin_no']), Pin.OUT)

    # connect
    ok = connect_wifi()
    if not ok:
        print('Failed to establish a Wi-Fi connection, resetting')
        utime.sleep(5)
        machine.reset()
    else:
        print('ok!!!')

    # Create web server application
    app = tinyweb.webserver()
    # Add our resources
    app.add_resource(Gpio, '/gpio/<p_cmd>')
    app.run(host='0.0.0.0', port=8081)


if __name__ == '__main__':
    # To test your server run in terminal:
    # - GPIO - ON/OFF
    #       curl http://localhost:8081/gpio/1_on
    #       curl http://localhost:8081/gpio/1_off
    #       curl http://localhost:8081/gpio/2_on
    #       curl http://localhost:8081/gpio/2_off
    try:
        run()
    except Exception as e:
        print(e)
        print('Failed!!!, resetting')
        utime.sleep(1)
        machine.reset()

実行例

Successfully connected
network config: ('192.168.xxx.xxx', '255.255.255.0', '192.168.xxx.1', '192.168.xxx.1')
ok!!!
# ブラウザより - http://192.168.xxx.xxx:8081/gpio/1_on
p_cmd :  1_on  # <= ターゲットが動作
# ブラウザより - http://192.168.xxx.xxx:8081/gpio/1_off
p_cmd :  1_off # <= ターゲットが停止

デモのような結果になります。

🔎ポイント

リレーモジュール

INPUT(信号トリガーターミナル)に電流を流すことで、NO側をスイッチとして動作させることができます。
INPUTをHIGHにすると、COMとNOが導通します。
また、INPUTをLOWにすると、COMとNCが導通します。
リレースイッチが入っているので、ON/OFFの切り替え時に、"カチッ"と音がします。

さいごに

後日、本記事の続編を書きたいと思います。

GitHubで編集を提案

Discussion

ログインするとコメントできます