ArduinoイーサネットRFIDカードリーダー
コンポーネントと消耗品
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 |
必要なツールとマシン
|
アプリとオンラインサービス
| ||||
![]() |
|
このプロジェクトについて

自宅やオフィスにRFIDタグ/カードセキュリティシステムまたは監視システムを追加することを考えたことはありますか。さて、あなたがここに着いたら、あなたはすでに彼らが200ドルから2000ドルの範囲でどれほど高価であるかを調べたに違いありません、あまりにも正しいです!??友人と私は、100ドル未満のコストで、ドアにアクセスする以上のことができるシステムを作成することにしました。これが私たちが思いついたものです。インターネット対応のarduinorfidタグリーダー。 20ドル以上でドアを開けることができます。このシステムは、高校の生徒を追跡するために設計されたものであり、学校が承認してくれることを願っています。
プロトタイプは次のとおりです:
<図>
あなたはそれが長い時間がかかるかもしれないと思っているかもしれません、yatta yattayatta。それでも、これには約6時間しかかかりませんでした(電源の問題があったため)が、上記の例のようにセットアップするのに約30分かかる可能性があります。すべてのコードと写真が下にあるので、次のステップで混乱している場合は、先に進んで下の写真/コードを見てください。
すべての手順は次のとおりです。
始める前に(必要)
カードのスキャンを開始してTelnet / TCPサーバーに送信する前に、いくつかのライブラリが必要です。ここでUIPEthernetを入手してくださいhttps://github.com/ntruchsess/arduino_uip
ここでMFRC522を入手https://github.com/miguelbalboa/rfid
これらのライブラリの両方をプログラムファイル(x86)/ Arduino / Libraries /再起動arduinoに配置します
ハードウェア
- Arduino Nano(デバイスに合わせてコードをいつでも変更できます)
- MAIFAREカードを使用したMFRC522
- ジャンパー線(オスからオス)(オスからメス)
- enc28j60イーサネットモジュール/シールド
- RGB LED
- 700マイルアンペアのAC-DCコンバーターを超える3Vまたは5V
セットアップ
- arduinoをブレッドボードに取り付けます(ナノまたはマイクロの場合)
- ボードのピン配置をオンラインで検索して、SPIセットアップを見つけます(以下の値を変更してください)
- arduinoピン10(SS)をイーサネットモジュールssまたはCSに接続します
- arduinoピン12(MISO)をrfidMISOおよびイーサネットSOに接続します
- arduinoピン11(MOSI)をrfidMOSIおよびイーサネットSIに接続します
- arduinoピン13(SCK)をrfidSCKおよびイーサネットSCKに接続します
- arduinoピン9をrfidRSTピンに接続します
- arduinoピン8をrfidSSNに接続します
- arduinoピン5を緑のLEDに、4を青に、3を赤に接続します
- ACをDCに接続してブレッドボードの+と-に接続します
- arduinoをACからDCに接地します
- rfidとイーサネットの両方のVCCとGNDをac-dcに接続します(これらのデバイスは3vのみであることを忘れないでください!!!!! 5vを供給しないでください)問題がある場合は、抵抗を使用して電圧を3vにします
- LEDのVCCピンをarduino3vまたはac-dc3vに配線します
- イーサネットケーブルをモジュールに接続し、コンピュータと同じネットワーク上にあることを確認します
- コンピューターからarduinoにUSBケーブルを接続します
- コンピューターを同じネットワークに接続する
ニーズに合わせてコードを変更する
- コードはかなりよくコメントされているので、特定の部分にアクセスして変更することができますが、確かなことの1つはehternetモジュールです
- Macアドレスは同じままにすることができます(これらを複数作成する予定がない限り)
- 192.168。を使用している場合IPを維持できるベースIPネットワーク
- ここでもDNSを保持できますが、変更するのは8.8.4.4までです

- ipconfigを実行してゲートウェイを見つけます。デフォルトは192.168.1.1です(わからない場合)(コードは現在192.168.1.5です)
- コマンドプロンプトを実行し、ipconfigと入力して、コンピューターのIPアドレスを確認します

- 下にスクロールして[サーバーに送信]を見つけ、コンピューターのIPを入力するか、ポートがルーターをパブリックIPアドレスに転送したかどうかを入力します
- PYTHONを使用し、サーバーを実行していることを確認します(これは、学校へのプレゼンテーションに使用したサンプルコードであるため、Pythonサーバーは既に作成されており、ほとんど変更されていないため、Telnet / TCPサーバーを使用できます)
そして、おそらく変更する必要がある他のコード:
<図>
コードの実行
- AC-DC電源を壁に接続します
- arduinoが現在コンピューターに接続されていることを確認してください
- 両方のデバイスが同じネットワーク上にあることを確認してください
- 変更したarduinoコードをフラッシュするか、私が持っているコードが機能する場合は素晴らしいです(ほとんどの場合、変更する必要はありません)
- Python、C ++スクリプト、またはネットワーク上の任意のTelnet / TCPサーバーを起動します
- 安全のためにarduinoを再起動してください
- ライトが青色に変わるまで待ってからカードをスキャンしてみてください。サーバーがカードのIDを取得している場合は、準備ができています
- ライトの意味を覚えておいてください紫/赤みがかった色は起動を意味します
- 赤は、カードの角度がおかしい、サーバーが時間内に応答しなかったなどのエラーを意味します
- 緑は合格を意味し、サーバーがgoで応答し、次のカードを読み取ることができます
- 青は、カードまたは応答を待つ/ロードすることを意味します
- arduinoが遅れ始め、赤信号が表示されるまでに30秒以上かかる場合は、arduinoイーサネットモジュールがサーバーにまったく接続できなかったことを意味します。これは、最初にarduinoに十分な電力がなく、arduinoイーサネットモジュールがパケットの送信に苦労している、コンピューターサーバーが実行されていない、またはarduinoとコンピューターが同じネットワーク上にないなどの複数の原因が原因である可能性があります。
-
arduinoが遅れ続ける場合は、これらのトリックを試して修正してください
-
Windowsファイアウォールをオフにする
- 高度なファイアウォール設定に移動し、インバウンド/アウトバウンドポート23を許可します
- ポートはルーターをポート23でコンピューターに転送します
- ワイヤレスの場合は、arduinoをルーターに直接接続し、コンピューターを同じルーターに接続します
- より頑丈なAC-DC電源アダプターを購入する
-
それ以外の場合は、IPアドレスまたは接続アドレスを間違って入力した可能性があります
-
それよりも問題がある場合は[email protected]までご連絡ください
- よろしくお願いします!!!

ドアロックシステムのコードはありません。私にはコードがないため、追跡システムとしてだけでなく、ドアロック追跡システムとしても使用する場合は、コードを追加する必要があります。
以下をお読みください:
コード
- Arduinoコード
- サーバーコードの例
Arduinoコード C / C ++
これは、ソフトウェアがほぼ準備ができているarduinoで実行されるため、ゲートウェイ、IP、ゲートウェイ、Macアドレス、およびdns/ * * ------------を調整するだけです。 ---------------------- * MFRC522 Arduino *リーダー/ PCDNano v3 *信号ピンピン* -------------- -------------------- * RST /リセットRSTD9 * SPI SS NSS D10 * SPI MOSI MOSI D11 * SPI MISO MISO D12 * SPI SCK SCK D13 * ///インストールする必要のある最初のライブラリはUIPETHERNETです。2番目はMFRC522です。どちらもGITHUBにあります。#include#include //キーの選択用#include // RFIDキーライブラリ#defineRST_PIN9 //構成可能、上記の一般的なピンレイアウトを参照-これはArduino Nano用です-RFID#define SS_PIN 8の場合//イーサネットモジュールは10バイトセクターを使用するため、RFIDには8を使用しています=0;バイトblockAddr =0; ////////カード内の特定のセクター/ブロックにアクセスします。トレーラーブロックは最後のブロックバイトですtrailerBlock =1; int red =3; int blue =4; // RGBLEDのピンint緑=5; EthernetClientクライアント; // ETHERNET INSTANCEMFRC522 mfrc522(SS_PIN、RST_PIN); // MFRC522インスタンスを作成します。MFRC522::MIFARE_Keyキー; //キーinstancesignedlongtimeoutを設定します; //タイムアウトなので、永遠にそこに座っていませんvoid setup(){// UI BEGIN pinMode(red、OUTPUT); pinMode(blue、OUTPUT); // RGB LEDを初期化しますpinMode(green、OUTPUT); Reset(); // LEDをオフにして開始Serial.begin(9600); // 9600ビット/秒の速度でコンピューター接続を開始します// UI END // ETHERNET MODULE INITIAL SPI.begin(); // SPIバスを初期化しますuint8_tmac [6] ={0x00,0x01,0x02,0x03,0x04,0x05}; // MAC =000102030405 IPAddress mip(192,168,1,160); // IP =192.168.1.160 IPAddress mdns(8,8,8,8); // DNS =8.8.8.8 IPAddress mgate(192,168,1,5); // GATEWAY =192.168.1.5 IPAddress msubnet(255,255,255,0); // SUBNET =255.255.255.0 Ethernet.begin(mac、mip、mdns、mgate、msubnet); //上記を使用して接続Serial.println( "Succesful connection"); //イーサネットの終わりfor(int t =255; t> 0; t-){analogWrite(red、t); ////もっと表示しますが、イーサネットのSPIとRFIDの間に少なくとも1秒かかりますdelay(10); } // RFID INITIAL mfrc522.PCD_Init(); // MFRC522カードを初期化します(byte i =0; i <6; i ++){//キーを準備します(キーAとキーBの両方として使用されます)key.keyByte [i] =0xFF; //工場出荷時のチップ配送時のデフォルトであるFFFFFFFFFFFFhを使用} Serial.println(F( "Scan a Card")); dump_byte_array(key.keyByte、MFRC522 ::MF_KEY_SIZE); //キーのバイトサイズのタイムアウトを取得=0; delay(2000); Reset();} // END RFID INITIALvoid loop()//永久に実行{//新しいカードを探すif(!mfrc522.PICC_IsNewCardPresent()){digitalWrite(blue、LOW);戻る; } //カードの1つを選択if(!mfrc522.PICC_ReadCardSerial())return; digitalWrite(青、HIGH); //カードが読み取られたことをユーザーに表示しますbytepiccType =mfrc522.PICC_GetType(mfrc522.uid.sak); // Mifareカードとの互換性を確認しますif(piccType!=MFRC522 ::PICC_TYPE_MIFARE_MINI &&piccType!=MFRC522 ::PICC_TYPE_MIFARE_1K &&piccType!=MFRC522 ::PICC_TYPE_MIFARE_4K){Error();戻る; }バイトステータス;バイトバッファ[18];バイトサイズ=sizeof(buffer); status =mfrc522.PCD_Authenticate(MFRC522 ::PICC_CMD_MF_AUTH_KEY_A、trailerBlock、&key、&(mfrc522.uid)); if(status!=MFRC522 ::STATUS_OK){Serial.print(F( "PCD_Authenticate()failed:")); Serial.println(mfrc522.GetStatusCodeName(status));エラー();戻る; } //ブロックステータスからデータを読み取る=mfrc522.MIFARE_Read(blockAddr、buffer、&size); if(status!=MFRC522 ::STATUS_OK){Serial.print(F( "MIFARE_Read()failed:")); Serial.println(mfrc522.GetStatusCodeName(status));エラー(); } // PICCを停止しますmfrc522.PICC_HaltA(); // PCDの暗号化を停止しますmfrc522.PCD_StopCrypto1(); //カードの読み取りが完了した後サーバーに送信if(client.connect(IPAddress(192,168,1,100)、23)){timeout =millis()+ 1000; Serial.println( "クライアント接続"); const文字列ID =dump_byte_array(buffer、size); client.println(ID); Serial.println( "sent:" + ID); delay(10); while(client.available()==0){if(timeout --millis()<0)goto close; } intサイズ; while((size =client.available())> 0){uint8_t * msg =(uint8_t *)malloc(size);サイズ=client.read(msg、size); Serial.write(msg、size); if(size ==sizeof( "g")-1){Pass(); } else {Error(); } free(msg); } close:client.stop(); } else {Serial.println( "サーバーに接続できませんでした");エラー(); } //サーバーへの送信の終了Reset(); // LEDをオンにせずにループを再開} //バッファ配列を大文字の単一の文字列に変換します。これはセクターとブロックのIDに相当しますStringdump_byte_array(byte * buffer、byte bufferSize){String out =""; for(byte i =0; i サーバーコードの例 Python
serverimport SocketServerclass MyTCPHandler(SocketServer.BaseRequestHandler)の使用方法の完全な例を次に示します。defhandle(self):#self.requestは、クライアントに接続されたTCPソケットですself.data =self.request.recv (1024).strip()print "{} written:"。format(self.client_address [0])print self.data "" "SQL STUFF HERE if(self.data ==SQL NAME or something){self.request .sendall( "g")// send good //ここにSQLに時間と場所を挿入{else {self.request.sendall( "bb")// send bad // arduinoの不良データに送信するだけではいけません} "" "self.request.sendall(" g ")if __name__ ==" __main __ ":HOST、PORT =" "、23 server =SocketServer.TCPServer((HOST、PORT)、MyTCPHandler)server.serve_forever()GitHubのコードを更新
ここでは、最新のコードを入手できますhttps://github.com/smerkousdavid/InternetRFIDTags
回路図
回路がシンプルなので配線で写真を撮りました 
製造プロセス