5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

大トロくん( オートロック )の作り方

Posted at

ezgif.com-gif-maker (1).gif

今回はこちらの大トロくん( オートロック )をラズパイで作っていきます〜

用意するもの

  • Raspberry Pi (僕は 4 を買いました。)
  • Servo Moter
  • ジャンパーワイヤー
  • サーボモータの動力で家の鍵を開閉するやつ ( 自作してください )

お求めはこちらから ↓

目次

  1. サーボモータを動かす Python のプログラム
  2. サーボモータの動力で家の鍵を開閉するやつ作り
  3. LINE Messaging API の設定
  4. ラズパイ側の Webhook の設定

ラズパイでサーボモータを起動

まずはラズパイとサーボモータの接続方法の説明

サーボモータについている 3 つの線は以下のように繋ぎます

赤い線は 2 ピン
黒い線は 6 ピン
黄色い線は 12 ピン

servo.py のファイルを作って以下のようにコードを書きます

servo.py
import sys
import RPi.GPIO as GPIO
import time
from argparse import ArgumentParser

# 標準入力経由で渡ってくる数字(角度)を取得
degree = sys.stdin.readline()

servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
servo = GPIO.PWM(servo_pin, 50)
servo.start(0.0)
servo.ChangeDutyCycle(float(degree))
time.sleep(1.0)
GPIO.cleanup()
print(degree)

家の鍵を開閉するやつ作り

スクリーンショット 2021-12-17 1.09.35.png

情報収集のため色々記事を漁っているとどうやら 3D プリントでそれそれの鍵にあう形に作るのが主流だったのですが僕は持ってなかったのでどうしようか悩んでいたところ、大学生の電子工作 ラズパイでスマートロックを自作してみた
という記事に出会い、この記事では時間が経てば固まる粘土を使っていたので僕も石粉粘土を使うことにしました。

↓ 仕上がりはこんな感じ

スクリーンショット 2021-12-17 1.05.03.png

あとはお好きなように色を塗って家のドアに合うように
頑張って貼っつけていきます

スクリーンショット 2021-12-17 1.18.45.png

これで鍵を開け閉めする準備は整いました!!
次は、Web サーバーを立てていきます

LINE Messaging API の設定

上記のリンクから設定を行います。

スクリーンショット 2021-12-17 16.48.01.png

ログインできたら LINE チャンネルの作成を行なっていきます

スクリーンショット 2021-12-17 16.50.06.png

チャンネルの種類: Messaging API (デフォルトで選択されている)
プロパイダー: LINE Developers を初めて使うの方は新規作成してください
チャンネルアイコン: お好みで
後の必須項目も埋めていきます

スクリーンショット 2021-12-17 16.54.28.png

最後に"作成"ボタンを押して完了

発行したアクセストークンとシークレットキーは、ラズパイの環境変数として設定しておきます。

$ export LINE_CHANNEL_ACCESS_TOKEN= YOUR_LINE_CHANNEL_ACCESS_TOKEN
$ export LINE_CHANNEL_SECRET= YOUR_LINE_CHANNEL_SECRET

.profile に上記のコマンドを登録しておくとラズパイが再起動した時にコマンドを打たなくて良くなります。

$ nano .profile

ラズパイ側の Webhook の設定

Web サーバーは Express ( JavaScript )、サーボモータを動かすプログラムは Python で実装しました。

言語の統一は試みたのですが、サーボモータを動かすプログラムのいいライブラリが JS にはあまりなかったのでなくなく Python を選びました。

Express でローカルサーバーを立てる

  1. Express でローカルサーバーをたてる
  2. ngrok を使って、ローカル上で稼働している Express サーバーをグローバル公開する

まずは適当なディレクトリにサーバー用のフォルダを作って npm init

$ mkdir auto-lock-server
$ npm init

次に必要なライブラリをインストール

$ npm i express python-shell ngrok @line/bot-sdk

auto-lock-server フォルダ配下に main.js を作成し以下のようにコードを書きます

auto-lock-server/main.js

var { PythonShell } = require("python-shell");
var ngrok = require("ngrok");
var line = require("@line/bot-sdk");
var express = require("express");
var app = express();

var PORT = 3000;

const lineConfig = {
  channelAccessToken: process.env.LINE_CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.LINE_CHANNEL_SECRET,
};

const client = new line.Client(lineConfig);

function handleEvent(event) {
  if (event.type !== "message" || event.message.type !== "text") {
    return null;
  }
  var pyshell = new PythonShell("servo.py");
  let replyMessage = "あけて or しめてってメッセージしてね";

  if (event.message.text === "あけて") {
    replyMessage = "ドアをあけるよ";
    // 標準入力経由で Python スクリプトに角度を送信します
    pyshell.send(5);
    pyshell.on("message", function (degree) {
      console.log("--- Python Log:", degree);
    });
  }
  if (event.message.text === "しめて") {
    replyMessage = "ドアをしめるよ";
    pyshell.send(9);
    pyshell.on("message", function (degree) {
      console.log("--- Python Log:", degree);
    });
  }

  return client.replyMessage(event.replyToken, {
    type: "text",
    text: replyMessage,
  });
}

// Note: API の設定
app.post("/webhook", line.middleware(lineConfig), (req, resolve) => {
  req.body.events.map(handleEvent);
  resolve.send("Done");
});

ngrok.connect(PORT).then((url) => {
  app.listen(PORT, function () {
    console.log(`Server listening on port !${PORT}`);
    console.log(`listening at ${url}`);
  });
});

最初の方に作った Python のコードは、auto-lock-server フォルダの直下に移動させます

最終的なディレクトリ構成はこんな感じ

auto-lock-server/
├ node_modules/
├ main.js
├ servo.py
├ packege.json

あとはサーバーを起動

$ node main.js

ローカルとグローバルの URL が発行されるので ngrok で作られた URL を LINE Messaging API 側に設定します

Example app listening at http://localhost:8080
Example app listening at https://hoge.ngrok.io

スクリーンショット 2021-12-17 0.56.13.png

これで完成!

見事、LINE でメッセージ送信すると鍵を開けてくれました!

ezgif.com-gif-maker (1).gif

参考記事

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?