基于Arduino ATmega328人脸识别IOT演示门锁
§01 Arduino ATmega328 测试电路
根据 Arduino门禁人机接口调试 Version 1.0 基于Groove Beginner的背板的设计基础上,按照 从0 开始 DIY你的Arduino UNO 设计方法,将ATmega328直接与接口电路设计成一个单一的电路板,便可以大大简化系统的构成了。
1、电路设计
▲ 图1-1 最小系统原理图
▲ 图1-2 ESP8266子系统电路
▲ 图1-3 接口电路
▲ 图1-4 USB下载电路接口
2、接口说明
根据下图所示的Arduino管脚的定义,结合前面的原理图设计,可以分别确定按键
,LED模块
,舵机
,语音模块
,人脸模块
,ESP8266模块的接口
。
▲ 图2-1 Arduino 管脚定义
(1)按键接口
按键的行扫描与列扫描分别使用 D4
,D5
,D6
,D7
,D8
,D9
,D18
,D19
。键盘的读取参考程序参见:
/*
**==============================================================================
** TESTKEY.C: -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*///------------------------------------------------------------------------------#define KEYLINE_1 4
#define KEYLINE_2 5
#define KEYLINE_3 6
#define KEYLINE_4 7
#define KEYCODE_1 8
#define KEYCODE_2 9
#define KEYCODE_3 18
#define KEYCODE_4 19#define KEY_NULL 0xff
#define KEY_1 0x47
#define KEY_2 0x4B
#define KEY_3 0x4D
#define KEY_4 0x37
#define KEY_5 0x3B
#define KEY_6 0x3D
#define KEY_7 0x27
#define KEY_8 0x2B
#define KEY_9 0x2D
#define KEY_0 0x17
#define KEY_A 0x4E
#define KEY_B 0x3E
#define KEY_C 0x2E
#define KEY_D 0x1E
#define KEY_E 0x1D
#define KEY_F 0x1Bvoid keyLineSet(unsigned char ucLine) {if(ucLine & 0x1) digitalWrite(KEYLINE_1, HIGH);else digitalWrite(KEYLINE_1, LOW);if(ucLine & 0x2) digitalWrite(KEYLINE_2, HIGH);else digitalWrite(KEYLINE_2, LOW);if(ucLine & 0x4) digitalWrite(KEYLINE_3, HIGH);else digitalWrite(KEYLINE_3, LOW);if(ucLine & 0x8) digitalWrite(KEYLINE_4, HIGH);else digitalWrite(KEYLINE_4, LOW);
}void keySetup(void) {pinMode(KEYLINE_1, OUTPUT);pinMode(KEYLINE_2, OUTPUT);pinMode(KEYLINE_3, OUTPUT);pinMode(KEYLINE_4, OUTPUT);pinMode(KEYCODE_1, INPUT_PULLUP);pinMode(KEYCODE_2, INPUT_PULLUP);pinMode(KEYCODE_3, INPUT_PULLUP);pinMode(KEYCODE_4, INPUT_PULLUP); keyLineSet(0x0);
}unsigned char keyReadCode(void) {keyLineSet(0xe);if(keyCode() != 0xf) return 0x10 | keyCode();keyLineSet(0xd);if(keyCode() != 0xf) return 0x20 | keyCode();keyLineSet(0xb);if(keyCode() != 0xf) return 0x30 | keyCode();keyLineSet(0x7);if(keyCode() != 0xf) return 0x40 | keyCode();return 0xff;
}unsigned char keyCode(void) {unsigned char ucCode;ucCode = 0x0;if(digitalRead(KEYCODE_1) == HIGH) ucCode |= 0x1;if(digitalRead(KEYCODE_2) == HIGH) ucCode |= 0x2;if(digitalRead(KEYCODE_3) == HIGH) ucCode |= 0x4;if(digitalRead(KEYCODE_4) == HIGH) ucCode |= 0x8;return ucCode;
}//------------------------------------------------------------------------------
unsigned char Hex2Text(unsigned char ucCode) {if(ucCode < 10) {return '0' + ucCode;}return 'A' + ucCode - 10;}void SendHEX8(unsigned char ucCode) {Serial.write(Hex2Text(ucCode >> 4));Serial.write(Hex2Text(ucCode & 0xf));
}//------------------------------------------------------------------------------
void setup(void) {Serial.begin(115200);keySetup();}//------------------------------------------------------------------------------
void loop(void) {delay(250);SendHEX8(keyReadCode());Serial.write("\r\n");
}//==============================================================================
// END OF THE FILE : TESTKEY.C
//------------------------------------------------------------------------------
(2)点阵LED模块接口
控制点阵LED模块的四个IO口分别为 D14
,D15
,D16
,D17
。
对于LED模块控制参考程序为:
/*
**==============================================================================
** TESTLED.C: -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*/#define LED_DATA1 14
#define LED_DATA2 15
#define LED_CLK1 16
#define LED_CLK2 17//------------------------------------------------------------------------------
unsigned char g_ucLEDBuffer[4][16];void ledSetup(void) {int i, j;for(i = 0; i < 4; i ++) {for(j = 0; j < 16; j ++) {g_ucLEDBuffer[i][j] = 0x0;}}pinMode(LED_DATA1, OUTPUT);pinMode(LED_DATA2, OUTPUT);pinMode(LED_CLK1, OUTPUT);pinMode(LED_CLK2, OUTPUT); digitalWrite(LED_CLK1, HIGH);digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_DATA1, HIGH);digitalWrite(LED_DATA2, HIGH);}void ledSetData12(unsigned char ucData12) {if(ucData12 & 0x1) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW);if(ucData12 & 0x2) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW);
}void ledClock1(void) {digitalWrite(LED_CLK1, HIGH); // clock up 7usdigitalWrite(LED_CLK1, LOW);
}void ledClock2(void) {digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_CLK2, LOW);
}void ledStart(void) {digitalWrite(LED_DATA1, LOW);digitalWrite(LED_DATA2, LOW);digitalWrite(LED_CLK1, LOW);digitalWrite(LED_CLK2, LOW);}void ledStop(void) {digitalWrite(LED_DATA1, LOW);digitalWrite(LED_DATA2, LOW);digitalWrite(LED_CLK1, HIGH);digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_DATA1, HIGH);digitalWrite(LED_DATA2, HIGH);}void ledWriteData(unsigned char ucChar1, unsigned char ucChar2,unsigned char ucChar3, unsigned char ucChar4) {unsigned char i;unsigned char ucMask;ucMask = 0x1;for(i = 0; i < 8; i++) {if(ucChar1 & ucMask) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW); if(ucChar2 & ucMask) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW); digitalWrite(LED_CLK1, HIGH); // clock up 7usdigitalWrite(LED_CLK1, LOW);if(ucChar3 & ucMask) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW); if(ucChar4 & ucMask) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW); digitalWrite(LED_CLK2, HIGH); // clock up 7usdigitalWrite(LED_CLK2, LOW);ucMask = ucMask << 1;}}//------------------------------------------------------------------------------
#define LEDCMD_ADD_INC 0x40
#define LEDCMD_ADD_SET 0x44
#define LEDCMD_MODE_CLOSE 0x80
#define LEDCMD_MODE_OPEN 0x8a//------------------------------------------------------------
void ledWriteByteAll(unsigned char ucChar) {ledWriteData(ucChar, ucChar, ucChar, ucChar);
}void ledWriteData16All(unsigned char ucData) {unsigned char i;ledStart();ledWriteByteAll(LEDCMD_ADD_INC);ledStop();ledStart();ledWriteByteAll(0xc0);for(i = 0; i < 16; i ++) {ledWriteByteAll(ucData);}ledStop();ledStart(); ledWriteByteAll(LEDCMD_MODE_OPEN);ledStop();
}//------------------------------------------------------------------------------
void ledWriteBuffer(void) {unsigned char i;ledStart();ledWriteByteAll(LEDCMD_ADD_INC);ledStop();ledStart();ledWriteByteAll(0xc0);for(i = 0; i < 16; i ++) {ledWriteData(g_ucLEDBuffer[0][i],g_ucLEDBuffer[1][i],g_ucLEDBuffer[2][i],g_ucLEDBuffer[3][i]);}ledStop(); ledStart(); ledWriteByteAll(LEDCMD_MODE_OPEN);ledStop();
}//------------------------------------------------------------------------------
#define LED_PIN 13
void setup(void) {ledSetup();pinMode(LED_PIN, OUTPUT);}//------------------------------------------------------------------------------
unsigned char ucCount = 0;
void loop(void) {int i, j;ucCount ++;if(ucCount & 0x1) digitalWrite(LED_PIN, HIGH);else digitalWrite(LED_PIN, LOW);for(i = 0; i < 4; i ++) {for(j = 0; j < 16; j ++) {g_ucLEDBuffer[i][j] = ucCount;}}ledWriteBuffer();delay(500);
}//==============================================================================
// END OF THE FILE : TESTLED.C
//------------------------------------------------------------------------------
将按键与LED模块符合在一起的测试程序,请参见 Arduino门禁人机接口调试 Version 1.0 最后的例程。
(3)舵机接口
使用ATmega328 的MOSI(PB3)接口,对应的Arduino接口 D11。
根据 Grove Beginner Kits基础实验 Arduino 对于IO口控制舵机的讨论,需要将定时器2的寄存器TCCR2B进行修改,才能够将输出的频率修改成122.5Hz,满足舵机控制所需。参考处贴上如下:
const int PWM_PIN = 11;
void setup() {TCCR2B = TCCR2B & B11111000 | B00000110;pinMode(PWM_PIN, OUTPUT);
}
void loop() {delay(1000);analogWrite(PWM_PIN, 63);delay(1000);analogWrite(PWM_PIN, 31);
}
上述程序分别输出31(对应1ms)与63(对应2ms),可以控制舵机从最左边移动到最右边。
PWM脉宽 | PWM设置值 | 实际输出时间(us) | 实测时间(us) |
---|---|---|---|
1ms | 31 | 0.992ms | 0.988 |
1.5ms | 47 | 1.504ms | 1.5ms |
2ms | 63 | 2.016ms | 2.01ms |
/*
**==============================================================================
** TESTPWM.C: -- by Dr. ZhuoQing, 2021-05-30
**
**==============================================================================
*/#define ON(pin) digitalWrite(pin, HIGH)
#define OFF(pin) digitalWrite(pin, LOW)
#define VAL(pin) digitalRead(pin)
#define IN(pin) pinMode(pin, INPUT)
#define OUT(pin) pinMode(pin, OUTPUT)
const int LED_PIN = 13;const int PWM_PIN = 11;
const int SERVO_MID = 47;
const int SERVO_LEFT = 31;
const int SERVO_RIGHT = 63;
void servoSetup(void) {TCCR2B = TCCR2B & B11111000 | B00000110;pinMode(PWM_PIN, OUTPUT);analogWrite(PWM_PIN, SERVO_MID);
}//------------------------------------------------------------------------------
void setup(void) {pinMode(LED_PIN, OUTPUT);servoSetup();}//------------------------------------------------------------------------------
void loop(void) {analogWrite(PWM_PIN, SERVO_LEFT);delay(1000);analogWrite(PWM_PIN, SERVO_RIGHT);delay(1000);}//==============================================================================
// END OF FILE : TESTPWM.C
//------------------------------------------------------------------------------
(4)语音模块接口
语音模块使用了SoftwareSerial。利用ATmega328 的 MISO,SCK两个管脚(分别对应)D12,D13作为RX,TX。
语音模块使用9600的波特率。通过软件串口发送对应文字的编码便可以发出声音。
#include <SoftwareSerial.h>
//------------------------------------------------------------------------------
SoftwareSerial mySerial(12, 13);
void setup() {mySerial.begin(9600);
}
//------------------------------------------------------------------------------
void loop() {mySerial.write('U');delay(10);
}
下面的程序发送“卓一康”的读音。
/*
**==============================================================================
** TESTSERIAL.C: -- by Dr. ZhuoQing, 2021-05-30
**
**==============================================================================
*/#include <SoftwareSerial.h>//------------------------------------------------------------------------------
SoftwareSerial ttsPort(12, 13);void setup(void) {ttsPort.begin(9600);}//------------------------------------------------------------------------------
void loop(void) {ttsPort.write("\xd7\xbf\xd2\xbb\xbf\xb5");delay(1000);
}//==============================================================================
// END OF FILE : TESTSERIAL.C
//------------------------------------------------------------------------------
(5)人脸识别模块接口
未完待续
(6)ESP8266接口
ESP8266有ATmega328 的SoftwareSerial相连接。使用到D2,D3两个端口。通讯的波特率为115200。
下面的示例程序显示了发送与接收的过程。
/*
**==============================================================================
** UNORECEIVE.C: -- by Dr. ZhuoQing, 2021-05-30
**
**==============================================================================
*/#include <SoftwareSerial.h>#define ON(pin) digitalWrite(pin, HIGH)
#define OFF(pin) digitalWrite(pin, LOW)
#define VAL(pin) digitalRead(pin)
#define IN(pin) pinMode(pin, INPUT)
#define OUT(pin) pinMode(pin, OUTPUT)SoftwareSerial ttsPort(12, 13);
SoftwareSerial wifiPort(2, 3);//------------------------------------------------------------------------------
void setup(void) {char c;ttsPort.begin(9600);wifiPort.begin(115200);wifiPort.listen();wifiPort.setTimeout(500);Serial.begin(115200);//----------------------------------------------------------------------}//------------------------------------------------------------------------------
int count = 0;
String str;
void loop(void) {char c;char buf[256];ttsPort.listen();wifiPort.print("http://192.168.4.2:8000/lock/update/?type=LOCK&detail=AAAA\r");wifiPort.listen();while(1) {str = wifiPort.readString();Serial.print(str);if(wifiPort.available() == 0) break; }delay(2000);}//==============================================================================
// END OF FILE : UNORECEIVE.C
//------------------------------------------------------------------------------
※ 实验总结 ※
未完待续
■ 相关文献链接:
- Arduino门禁人机接口调试 Version 1.0
- 从0 开始 DIY你的Arduino UNO
- Grove Beginner Kits基础实验 Arduino
● 相关图表链接:
- 图1-1 最小系统原理图
- 图1-2 ESP8266子系统电路
- 图1-3 接口电路
- 图1-4 USB下载电路接口
- 图2-1 Arduino 管脚定义
基于Arduino ATmega328人脸识别IOT演示门锁相关推荐
- 基于树莓派的人脸识别解锁门锁设计
点击查看:基于树莓派的人脸识别解锁门锁设计
- 基于OpenCV的人脸识别自助商店(源码&部署视频)
1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...
- Python基于OpenCV的人脸识别自助商店(源码&部署视频)
1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...
- 基于python的人脸识别系统设计与实现
案例分享之基于python的人脸识别系统设计与实现 人脸识别即程序对输入的图像进行判别是否有人脸,并识别出有人脸的图像所对应的人.即我们常说的人脸识别一般包含了人脸检测和人脸识别两部分.下面对其在op ...
- 基于javaweb的人脸识别登录系统(java+springboot+mysql)
基于javaweb的人脸识别登录系统(java+springboot+mysql) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/myeclipse/sts等均可配置 ...
- 基于MATLAB的人脸识别系统GUI
基于MATLAB的人脸识别系统GUI,可以识别出不同表情的人脸 演示视频:[基于matlab人脸识别系统-哔哩哔哩] https://b23.tv/Pj8j0Uu 运行截图: 源码获取+卫星:DX52 ...
- python人脸识别毕业设计-Python基于Dlib的人脸识别系统的实现
之前已经介绍过人脸识别的基础概念,以及基于opencv的实现方式,今天,我们使用dlib来提取128维的人脸嵌入,并使用k临近值方法来实现人脸识别. 人脸识别系统的实现流程与之前是一样的,只是这里我们 ...
- 基于matlab的人脸五官边缘检测方法,基于MATLAB的人脸识别系统的设计
基于MATLAB的人脸识别系统的设计(论文12000字,外文翻译,参考程序) 摘要:本文基于MATLAB平台设计了一款简单的人脸识别系统,通过USB摄像头来采集图像,经过肤色方法进行人脸检测与定位,然 ...
- python人脸识别训练模型_开源 | 基于Python的人脸识别:识别准确率高达99.38%!
原标题:开源 | 基于Python的人脸识别:识别准确率高达99.38%! 该库使用 dlib 顶尖的深度学习人脸识别技术构建,在户外脸部检测数据库基准(Labeled Faces in the Wi ...
最新文章
- Linux 入门基础
- linux用8m内存读取1g日志,检查 Linux 中内存使用状况的 8 条命令
- visual studio 2019安装配置可编写c/c++语言的IDE环境
- Windows 中_T和L
- [Node.js] mySQL数据库 -- NPM包
- 底部按钮吸附_知乎的药丸按钮(二)我的 iOS 实现
- Linux系统下xampp集成环境安装
- Alt+/ 快速提示快捷键修复及ecplise心得
- openStack常见报错
- python编程入门 适合于零基础朋友-Python不能帮你找到女朋友,却能让你成为有钱的单身狗。...
- NSNotificationCenter消息通信机制介绍(KVO)
- ASP.NET 2.0 Provider Toolkit
- java笔记--关于int和byte[]的转换
- 高通笔记本装linux,在华硕畅370(TP370QL)骁龙笔记本上安装Ubuntu 18.04 ARM64的方法...
- 模电摸索日记之《模电基础》
- 无锁(Lock-Free)编程简介及漫谈
- 基于Operator Discretization Library (ODL)的CT图像正反投
- HDU 5269 ZYB loves Xor I
- Android 进程和文件的UID/GID
- html如何设置打印分页打印出来,网页中如何用 CSS 设置打印分页符
热门文章
- VIEW登陆故障解决办法。
- GP通过外部表装载数据时遇到ERROR:extra data after last expected column解决方法
- 1Python进阶强化训练之装饰器使用技巧进阶
- 交叉编译VIM并移植到ARM嵌入式Linux系统
- textarea 在浏览器中固定大小和禁止拖动
- RHEL 6上KVM的安装配置及使用-将物理接口桥接到桥接器
- cPanel之EasyApache (Apache Update)的使用
- 特别推荐:RHCE考试经验
- Java 程序优化之对象池
- Python练习-循环及切片-2018.11.27