前言
班级的小教室使用刷卡开门,但小教室的门禁学生卡没有录入故只有教师才能开门,所以想要到小教室自习十分不便。想到用舵机牵引,上网搜索发现已有案例分享但全网并没有找到单基于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 | 22 |
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 22
#define SERVO_PIN 13
//Servo
Servo servoMotor;
//Parameters
const int ipaddress[4] = {103, 97, 67, 25};
//
unsigned char serNum[5]; //ic卡的id码
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!");
SPI.begin();
rfid.PCD_Init();
rfid.PCD_DumpVersionToSerial();
// attaches the servo on ESP32 pin
servoMotor.attach(SERVO_PIN, 500, 2400);//之前没加后面参数转不到180度
servoMotor.write(0);
}
void loop() {
readRFID();
switch(decid){
case 1002125://white 这里填写读卡器读到卡后的在串口监视器(Serial Monitor)上显示的decid数字
Serial.println("Pass!");
// rotates from 0 degrees to 180 degrees
for (int pos = 0; pos <= 180; pos += 1) {
// in steps of 1 degree
servoMotor.write(pos);
delay(10);
}
delay(1000);
servoMotor.write(0);
break;
}
decid=0;
}
void readRFID(void ) { /* function readRFID */
////Read RFID card
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;
decid=id[0]*pow(16,3)+id[1]*pow(16,2)+id[2]*pow(16,1)+id[3]*pow(16,0);
Serial.print(F("RFID In dec: "));
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
Serial.print("DECID:");
Serial.println(decid); //输出卡id
// Halt PICC
rfid.PICC_HaltA();
// Stop encryption on PCD
rfid.PCD_StopCrypto1();
}
/**
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-motor
https://www.electronicwings.com/esp32/rfid-rc522-interfacing-with-esp32
https://www.aranacorp.com/en/using-an-rfid-module-with-an-esp32/amp/
https://blog.csdn.net/lmf666/article/details/123527739
https://zhuanlan.zhihu.com/p/66467989
https://zhuanlan.zhihu.com/p/281103196
https://zhuanlan.zhihu.com/p/416003658
非常感谢你分享这篇文章,我从中学到了很多新的知识。
小橘子好厉害ヾ(≧∇≦*)ゝ