Arduino 以太网 Rfid 读卡器
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
| ||||
|
关于这个项目
您有没有想过在家中和/或办公室添加 RFID 标签/卡安全系统或监控系统。好吧,如果你到了这里,我敢打赌你已经看过它们的价格从 200 美元到 2000 美元不等,太贵了!??好吧,我和一个朋友决定制作一个成本低于 100 美元的系统,并且可以做的不仅仅是进入一扇门,所以这就是我们想出的。支持互联网的 arduino rfid 标签阅读器。多花 20 美元就可以开门。该系统旨在跟踪我们高中的学生,我们希望学校批准。
这是原型:
你可能认为这可能需要很长时间,yatta yatta yatta。然而,这件事只花了我大约 6 个小时(因为我有电源问题),但这可能需要大约 30 分钟的时间来设置,就像上面的例子一样。所有代码和图片都在下面,所以如果您在接下来的步骤中感到困惑,请继续查看下方的图片/代码。
以下是所有步骤:
开始之前(必要)
在我们开始扫描卡片并将它们发送到我们的 Telnet/TCP 服务器之前,我们需要一些库在此处获取 UIPEthernet https://github.com/ntruchsess/arduino_uip
在此处获取 MFRC522 https://github.com/miguelbalboa/rfid
将这两个库放在 Program Files(x86)/Arduino/Libraries/ Restart arduino
硬件
- Arduino Nano(您可以随时修改代码以适合您的设备)
- 带 MAIFARE 卡的 MFRC522
- 跳线(公对公)(公对母)
- enc28j60 以太网模块/sheild
- RGB LED
- 3V 或 5V 大于 700 英里的 AC-DC 转换器
设置
- 将 arduino 连接到面包板(如果是 nano 或 micro)
- 在线查找电路板的引脚排列以找到 SPI 设置(更改下面的值)
- 将 arduino 引脚 10 (SS) 连接到以太网模块 ss 或 CS
- 将 arduino 引脚 12 (MISO) 连接到 rfid MISO 和以太网 SO
- 将 arduino pin 11 (MOSI) 连接到 rfid MOSI 和以太网 SI
- 将 arduino 引脚 13 (SCK) 连接到 rfid SCK 和以太网 SCK
- 将 arduino 引脚 9 连接到 rfid RST 引脚
- 将 arduino 引脚 8 连接到 rfid SSN
- 将 arduino 引脚 5 连接到绿色 LED,将 4 连接到蓝色,将 3 连接到红色
- 将 AC 到 DC 连接到面包板上的 + 和 -
- 将您的 arduino 接地到交流到直流
- 将 rfid 和以太网上的 VCC 和 GND 连接到 ac-dc(请记住,这些设备只有 3v!!!!!不要提供 5v)如果出现问题,请使用电阻器将电压升至 3v
- 将 LED 上的 VCC 引脚连接到 arduino 3v 或 ac-dc 3v
- 将以太网电缆连接到模块并确保它与您的计算机在同一网络上
- 将 USB 数据线从计算机插入 arduino
- 将计算机连接到同一网络
修改代码以满足您的需求
- 代码注释得很好,因此您可以直接修改某些部分,但可以肯定的是 ehternet 模块
- Mac 地址可以保持不变(除非您计划构建多个)
- 如果您使用的是 192.168。基础ip网络,你可以保留ip
- 您可以再次保留 dns,只是时间更改为 8.8.4.4
- 运行 ipconfig 找到您的网关,默认为 192.168.1.1(如果您不知道)(当前代码为 192.168.1.5)
- 运行命令提示符并输入 ipconfig 以找出您计算机的 IP 地址
- 向下滚动找到 SEND TO SERVER,然后输入您的计算机的 ip 或者您的端口是否将您的路由器转发到您的公共 ip 地址
- 确保您有 Python 并运行服务器(请记住,这只是我们用于向学校进行演示的示例代码,因此 Python 服务器已经预制,几乎没有修改,您可以使用任何 Telnet/TCP 服务器)莉>
以及您可能需要修改的其他代码:
运行代码
- 将 AC-DC 电源插入墙上
- 确保您的 arduino 当前已连接到计算机
- 确保两台设备在同一网络上
- 刷出你修改过的 arduino 代码,或者如果我有适合你的代码,那就太好了(你几乎没有机会修改它)
- 在您的网络上启动您的 Python、C++ 脚本或任何 Telnet/TCP 服务器
- 重新启动您的 arduino 以确保安全
- 等到指示灯变成蓝色并尝试扫描卡,如果您的服务器获得了卡的 ID,那么您就可以开始了
- 记住灯光的含义是紫色/渐隐的红色意味着正在启动
- 红色表示任何错误,例如卡处于奇怪的角度和/或服务器没有及时响应
- 绿色表示通过,因此服务器响应为通过,您可以读取下一张卡片
- 蓝色表示等待/加载等待卡片或响应
- 如果您的 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 * Reader/PCD Nano v3 * 信号引脚 * -------------- -------------------- * RST/复位 RST D9 * SPI SS NSS D10 * SPI MOSI MOSI D11 * SPI MISO MISO D12 * SPI SCK SCK D13 *///需要安装的第一个库是UIP ETHERNET 第二个是MFRC522 两者都在GITHUB#include#include //用于选择key#include // RFID 密钥库#define RST_PIN 9 // 可配置,请参阅上面的典型引脚布局 - 这是针对 Arduino Nano - 对于 RFID#define SS_PIN 8 //我们使用 8 作为 RFID,因为以太网模块使用 10 字节扇区 =0;字节块地址 =0; ////////访问卡中的某些扇区/块,trail block是最后一个块字节trailerBlock =1;int red =3;int blue =4; // RGB LEDint green =5 的引脚;EthernetClient 客户端; //以太网实例MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建 MFRC522 实例。MFRC522::MIFARE_Key key; //设置key instancesigned long timeout; //超时所以它不会永远坐在那里void setup(){ //UI BEGIN pinMode(red, OUTPUT); pinMode(蓝色,输出); //初始化RGB LED pinMode(green, OUTPUT);重启(); //从关闭 LED 开始 Serial.begin(9600); //以每秒 9600 位的速率启动计算机连接 //UI END //ETHERNET MODULE INITIAL SPI.begin(); // 初始化 SPI 总线 uint8_t mac[6] ={0x00,0x01,0x02,0x03,0x04,0x05}; //MAC =000102030405 IP地址mip(192,168,1,160); //IP =192.168.1.160 IP地址 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("连接成功"); // 以太网结束 for(int t =255; t> 0; t--) { analogWrite(red, t); ////更多的展示,但让以太网的 SPI 和 RFID 延迟(10)之间至少有一秒钟; } //RFID 初始化 mfrc522.PCD_Init(); // 初始化 MFRC522 卡 for (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); //获取key字节大小 timeout =0;延迟(2000); Reset();}//END RFID INITIALvoid loop() //永远运行{ // 寻找新卡 if ( ! mfrc522.PICC_IsNewCardPresent()) { digitalWrite(blue, LOW);返回; } // 选择一张卡片 if ( ! mfrc522.PICC_ReadCardSerial()) return;数字写入(蓝色,高); //向用户显示卡已被读取 byte piccType =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);状态 =mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, TrailerBlock, &key, &(mfrc522.uid)); if (status !=MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() 失败:")); Serial.println(mfrc522.GetStatusCodeName(status));错误();返回; } // 从块中读取数据 status =mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status !=MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() 失败:")); 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 String ID =dump_byte_array(buffer, size); client.println(ID); Serial.println("发送:" + ID);延迟(10); while(client.available()==0) { if (timeout - millis() <0) goto close;整数大小; 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 { 错误();自由(味精); }关闭:client.stop(); } else { Serial.println("无法连接到服务器");错误(); } //结束发送到服务器重置(); //重新启动没有 LED 灯的循环}// 将缓冲区数组变成一个大写的字符串,它等于我们的扇区 ID 和块字符串 dump_byte_array(byte *buffer, byte bufferSize) { String out =""; for (byte i =0; i 示例服务器代码Python
下面是如何使用服务器的完整示例import SocketServerclass MyTCPHandler(SocketServer.BaseRequestHandler):def handle(self):# self.request 是连接到客户端的TCP socket self.data =self.request.recv (1024).strip() print "{} 写道:".format(self.client_address[0]) print self.data """ SQL STUFF HERE if(self.data ==SQL NAME or something) { self.request .sendall("g")//send good //INSERT TIME AND LOCATION INTO SQL HERE { else { self.request.sendall("bb")//send bad //DO NOTHING 只是发送到 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
示意图
电路很简单,所以我只是用接线拍了一张照片制造工艺