AS608 指纹模块

最近更新于 2024-05-05 12:32

前言

这个指纹模块是之前在学校的时候搞科研立项买的,当时是做了一个开锁模型,搞了指纹和人脸识别开锁,开锁控制逻辑和指纹模块的读写部分是另外一个兄弟做的,他是用的 STM32(我不会)。人脸识别部分是我写的,用的树莓派,通过串口和 STM32 进行通信。后面这个指纹模块一直就放在我这儿,中间也想试试的,但是没有啥资料,实在搞不太明白,现在翻出来再折腾折腾。
这个模块是是通过光学采集指纹的,感觉结构和现在的光学鼠标差不多,有一个棱镜用来控制光路,里面射出一束光照在手指上,指纹会反射出深浅不同的纹路,里面的“摄像头”就能采集到,我还拆开过,里面就是一个摄像头,可能是特制的摄像头吧。
指纹的储存以及匹配算法都是在这个模块的芯片里的,只是可以通过外部信号进行控制它的行为,以及返回结果。
file
file

至于接口,这里简单说一下:

  • V+ 模块的输入电源正极
  • TX 和 RX 就是串口,注意接到上位机是反过来的,模块的读(RX)对应上位机的写(TX),模块的写(TX)对应上位机的读(RX)
  • GND 公共端
  • TCH 触摸感应,手指放上去就会输出高电平
  • VA 触摸感应的电源正极,不给电,触摸感应就不能使用
  • D+ USB 2.0 的白线(或橙色)
  • D- USB 2.0 的绿线(或蓝色)
    file

用单片机控制的话就不需要使用 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);
}

file

模块连接测试

#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()
{
}

file

修改密码

注:初始密码为 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()
{

}

file

清空指纹

#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()
{

}

file

删除指定指纹

#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;
}

file

指纹录入(烧坏了,待续)

接到 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
file

file

接线

\begin{array}{|c|c|}
\hline
AS608 & 串口模块 \\
\hline
V+ & VCC \\
\hline
TX & RX \\
\hline
RX & TX \\
\hline
GND & GND \\
\hline
\end{array}

测试

运行测试程序
file

点击打开设备,选择查看到的端口
file

连接上以后就可以在上面操作了,这个比较直观,操作简单,也就不多说了
file

AS608 指纹模块
Scroll to top