0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

レゴブロックに救われたスマートロック自作計画

Posted at

彼女のお婆ちゃんからさつまいもを頂いたので、食べながら書いています。
初Qiita記事はさつまいもと共に。

目次

  1. きっかけ
  2. 使ったもの一覧
  3. 構成
  4. ソースコード
  5. 動作確認
  6. トラブル
  7. 反省と改善
  8. まとめ

1. きっかけ

家の鍵は基本開けっ放しの田舎っぺな僕ですが、都会に引っ越すこととなりましたので鍵の管理をせねばと。
空き巣とか、居空きとか、居留守とか、怖いですから。
ただ、鍵を持ち歩くのは紛失のリスクもありまして、「あ、鍵閉め忘れた」的なことも多々ありまして。
鍵の携帯に不向きな田舎っぺが染み付いている僕なのでした。

ということで、ICカードで鍵の施錠・開錠ができる、Arduinoを使ったスマートロックの自作を始めることにしました。
出来合いのスマートロックは買うと高いですから。
後付けタイプのスマートロックって安いんですね、アマゾンに6,480円で売ってました。
https://amzn.asia/d/7p9obkU
image.png

僕の作ったスマートロックは全部合わせて4,000円くらいです。
のちに出てきますが、ケーブルは剥き出しだしAruduinoも剥き出しだしブレッドボードで配線してるところもあるし家の外に閉じ込められるし、ひどい出来になっています。
自作するものではないですね、コスパを考えれば。
いいんです、僕は組み込みシステムの勉強がしたかっただけなので!


2. 使ったもの一覧

部品 用途 リンク
Arduino用 uno 互換 USB-typeB 制御用マイコン https://amzn.asia/d/5I7dvL4
RC522 ICタグリーダー https://amzn.asia/d/00Z4wM7
リモコンライト(*1) ボタン https://jp.daisonet.com/products/4972822710596
FS5103B(*2) サーボモーター(鍵を回す) https://akizukidenshi.com/catalog/g/g114802/
ジャンパ線 配線 https://amzn.asia/d/jc4B0LF
ブレッドボード 配線 https://amzn.asia/d/2M8mpDl
MOSWAG MIDI USB B 変換ケーブル 給電用 https://amzn.asia/d/6mj7vC8
レゴブロック(*3) サーボと鍵の位置固定に使用(救世主) https://jp.daisonet.com/products/4549131622188
両面テープ 固定用 https://jp.daisonet.com/products/4580707591149
絶縁テープ(*4) 配線整理用 https://amzn.asia/d/7QK2lgs

(*1) サーボモーターが内鍵に接着される構成となってしまったため、室内から内鍵を回しての施錠・開錠ができなくなりました。対策として室内からでもサーボモーターを駆動させられるように押しボタンをつけました。https://monomonotech.jp/kurage/raspberrypi/daiso_mini_touch_light.html
(*2) サーボモーターは内鍵を回せる程度のトルクが必要だったのでトルクが強めで小さいものを選びました。
(*3) 僕が買ったのはシャチが作れるやつですが、ダイソーオンラインストアでは取り扱いがなさそうですね。
(*4) 車にソーラーパネルと蓄電池を付けた時に使って余ったものを使いました。絶縁用途でこれにしたわけではないです。


3. 構成

スマートロック取付

玄関ドアに取り付けたスマートロックのイメージ図です。

ドアポストの口のところからICタグリーダーを外に出しています。
このICタグリーダーにICカードをかざすことでUIDを取得、Aruduinoで登録済みのUIDか判定、登録済みのUIDの場合はサーボモーターを駆動させて施錠・開錠を実行します。

サーボモーターは内鍵のつまみ部分に接着してしまっているので直接つまみ部分を回しての施錠・開錠が行えません。
ので、内側から施錠・開錠を行えるように押しボタンを付け、押しボタンの押下によってサーボモーターを駆動させて施錠・開錠を実行します。

ポイントは「安価」と「非破壊」です。
お金がないので安価に、賃貸なので非破壊で。

配線図

スマートロックの配線図です。
image.png
AruduinoとICタグリーダー、Aruduinoとサーボモーター、Aruduinoと押しボタンの3つに分解して詳細を記載します。

①AruduinoとICタグリーダー

image.png
以下のように接続しています。

ICタグリーダー AruduinoのPin
RST 9Pin
SDA(SS) 10Pin
MOSI 11Pin
MISO 12Pin
SCK 13Pin
3.3V 3.3V
GND GND

以下のサイトを参考に構築しました。
https://dotstud.io/blog/arduino-use-rfid-reader/

②Aruduinoとサーボモーター

image.png
以下のように接続しています。

サーボモーター AruduinoのPin
PWM 8Pin
Vcc 5V
Ground GND

以下のサイトを参考に構築しました。
https://tech.nri-net.com/entry/arduino_with_Servomotor

③Aruduinoと押しボタン

image.png
以下のように接続しています。

押しボタン AruduinoのPin
Vcc 7Pin
Ground GND

4. ソースコード

ソースコードの全文です。

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

/* 承認するICタグのUID ********の部分にUIDを記述する */
constexpr char UID1[] = "********";
constexpr char UID2[] = "********";
constexpr char UID3[] = "********";
constexpr char UID4[] = "********";

/* PIN番号 */
constexpr uint8_t BTN_PIN = 7;
constexpr uint8_t SERVO_PIN = 8;
constexpr uint8_t RST_PIN = 9;
constexpr uint8_t SS_PIN = 10;

/* Open/Closeの管理変数 */
int lockStatus = 0;
/* 読み取ったUIDを保持する変数 */
String strUID;
Servo servo;
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {
 SPI.begin();
 mfrc522.PCD_Init();
 servo.attach(SERVO_PIN, 500, 2400);
 pinMode(SERVO_PIN, OUTPUT);
 pinMode(BTN_PIN, INPUT_PULLUP);
}

void loop() {
 /* ICタグ読み取り判定 */
 if(mfrc522.PICC_IsNewCardPresent()) {
  /* UID読み取り判定 */
  if(mfrc522.PICC_ReadCardSerial()) {
   /* ICタグ読み取り情報成形 */
   strUID = "";
   for(byte i = 0; i < 4; i++) {
    String hexByte = String(mfrc522.uid.uidByte[i], HEX);
    if(hexByte.length() == 1) {
      hexByte = "0" + hexByte;
    }
    strUID += hexByte;
   }
   /* ICタグ判定 */
   if( strUID == UID1 || strUID == UID2 || strUID == UID3 || strUID == UID4 ) {
    servMove();
   }
  }
 } else {
  /* ボタン押下判定 */
  if(digitalRead(BTN_PIN) != HIGH) {
   servMove();
  }
 }
}

/* lockStatusから鍵のOpen/Close状態を判定し開錠/施錠のサーボ駆動を行う関数 */
void servMove() {
 /* lockStatus 0:Open 1:Close */
 if( lockStatus == 0) {
  /* サーボの駆動中に新規通信を受け入れないためにdelayが必要 */
  delay(1000);
  /* 鍵をCloseする */
  servo.write(80);
  delay(1000);
  /* 状態をCloseに更新 */
  lockStatus = 1;
 } else {
  delay(1000);
  /* 鍵をOpenする */
  servo.write(0);
  delay(1000);
  /* 状態をOpenに更新 */
  lockStatus = 0;
 }
}

仕事で実装するときは↓のように書きます。

if()
{
    ~~~~;
}

Qiita掲載のために中かっこを続けて記載するようにしましたが、なんか慣れないなぁと思いました。
どっちの書き方が一般的なんでしょうか。
プロジェクトのコーディング規約によるから一般的とかない、という感じでしょうか。


5. 動作確認

実際に自作スマートロックを設置して動かしてみました。

室内側

室外側

音を聞いてください。
サーボの音を。


6. トラブル

トラブル、たくさんありました。
たくさんあった中の3つをピックアップして記載します。

  1. ICタグリーダーのはんだ付け失敗
  2. サーボを内鍵に固定できない
  3. ICタグリーダーがICカードを読み取ってくれない

他にも開発用に使っていたデスクトップPCの電源がつかなくなる(直りました)、プロバイダへの入金ができておらずWiFiが繋がらなくなる(払いました)、などありました。

1. ICタグリーダーのはんだ付け失敗

[ 使ったもの一覧 ]からICタグリーダーのリンクを踏んでもらえばわかるかと思いますが、僕ははんだ付けされていないICタグリーダーを購入しました。
はんだ付け済みのものもありましたが、高校の授業ではんだ付けは勉強したし、はんだ付けされていないICタグリーダーの方が安かったので自分ではんだ付けしよー、と。
愚かでした。
はんだ付けに慣れていないためはんだごてを基盤に長時間当ててしまい、熱によって回路が破損してしまいました。
見た目でははんだブリッジもないしちゃんと接続できているのですが、Aruduinoに繋げてもUIDを読み取ることができませんでした。

幸いICタグリーダーは2個セットで購入していたので、はんだごてを長時間当てすぎないように
注意しながらはんだ付けし直しました。
(エラーメッセージを貼り付けようとしましたが、残していませんでした。次からエラーメッセージ残します)

2. サーボを内鍵に固定できない

タイトル回収です。
サーボモーターを内鍵のつまみ部分に直接くっつけて施錠・開錠を行う設計なので、サーボモーターを内鍵の正面に固定する必要がありました。
ただ、賃貸なのでドアに穴をあけることはできないし、3Dプリンターでケースを作成するのも高額になりそう。
出入りの邪魔になるような物は置けないし、玄関ドアの開閉に耐えられる強度で固定されていないといけない。
CopilotやGeminiに相談してもよさげな答えは返ってこない。
机の上では動作の確認ができて、あとはドアに接着できれば完成、というタイミングで頓挫か…?と。
諦めながらダイソーを彷徨っていた時に見つけたのが今回の救世主、レゴブロックです。
レゴブロックでサーボモーターを固定する台を作成し、台を両面テープでドアに固定する、という解決方法を思いついたことでスマートロック自作計画は救われました。

と思いきや、半月程度で両面テープの粘着が剥がれてしまうのでレゴブロックの固定が安定せず、安定運用にはまだまだ程遠いです。
救ってないじゃん、レゴブロック。

3. ICタグリーダーがICカードを読み取ってくれない

サーボモーターの固定が完了して、やったぁ完成!
と思ったのですが、動作確認を行ったところICカードが読み取られませんでした。
机の上ではちゃんと読み取ってサーボモータも駆動していたのに。
配線ミスかなぁと思って何度も確認しました。
配線ミス無し、でも動かない。
仕方なく固定したものを外し、原因解明のために机の上でもう一度動かしてみました。
動きました。
机の上では動くんです。
でもドアに固定すると動かないんです。
???
超常的ななにかか?

原因はドアの素材です。
ドアが金属、ポストも金属でして、ICタグリーダーの電磁波が吸収・反射されてしまうことで読み取りができなくなっていました。
対策としてICタグリーダーをドアに接触しないように2~3cm程度離して固定しました。

本番環境で動かしてみるまで分からないものですね。
仕事だったら怒られそうですが、趣味なのでセーフ。
良い学びになりました。


7. 反省と改善点

後日ICカードを使って施錠し2~3日外出して戻ってきた時に、ICタグリーダーがドア金属部に触れたのか障害が発生してAruduinoがバグってしまい、開錠できない事件が起きました。
ICカードを信頼して鍵を持って出なかったせいで閉じ込められてしまったのです。
幸い彼女に合鍵を渡していたので、彼女から鍵を借りて事なきを得ました。
ICタグリーダーがドア金属部に触れて障害が発生すると、ドア金属部から離してもAruduino再起動を行うまで読み取りが復活しないので、外側からAruduinoの再起動が行える構成に改善する必要があります。

また、サーボモータの固定が不安定なため半月に1回くらいの頻度で固定を確認する必要があり、外出中に固定が外れてしまった場合はICタグリーダーが正常に動いていても開錠ができない問題もあります。
固定方法を改善せねば、と思います。

あとQiita記事を書いていて思ったこととして、開発時に出たエラーメッセージや解決時に参照したサイト等をメモしておけばよかった、と反省しました。


8. まとめ

タイトル「レゴブロックに救われたスマートロック自作計画」ですが、[ 6.トラブル ]に書いた通りレゴブロックだけでは僕を救ってはくれないみたいです。
閉じ込められましたし、まだまだ安定運用できるようなものではありません。
ただ、自作で動かせるものが作成できたということで、とても満足しています。

次はAruduinoを外部から再起動できるようにする、サーボモータをより強固に固定する、に加えてICカードも持ち歩かなくてよいようにスマホからサーボモーターの制御を行えるようにしたいです。


あとがき

Qiitaに記事を投稿するのに憧れがありまして、これを投稿することで夢が一つ叶った感じがしています。
配線図を作成して、開発時に考えていたことやトラブルを文字に起こして、という作業がとても大変で、とても勉強になるなと。
楽しかったですし勉強になりましたが、睡眠時間が毎日3時間とかになっていました。
昼間は組み込みSEとして仕様書とコードを書き、夜は趣味で自作スマートロックを作成してQiitaの記事を書き。
SEっぽいですよね、楽しいです。
もっといろいろ勉強したい、理解して扱えるようになりたい、と思っています。
ボトルネックは僕の頭です。保存容量が足りない。
SSDとか接続したいなぁ。
自作したいですね、生体接続外部記憶装置。
自作出来たらQiitaに載せます。

書き終わったので達成感に包まれながら寝たいと思います。
おやすみなさい。


0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?