qeqeのアイコン画像
qeqe 2024年09月20日作成 (2024年10月30日更新)
製作品 製作品 閲覧数 48
qeqe 2024年09月20日作成 (2024年10月30日更新) 製作品 製作品 閲覧数 48

lineスマートロック

lineスマートロック

概要

スマートフォンからlineを使用してRaspberryPi4を動かしてモーターを回転させる。ngrokを使用してローカルの開発環境で稼働させているネットワークサービスを一時的にネット上に外部公開して、RaspberryPi4と通信する。

特定のワードをLINE Messaging APIに送信 → RaspberryPi4がサーボモータを動かして開錠・施錠

時間を指定しての動作
LINEのリッチメニューを使用してワンタッチで動作

イメージ画像

詳細

スマートフォンからlineを使用してRaspberryPi4を動かしてモーターを回転させる。ngrokを使用してローカルの開発環境で稼働させているネットワークサービスを一時的にネット上に外部公開して、RaspberryPi4と通信する。

使用物品

  • RaspberryPi4
  • マイクロサーボ9g SG-90
  • LINEを使用できるデバイス

メインコード

from __future__ import unicode_literals import os import sys import function from argparse import ArgumentParser from flask import Flask, request, abort from linebot import ( LineBotApi, WebhookParser ) from linebot.exceptions import ( InvalidSignatureError ) from linebot.models import ( MessageEvent, TextMessage, TextSendMessage, ) app = Flask(__name__) channel_secret = os.getenv('', None) channel_access_token = os.getenv('', None) if channel_secret is None: print('Specify LINE_CHANNEL_SECRET as environment variable.') sys.exit(1) if channel_access_token is None: print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.') sys.exit(1) line_bot_api = LineBotApi(channel_access_token) parser = WebhookParser(channel_secret) @app.route("/callback", methods=['POST']) def callback(): signature = request.headers['X-Line-Signature'] body = request.get_data(as_text=True) app.logger.info("Request body: " + body) try: events = parser.parse(body, signature) except InvalidSignatureError: abort(400) for event in events: if not isinstance(event, MessageEvent): continue if not isinstance(event.message, TextMessage): continue message = event.message.text reply = event.message.text if message.count('開錠'): function.unlock() reply = "開錠しました" elif message.count('施錠'): function.lock() reply = "施錠しました" line_bot_api.reply_message( event.reply_token, TextSendMessage(text=reply) ) return 'OK' if __name__ == "__main__": arg_parser = ArgumentParser( usage='Usage: python ' + __file__ + ' [--port <port>] [--help]' ) arg_parser.add_argument('-p', '--port', type=int, default=8000, help='port') arg_parser.add_argument('-d', '--debug', default=False, help='debug') options = arg_parser.parse_args() app.run(debug=options.debug, port=options.port)

モータの回転

# 鍵をかけるようにモータを回転 def lock(): GPIO.setmode(GPIO.BCM) GPIO.setup(gp_out, GPIO.OUT) servo = GPIO.PWM(gp_out, 50) servo.start(0.0) servo.ChangeDutyCycle(9.5) time.sleep(0.5) GPIO.cleanup() # 鍵をあけるようにモータを回転 def unlock(): GPIO.setmode(GPIO.BCM) GPIO.setup(gp_out, GPIO.OUT) servo = GPIO.PWM(gp_out, 50) servo.start(0.0) servo.ChangeDutyCycle(5.5) time.sleep(0.5) GPIO.cleanup()

参考文献

ログインしてコメントを投稿する