SuicaやEdyを鍵にした電子錠を2万円くらいで作る(C#)

AkerunProを本気で検討していたのですがコスパが当社には合わなかったので自作することにしました。
でも画面とか用意されていたりする点でも、AkerunProの方がおすすめです。ちょっとこういう方法もあるんだくらいのIoTネタとして見てください。

 

【したいこと】

社員が持ってるICOCAPiTaPaおサイフケータイ(ようはスマホとか)で事務所の出入り口を開錠できるようにしたい。

リモートで入退室ログの確認や、カードを忘れた社員から電話があればリモートで開錠してあげれたりしたい。

今ここまでつくった↓

f:id:seireinetwork:20180403223926p:plain

 

【買ったもの】

電気錠:KKmoon  片ドア 電磁式電気錠 12V 180KG (2200円)

https://www.amazon.co.jp/gp/product/B01644X458/
*180キロまで耐えられる磁石。安い。

 

USBリレーモジュール:WINGONEER LCUS - タイプ1 (1300円)
https://www.amazon.co.jp/gp/product/B071S7P5M9
Windowsから(別にLinuxでもいけそうだけど)電気の遮断・通電を制御するためのもの。


パソリ:SONY 非接触 ICカードリーダ/ライタ USB RC-S330(2500円)
*私はもとから持っていたのでS330にしました
https://www.amazon.co.jp/gp/offer-listing/B001MVPD8U
*鍵としてICカード固有のデータ(シリアルっぽいもの)を読み取るために

 

中古のパソコン:ノートパソコンは古過ぎるだとつけっぱなしで発火とか事故も怖いので私はデスクトップ派。USBリレーモジュールはきっとLinux対応してくれているので、Linuxでプログラミングできるような人ならRaspberryPiとかでいいかも。

UPS:BE425M-JP APC ES 425VA(6500円)←Amazonちょっと高かったhttps://www.amazon.co.jp/dp/B01MY53XVO
*ノートパソコンとかのDC12V対応モバイルバッテリーも候補にしていましたが、デスクトップPCの給電もしたかったのと、DC12Vモバイルバッテリーの耐久性についてそれっぽい情報がないので。

 

DC12VのACアダプター(900円)
https://www.amazon.co.jp/dp/B06XSXTLLM
*電子錠に電気送る用

 

DC変換アダプタ(100円)
https://www.amazon.co.jp/dp/B00MG97JDO
*ACアダプタのプラグと電子錠から出てるケーブルをつなげるため。小さいドライバが必要なので無かったら買う。

 

【持ってる人はいらないけれど、買ったもの】

エーモン 細線用電工ペンチ 全長約160mm(1200円)https://www.amazon.co.jp/gp/product/B00366BYAA
*配線剥く用

 

エーモン 配線コード 0,5sq 20m 黒(600円)
https://www.amazon.co.jp/gp/product/B00EXGSMLG
*電子錠から出てるケーブル短いので延長用

 

エーモン 防水収縮チューブ 4φ 140mm・4本入(200円)
https://www.amazon.co.jp/gp/product/B001JBYGHC
*配線コードをつなげる用。まだ使ってないけどこれでいいと思う

【とりあえず配線】

b接点(通常施錠)にしたいので、USBリレーのNCとCOMに電子錠のケーブル片方とアダプタのケーブル片方を配線する。余ったケーブル同士をつなぐ。ぶっちゃけ写真の通りで、線をねじるだけでも動作確認はできる。

 

【とりあえずコード(C#)】

SerialPort1.PortName = "COM4";
SerialPort1.BaudRate = 9600;
SerialPort1.Parity = System.IO.Ports.Parity.None;
SerialPort1.DataBits = 8;
SerialPort1.StopBits = System.IO.Ports.StopBits.One;
SerialPort1.Handshake = System.IO.Ports.Handshake.None;
SerialPort1.RtsEnable = true;
SerialPort1.Open();

//ずっとFelica確認しとく
while (true){ 
try{
using (Felica felica = new Felica()){

felica.Polling(0xFFFF);
byte data = felica.IDm();
String id = "";
for (int i = 0; i < data.Length; i++){
id += data[i].ToString("X2");
}
//MessageBox.Show(id); 登録用にID(ICカードのシリアルっぽいの)表示したいとき。
if (id == "0110AACCDDEEFF00"){ //このIDだったらあける。
   開ける();
   System.Threading.Thread.Sleep(3000); //3秒後に施錠
   閉める();
}
System.Threading.Thread.Sleep(500);
}
}
catch (Exception ex){
Console.Error.WriteLine(ex.Message);
}
}

private void 開ける(){
if ((SerialPort1.IsOpen == true)){
byte bytesOnCommand = new byte { 0xa0, 0x01, 0x01, 0xa2 };
SerialPort1.Write(bytesOnCommand, 0, bytesOnCommand.Length);
}else{
MessageBox.Show("SerialPort is not open.");}
}

private void 閉める(){
if ((SerialPort1.IsOpen == true)){
byte bytesOnCommand = new byte[] { 0xa0, 0x01, 0x00, 0xa1 };
SerialPort1.Write(bytesOnCommand, 0, bytesOnCommand.Length);
}else{
MessageBox.Show("SerialPort is not open.");
}
}