这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 指纹舵机控制

共1条 1/1 1 跳转至

指纹舵机控制

高工
2026-04-17 22:00:31     打赏
项目介绍咱这个项目是关于指纹验证开锁的。指纹验证可是现在超火的身份验证方式哦,它靠采集和比对咱们的指纹来确定身份。为啥它这么受欢迎呢?因为它有好多优点呀!每个人的指纹都是独一无二的,很难被复制或者伪造,这就保证了它的唯一性;咱们不用再费心记密码,也不用随身带着钥匙啥的,只要用手指轻轻一碰就能完成验证,特别方便;而且现在指纹识别技术可厉害了,几秒钟就能完成验证,效率超高。现在指纹验证已经融入到咱们生活的方方面面啦。咱们这个项目呢,用的是电容式指纹传感器来进行身份鉴权,鉴权成功后驱动舵机机构运动,就能实现开锁啦。硬件介绍传感器:用的是电容式指纹识别传感器(SEN0348)。这个模块可厉害啦,它把指纹采集、处理、存储还有指纹比对这些功能都集成在一起了。它里面有 ID809 高性能处理器和半导体指纹传感器,还内置了 IDfinger6.0 指纹算法,自己就能完成全部的指纹识别工作。这个模块用的是标准 UART 通讯,配合相应的库,咱们很容易就能实现录入指纹、删除指纹、比对指纹这些功能。它的外观精致又轻薄,还有环形炫酷呼吸灯呢,指纹识别速度超快,安全性也高,支持 360 度任意角度识别,还有深度自学习功能,性能好又省电。主控:用的是树莓派 Pico,它的核心芯片是 RP2040。它有两个 Arm Cortex M0+内核,运行速度能达到 133MHz,有 264KB 内存,性能特别强大。它的可编程 IO 高度灵活,能用于高速数字接口。它片内还有温度传感器,支持外部 4 路模拟信号输入,内部 ADC 采样率高达 500Ksps,精度是 12 位。而且它支持用 MicroPython、C、C++这些语言编程。锁:这里用了一个 180 度舵机来代替电子锁,通过控制舵机就能实现开锁和上锁的动作。任务选择咱们选的是方向二,也就是安全监测,要实现系统安全。具体来说,就是用指纹来确认人的身份,只有鉴权通过了,才能控制舵机进行开锁或者闭锁操作。


框架图

image.png


利用指纹传感器上的 LED 灯来实现与用户的信息交互,为用户带来新颖且便捷的使用体验。系统启动初始化后,指纹传感器上的 LED 灯会呈现蓝色呼吸灯状态。这种柔和且规律的明暗变化,如同在轻声呼唤用户,明确提示用户可以进行指纹触摸操作。当用户将手指放置在指纹传感器上,系统检测到指纹输入信号后,LED 灯立即切换为黄色闪烁模式。黄色闪烁具有较强的视觉冲击力,能够迅速引起用户注意,其作用是提示用户将手指从传感器上移开,以便系统顺利进行后续的指纹匹配工作。在手指离开后,系统迅速启动指纹匹配程序。若指纹与预设的不匹配,LED 灯会以红色闪烁的方式向用户反馈“指纹不匹配”的信息,红色通常代表着警示和错误,能让用户清晰知晓操作未成功。而当指纹匹配成功时,LED 灯则变为绿色闪烁,绿色象征着成功与通行,明确提示用户“指纹匹配”,同时系统会驱动舵机旋转,实现开锁功能。开锁之后,系统会维持开锁状态一段时间,确保用户有足够的时间进行相关操作。时间一到,系统再次驱动舵机,实现关锁动作。关锁完成后,指纹传感器上的 LED 灯重新恢复为蓝色呼吸灯状态,整个系统回到初始等待状态,随时准备迎接下一次的指纹识别操作。在开发环境方面,系统采用 Vscode 搭配 platformIO,利用 Arduino 进行编程。这种组合方式具有强大的代码编辑和项目管理功能,能够提高开发效率,方便开发者进行代码调试和优化,为系统的稳定运行提供了有力保障。

image.png


硬件连接,指纹传感器使用串口与树莓派Pico连接,这里连接到树莓派Pico的串口1(GP0,GP1),并且将指纹传感器的4、6脚短接起来,接到3.3V的电源口上;5脚是指纹传感器的额输出端,这里没有使用,悬空处理。舵机使用5V供电,信号脚接到GP28脚。

代码

#include <Arduino.h>
#include <DFRobot_ID809.h>
#define COLLECT_NUMBER 2 //指纹采样次数,可设置2-3
#define FPSerial Serial1
DFRobot_ID809 fingerprint;
void setup()
{
  Serial.begin(115200);
  FPSerial.begin(115200);
  fingerprint.begin(FPSerial);
  while (fingerprint.isConnected() == false) {
    Serial.println("与设备通讯失败,请检查接线");
    Serial.println(fingerprint.getErrorDescription());
    delay(1000);
  }
  fingerprint.delFingerprint(DELALL);  //删除所有指纹
}
uint8_t ID, i, ret;
void loop()
{
  /*获取一个未注册编号,用来保存指纹    获取成功返回ID号,    获取失败返回ERR_ID809   */
  if ((ID = fingerprint.getEmptyID()) != ERR_ID809) {
    Serial.print("未注册编号,ID=");
    Serial.println(ID);
    i = 0; //采样计数清零    /*指纹采样2次*/
    while (i < COLLECT_NUMBER)  {
      fingerprint.ctrlLED(/*LEDMode = */ fingerprint.eBreathing, /*LEDColor = */ fingerprint.eLEDBlue, /*blinkCount = */ 0);
      Serial.print("正在进行第");
      Serial.print(i + 1);
      Serial.println("次指纹采样");
      Serial.println("请按下手指");
      /*采集指纹图像,超过10S没按下手指则采集超时,如果timeout=0,关闭采集超时功能        如果获取成功返回0,否则返回ERR_ID809       */
      if ((fingerprint.collectionFingerprint(/*timeout = */ 10)) != ERR_ID809) {
        fingerprint.ctrlLED(/*LEDMode = */ fingerprint.eFastBlink, /*LEDColor = */ fingerprint.eLEDYellow, /*blinkCount = */ 3);   /*设置指纹灯环为黄色快闪3次*/
        Serial.println("采集成功");
        i++; //采样计数+1
      }
      else{
        Serial.println("采集失败");
      }
      Serial.println("请松开手指");
      /*等待手指松开        检测到手指返回1,否则返回0       */
      while (fingerprint.detectFinger());
    }
    /*将指纹信息保存到一个未注册的编号中*/
    if (fingerprint.storeFingerprint(/*Empty ID = */ ID) != ERR_ID809) {
      Serial.print("保存成功,ID=");
      Serial.println(ID);
      Serial.println("-----------------------------");
      /*设置指纹灯环为绿色常亮*/
      fingerprint.ctrlLED(/*LEDMode = */ fingerprint.eKeepsOn, /*LEDColor = */ fingerprint.eLEDGreen, /*blinkCount = */ 0);
      delay(1000);
      /*关闭指纹灯环*/
      fingerprint.ctrlLED(/*LEDMode = */ fingerprint.eNormalClose, /*LEDColor = */ fingerprint.eLEDBlue, /*blinkCount = */ 0);
      delay(1000);
    }
    else {
      Serial.println("保存失败");
    }
  }
}

#include <Arduino.h>
#include <Servo.h>
#include <DFRobot_ID809.h>
#define LOCKPIN 28
#define FPSerial Serial1


Servo servo;  // 控制舵机
DFRobot_ID809 fingerprint;      //指纹


// 控制锁的开关
void lock_action(bool lock){
  if(lock){
    servo.write(0);
  }else{
    servo.write(180);
  }
}


void setup() {
  Serial.begin(115200);
  servo.attach(LOCKPIN); //初始化舵机,初始化后置于锁状态
  lock_action(false);  
  FPSerial.begin(115200);
  fingerprint.begin(FPSerial);
  while(fingerprint.isConnected() == false){
    Serial.println("与设备通讯失败,请检查接线");
    delay(1000);
  }
  //设置指纹采集器 等待模式 处于蓝色呼吸灯状态
  fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
}


void loop() {
  uint8_t fingerid=0;
  // 采集指纹图像,关闭采集超时功能    如果获取成功返回0,否则返回ERR_ID809
  if((fingerprint.collectionFingerprint(/*timeout=*/0)) != ERR_ID809){
    /*设置指纹灯环为黄色快闪2次*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */2);
    Serial.println("采集成功");
    Serial.println("请松开手指");
    // 等待手指松开      检测到手指返回1,否则返回0   
    while(fingerprint.detectFinger());
    // 将采集到的指纹与指纹库中的所有指纹对比,      成功返回指纹编号(1-80),失败返回0
    fingerid = fingerprint.search();
    // 将采集到的指纹与指定编号指纹对比      成功返回指纹编号(1-80),失败返回0
    if(fingerid != 0){
      // 指纹匹配,设置指纹灯环为绿色闪亮  并且开锁
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */3);
      Serial.print("匹配成功,ID=");
      Serial.println(fingerid);
      lock_action(true);
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDCyan, /*blinkCount = */0);
      delay(10000);       //保持开门状态10秒
      lock_action(false);
    }else{
      // 指纹不匹配,设置指纹灯环为红色闪亮  不开锁
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */3);
      Serial.println("匹配失败");
      lock_action(false);
    }
  }else{
    Serial.println("采集失败");
  }
  delay(2000);
  fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
}


实现效果

image.png

image.png

image.png


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]