最近更新于 2024-05-05 12:32
前言
这个指纹模块是之前在学校的时候搞科研立项买的,当时是做了一个开锁模型,搞了指纹和人脸识别开锁,开锁控制逻辑和指纹模块的读写部分是另外一个兄弟做的,他是用的 STM32(我不会)。人脸识别部分是我写的,用的树莓派,通过串口和 STM32 进行通信。后面这个指纹模块一直就放在我这儿,中间也想试试的,但是没有啥资料,实在搞不太明白,现在翻出来再折腾折腾。
这个模块是是通过光学采集指纹的,感觉结构和现在的光学鼠标差不多,有一个棱镜用来控制光路,里面射出一束光照在手指上,指纹会反射出深浅不同的纹路,里面的“摄像头”就能采集到,我还拆开过,里面就是一个摄像头,可能是特制的摄像头吧。
指纹的储存以及匹配算法都是在这个模块的芯片里的,只是可以通过外部信号进行控制它的行为,以及返回结果。
至于接口,这里简单说一下:
- V+ 模块的输入电源正极
- TX 和 RX 就是串口,注意接到上位机是反过来的,模块的读(RX)对应上位机的写(TX),模块的写(TX)对应上位机的读(RX)
- GND 公共端
- TCH 触摸感应,手指放上去就会输出高电平
- VA 触摸感应的电源正极,不给电,触摸感应就不能使用
- D+ USB 2.0 的白线(或橙色)
- D- USB 2.0 的绿线(或蓝色)
用单片机控制的话就不需要使用 D+ 和 D-,如果要接到电脑上,可以用 D+ 和 D-,也可以用 USB 转串口模块
Arduino
测试环境
Arduino UNO
Arduino IDE 2.1.1(
Adafruit-Fingerprint-Sensor-Library 2.1.2:https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library
)
AS608 指纹识别模块
接线说明
\begin{array}{|c|c|}
\hline
AS608 & Arduino \\
\hline
V+ & 3.3V \\
\hline
TX & 2 \\
\hline
RX & 3 \\
\hline
GND & GND \\
\hline
TCH & 4(可选,触摸功能使用)\\
\hline
VA & 3.3V (可选,触摸功能使用)\\
\hline
\end{array}
注:
- 请勿接 5V 供电,亲身经历烧坏。
- Arduino 的 0 和 1 是硬件串口,在电脑上传程序到 Arduino 的时候实际使用的就是这个硬件串口,因此这里连接 AS608 时不能使用这个,于是在 2 和 3 采用软件模拟串口。
示例
指纹触摸检测
#define TOUCH_PIN 4
void setup()
{
Serial.begin(9600);
pinMode(TOUCH_PIN, INPUT);
}
void loop()
{
if (digitalRead(TOUCH_PIN) == HIGH)
{
Serial.println(F("检测到手指触摸!"));
}
delay(300);
}
模块连接测试
#include <Adafruit_Fingerprint.h>
// 软件模拟串口的引脚
#define RX 2
#define TX 3
SoftwareSerial mySerial(RX, TX);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
Serial.begin(9600);
Serial.println(F("指纹模块测试"));
finger.begin(57600);
if (finger.verifyPassword())
{
Serial.println(F("发现指纹模块!"));
}
else
{
Serial.println(F("没有找到指纹模块 :("));
while (1)
{
delay(1);
}
}
Serial.println(F("正在读取指纹模块参数!"));
finger.getParameters();
Serial.print(F("状态: 0x")); Serial.println(finger.status_reg, HEX);
Serial.print(F("系统 ID: 0x")); Serial.println(finger.system_id, HEX);
Serial.print(F("容量: ")); Serial.println(finger.capacity);
Serial.print(F("安全等级: ")); Serial.println(finger.security_level);
Serial.print(F("设备地址: ")); Serial.println(finger.device_addr, HEX);
Serial.print(F("数据包长度: ")); Serial.println(finger.packet_len);
Serial.print(F("波特率: ")); Serial.println(finger.baud_rate);
}
void loop()
{
}
修改密码
注:初始密码为 0
#include <Adafruit_Fingerprint.h>
SoftwareSerial mySerial(2, 3);
#define PASSWORD 0 // 此处为当前密码
#define NEW_PASSWORD 0 // 设置新密码
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial, PASSWORD); // 第二个参数是密码,如果密码修改过(非 0),则需要指定密码,否则可以不填这个参数
void setup()
{
Serial.begin(9600);
finger.begin(57600);
if (finger.verifyPassword())
{
Serial.println(F("发现指纹模块!"));
}
else
{
Serial.println(F("没有找到指纹模块:("));
while (1);
}
Serial.println(F("设置密码... "));
uint8_t p = finger.setPassword(NEW_PASSWORD);
if (p == FINGERPRINT_OK)
{
Serial.println(F("密码设置完成"));
}
else
{
Serial.println(F("密码设置出错"));
}
}
void loop()
{
}
清空指纹
#include <Adafruit_Fingerprint.h>
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
Serial.begin(9600);
finger.begin(57600);
if (finger.verifyPassword())
{
Serial.println(F("发现指纹模块!"));
}
else
{
Serial.println(F("没有找到指纹模块 :("));
while (1);
}
Serial.println(F("删除所有指纹模板?"));
Serial.println(F("请输入 Y 以继续操作"));
while (1)
{
if (Serial.available() && (Serial.read() == 'Y'))
{
break;
}
}
finger.emptyDatabase();
Serial.println(F("指纹模板已被清空!"));
}
void loop()
{
}
删除指定指纹
#include <Adafruit_Fingerprint.h>
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
Serial.begin(9600);
finger.begin(57600);
if (finger.verifyPassword())
{
Serial.println(F("发现指纹模块!"));
}
else
{
Serial.println(F("没有找到指纹模块 :("));
while (1)
{
delay(1);
}
}
}
uint8_t readnumber(void)
{
uint8_t num = 0;
while (num == 0)
{
while (! Serial.available());
num = Serial.parseInt();
}
return num;
}
void loop()
{
Serial.println(F("请输入您想删除的指纹对应的 ID(1-127)..."));
uint8_t id = readnumber();
if (id == 0)
{
return;
}
Serial.print(F("ID 删除中:#"));
Serial.println(id);
deleteFingerprint(id);
}
uint8_t deleteFingerprint(uint8_t id)
{
uint8_t p = -1;
p = finger.deleteModel(id);
if (p == FINGERPRINT_OK)
{
Serial.println(F("已删除!"));
}
else if (p == FINGERPRINT_PACKETRECIEVEERR)
{
Serial.println(F("通讯出错"));
}
else if (p == FINGERPRINT_BADLOCATION)
{
Serial.println(F("无法在该位置删除"));
}
else if (p == FINGERPRINT_FLASHERR)
{
Serial.println(F("写入闪存时出错"));
}
else
{
Serial.print(F("未知错误: 0x"));
Serial.println(p, HEX);
}
return p;
}
指纹录入(烧坏了,待续)
接到 5V 被烧坏了,无法采集指纹数据,暂时搁置
指纹识别
指纹查看
电脑
指纹模块上自带的 USB 接口没试过,这里采用 USB 转串口模块接到电脑上。
测试环境
SynoChip 芯片测试程序 2.906:https://pan.baidu.com/s/1zEcxBfR3P60cd_AK3x8_1Q?pwd=7oz2
CH340 USB 转串口模块
AS608 指纹识别模块
将串口模块插入电脑后可以在设备管理器中看到 COM 端口,记住这个端口号,测试时需要使用,如果找不到,那可能是没有安装串口芯片驱动,需要自行下载安装(https://blog.iyatt.com/?p=11016 )
接线
\begin{array}{|c|c|}
\hline
AS608 & 串口模块 \\
\hline
V+ & VCC \\
\hline
TX & RX \\
\hline
RX & TX \\
\hline
GND & GND \\
\hline
\end{array}
测试
运行测试程序
点击打开设备,选择查看到的端口
连接上以后就可以在上面操作了,这个比较直观,操作简单,也就不多说了