彼女のお婆ちゃんからさつまいもを頂いたので、食べながら書いています。
初Qiita記事はさつまいもと共に。
目次
- きっかけ
- 使ったもの一覧
- 構成
- ソースコード
- 動作確認
- トラブル
- 反省と改善
- まとめ
1. きっかけ
家の鍵は基本開けっ放しの田舎っぺな僕ですが、都会に引っ越すこととなりましたので鍵の管理をせねばと。
空き巣とか、居空きとか、居留守とか、怖いですから。
ただ、鍵を持ち歩くのは紛失のリスクもありまして、「あ、鍵閉め忘れた」的なことも多々ありまして。
鍵の携帯に不向きな田舎っぺが染み付いている僕なのでした。
ということで、ICカードで鍵の施錠・開錠ができる、Arduinoを使ったスマートロックの自作を始めることにしました。
出来合いのスマートロックは買うと高いですから。
後付けタイプのスマートロックって安いんですね、アマゾンに6,480円で売ってました。
https://amzn.asia/d/7p9obkU

僕の作ったスマートロックは全部合わせて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の場合はサーボモーターを駆動させて施錠・開錠を実行します。
サーボモーターは内鍵のつまみ部分に接着してしまっているので直接つまみ部分を回しての施錠・開錠が行えません。
ので、内側から施錠・開錠を行えるように押しボタンを付け、押しボタンの押下によってサーボモーターを駆動させて施錠・開錠を実行します。
ポイントは「安価」と「非破壊」です。
お金がないので安価に、賃貸なので非破壊で。
配線図
スマートロックの配線図です。

AruduinoとICタグリーダー、Aruduinoとサーボモーター、Aruduinoと押しボタンの3つに分解して詳細を記載します。
①AruduinoとICタグリーダー
| 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とサーボモーター
| サーボモーター | AruduinoのPin |
|---|---|
| PWM | 8Pin |
| Vcc | 5V |
| Ground | GND |
以下のサイトを参考に構築しました。
https://tech.nri-net.com/entry/arduino_with_Servomotor
③Aruduinoと押しボタン
| 押しボタン | 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つをピックアップして記載します。
- ICタグリーダーのはんだ付け失敗
- サーボを内鍵に固定できない
- 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に載せます。
書き終わったので達成感に包まれながら寝たいと思います。
おやすみなさい。




