前言
班级的小教室使用刷卡开门,但小教室的门禁学生卡没有录入故只有教师才能开门,所以想要到小教室自习十分不便。想到用舵机牵引,上网搜索发现已有案例分享但全网并没有找到单基于ESP32与RC522的简易方案,于是自己动手丰衣足食,遂出此文分享。
准备
文中涉及到的设备以及环境是ESP32-WROOM-32D 推荐CH9102X芯片,免驱SG5010舵机ESP32 38Pin拓展版 当然只是为了后续接线与固定在门上方便为主,不加或者使用面包板也可以杜邦线MFRC-522射频模块Arduino IDE
Arduino IDE环境配置
首先去IDE File-Preferences首选项最后一行添加链接https://ghproxy.com/https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json再到Boards Manager搜索esp32安装,可能会安装出错或者后续编译有莫名其妙的报错,换个版本安装一般能够解决。这时可以基础编译适配ESP32,但我们还有MFRC-522模块与舵机,所以需要添加库,在library Manager搜索MFRC-522安装即可,再搜索ESP32Servo安装即可。需要注意的是,单搜索Servo安装的库不能支持ESP32,碰到下载ESP32Servo依旧报错的可以到Github上下下来再到C:\Users\用户名\AppData\Local\Arduino15\libraries\Servo 替换文件,Github上的名称是ESP32_Servo 需要将文件名以及文件内部所有类似名字替换为Servo即可。
串口引脚连接
| RC522引脚名称 | ESP32引脚名称 || ------------------------------------------------------------ | ------------------------------------------------------------ || 3.3V | 3V3 || RST | 27 || GND | GND || MISO | 19 || MOSI | 23 || SCK | 18 || SDA/SS | 12 |
| 舵机引脚颜色 | ESP32引脚名称 || ------------------------------------------------------------ | ------------------------------------------------------------ || 橙色 | 13 || 红色 | 5V || 棕色 | GND |
编写程序
连接好引脚后就进入编写程序的环节。
//Libraries#include <SPI.h>//https://www.arduino.cc/en/reference/SPI#include <MFRC522.h>//https://github.com/miguelbalboa/rfid#include <Servo.h>#include <string.h>#include <math.h>//Constants#define SS_PIN 12#define RST_PIN 27#define SERVO_PIN 13//Servo Servo servoMotor;//Parameters const int ipaddress[4] = {103, 97, 67, 25};//int decid=0;int i=0;//Variables byte nuidPICC[4] = {0, 0, 0, 0};MFRC522::MIFARE_Key key;MFRC522 rfid = MFRC522(SS_PIN, RST_PIN);
void setup() {//Init Serial USB Serial.begin(115200);//这里在串口监视器(Serial Monitor)旁边数值要调成一样Serial.println("welcome!");Serial.println(F("Initialize System"));//init rfid D8,D5,D6,D7 SPI.begin();rfid.PCD_Init();Serial.print(F("Reader :"));rfid.PCD_DumpVersionToSerial();// attaches the servo on ESP32 pin servoMotor.attach(SERVO_PIN);servoMotor.write(0);}
void loop() {readRFID();switch(decid){case 869660://white 这里填写读卡器读到卡后的在串口监视器(Serial Monitor)上显示的decid数字Serial.println("Pass!");servoMotor.write(180); //舵机转180度delay(3500);servoMotor.write(0);break;}decid=0;delay(1000);}
void readRFID(void ) { / function readRFID /////Read RFID card unsigned char status; //状态变量unsigned char str[5];for (byte i = 0; i < 6; i++) {key.keyByte[i] = 0xFF;}// Look for new 1 cards if ( ! rfid.PICC_IsNewCardPresent())return;
// Verify if the NUID has been readed if ( !rfid.PICC_ReadCardSerial())return;
// Store NUID into nuidPICC array for (byte i = 0; i < 4; i++) {nuidPICC[i] = rfid.uid.uidByte[i];}unsigned char id = nuidPICC;decid=0;for(i=0;i<4;i++) {decid=decid+id[i]pow(16,i); //16转10进制}Serial.print(F("RFID In dec: "));printDec(rfid.uid.uidByte, rfid.uid.size);Serial.println();Serial.print("DECID:");Serial.println(decid); //输出卡DECID,10进制// 如果传感器/读卡器上没有新卡,则返回主程序。这将在空闲时保存整个进程。if ( ! rfid.PICC_IsNewCardPresent())return;// Halt PICC rfid.PICC_HaltA();
// Stop encryption on PCD rfid.PCD_StopCrypto1();
}
/*Helper routine to dump a byte array as hex values to Serial.//*void printHex(byte buffer, byte bufferSize) {for (byte i = 0; i < bufferSize; i++) {Serial.print(buffer[i] < 0x10 ? " 0" : " ");Serial.print(buffer[i], HEX);}}//Helper routine to dump a byte array as dec values to Serial./void printDec(byte *buffer, byte bufferSize) {for (byte i = 0; i < bufferSize; i++) {Serial.print(buffer[i] < 0x10 ? " 0" : " ");Serial.print(buffer[i], DEC);}}
代码结束。
程序烧录
选择ESP32 Dev Module,选择正确的串口Upload一下接着打开Monitor,刷卡,添加程序中switch语句的case大概效果如下图,当时没写decid,大致看一下

实践
经过粗略测量,在门把手斜下方用热熔胶固定,再限位器粘在在舵机上方避免热熔胶纵向受力直接脱落。将rc522模块穿过门缝粘在外面。用线将门把手与舵机连接,最终实现了门外刷卡控制门内舵机向下转动拉动门把手实现开门的效果。
遇到的问题
最后效果近乎完美,广受师生好评,暂时无图。但目前采用的供电方式是使用充电宝低电流模式供电,貌似经过三个小时其依旧会自动断电,打算更换两个干电池盒试试,3V独立给ESP供电,6V独立给舵机供电。不知是否可行。
总之到这里,整个奇妙探索旅程就结束了,总共历时半个月,总成本五十多,当然也少不了我亲爱的同桌和同学的支持。
参考:
https://rntlab.com/question/unit-9-esp32-control-servo-motor-library-problem/https://esp32io.com/tutorials/esp32-servo-motorhttps://www.electronicwings.com/esp32/rfid-rc522-interfacing-with-esp32https://www.aranacorp.com/en/using-an-rfid-module-with-an-esp32/amp/https://blog.csdn.net/lmf666/article/details/123527739https://zhuanlan.zhihu.com/p/66467989https://zhuanlan.zhihu.com/p/281103196https://zhuanlan.zhihu.com/p/416003658