🔋
電池のリモートオンオフ装置をつくった
乾電池で動作する機材のオンオフを、リモートで制御できないか検討したので紹介します。
💡やりたいこと
- 利用者は、離れたところからトリガーをかける
- 例:スイッチを押す、スマホからリクエストを送信するなど
- 本記事でつくるものは、HTTPリクエストでON/OFFを送信
- 電池を導通させる
- リレースイッチで導通を行う
- ターゲット(乾電池で動作する機材)が動作する
今回は、ESP32とリレースイッチを使って作ることにしました。
🏁デモ
こんな感じで動作させます。
🔧パーツ一覧
no | 部品名 | 個数 | 備考 |
---|---|---|---|
1 | ESP32-DevKitC | 1 | 秋月電子 |
2 | ドライバ内蔵リレーモジュール | 1 | 秋月電子 |
3 | ジャンパー線 | 適量 | - |
4 | 電池ばね板 | 2 | Amazon |
5 | 単4->単3電池ケース | 1 | 3Dプリンタで自作 |
6 | ターゲット(ライト) | 1 | 単三乾電池 x3で点灯 |
接続図
単4->単3電池ケースは、↓のような感じです。
ピンの接続
ESP32側
Pin | リレーモジュール | 備考 |
---|---|---|
3.3V | V | - |
27 | INPUT | - |
GND | GND | 緑ケーブル |
リレーモジュール側
リレーモジュール | 接続先 | 備考 |
---|---|---|
COM | 電池ばね板 | 極性なし |
NO | 電池ばね板 | 極性なし |
NC | つながない | - |
💻環境
開発環境
- ESP32
- MicroPython1.17(esp32-20210902-v1.17.bin)
環境の構築は↓を参考にしてください。
モジュールの利用
今回、ON/OFFの制御をHTTPリクエストで通知します。
そこで、下記のtinyweb(web server)を利用すことにしました。
また、↑のtinywebは、loggingモジュールが必要です。
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 | ログ用 | ディレクトリ |
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の切り替え時に、"カチッ"と音がします。
さいごに
後日、本記事の続編を書きたいと思います。
Discussion