それでは後半戦を始めていきましょう。前半(本当の)0からNFCでカギを操作するソフトを作る。3.コードを書いていこう(最後に当サイトで紹介したコードのダウンロード方法を書いておきます。軽く読んで大丈夫です。)続いて基盤となるプログラム作るためにコーディングしていきます。その前にどのような動作をするかおおまかに設計します。今回の目的はNFCでカギを開ける。事前に登録したNFCチップが読み込まれたらサーボモーターを回したいのです。開けるだけでなく鍵を閉めることもできるようにしたいですね。これらを軽く整理すると以下の図が完成します。この図の通りになるように、構築していきたいと思います。やってコードを書けば良いのか。サーボモーターを回すことから始めましょう。ちなみにここからは、人によって得意なプログラミング言語が変わってくるので、構築言語は変わっていくと思います。今回はサーボモーターを動作させるに当たって容易なPythonと、システム構築が容易なRubyを用いていきます。サーボモーターを制御するプログラムを書く前に、一般的なPWM制御について軽く説明させて頂きます。サーボモーターとは、特定の角度で位置決めをする事ができるモーターです。Modulation:パルス幅変調)を用いて角度を決めていきます。この信号の幅が狭いと0°、幅が大きいと180°のように位置決めが行えます。この幅はデューティー比によって制御できます。Raspbianにはこのデューティー比を指定するための関数が、Pythonのライブラリとしてあるため簡単に制御が行えます。サーボモーターの制御にPythonを用います。途中で周波数を求める部分がありますが、1/PWMサイクル[秒]=周波数[HZ]で求められます。PWMサイクルはデーターシート(仕様書)などで見られます。プログラムを書いていきましょう。プログラムは全て同じフォルダの中に作るようにしてください。今回はhomeフォルダ(Windowsで言う、自分の名前のフォルダ。)に下にフォルダを作り、プログラムを作成していきます。いう事で先ほどの黒い画面(Terminal)を起動させて、以下のコマンドを入力してください。Directory(フォルダを作成)を略してmkdirとなっています。nfckeyという部分はフォルダの名前になります。フォルダの名前このコマンドはLinux(Ubuntu、Arch、Raspbianなどなど)というOSではよく使うので覚えておくといいです。続いて、このままだと「nfckey」という名前のフォルダを作成しただけなので、プログラムを作成する前にフォルダの中に入る必要があります。directoryの略)コマンドを使って移動を行います。このコマンドの使い方は次の通りです。$と変化すると思います。これで、nfckeyフォルダの中に入ることができました。それでは、画面を閉じずコマンドでプログラムを作成してみましょう。万が一閉じてしまったら、Terminalを起動しなおして、cdコマンドでフォルダの中に入りましょう。フォルダは作ってあるのでmkdirコマンドは不要です。次にコマンドでエディタを起動したいと思います。...などと挙げればたくさんありますが、今回は操作が分かりやすいnanoというエディタを使っていきます。他のエディタが良いという方は使いやすいエディタを使うのが最適解なので、好きなものを使ってください。黒い画面にnanoと入力して実行するだけです。実行すると下のような画面になると思います。後はここに文字を入力するだけです。write:」と出るので、ファイル名を入力しEnterキーを押します。Line]と表示されるので、これで保存完了です。終了するときは、ctrlとxキーを同時に押しましょう。protected]~~の画面に戻れるはずです。それでは、試しに以下のコードを入力していきましょうちなみに#はコメント行なので#が先頭についている行は書かなくても大丈夫です。半角空白8文字はtabキー1回で行なってください。50)#サーボモーター動作開始servoctl.start(0.0)#デューティー比を変更servoctl.ChangeDutyCycle(8)#0.5秒ウェイトtime.sleep(0.5)#GPIO設定を初期化GPIO.cleanup()こんな感じになりました。非常に少ない行数でサーボモーターを制御することができます。この行数で済むのもライブラリのおかげです。この2つのファイルの違いについてですが、デューティー比変更の際に12としているか8としているかの違いだけです。この値は後ほど調整するので、実際に設置してから値を変更することになります。次にNFCのIDを取得するためのプログラムを作成します。ここで「2.ライブラリをインストールしよう」でインストールしたnfcpyを使っていきます!では早速コードを以下に示します。main()では次に先程の図の順序通りに動作するように、基盤となるソフトを作ります。これはPythonではなく、Rubyを使います。理由は自分が作りやすかったからです。felicaload.py`endに書き換えて下さい。これで動作させるのに必要なプログラムが完成しました。動かそう!」で実際に動作させてみたいと思います。今回作成したプログラムは次のコマンドでダウンロードすることができますので、ご自由にお使いください。elevenband_nfckeyこの方法でダウンロードした場合、ディレクトリがelevenband_nfckeyとなりますのでご注意下さい。GitHubページを出しておきます。動かそう!みなさんが好きな動作確認の時間です。サーボモーターが動作することを確認します。Output)ピンに接続します。接続の前にサーボモーターの線を見てみて下さい。3色で構成されていますね。これらの色についてですが、以下の構成となっております。GPIO構成は以下の画像の通りとなっております。4を信号線としています。DC出力」のピンに挿すと良さそうですね。次のように接続します。メス)」を使って接続します。ジャンパー線とは延長コードのようなものです。接続は外れないようにしっかりとね!これで、好きなところに接続できるようになるので、先ほどの画像のように接続します。色については元線が対応するように接続します。短絡しないようにしっかりピンに挿しましょう。自分はピンがうまく挿さっていなかったのか不明ですが、これでジャンパー線溶かしました。危ない危ない...図では5V電源とGNDを隣合わせに接続していますが、以下の方が良いかもしれません。Piとの接続は完了です。それではプログラムを起動させて、実際にサーボモーターを動かしてみましょう。作ったプログラムと同じフォルダにいる状態で以下のコマンドを実行します。unlock.py動作しましたか?多分以下のように動くと思います。万が一動かない場合、コードが正しく書かれているか、配線が正しいかを確認してみて下さい。サーボモーターに何かついていますが、これはサーボモーターを購入するときについてきた部品です。必要に応じて付属のパーツとねじを使ってサーボモーターに固定して下さい。このコマンドについてですが、Pythonを実行するコマンドです。実行したいファイルでは、サーボモーターの動作確認ができたので続いて、NFCの読み込みを行ってみたいと思います。PiのUSBポートにカードリーダーを接続して下さい。NFCリーダーライターを接続しようNFCの読み込みについてですが、読み込みたいカードの種類のよって実行するコードが違います。コーディングの際にType2とFelicaの種類のプログラムを作成しました。自分は今回、イレブンバンド(Type2のNFCチップ)を用意しました。今回はこれを鍵の代わりにする。cardload.pyとなります。felicaload.pyとなります。sudoを使う理由はカードリーダーとの接続の際に、root権限が必要だからです。root権限を不要にする方法もありますが割愛します。それでは実際にコマンドを実行して、カードリーダーに読み込みたいカード・チップをかざしてみましょう。“nfc.llcp.sec”だけ出たら読み込み準備OKかざしてみるすると図のように何か画面上に文字列が出力されると思います。この文字列が重要な鍵となります。ID=0000000000000000000000000000と表示されると思います。(felicaload.pyの場合は多少変わりますが、同じくID=...が出ます。)この00000000000000の部分がNFCの固有番号です。この番号をメモしてください。この番号は他人に知られないようにして下さい。次の今回かざしたカードの情報をプログラムに埋め込みます。system.rbでsystem.rbを開いてください。ファイルを開くと、nanoエディタ上に先ほど書いたプログラムが出ると思います。それではカード情報を埋め込んでいきましょう。埋め込むには今回の場合、DBという名前の配列に書き込む必要があります。矢印キーでDBが書かれている行までカーソルを移動してみましょう。したら、YourName1の部分をログに記録したい名前、XXXXの部分を先ほどメモしたNFCの固有番号に置き換えてください。(以下に例を示します。}編集できましたか?編集出来たらctrlとoキーを同時に押し、そのままEnterキーを押してファイルを上書き保存します。これでカード情報の埋め込みが完了です。それではctrlとxキーを押して終了しましょう。ソフトの動作確認を行います。サーボモーターとNFCリーダーライターを接続した状態で進めていきます。system.rbはRubyという言語で書いたため、Rubyコマンドでプログラムを実行します。system.rbを実行しましょう。Card...と表示されるので、先ほどかざしたカードをかざしてみましょう。かざしてみると、サーボモーターが回ります!また、10秒後に逆回転します。Card...と表示されればプログラムは正常に動作しています。別のカードをかざすと、サーボモーターは動きません。DBにある固有番号かどうかで判定をしているため、登録したカード以外では反応しません。以下に、僕が製作した一例を載せておきます。動画では色々表示されていますが、少し改変してあるので同じ表示じゃなくても大丈夫です。プログラムを終了する際はctrlとcキーを同時に押すと終了できます。重要なのは、登録したNFCでのみサーボモーターが動き、10秒後に元に戻る、未登録のNFCがかざされたときは反応しないことです。うまく動作しないなどがあれば、NFCの固有番号の入力に問題があることが多いです。読み取ったNFCの固有番号と、system.rbに入力した固有番号を再度確認してみましょう。問題なく動作したら動作確認を完了です。設置しよう!」に進みましょう。設置しよう!今回作ったシステムを実際に設置していきます。注意点としては、NFCカードとNFCリーダーライターの間に金属板があると正常にカードが読み取れなくなってしますので注意してください。必要に応じて、アンテナの製作やNFCリーダーライターを外に出してください。僕の場合ロッカーに僅かな隙間があるので、カードは無理そうですが、小型のチップなら読み取れそうです。僅かな隙間が・・・では設置します。鍵の仕組み応じてサーボモーターの設置を行って下さい。ついてですが、環境によって変わってくるので各自固定してください。サーボモーターの故障時や、モバイルバッテリーでの駆動時にバッテリー切れになる場合があるため、普通のカギでも開けられるように設置しておきましょう。(開かなくなります)なので、ロッカーに設置するのではなく、ドアにある以下のような鍵に軽く設置する程度にしましょう。ここにサーボモーターが軽く引っかかるようにつける設置完了したらsystem.rbを起動して、動かしてみましょう。僕の動作例を以下に載せておきます。サーボモーターの角度が合わないなと思ったら、lock.pyとunlock.pyをエディタで開き、#デューティー比を変更servoctl.ChangeDutyCycle(8)#0.5秒ウェイトtime.sleep(0.5)のservoctl.ChangeDutyCycle(8)の数字を変えて調整してみましょう。0~12の範囲で設定します。うまい具合に調整後、先ほどの重要ポイントである、登録したNFCでのみサーボモーターが動き、10秒後に元に戻る、未登録のNFCがかざされたときは反応しないことの3つの条件が満たせれば完成です。お疲れ様でした!何度も注意しますが、必ず普通のカギでも開けられるようにしてください。設置不良で開けられなくなっても、責任は負いかねます。あと前半でも言いましたが、カードエミュレーションでIDmを偽装できるので、時間を掛ければ認証突破できてしまうので注意しましょう。(かなり時間がかかるのでやる人はあまり居ないと思いますが...念の為)要するに家の鍵など重要な部分には付けないようにしましょう。実際に家の鍵など安全性を要求する所に設置するならば、Felicaのブランクカード買ってメモリ領域に適当な値を書き込み、IDm認証+メモリ領域認証を実装すれば不正に突破される確率は少なくなります。(メモリも偽装されれば突破はできてしまうけど、それだけパターンは増えるので更に時間がかかると思われます。絶対に突破できなくなる訳では無いので注意。)(実際の製品とかはどうなっているのか、良く調べていないので分かりませんが...)終わりにということで今回は0からカードキーシステムを作ってみました。いかがでしたでしょうか。今回は簡易的に製作を行いましたが、実際の製品にするにはもう少し改良とセキュリティの強化を行う必要があります。今回製作していて、おもしろいと感じてみたらインターネット上に多くの文献があるので、自分で調べて改良するのもおすすめです。Piはこれ以外にも様々な工作に応用できるので、ぜひ自身のアイデアを積極的に実際のカタチにしてみてください。稚拙な文章にもかかわらず、ここまで読んでいただきありがとうございました。何かご質問やご指摘、感想が御座いましたら、当記事のコメント欄までお願い致します。ありがとうございました。Quiitaもりかぷプログラミングが学べるということで「電気・電子」の学科に入ったら失敗しながらも、何とか留年せずに上がってきた高専生です。変なものを作っています。コメントデータの処理方法の詳細はこちらをご覧ください。[前半](本当の)0からNFCでカギを操作するソフトを作る。自作OSにページングを実装したTwitterFacebookポリシーハードウェアやソフトウェア開発を中心に活動しているモノづくりグループです。