フェイスアンロック付きスマートドア
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 2 | ||||
| × | 1 |
必要なツールとマシン
> |
|
アプリとオンラインサービス
> |
| |||
| ||||
| ||||
| ||||
|
このプロジェクトについて
ようこそ、好奇心旺盛な仲間!私たちはインターネットに革命を起こした時代に生きており、世界中の何百万人もの人々にプラスの影響を与える可能性のある素晴らしいアイデアを思いつくために、これまでになく簡単に実験や革新を行うことができます。
自宅の棚、引き出し、ワードローブ、ドアに少しセキュリティを追加したいと思ったことはありませんか?インターネットを使用したイノベーションに関しては、私たちが利用できる何千ものプラットフォームとツールの中で、際立っているのは Arduino
です。 および Bolt IoT
。このプロジェクトでは、標準の棚を変更して、顔の確認を使用してロックを解除するセキュリティシステムを追加します。 Windowsフォームアプリケーションを作成します C# 信頼できる顔を保存、検証、ロック解除できます。 FacePlusPlus API
を使用します 顔の検証と Bolt IoT Cloud API BoltWiFiモジュールおよびArduinoとの通信用。 BoltWiFiモジュールを Arduino Uno とインターフェースします 、それはドアをロック/ロック解除するためにサーボモーターを制御します。
興奮した?始めましょう。
背景
このプロジェクトは、InternshalaTrainingsが実施したInnovateChallengeとIoTTrainingの一環として作成しました。彼らのトレーニングは、APIサービス、オブジェクト指向プログラミング、そして最も重要なことに、BoltWiFiモジュールの使用の基本を理解するのに役立ちました。このトレーニングの一環として行われたCapstoneプロジェクトの概要は、ここにあります。これらの概念の多くは、このプロジェクトの開発の過程で役に立ちました。それで、これを可能にしてくれたInternshalaチームに大声で叫びました。
ステップ1:ソフトウェアの構築
VisualStudioを使用してWindowsフォームアプリケーションを構築します。このアプリケーションはWindowsマシン上で実行され、承認された顔の管理、FacePlusPlus APIを使用した顔の検証、およびBoltWiFiモジュールとの通信を担当します。コーディングにはC#を使用します。
Visual Studioを起動し、新しいWindowsフォームアプリケーションプロジェクトを作成します。 Visual Studioをまったく使用したことがない場合は、VisualStudioを使用したWindowsフォームアプリケーション開発の基本を学ぶことをお勧めします。これとこれは始めるのに良いリソースです。
このチュートリアルでは、主な機能と重要な機能を実行するプロジェクトのスニペットを使用してコードを説明するだけです。ほとんどのコードは自明であり、十分に文書化されているため、コード全体を確認するのは面倒で不要です。
Visual Studioプロジェクトでは、さまざまな目的で3つのライブラリを使用しています。それらは:
- AForge .NET :Windowsでの画像処理に使用される人気のある.NETフレームワーク。ウェブカメラから画像をキャプチャするために使用します。
- Bolt IoT API .NET :Bolt Cloud APIを通信するためにC#で作成した非公式のクライアントライブラリ。
- Newtonsoft JSON :.NET用の人気のある高性能JSONフレームワーク。プロジェクトでAPI応答を解析するために使用されます。
注:上記のAPIでのさまざまなメソッドの使用法を明確にするために、ここ、ここ、およびここでそれぞれのドキュメントを参照してください。
はじめに
コーディングに取り掛かる前に、いくつかの設定を行う必要があります。
1。 Bolt CloudAPIクレデンシャル
まだ行っていない場合は、cloud.boltiot.comにアクセスしてアカウントを設定してください。ログインしたら、WiFiモジュールをBoltCloudにリンクします。そのためには、Bolt IoT SetupAppを携帯電話にダウンロードしてください。アプリに表示される指示に従って、デバイスをアカウントにリンクします。これには、BoltとローカルWiFiネットワークのペアリングが含まれます。リンクに成功すると、ダッシュボードにデバイスが表示されます。これで、デバイスID を取得できます および APIキー ダッシュボードから。
2。 FacePlusPlusAPIクレデンシャル
このプロジェクトで依存しているもう1つのAPIサービスは、 FacePlusPlus API です。 。さまざまな画像認識サービスを提供する無料のプラットフォームです。顔識別に使用します。アカウントを作成し、FacePlusPlusコンソールに移動します。 APIキー
に移動します アプリ
の下 + Get API Key
をクリックします 。新しく生成された APIキーを書き留めます および APIシークレット 。
これで、次の準備が整いました。
private readonly string BOLT_DEVICE_ID ="BOLTXXXXXX"; private readonly string BOLT_API_KEY ="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";プライベート読み取り専用文字列FPP_API_KEY ="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";プライベート読み取り専用文字列FPP_API_SECRET ="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
myBolt
というBoltクラスの新しいグローバルインスタンスを作成します 、これを介して、WiFiモジュールとの今後のすべての通信を行います:
myBolt =new Bolt(BOLT_API_KEY、BOLT_DEVICE_ID);
そうは言っても、アプリケーションがいくつかのコア機能をどのように実行するかを見てみましょう。
1.ドアのロック/ロック解除
デジタルピン0が HIGH
になるように回路を設計しました 、ドアがロックされることになっています。デジタルピン3が HIGH
の場合、 、ドアのロックが解除されているはずです。これは、後で回路回路図について説明するときにさらに明確になります。
ロックには、 DigitalMultiWrite を使用します
ライブラリから HIGH
を書き込むメソッド 値をD0に、LOW値をD3に設定します。これは、Arduinoにドアをロックするように信号を送ります。同様に、ロックを解除するために、 LOW
と記述します。 D0と HIGH
の値 D3への値。これにより、Arduinoにドアのロックを解除するよう信号が送られます。このチュートリアルの後半で、Arduinoのコードと回路設計について説明します。
ロックを実行するコード:
private async Task LockDoor(){MultiPinConfig multiPinConfig =new MultiPinConfig(); MultiPinConfig.AddPinState(DigitalPins.D0、DigitalStates.High); //ロック信号multiPinConfig.AddPinState(DigitalPins.D3、DigitalStates.Low); //シグナルのロックを解除awaitmyBolt.DigitalMultiWrite(multiPinConfig); multiPinConfig =new MultiPinConfig(); multiPinConfig.AddPinState(DigitalPins.D0、DigitalStates.Low); //ロック信号multiPinConfig.AddPinState(DigitalPins.D3、DigitalStates.Low); //シグナルのロックを解除しますmyBolt.DigitalMultiWrite(multiPinConfig);}
ロック解除を実行するコード:
private async Task UnlockDoor(){MultiPinConfig multiPinConfig =new MultiPinConfig(); multiPinConfig.AddPinState(DigitalPins.D0、DigitalStates.Low); //ロック信号multiPinConfig.AddPinState(DigitalPins.D3、DigitalStates.High); //シグナルのロックを解除awaitmyBolt.DigitalMultiWrite(multiPinConfig); multiPinConfig =new MultiPinConfig(); multiPinConfig.AddPinState(DigitalPins.D0、DigitalStates.Low); //ロック信号multiPinConfig.AddPinState(DigitalPins.D3、DigitalStates.Low); //シグナルのロックを解除しますmyBolt.DigitalMultiWrite(multiPinConfig);}
2.信頼できる顔を追加/削除
信頼できる顔の画像データはBase64文字列にエンコードされ、マシンにローカルに保存されます。各面の対応する名前のリストも保存されます。このプログラムでは、顔を追加するために、最初に現在のフレームで使用可能な顔があるかどうかを確認します。これは、FacePlusPlusのDetectAPIを使用して行います。検出された顔の特徴を含むJSON応答を返します。顔が検出されない場合、応答は単に []
になります 。顔が検出されると、画像のbase64でエンコードされた文字列と対応する名前が保存されます。これが信頼できる顔を追加するビデオデモです。
顔の削除は非常に簡単です。削除ボタンを押すと、保存されているリストから画像データと名前が削除されます。
顔情報を追加および保存するコード:
//画像をbase64文字列に変換してリストに追加します。 ImageDataList.Add(ImageToBase64((Image)PreviewBox.Image.Clone())); //顔の名前をlistNameList.Add(FaceNameTextBox.Text.Trim());に追加します。 //顔画像データをそのnameProperties.Settings.Default.Base64ImageData =ImageDataList; Properties.Settings.Default.FaceNames =NameList; Properties.Settings.Default.Save();
とともにベースエンコード文字列として保存します
顔情報を削除するコード:
// listNameList.RemoveAt(e.RowIndex); ImageDataList.RemoveAt(e.RowIndex);の指定された位置にある顔情報を削除します。 // faceProperties.Settings.Default.FaceNames =NameList; Properties.Settings.Default.Base64ImageData =ImageDataList; Properties.Settings.Default.Save();
を削除した後にリストを保存します
添付のプロジェクトのコードを確認してください。ここでは、プロセスが各行のコメントとして説明されており、明確なアイデアが得られます。
3.顔の確認
FacePlusPlusのCompareAPIを使用して、顔が信頼できるかどうかを確認します。このプロセス中に、保存されたリストの各面を線形に反復し、キャプチャされた画像と比較します。 APIが80%を超える信頼度を返した場合、ドアのロックを解除します。
この比較を行うコードは次のようになります:
WebClient client =new WebClient(); byte [] response =client.UploadValues( "https://api-us.faceplusplus.com/facepp/v3/compare"、new NameValueCollection(){{" api_key "、FPP_API_KEY}、{" api_secret "、FPP_API_SECRET}、 {"image_base64_1"、face1Base64}、{"image_base64_2"、face2Base64}});});文字列の信頼性=JObject.Parse(System.Text.Encoding.UTF8.GetString(response))["confidence"]。ToString();
WebClient.UploadValues メソッドは、比較対象の2つの顔のbase64エンコードされた顔データとAPIクレデンシャルとともにリクエストをFacePlusPlusAPIに送信します。応答は Newtonsoft JSON を使用して解析されます ライブラリと<コード> 自信 値が取得されます。引数を明確に理解するには、CompareAPIのドキュメントをお読みください。
4.ベルリスニングスレッド
ユーザーがカメラを見ながら押してドアのロックを解除できるように、ベルボタンを呼び出すような物理的なプッシュボタンを提供する予定です。これを可能にするには、ベルボタンの押下イベントを継続的にリッスンする新しい専用スレッドを作成する必要があります。
このチュートリアルの後半では、プッシュボタンがどのように使用され、BoltWiFiモジュールのD4ピンが HIGH
になるかを確認します。 ボタンが押されたとき。今のところ、上記を想定します。したがって、このスレッドでは、継続的に DigitalRead
D4ピンの値。 HIGH
の場合 、それをベルリングイベントと見なし、顔のキャプチャと検証を行います。
ベルリスニングスレッドで継続的に実行されるコードは次のとおりです。
while(ListenForBell){Response R =await myBolt.DigitalRead(DigitalPins.D4); if(R.Value =="1"){RingBell_Click(null、null); Thread.Sleep(2000); } Thread.Sleep(2000);}
停止して、各反復の間に2秒間待機します。そうしないと、Bolt CloudAPIの使用クォータがすぐに使い果たされてしまいます。
ステップ2:VisualStudioプロジェクトの構築
プロジェクト全体をダウンロード ここ 。 Facebolt Doorlock.sln
を開きます VisualStudioのファイル。ソリューションが読み込まれたら、 Form1.cs
を開きます ファイルを作成し、APIクレデンシャルでコードを更新します。 「開始」という名前の緑色の再生ボタンを押して、プログラムをビルドして実行します。
このプログラムでは、システムに接続されているカメラデバイスから選択して、カメラからのライブフィードを確認できます。信頼できる顔を追加/削除できます。顔の監視を開始します。プログラムがボルトデバイスの接続を確認したら、プログラムから直接ベルを鳴らすか、ドアをロックできます。
<図> <図> <図>プログラムで顔の確認、ロック、ロック解除がどのように機能するかについて混乱していても問題ありません。回路回路図の設計とArduinoのコードを見ると、より明確になります。最後に、各操作のイベントの流れについても説明します。
ステップ3:回路設計とArduinoコード
私たちの回路では、次の機能を実装する予定です。
- ドアのロック状態とロック解除状態をそれぞれ示す赤と緑のLED表示。
- 呼び出しベルスイッチのように機能するプッシュボタン。押すと、WinFormsアプリケーションは顔を確認し、顔認証が成功するとドアを開ける必要があります。
- ドアをロックするためのもう1つの押しボタン。
- ドアベルリングとドアロックが発生した場合にビープ音を鳴らすブザー。
私たちのプロジェクトの回路接続を以下に示します:
<図> <図>まだダウンロードしていない場合は、ここからArduino IDEをダウンロードして、Arduinoをシステムに接続します。コードをアップロードする前に、IDE設定で正しいArduinoモデルとポートを設定していることを確認してください。
Arduinoコード:
#include #define ServoPin 4#define LockSignalPin 2#define UnLockSignalPin 3#define BellButtonPin 5#define LockButtonPin 8#define RingBellSignalPin 6#define BuzzerPin 7#define GreenLedPin 9#define RedLedPin 10 Servo myServo; void setup(){pinMode(LockSignalPin、INPUT); pinMode(UnLockSignalPin、INPUT); pinMode(BellButtonPin、INPUT); pinMode(LockButtonPin、INPUT); pinMode(BuzzerPin、OUTPUT); pinMode(RedLedPin、OUTPUT); pinMode(GreenLedPin、OUTPUT); pinMode(RingBellSignalPin、OUTPUT); digitalWrite(RedLedPin、LOW); digitalWrite(GreenLedPin、LOW); digitalWrite(RingBellSignalPin、LOW); myServo.attach(ServoPin); Serial.begin(9600);} void loop(){int lockButton、lock、unlock、bell; char snum [5];ロック=digitalRead(LockSignalPin);ロック解除=digitalRead(UnLockSignalPin); //ボルトからのロック信号がHIGHかどうかを確認しますif(lock ==HIGH){//モーターをロック位置に回しますmyServo.write(120); // LED表示を設定しますdigitalWrite(GreenLedPin、LOW); digitalWrite(RedLedPin、HIGH); //バズロックサウンドdigitalWrite(BuzzerPin、HIGH); delay(1000); digitalWrite(BuzzerPin、LOW); delay(1000); } //ボルトからのロック解除信号がHIGHかどうかを確認しますelseif(unlock ==HIGH){//モーターをロック解除位置に回しますmyServo.write(0); // LED表示を設定しますdigitalWrite(GreenLedPin、HIGH); digitalWrite(RedLedPin、LOW); delay(2000); }ベル=digitalRead(BellButtonPin); if(bell ==HIGH)//ユーザーがベルリングベットを押した{//リングボタンが押されたことを示すシグナルボルトdigitalWrite(RingBellSignalPin、HIGH); //呼び出しベルの音のパターン! digitalWrite(BuzzerPin、HIGH); delay(100); digitalWrite(BuzzerPin、LOW); delay(20); digitalWrite(BuzzerPin、HIGH); delay(200); digitalWrite(BuzzerPin、LOW); delay(100); digitalWrite(BuzzerPin、HIGH); delay(100); digitalWrite(BuzzerPin、LOW); delay(20); digitalWrite(BuzzerPin、HIGH); delay(200); digitalWrite(BuzzerPin、LOW); delay(1500); //信号をオフにしますdigitalWrite(RingBellSignalPin、LOW); } lockButton =digitalRead(LockButtonPin); if(lockButton ==HIGH)//ユーザーがロックベットを押した{//モーターをロック位置に回すmyServo.write(120); // LED表示を設定しますdigitalWrite(GreenLedPin、LOW); digitalWrite(RedLedPin、HIGH); //バズロックサウンドdigitalWrite(BuzzerPin、HIGH); delay(1000); digitalWrite(BuzzerPin、LOW); }}
イベントフロー
WinFormアプリケーションとArduinoデザインの両方の準備ができたので、コードを詳しく調べて、各操作の制御フローを調べてみましょう。
1。リング ボタンを押す
<図>2。ロック ボタンを押す
<図>上記の両方の操作は、Windowsフォームアプリケーションから直接実行することもできます。
ここでは、ボルトWiFiモジュール WindowsフォームアプリケーションとArduino間の重要なワイヤレスインターフェイスとして機能します。 Bolt Cloud APIを使用すると、プロジェクトを拡張し、Androidなどの他のプラットフォームでアプリケーションを構築し、電話を使用してドアのロックを解除できます。この柔軟性は、IoTとボルトプラットフォームの力です。
ソフトウェア設計の部分が完了したので、先に進んでロック可能なドアメカニズムを構築しましょう。
ステップ4:ハードウェアの構築
私は靴棚を置いているので、このプロジェクトでは、それをロックのデモンストレーションに使用します。棚やドア、ワードローブなど、ハッキング可能なロック機構を備えたものなら何でも使用できます。本当にあなた次第です。
<図> <図> <図> <図>サーボモーターとロックを接続するカップリング機構を構築する必要があります。このために、私の考えは、ボトルからのカットオフネックと別のボトルのキャップを使用することです。ボトルネックをサーボモーターに取り付け、キャップをロックに取り付けます。次に、ナイロン糸を使用してそれらを結合します。これにより、モーターが回転するたびにロック/ロック解除アクションが発生します。
キャップにドリルで穴を開けた必要なボトルネックは、次のようになります。これをシューラックのロッキングシャフトに取り付けます。
<図> <図>別のボトルのキャップをサーボモーターに取り付ける必要があります。キャップとモーターの回転軸の接続には銅線を使用しています。
<図> <図> <図>次に、これら2つを結合する必要があります。そのためにナイロン糸を使用しています。必要な長さの糸を使ってループを作り、両方のキャップに糸を取り付けます。
<図> <図>結合すると、相互に回転するアクションを引き起こす可能性があります:
<図>回転機構の準備ができたので、次にロックをハックしてボトルネックを固定します。穴を開けたので、ロックシャフトをラックから外し、ボトルネックをその上に置き、ロックをしっかりと締め直すだけです。
<図>あとはサーボモーターをシューラックに固定するだけです。ホットグルーガンを使用して、モーターをラックにシールします。
<図> <図>糸の長さを調整し、十分に締めたら、最終的なセットアップの準備が整います。以下に示すように、サーボモーターはドアを正しくロックおよびロック解除できます!
<図> <図>必ずしもボトルネックを使用する必要はありません-カップリングのスレッド方式。ロックシステムに最適で便利な方法を使用してください。
幸い、ラックの適切な場所に小さな開口部がありました。これにより、サーボモーターの接続を簡単に外すことができました。少し装飾作業とラベリングを行った後、最終的なスマートシューズラックの準備が整いました。
<図> <図> <図> <図> <図> <図>これですべての設定が完了しました。あとは、回路を起動し、WinFormsアプリケーションに信頼できる顔を追加して、ドアのフェイスロックセキュリティを楽しむだけです。 ArduinoとBoltWiFiモジュールの両方に電力を供給する必要があります。私は10000mAhのパワーバンクを使用して両方に電力を供給しています。私が使用しているWebCamは、Microsoft LifeCamVX-800です。それは古いですが、それでもラップトップのカメラよりも優れています。デモビデオをチェックしてください。それは私たちのプロジェクトの働きを詳細に示しています。
ビデオデモンストレーション
私たちのプロジェクトの実際をご覧ください(ビデオ品質についてお詫びします):
結論
ハフ..それはかなり長かった。このプロジェクトは、BoltIoTを活用したInternshalaのIoTトレーニングの成果です。このプロジェクトは非常に単純ですが、モノのインターネットの可能性と、それが人々の日常生活をどのように楽にすることができるかを示しています。
とにかく..これは私にとって素晴らしい学習体験でした。皆さんがこれを作成するのを楽しんでくれることを願っています。あなたが思いつく新しいイノベーションを見るのを楽しみにしています。最後に、このベンチャーを可能にしてくれたInternshalaとBoltIoTのトレーニングチームに心から感謝します。
これで終わりです!
コード
- BoltDoorLock.ino
- WinFormsアプリケーション-VisualStudioプロジェクト(Facebolt Doorlock).zip
BoltDoorLock.ino C / C ++
Arduinoコード。#include#define ServoPin 4#define LockSignalPin 2#define UnLockSignalPin 3#define BellButtonPin 5#define LockButtonPin 8#define RingBellSignalPin 6#define BuzzerPin 7#define GreenLedPin 9#define RedLedPin; void setup(){pinMode(LockSignalPin、INPUT); pinMode(UnLockSignalPin、INPUT); pinMode(BellButtonPin、INPUT); pinMode(LockButtonPin、INPUT); pinMode(BuzzerPin、OUTPUT); pinMode(RedLedPin、OUTPUT); pinMode(GreenLedPin、OUTPUT); pinMode(RingBellSignalPin、OUTPUT); digitalWrite(RedLedPin、LOW); digitalWrite(GreenLedPin、LOW); digitalWrite(RingBellSignalPin、LOW); myServo.attach(ServoPin); Serial.begin(9600);} void loop(){int lockButton、lock、unlock、bell; char snum [5];ロック=digitalRead(LockSignalPin);ロック解除=digitalRead(UnLockSignalPin); //ボルトからのロック信号がHIGHかどうかを確認しますif(lock ==HIGH){//モーターをロック位置に回しますmyServo.write(120); // LED表示を設定しますdigitalWrite(GreenLedPin、LOW); digitalWrite(RedLedPin、HIGH); //バズロックサウンドdigitalWrite(BuzzerPin、HIGH); delay(1000); digitalWrite(BuzzerPin、LOW); delay(1000); } //ボルトからのロック解除信号がHIGHかどうかを確認しますelseif(unlock ==HIGH){//モーターをロック解除位置に回しますmyServo.write(0); // LED表示を設定しますdigitalWrite(GreenLedPin、HIGH); digitalWrite(RedLedPin、LOW); delay(2000); }ベル=digitalRead(BellButtonPin); if(bell ==HIGH)//ユーザーがベルリングベットを押した{//リングボタンが押されたことを示すシグナルボルトdigitalWrite(RingBellSignalPin、HIGH); //呼び出しベルの音のパターン! digitalWrite(BuzzerPin、HIGH); delay(100); digitalWrite(BuzzerPin、LOW); delay(20); digitalWrite(BuzzerPin、HIGH); delay(200); digitalWrite(BuzzerPin、LOW); delay(100); digitalWrite(BuzzerPin、HIGH); delay(100); digitalWrite(BuzzerPin、LOW); delay(20); digitalWrite(BuzzerPin、HIGH); delay(200); digitalWrite(BuzzerPin、LOW); delay(1500); //信号をオフにしますdigitalWrite(RingBellSignalPin、LOW); } lockButton =digitalRead(LockButtonPin); if(lockButton ==HIGH)//ユーザーがロックベットを押した{//モーターをロック位置に回すmyServo.write(120); // LED表示を設定しますdigitalWrite(GreenLedPin、LOW); digitalWrite(RedLedPin、HIGH); //バズロックサウンドdigitalWrite(BuzzerPin、HIGH); delay(1000); digitalWrite(BuzzerPin、LOW); }}
WinFormsアプリケーション-VisualStudioプロジェクト(Facebolt Doorlock).zip C#
* zipファイルを抽出し、VisualStudioで.slnファイルを開きます。* APIクレデンシャルを使用してコードを変更します。
*プロジェクトを実行します。
*信頼できる顔を追加します。
*最後に、顔の監視を開始します。
プレビューなし(ダウンロードのみ)。
Bolt IoT CloudAPI-クライアントライブラリ
これは、Bolt CloudAPIと通信するために私が作成した非公式のクライアントライブラリです。このライブラリは、BoltWiFiモジュールと通信するためにWinFormsアプリケーションで使用されます。https://github.com/diozz/Bolt-IoT-API-.NET 回路図
フリッツ回路図製造プロセス