今回はこちらの大トロくん( オートロック )をラズパイで作っていきます〜
用意するもの
- Raspberry Pi (僕は 4 を買いました。)
- Servo Moter
- ジャンパーワイヤー
- サーボモータの動力で家の鍵を開閉するやつ ( 自作してください )
お求めはこちらから ↓
目次
- サーボモータを動かす Python のプログラム
- サーボモータの動力で家の鍵を開閉するやつ作り
- LINE Messaging API の設定
- ラズパイ側の Webhook の設定
ラズパイでサーボモータを起動
まずはラズパイとサーボモータの接続方法の説明
サーボモータについている 3 つの線は以下のように繋ぎます
赤い線は 2 ピン
黒い線は 6 ピン
黄色い線は 12 ピン
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)
家の鍵を開閉するやつ作り
情報収集のため色々記事を漁っているとどうやら 3D プリントでそれそれの鍵にあう形に作るのが主流だったのですが僕は持ってなかったのでどうしようか悩んでいたところ、大学生の電子工作 ラズパイでスマートロックを自作してみた
という記事に出会い、この記事では時間が経てば固まる粘土を使っていたので僕も石粉粘土を使うことにしました。
↓ 仕上がりはこんな感じ
あとはお好きなように色を塗って家のドアに合うように
頑張って貼っつけていきます
これで鍵を開け閉めする準備は整いました!!
次は、Web サーバーを立てていきます
LINE Messaging API の設定
上記のリンクから設定を行います。
ログインできたら LINE チャンネルの作成を行なっていきます
チャンネルの種類: Messaging API (デフォルトで選択されている)
プロパイダー: LINE Developers を初めて使うの方は新規作成してください
チャンネルアイコン: お好みで
後の必須項目も埋めていきます
最後に"作成"ボタンを押して完了
発行したアクセストークンとシークレットキーは、ラズパイの環境変数として設定しておきます。
$ 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 でローカルサーバーを立てる
- Express でローカルサーバーをたてる
- ngrok を使って、ローカル上で稼働している Express サーバーをグローバル公開する
まずは適当なディレクトリにサーバー用のフォルダを作って npm init
$ mkdir auto-lock-server
$ npm init
次に必要なライブラリをインストール
$ npm i express python-shell ngrok @line/bot-sdk
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
これで完成!
見事、LINE でメッセージ送信すると鍵を開けてくれました!
参考記事