Arduino门禁人机接口调试 Version 1.0

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino门禁人机接口调试 Version 1.0相关的知识,希望对你有一定的参考价值。


 


■ 相关文献链接:

 

§01 于Arduino UNO门禁接口


1、前期的准备工作

▲ 门禁系统的系统框图

▲ 门禁系统的系统框图

下面将基于前面的初步测试

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的端口定义

▲ Arduino UNO的端口定义

(2)PCB设计

为了使用快速制版,设计了适合单面制版的PCB图,通过快速制版形成测试的电路。

▲ 设计版图以及快速制版电路图

▲ 设计版图以及快速制版电路图

3、焊接与调试

(1)焊接之后的电路板

将焊接之后的电路板放置在Grove Beginner Kit上进行调试。

▲ 焊接之后的电路板

▲ 焊接之后的电路板

 

§02 路调试


1、4×4按键矩阵

(1)测试代码

下面的代码是从 Arduino基本人机接口:点阵LED、汉字库、键盘 拷贝过来的。对于其中KEYLIN_n, KEYCODE_n重新进行了定义。

▲ 原理图中,4×4键盘对应的接口

▲ 原理图中,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发送的按键编码值

▲ 使用串口监视器获得Arduino发送的按键编码值

2、测试点阵LED

测试点阵LED的代码来自于 Arduino基本人机接口:点阵LED、汉字库、键盘 。根据原理图中的设计,对应LED_DATA1,LED_DATA2,LED_CLK1,LED_CLK2定义与前面实验相同,所以所使用的代码可以直接使用。

▲ 原理图中关于点阵LED以及汉字库接口

▲ 原理图中关于点阵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字符

▲ 显示FONT字符

(4)显示按键数值

<p以上是关于Arduino门禁人机接口调试 Version 1.0的主要内容,如果未能解决你的问题,请参考以下文章

Arduino基本人机接口:点阵LED汉字库键盘

arduino门禁系统卡uid默认多少

ESPcopter无人机源码分析.1

无人机开发之一:Pixhawk与Arduino简述

Arduino与PCF8575 IIC 总线调试

arduino串口接收的问题