Arduinoで電子錠自作！

#はじめに
初めまして、2021/3に木更津高専を卒業した者です。Qiita初投稿！
今回は在学中に取り組んだ、電子錠(ICカードかざすだけで鍵の開け閉めできるやつ)の製作について書かせていただきます。

ただ昔やってたことを懐かしみながらダラダラ書き連ねるだけですが...

#目次
1.簡単な自己紹介(笑)
2.作ろうとしたきっかけ
3.用語解説
4.ハードウェア構成
5.作り始めてすぐ苦戦！
6.C言語ちょっとわかってきた
7.物理機構でまた苦戦
8.ようやく完成！
9.実はソフトウェア未完成のまま...
10.最後に

# 1.簡単な自己紹介(笑)
2016年4月 木更津高専 電気電子工学科 入学
→本当は当時プログラミングに興味があり、情報工学科にしようか迷っていたが、倍率が高く(しかも中学の通知表は3が沢山あり、推薦は絶対落ちるw)、電気電子工学科を第1志望に記入。学力選抜は過去問ゲーミングだったため、余裕で合格。

家から木更津まで通学時間1.5時間ほどで通うには微妙なため、UFO軍(寮)に入隊。
→当時は挨拶とかやばかったw

時は進んで2年生の時、@3rdjcg 君にArduinoを布教され、見事にハマった。
→記憶が正しければ、そのころから表題のデバイス自作について考えていた。

→以降、趣味に電子工作が追加され、様々な物を作ってきた。(自慢できるものは無い...)
最近はオーディオDACとかにハマってる

# 2.作ろうとしたきっかけ
住んでいた寮の部屋は、古いからか建付けが悪く、鍵を開閉するときにはドアを少し押しながらでないと鍵が回らないという致命的なバグが潜んでいたため、そのたびに煩わしさを感じていた。
その他にも、せっかく電子工作にハマったのだから、マイコンを使って何か動くものを作ろうと思っていたので

※いいわけ
高専2年生のころから本題のデバイス製作について考えていたが、実際の完成は4年生はじめである。開発に時間が掛かりすぎた理由として、作り始めの頃は極端に電子工作の知識が不足していたこと、寮の部屋が2人部屋で実装に抵抗があったこと、サムターン(鍵)の部分の回す機構の考案に時間がかかったこと、などが挙げられる。
![MV-Remove-replace-front-door-thumb-turn-min.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/a82d3e50-33d3-2a4d-7af6-281205d1dd81.jpeg)
出展:https://www.seikatsu110.jp/library/key/ky_police/171322/
↑ サムターンどうやって回す？ (画像はイメージです。)

# 3.用語解説
この記事に出てくるマニアックな用語を雑に解説します。
###Arduino
プログラムを組んでLEDを光らせたり他のセンサなどと連携したり...割といろいろできる。個人向け開発用ボード(Arduino Uno)。およびプラットフォーム。

###ESP8266(WROOM-02)
WiFiが使えるちょっとすごいマイコン。Arduino環境にも対応し、簡単にIoTデバイスを作ったりできる。

###ESP32(WROOM-32)
8266の多機能版的な感じで、WiFiのほかにBluetoothも使えるし、たくさんのインターフェースも備えている。デュアルコア！

###サーボモータ SG92R
回す角度を超簡単に制御できるモータ
今回は鍵を回すのに使用した。

###RC522(以下ICカードリーダー)
MIFAREというICカードを読み取り/書き込みできるカードリーダー

###UID
個々のカードを識別するための情報で、0～255までの数字の塊が4こ集まったものと考えていただければよいかと
WiFiのMACアドレスに似ていて、01:AF:65:2C 的な雰囲気(16進数ね)
(ちなみに今調べたらWiFiのMACアドレスは6バイトだけど...あれー合ってるかな？)
 
以降、製作開始～完成まで、初心者でも理解しやすいように心がけて書きます。

# 4.ハードウェア構成
まず、ICカードを識別するための機器が必要である。少し調べると、MFRC522というICカードリーダーは安く、Arduinoでのライブラリも用意されているということがわかったのでそれにした。Amazonだと数百円で買え、中国から送られてくるw

上記のカードリーダーを使うにはマイコンなどが必要である。私は最初、Arduinoで動作確認した後、ATmega328をユニバーサル基板に実装、次にESP系のマイコンで動くようにした。詳しくは後述。
ESP系のマイコンではPCBも設計し、外注した。

鍵を回すのには上で述べた通りサーボモータを利用する。

# 5.作り始めてすぐ苦戦！
それは2年生の夏季休暇の時、Arduino UnoでICカードリーダーを動かすためにサンプルスケッチを初めて見た時のこと


:::note alert
全くわかんねぇぇぇぇぇぇwww
:::
そいえばその頃は、あまりC言語に慣れてなく学校でも関数や配列まで勉強が進んでいなかったため、理解不能だった。
しかし、Serial.println(n);をプログラムのところどころに挿入し(nは変数)、プログラムのフローを掴んでどうにかしたw

結果、夏休み中の進捗は、”リーダーにかざされたカードのUIDをPCへシリアル出力する”までは出来た。 (当時の自分には凄いことだった)

# 6.C言語ちょっとわかってきた
ところで、前項目でカード情報の取得は出来るようになったが、プログラムはそれで終わりではない。
ほかには、
①カード情報を上書き保存できるようにする 注1
②読み取ったカードのUIDが登録されていれば、サーボモータを回す

少なくともこれらが必要だと思われる。

①の解決策
Arduino系のボードにのっているATmegaというマイコンは、EEPROMというプログラムコードを保持するROMとは別の領域を持っていて、そこに保存することにした。EEPROMは1バイトごと書き込めるので、そのまま4枠に分けて保存した。

②の解決策
UIDは4つに分かれていて、一括でif文に通すのはめんどくさいため、String (文字列)として連結した。
サーボモータは、ライブラリを使用したため、簡単だった。

まあそんなこんなで動く程度のプログラムは完成した。

注1 ソースコード内に定義だとなんか完成度が...

# 7.物理機構でまた苦戦
ここまでくれば、あとはドアに本装置を取り付けるだけだが、ここでも苦戦した。
1.モータの動力をどうやってサムターンに伝えるか？
SG92Rには初めからアタッチメントは付いていないも同然で、自分でどうにかする必要がある。初めのほうは、ペットボトルのキャップに穴開けたり切り込み入れたり不要なスペースには粘土入れたりしてどうにかしようと思ったが、途中でいいアイディアが思いついた。
円形の基板にピンソケットを二個並列にはんだ付けしてモーターに付くように中心に穴開ければ良くね！？
（写真2枚準備中）

↑SR92付属のアタッチメント
↑自作したアタッチメント
若干無理やりだが当時の自分は気に入ったので、これを使うことにした(笑)

2.どうやってドアに固定するか？
モータの動力をサムターンに伝えるには、サムターンから見て上側(本人から見てy軸正の方向)にモータを配置する必要があるため何らかのアプローチが必須である。
ただ、回路が完成してすぐにでも使い始めたかった私は以下のように木材を適当に加工してガムテープで固定していた。

![EA4FfnDU4AAKgn2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/a69fe570-a3f5-22d1-9344-3b5eb364904f.jpeg)
自身のTwitterより:https://twitter.com/0XWQVLJfetIf1Q/status/1156868201998761986/photo/1
(画像のマイコンはESP8266 Ver0.1版だが、1番最初はユニバーサル基板にATmega328のっけてた。写真なかったので)

最終的には
**”一般的な器具(ねじやスペーサー)のみで取り付けできる”**
が目標だったため、それに準拠するようにPCBを設計し、中国の「PCBGOGO」という基板製造会社に発注した。
回路図描いてアートワークして発注！
![画像_2021-12-23_002913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/fdf6301b-0ff9-88f3-fca0-2aa6c9c29701.png)


到着!
![EA2nK1oU0AAda1n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/e5caed1f-2088-c056-b198-865a376be027.jpeg)
![EA2nnlLUEAAbXGY.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/84a3070d-6169-df03-6b83-d70637429e07.jpeg)
![EA2nnlFUIAAfNYW.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/f0f179e6-150e-bb7d-b795-11cd82c7c19c.jpeg)
↑自身のTwitter:https://twitter.com/0XWQVLJfetIf1Q/status/1156764985613099008


![EA4FfnCUwAAe8km.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/025a6d6e-6b02-84ae-63b2-d665ef3fb9f0.jpeg)
![EA4FfnCUcAA_Etg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/85b38cac-2c35-4138-03d7-3cb41f2c82c5.jpeg)
サーボモータの固定は、基板に四角い穴をあけ写真のようにはめ込み、M2.6のねじで固定した。ドアと基板の固定は、取付ボスという両面テープ付きの固定器具に金属製のスペーサをねじ込んで基板を浮かせるようにして実現した。

これで完成！と思っていたが、またしても大きな問題が露呈した。(n回目)
それは、電源のMicroUSBケーブルの配線長が5mなため(コンセントから遠い)、モータが回り始める際の大電流と配線インピにより急激な電圧降下が発生し、マイコンが誤作動してしまうということが起きてしまった。(実は初期のATmega328 Verでもたまにリセットかかり以降動かない事があった、ESP8266ではたまにリセットがかかり極稀に**永久破壊に陥った**)

これは致命的なため、バグ修正&拡張性向上のため**ESP32版も作ることにした。**

# 8.ようやく完成！
![画像_2021-12-22_235809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389923/860a3ab9-7f8e-fca1-7fb1-afcd8f93ff4a.png)
モータ始動時の大電流による電源ライン電圧降下は、モータ(5V)とESP32(3.3V)付近に大容量コンデンサを入れ、アートワークも見直すことによって解決した(っぽい)。
ちなみにESP32はWiFi利用時に数百mAオーダーの電流を食うため、コンデンサに固体アルミコンデンサ(OSコン)を採用した。
ところで、コンデンサ容量を増やすことによって電源投入時の突入電流が増え、電源回路の方が壊れてしまう可能性もあるが、そこは電源投入から数秒間は100Ωほどの抵抗を介してコンデンサを十分充電してからマイコンやモータ側に通電するようにして解決した。

# 9.実はソフトウェア未完成のまま...
ESP8266 Ver の基板では、詳しくは書くつもりはないが少なくとも以下の機能を乗っけていた。
・ローカルネットワーク内から施錠/解錠
・アクションがあるたびに打刻し、ローカルネットワークで自由に履歴を閲覧
・OTAファームウェアアップデート

しかし、私はESP32の開発をあまりしたことがなく、また途中で飽きてしまったため、WiFiやBLEを使った機能の実装はしていない。

最後に、使用した部品代を示す。(準備中)


# 10.最後に
作るのも、思い出しながら記事を書くのも楽しかった！
またこんどなにか書ければいいなと思います。(オーディオ系とか？)
ソースコードは公開するか迷う///