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


![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/79c243a3-e20c-28ca-7c19-fa3adc310eda.gif)

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

# 用意するもの

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

お求めはこちらから ↓

https://jp.rs-online.com/web/generalDisplay.html?id=raspberrypi

https://www.amazon.co.jp/gp/product/B00WQWZXKW/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1

https://www.amazon.co.jp/gp/product/B00P9BVKOK/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1



# 目次

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

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


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


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

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



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

```Python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/5bb9a099-c05a-46b8-7451-7d19b8cc4f2b.png)

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

↓ 仕上がりはこんな感じ

![スクリーンショット 2021-12-17 1.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/46f5c7a6-fc42-d533-916d-cba46fff28ee.png)

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

![スクリーンショット 2021-12-17 1.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/c31e9ca8-bc37-cd98-6892-e0934239caf4.png)

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

## LINE Messaging API の設定

https://developers.line.biz/ja/services/messaging-api/

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

![スクリーンショット 2021-12-17 16.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/17e7f972-7d9f-7170-85e1-58d27dc626fe.png)

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

![スクリーンショット 2021-12-17 16.50.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/f753d00f-415d-7222-198b-f45db2f53fb6.png)

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

![スクリーンショット 2021-12-17 16.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/eb495f3e-e856-aeb0-26b3-a558f3b9fdf2.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 でローカルサーバーをたてる
1. ngrok を使って、ローカル上で稼働している Express サーバーをグローバル公開する

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

```
$ mkdir auto-lock-server
```

```
$ npm init
```


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

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

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

``` javascript: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/b414f629-a32a-4c1d-21dc-8a293ad94355.png)


これで完成！

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


![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/79c243a3-e20c-28ca-7c19-fa3adc310eda.gif)



## 参考記事


https://fabcross.jp/category/make/sorepi/20200831_raspi_tadaima.html

https://qiita.com/NT1123/items/09aed7b23388190cba23

https://qiita.com/youtoy/items/f44041689390deb81350

https://qiita.com/HeRo/items/c1c30d7267faeb304538僕![IMG_3375.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384323/4845c57f-d82a-ddfa-53dc-26628f19a2e4.png)