一日在淘宝闲逛,看到一个电动锁芯,价格比较便宜,做工精良,顺便买了回来,打算改造下大门,现在指纹锁比较流行,使用也最方便,车都无钥匙进入了,大门指纹开锁是必须的。淘宝搜一下,指纹锁真贵,好的要几千大洋,最便宜的要500块。所以准备自己做一个指纹锁。 一、材料准备 1、电动锁芯 ![]() 这个锁芯大部分防盗门都可以装上。 2、指纹模块 ![]() 淘宝的指纹模块有光学和电容式的两种,电容式的体积小,价格便宜点。最便宜的100块,就这个了。参数看着很强大,什么几百组指纹,识别准确率巴拉巴拉,都不关心,串口通讯,应该很好控制。 3、单片机 ![]() 算了一下16脚够用了,STC15W408AS SOP16 的手上有现成的。 4、电机控制 此锁芯电机5V可以转,力小转速慢,12V应该是正常工作电压,空载电流100mA,堵转电流700mA左右。 本打算用继电器控制,两个继电器正反转,结实耐用,控制简单,但体积太大。手上还有几个L9110H H桥驱动/全桥驱动/电机驱动芯片DIP-8。这个芯片标的最大耐压12V,我用5V开关电源测试,发热比较大,12V开关电源秒烧。2S电池8.2V工作倒不热,3S电池秒烧。连着烧了两个。所以还是选2S 8.4V工作电压稳妥点。 ![]() 5、5V供电 7805就行,据说效率不高, mini 360 降压模块,一直用这个,应该效率高点。 ![]() 6、辅材 主要材料就这些了,还需要无源蜂鸣器,发出宾馆磁卡锁那样 滴滴答的音乐,按键提示等各种不同的音调。按钮,电阻电容,发光二极管若干。 二、原理图 1、 电源部分 实测发现 mini 360 降压模块静态功耗非常大,什么都不接,只接Vin 静态电流十几毫安,如果电池供电,2000mAh的18650锂电,只为这一个模块待机,只能坚持100个小时,也就是4天。根本不能用呀。看来这个模块需要改造,通过资料发现电源芯片的第7脚是en引脚,模块中是直接用10K电阻接在Vin上,保证通电给高电平,只要把这个引脚引出来,用单片机控制电瓶就可以关断降压模块。 ![]() 图中这个引脚。 ![]() 改造之后的样子。经过测试关闭之后的待机电流只有uA级别了,满足电池供电需求了。 但是问题来了。单片机把供电关闭之后自己也没电了,所以再也醒不过来了,额…… 怎么办呢,只有给单片机单独供电,让单片机一直活着,才可以控制其他部件。 最终的电路图如下: ![]() BAT为2S 18650电池,BAT1是一个旧手机的电池。电路复杂了,两个电池插座,两个电源开关,还要两个电池电压检测程序。 2、 电机控制部分 ![]() 电机驱动模块,用两个1欧姆精度1%电阻并联做采样电阻,根据电流控制电机停止。 3、电源模块控制,蜂鸣器电路,指示灯电路 ![]() 因为手上只有2302mos管,所以就用的这个,下拉电阻10K~100K都可以,考虑到待机功耗,所以选了100K的。用8050也可以,电阻阻值、位置换一下。 4、按钮电路 ![]() 门外一个按钮,用来唤醒单片机指纹开锁,上锁。门内两个按钮一个用来直接开锁上锁,另一个用来录入指纹,清除指纹。 5 MCU部分 ![]() 1.电源模块控制 2. 2S电池电压 3.电机电流检测 4.按钮2 5. 空 6. VCC BAT1单独供电 7. 蜂鸣器 8. GND 9. 10. 串口连接指纹模块 11.内部按钮 12. 外部按钮 并联 红外接收头 13. 14. 指示灯 15. 16. 电机正反转控制 三、PCB ![]() ![]() 手工热转印,蚀刻,单层板。制作门内门外分两块, ![]() ![]() ![]() ![]() ![]() ![]() 测试过程中发现,老人的指纹磨损,很难识别,所以加入了红外密码开锁,红外接收头和门外按钮公用一个引脚。 四、程序部分 /**************************************************************************** /*2016-12-21 指纹模块测试,写指纹 门外按钮 短按 按下红灯亮,等待搜索指纹,正确红灯灭,蜂鸣器123,错误蜂鸣器4 门外按钮 长按 反转反锁 门内按钮1,短按绿灯亮,直接开锁 门内按钮1,长按 反转反锁 门内按钮2 长按 等待管理员指纹录入,检测5次,正确,录入新指纹 连续录入5次,正确红灯闪烁,5次后,熄灭 门内按钮2 长长按 等待管理员指纹录入,检测5次,正确,清除所有指纹 /*2016-12-24 所有功能实现 加入休眠功能 /*2017-1-15 单片机测量电机电流,电池电压,内部带隙电压 滴滴滴滴滴滴 单片机电池低 滴答滴答滴答 电机电池低压 /*2017-1-22 加入红外遥控密码开锁 *************************************************************/ #include "intrins.h" #include "IR.h" #include <SERIAL.c> #include <usartdrive.c> #include "time0.h" //定时器初始化 软件延时函数 #include "stc_ad.h" //adc函数 /*****************************/ //51单片机的时钟晶振大小为11.0592Mhz /****************************/ //typedef unsigned char uchar; //typedef unsigned int uint; #define MAX 0x0e //电机堵转电流 #define BatLow 176 //电池电压最低值 #define batVPin 3 //电池电压管脚 #define CurrPin 4 // 电机电流管脚 #define ClocsKey 0xFF //红外锁门 按键代码 #define btnOut P_IR_RX //外部按钮和红外接收公用一脚 sfr P5 = 0xC8; //xxxx,1111 端口5 sfr P0M0 = 0x94; // 0000,0000 sfr P0M1 = 0x93; // sfr P1M0 = 0x92; // 0000,0000 sfr P1M1 = 0x91; // sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 //sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 sfr ISP_CONTR=0xe7; ///////////////////管脚定义//////////////////////// //sbit btnOut=P3^3;//中断0 唤醒休眠用 /外部按钮和红外接收公用一脚 sbit btnIn=P3^2; //中断1 唤醒休眠用 内部按钮 sbit btnSet=P1^5; //设置指纹按下接地为0 sbit LedR=P3^7; //门外灯 sbit LedG=P3^6; //门内指示灯 sbit buzzer = P5^5; //控制三极管 推动蜂鸣器 sbit power = P1^2; //控制三极管 给除单片机外部件供电 sbit close=P1^1; //控制电机正反转 sbit open=P1^0; // 这四个脚需要强推挽 // 1.3 ADC 电池电压 1.4ADC 电机电流 //////////////// 变量声明//////////////// bit set1=0,set2=0,set3=0,set4=0 ,set5=0; //按钮动作功能位 set1 指纹开锁 set2 录入指纹 set3 上锁 set4 清所有指纹 set5 直接开锁 bit master=0; //管理员标志 bit locked=0; //已锁标志 uchar current; //电机电流 堵转 值0x0e uint count=0; //计数 10次 扫描按键动作 uchar j=0,i=0; uint Num; uint btnPressSum=0; //按钮长按计数 long int t=0; //time0 计时 uint mcuV ,batV; //1s电池电压 2s电池电压 //////////////函数声明////////////////// void fengming(uint x,uint y); //蜂鸣器发声 void buzz(uint No); //蜂鸣器奏乐 参数 123 321 1 2 3 4(低音do) void btnScan(); //按钮扫描 void fingerOpenLock(); //指纹开锁 void openLock(); //直接开锁 void closeLock(); //上锁反锁 void getFinger(); //录入新指纹 void clearFinger(); //清空指纹 void chkMaster(); //检查管理员 void chkBat(); //检查电池电压 void IRopenLock(); //红外密码开锁 void main() { InitADC(); power=0; //打开降压供电模块 Timer0Init(); serial_init(); Delay(500); P5M0|= 0x20; P5M1= 0x00; //P5.5 强推挽 P3M0=0xC0; //P3.6 3.7 强推挽 1100 0000 P3M1= 0x00; P1M0=0x07; // // P1.0 1.1 1.2 强推挽 0000 0111 P1M1= 0x00; open=0;close=0; LedR=0; LedG=0;buzzer=0; chkBat(); //检查电池电压 while(1) { btnScan(); if(set1) { buzz(3); set1=0; fingerOpenLock(); } if(set2) { buzz(3); set2=0; getFinger(); } (责任编辑:admin) |