【Arudino】合鍵はICカードでいこう

最終更新日時を読み込み中です…

夏季休業期間に入りましたが、いまだに1307に常駐しています。

ほとんど1307に住んでいます。水野翔太です。

エアコンとiMacのために来ています。

家も近いし、メリットしかありません。


目次


  1. はじめに
  2. 経緯
  3. ICカードでユーザ認証をする
  4. モーターで施錠/解錠をする
  5. ユーザ認証とモーター制御のプログラム(一部)
  6. 3Dプリンタを使ってみる
  7. 設置する
  8. おわりに
  9. 参考

はじめに


今回は1307教室の、面倒な鍵の管理を楽にするべく、あるシステムを開発しました。

このシステムでは、鍵がひとつしかないことにより、発生する問題を、ICカードを合鍵として利用可能とすることで解決をしました。

Arduinoにて、ICカードをRFIDリーダで読み取ることでユーザ認証を行い、さらにはモーターを用いた鍵の自動施錠、自動解錠が行えるようになっています。


経緯


先日、デジタルサインプレートを作りました。

あれから、少しのあいだ実際に使ってみて、さまざまな改善すべき点が見えてきました。

例えば、電気がつけたまま施錠されている場合や、施錠されていなくても電気がつけられていない場合などに機能しないという問題。

鍵を施錠したのちに、鍵を持ち歩いている人がいる場合。

そもそも通信端末がない場合には、入室状況の確認ができない。

など、問題とまではならなくても多少不便を感じるときが度々ありました。

もういっそのこと、鍵をなくせたらいいのになんて思ってしまいます。

ということで今回、問題となっているのは鍵を持っているその人しか、施錠、開錠が行えないということです。

ならば、その鍵の合鍵を作ってしまえば良いという話ですよね。

でも、勝手に合鍵を作ったりなんてしたら、きっと怒られると思うので自制しました。

もし、合鍵をどこかに落として紛失なんてしたら、それこそ色々と問題が発生しそうですし。

そんなことを、考えながら買い物をしていると、

楽天Edy「ピッ」

わあ!

楽天Edy「僕を使ってよ。」

と言われ、ICカードを鍵の代わりにできたら面白いかもと思いつきました。


ICカードでユーザ認証をする


「ICカード」「ユーザ認証」言葉はなんだか小難しい感じがしますね。

ですが幸いなことに、僕たちには、ArduinoUnoキットがあります。

このキットとても優秀で、RFIDリーダ(RFID-RC522)が付属しています。

これを使うことで、ICカードの情報を簡単に読み取ることができます。

とりあえず、RFIDリーダを動かしてみましょう。

Arduino Project Hubのサンプルを動かしてみると、読み取ったICカードの情報を表示することができます。

手元にあるICカード達を試してみたのですが、クレジットカード以外は反応しませんでした。

というのも、このRFIDでは「Mifare」という種類のカードにのみ対応しており、それ以外は使うことができない仕様があるためのようです。

付属のICカードは、問題なく使用可能なため、今回は付属のものを使うこととしました。

前述のプログラムでカードに記録されているUIDも取得できています。

ユーザ認証プログラムには、「非接触ICタグで遊ぼう!ArduinoでRFIDリーダRC522を使う方法」を参考に本プログラム用に最適化し作成しました。


モーターで施錠/解錠をする


これまた幸いなことに、モーターもキットに付属しています。

いくつか、入っているのですが、手始めに一番強そうなやつを試してみました。

見た目は強そうですが、残念ながら鍵を施錠するほどのパワーはありませんでした。

仕様書を見てみるとトルクは62gfのようです。

仕様書みるのは非常に大事。ということで、付属のモーターのトルクを確認しました。

すると意外なことに、おもちゃみたいなサーボモータ(SG90)がなかなか強いことがわかりました。

なんとトルクは1.8kgf。

試してみると、施錠、解錠ができるパワーを持っていました。

ヤー!


ユーザ認証とモーター制御のプログラム(一部)


プログラムはほとんどが、サンプルプログラムのままですが、どのような処理をしているのか一部紹介します。

loop部分の全容


void loop() {
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  //create string uid
  String strBuf[mfrc522.uid.size];
  String strUID = "";
  for (byte ii = 0; ii < mfrc522.uid.size; ii++) {
    strBuf[ii] =  String(mfrc522.uid.uidByte[ii], HEX);
    if (strBuf[ii].length() == 1) {
      strBuf[ii] = "0" + strBuf[ii];
    }
    strUID.concat(strBuf[ii]);
  }
  Serial.print(strUID);
  Serial.println();

  //check uid
  for (byte ii = 0; ii < sizeof(allow) / sizeof(String); ii++) {
    if (allow[ii].equals(strUID)) {
      Serial.print("allow");
      Serial.println();
      if (lock) {
        penguin.attach(6);
        lock = false;
      } else {
        penguin.attach(5);
        lock = true;
      }
      penguin.write(100);
      delay(500);
      penguin.write(0);
      delay(500);
      return;
    }
  }
  delay(1000);
}
                        

全体としては、UIDを取得し、認証の後に、モーターを動かすという流れとなっています。

14行目からの処理では、ICカードからUIDをString型で取得し、認証に使うための前処理を行なっています。

27行目からの処理では、登録済みのUIDと取得したUIDを比較し、認証を行い、モーターを動かしています。


3Dプリンタを使ってみる


さて、モーターでロックをできることが確認できたところで、次に考えなければならないことはモーターの固定方法です。

ガムテープで固定することもできなくはなさそうですが、あまりにカッコわることになりそうなので避けたいところ。

なんだこれは。

これは、「Ender-3」という3Dプリンタです。

せっかくなので今回は、基盤やモーターの固定のため3Dプリンタでケースを作ることにしました。

錠前の形に合わせて、Fusion360でモデリングしていきます。

いきなり、完成形を作るのではなく、テストのケースを作って何度か試しながら進めます。

これらは、テスト用にプリントしたものです。

ケース中央に穴が空いていますが、従来通り鍵や手での施錠、解錠を行えるようにするためです。


設置する


最後に、実際に設置をしてみます。

こんな感じで、設置できました。

丸い穴が空いている箱には基盤が入っています。

これは、菊池君がオープンキャンパスの時に作ってくれたケースを流用しました。

感謝します。

両面テープで止めているだけなので、少し心配ですが、ネジで留める許可も降りなそうなので、貼り付け方法は保留です。

どんな感じで動作するのか見てみましょう。


おわりに


今回は、ICカードを1307の合鍵として利用できるようにしてみました。

鍵を保管するロッカーを開ける手間もなく、個人的には非常に助かっています。

1307の利用者で、ICカードの合鍵が欲しい人は、ぜひ連絡をください。


参考



このサイトを作った人


水野翔太

福知山公立大学情報学部情報学科
2024年卒業予定

やまもとよしのふゼミ所属 3回生

連絡先:
32045088[at]fukuchiyama.ac.jp
(@マークに置き換えてご利用ください)