之前有篇文章只有图,所以今天来稍微详细说说这个制作过程。
这也是一个小项目,一直不知道该做什么东西,后来在网上看到有大学生给自己宿舍装了指纹锁,一下子受到启发,我自己也搞一个!
材料,arduino UNO 开发板;光学指纹模块,型号AS608/FPM10A;舵机或者电磁锁;
自己做的时候也看了不少材料,电容式那种指纹模块比较便宜,比如手机上的小圆片就是,我感觉打卡机那种光学的精度比较好,可存的指纹数量多,看起来也比较“高大上”。
至于源码,这里的源码指的仅仅是指纹模块的源码,GitHub上有,非常好用,下载下来解压,包放在arduino的libraries文件夹里,打开arduino,文件—示例—打开那个文件夹,里面
enroll是录入指纹程序,一个指头贴两遍
delete,输入你之前录入的编号即可删除
fingerprint,检测匹配,贴上你已录过的指头,显示匹配值,数值越高契合度越好,
大概常用的就这三个。几乎网上看到的所谓源码都是把这个指纹库里的东西扒拉出来然后贴上去,没有任何教程,还是建议GitHub上把完整安装包下载下来,导入本地arduino库。
连线问题,一共6条线,用其中4条就可以,现在也没在学校,东西不在手边,具体的忘了,大多数都是电源正负,通信两条线:TX,RX与开发板上的相反连接就行。电压一定要匹配,我的是5V的,连开发板上的3.3V就会闪。
最后说一下,调试好这个指纹模块才是一小步,毕竟现在也只是贴上指头然后电脑屏幕会反馈一个信息而已,难点在于把它和“锁”连接起来,本来说直接在淘宝上买个锁,就是那种一通电就把锁芯吸住,锁开。碍于经费有限,正好实验室有舵机,听从了大佬的意见,拿舵机模拟开锁就行,没必要弄个锁,只要是个机械装置即可。
这里就用到刚才说的那个库里面的fingerprint程序,进行这样的逻辑判断,匹配值达到X即给舵机一个信号,让它带动插销转动模拟开锁就行,于是把这个库代码改造改造,整合上之前学的一点舵机方面的小知识,
在fingerprint库最后的位置插入舵机转动相关代码,本来它是在指纹匹配的情况下要输出匹配值以及指纹标号的,现在就会先驱动舵机转动,然后再输出编号,达到开锁放行的目的。
最后我还加了点小料:LED灯。
如果指纹不匹配,给RED一个信号,即红灯亮,
如果匹配,则驱动舵机的同时给BLUE一个信号,蓝灯亮。(这里颜色自己定义啦,我这是实验室有啥就用啥)
以上为了打开制作思路,下面,上代码
#include <Adafruit_Fingerprint.h>
#include <Servo.h>
// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino (WHITE wire)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(2, 3);
Servo myservo;
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int bluePin = 10;
int redPin=11;
int pos = 0;
void setup()
{
Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(bluePin,OUTPUT);
myservo.attach(9);
//while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");
// set the data rate for the sensor serial port
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
}
void loop()
{
getFingerprintIDez();
delay(200); //don't ned to run this at full speed.
}
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println("No finger detected");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK success!
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
//open the door
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) {
digitalWrite(redPin,HIGH);
delay(200);
digitalWrite(redPin,LOW);
delay(5);
return -1;
}
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
digitalWrite(bluePin, HIGH);
digitalWrite(bluePin, LOW);
delay(5);
for(pos = 0; pos<90; pos+=1){
myservo.write(pos);
delay(15);
}
for(pos = 90; pos>=1; pos -= 1) {
myservo.write(pos);
delay(15);
}
代码有点C基础的都差不多可以看,建议要做的话也要学习学习arduino方面的代码规则,这个比起单片机已经算好理解的啦hhhh,这个代码是全整合型的,要用的小伙伴要自己定义好相关接口和材料,当然你没有经费限制的话来个现成 的锁也比较好,那个好像用什么三极管就可以驱动,我买好了三极管却。。
mi有经费了。
图中当时我录入了大拇指没有录食指,所以食指贴上去红灯亮,机械臂不转。
另一篇图片文章中链接
其他两个是已经开锁的图,蓝灯亮没拍到,但是可以看到舵机机械臂转动了一定角度。反正就是比较简陋吧(发扬硬核朋克风)
就这样吧。
国家政策,现在也不能去学校,有些东西没拍照片,具体流程也忘了点,以后会更新补上。当时泡在实验室好几天,东西在2019最后一天做出来完成的,最后也是加上了独立电源,毕竟指纹锁不可能装到门上都接个电脑吧哈哈哈。项目2020年底才收工,可以休息好长时间了。
第一次写博,码字不易,思路以及内容对你有帮助就点个赞吧。