Arduino门禁人机接口调试 Version 1.0
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino门禁人机接口调试 Version 1.0相关的知识,希望对你有一定的参考价值。
■ 相关文献链接:
§01 基于Arduino UNO门禁接口
1、前期的准备工作
- 在 Arduino基本人机接口:点阵LED、汉字库、键盘 初步对于基于Arduino的门禁系统中重要部件,进行了测试,包括键盘、点阵LED、汉字库(在一开始没有测试出结果)
- 在 Grove Beginner Kits基础实验 对于基于ESP8266的WiFi模块以及由它控制语音模块进行测测试。并给出了系统设计框图。
- 在 ESP8266访问网站-urequest get方法 进行了通过ESP8266访问网站的基本方法测试。
- 在 Arduio软件开发环境搭建 中给出了搭建Arduino的开发环境的过程。
▲ 门禁系统的系统框图
下面将基于前面的初步测试
2、系统硬件设计1
(1)原理图设计
▲ 系统详细原理图
下面给出自制电路板功能说明:
-
Ⅰ.ESP8266 WiFI模块接口:
-
串口接口
:软件UART,IO2-RX,IO3-TX
TTS接口
:ESP8266中的TXD1。
舵机接口
:ESP8266中的GPIO4
Ⅱ.4×4按键接口:
-
Arduino数字接口
:IO4,5,6,7,8,9,18,19
Ⅲ.LED模块接口:
-
Arduino数字接口
:IO14,15,16,17
Ⅳ.汉字库模块接口:
-
Arduino数字接口
:MOSI,MISO,SCK,SS
Ⅴ.人脸识别接口:
-
Arduino数字接口
:UART:RX,TX
为了参考方便,将 Grove Beginner Kits基础实验 中关于Arduino的数字口的配置显示如下:
▲ Arduino UNO的端口定义
(2)PCB设计
为了使用快速制版,设计了适合单面制版的PCB图,通过快速制版形成测试的电路。
▲ 设计版图以及快速制版电路图
3、焊接与调试
(1)焊接之后的电路板
将焊接之后的电路板放置在Grove Beginner Kit上进行调试。
▲ 焊接之后的电路板
§02 电路调试
1、4×4按键矩阵
(1)测试代码
下面的代码是从 Arduino基本人机接口:点阵LED、汉字库、键盘 拷贝过来的。对于其中KEYLIN_n, KEYCODE_n重新进行了定义。
▲ 原理图中,4×4键盘对应的接口
代码中,在 #define KEYLINE_n, KEY_CODE_n 分别定义了4×4键盘矩阵连接到Arduino数字接口的端口。
/*
**==============================================================================
** 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 0x1B
void 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)串口监视器
使用“工具栏”中的“串口监视器”,可以看到程序发送的读到的按键的二进制编码。 在没有按键的时候,读出的编码为0xff。其它的按键编码在上面的代码中前面进行了宏定义。
▲ 使用串口监视器获得Arduino发送的按键编码值
2、测试点阵LED
测试点阵LED的代码来自于 Arduino基本人机接口:点阵LED、汉字库、键盘 。根据原理图中的设计,对应LED_DATA1,LED_DATA2,LED_CLK1,LED_CLK2定义与前面实验相同,所以所使用的代码可以直接使用。
▲ 原理图中关于点阵LED以及汉字库接口
(1)测试代码
/*
**==============================================================================
** 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 7us
digitalWrite(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 7us
digitalWrite(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 7us
digitalWrite(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
//------------------------------------------------------------------------------
(2)运行效果
根据前面程序的逻辑,点阵LED显示的内容如下图所示。
▲ 程序运行结果
(3)显示字符
▲ 显示FONT字符
(4)显示按键数值
以上是关于Arduino门禁人机接口调试 Version 1.0的主要内容,如果未能解决你的问题,请参考以下文章