前言
班级的小教室使用刷卡开门,但小教室的门禁学生卡没有录入故只有教师才能开门,所以想要到小教室自习十分不便。想到用舵机牵引,上网搜索发现已有案例分享但全网并没有找到单基于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-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
博主救命!!!我的串口没有任何反应线接的也没问题不知道为什么!!
可以具体描述一下吗 或者给个截图什么的 可以到<关于>联系我邮箱
博主,我发你outlook了可能你没收到我比较急所以想在这里说明一下,我用的是esp32-WROOM-32E,按照你的接线你的代码波特率也正确但是串口就是没显示,想到一个问题会不会是因为库里的引脚定义我需要修改才能正常使用呢,希望博主赐予我力量
实在是不好意思具体发你邮箱了::quyin:die::不知这边是否已经解决?
你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接
流量卡知识网
http://53go.cn/
专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及
听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!
非常感谢你分享这篇文章,我从中学到了很多新的知识。
小橘子好厉害ヾ(≧∇≦*)ゝ