如何制作一个带指纹识别的机械键盘

在Windows 10发布时,除了使用传统的登陆密码,操作系统还支持三种Windows Hello类型: PIN面部识别,指纹识别。

也许我们在各种智能手机上已经习惯于手指一按或者盯着屏幕就可以解锁直奔主题的感觉,但是对于PC来说,生物识别的普及速度似乎慢了不止半拍。

这其中有很多原因,可以归结于电脑的使用方式不像手机需要频繁解锁,也可以认为PC行业作为老消费电子业创新乏力,各大厂商没有动力跟进最新技术(只有各大RGB灯厂依然蓬勃发展哈哈),但总之现状就是Windows Hello出现了这么久市面上能够适配的配件依然寥寥可数。

嘛,作为一个呆萌极客,遇到这种问题肯定是要挺身而出的,反正让我敲一长串密码我就难受,连指纹人脸都没有的电脑能算得上是神机吗?我表示强烈摇头。

今天就来教大家如何强势改造自己的键盘,给它添加上指纹模块,一键登录美滋滋。

开始之前,先介绍一下本次DIY的背景,其实个人自己用的台式机是支持人脸识别的,我很早(从RealSense发布的时候)就开始关注Windows Hello了。那时候能买的RealSense摄像头都很贵(现在也不便宜),我最早选择的是SR300这个型号,用是挺好用的,但是故障率奇高,半年时间内用坏了两个,所以当罗技也推出了支持人脸登录的Webcam之后,我毫不犹豫入手了一个,就是下面这个玩意↓

(顺便发一个我之前的回答,是介绍我如何攒机设计自己的台式机的)

你组装的最得意的一台电脑是什么样的?www.zhihu.com图标

来到公司之后,在公司的电脑上我自然也想设置相同的人脸解锁功能,但是很可惜,出于信息安全考虑,公司的电脑登录设置被策略组限制,只能使用密码而无法设置PIN

而在使用Windows Hello在设备上启用生物识别之前,必须选择PIN作为初始解锁方式。所以经过一番搜索后,对于是否可以在不设置PIN的情况下使用Windows Hello解锁这个问题,这里的答案是否定的,没有办法禁用PIN,且只有设置PIN后,才可以根据需要添加生物识别。

在Windows 10中,PIN登录是新Microsoft Passport功能的一部分,并且比传统密码更安全,下面的链接是微软官方的介绍↓

PIN 为何优于密码 (Windows 10)docs.microsoft.com图标

道理我都懂,但是这种情况下我要怎么愉快地在公司___呢?

当然难不倒我,既然软件上无法支持,那我们就来造一个物理外挂:直接用Arduino模拟成一个HID键盘,再通过指纹模块来做身份验证。

原理图如下↓

其实非常简单,就是在键盘的USB线中间插入了一个USB-Hub,然后Hub的一个口接键盘原来的USB线,一个口接我们的Arduino(这里用的是Micro,因为带USB模拟功能)

一拖二的USB-Hub

Arduino这边,选择了一个串口指纹模块,型号是FPM3X,长下面这样↓

然后就是键盘的拆解和改造了,这一步比较考验手工,总之就是找一个能塞下模块的位置钻个和传感器一样大小的窟窿。我用的键盘是某宝买的一个茶轴机械键盘(程序员必备),每个按键都带独立可控背光,还很便宜只要不到200块,具体型号就不说了避免广告。指纹的位置我选择放在ESC键边上,一是这边刚好有个空位,另外一个原因是放在左手边的话不会需要右手离开鼠标,使用起来会更顺畅。

键盘原始状态
脱下马甲
找到一个合适的位置放置指纹传感器
标记好孔位尺寸
开始打孔...
冒着生命危险
把指纹传感器嵌入,用热熔胶固定
完成!

接下来就是电路部分了,我买了最小的Arduino Micro,因为这个电路实在太简单,所有没有必要自己做PCB,飞几根线即可

为了避免短路,用热缩管把电路部分封装好
把所有电路都塞进去固定好
完成品的效果

最后插上电脑,电脑识别出一个键盘,一个Arduino串口,硬件无误~

下一步是编程,Arduino Micro上的Mega32U4芯片本身就带USB接口,所以官方也提供了USB库可以模拟成键盘和鼠标,这里通过模拟成键盘来实现读取到正确的指纹数据后输入一串密码的功能

VS下对Arduino进行编程

经验证,效果完美,而且不仅如此,由于我们可以录入多个指纹,所以可以轻松用代码实现不同指纹输入不同内容的功能;如果在Arduino上添加一些额外传感器,那么还能实现更多自定义宏的触发功能,简直一颗赛艇。

用不同手指输入不同密码

代码中封装好了各种模拟键盘的方法,可以很方便地自定义输入逻辑和内容↓

 switch (finger_id)
  {
  case 1: 
    fingerBoard.InputPassword("12345678");
    break;

  case 2:
    fingerBoard.InputPassword("123456789");
    break;

  case 3:
    fingerBoard.InputPassword("aaabbbccc");
    break;

    /* 
    you can also do something like this:
    // The keyboard will type the string and perform an ENTER.
    fingerBoard.TypeString("www.zhihu.com", true);
    // The keyboard will press ctrl+v and then release.
    fingerBoard.PressKey(KEY_LEFT_CTRL);
    fingerBoard.PressKey('v');
    fingerBoard.ReleaseAll();
    ...
    */


结束语:本次DIY主要是解决了无法使用PIN的情况下使用WIndows Hello的问题。对于大家自己的电脑,其实完全可以不需要Arduino这一块板子,直接把Hub另一口的Arduino板子换成USB指纹模块,也是可以完美兼容的~只不过这样的话就只能用于登录而无法编程实现其他功能了。

比如这种X宝买的USB指纹器,实测识别速度还是很快的

Arduino的代码在这里,板子型号、传感器链接、接线方式和串口指令说明都在代码里有注释,需要的同学可以自行尝试,记得给个星星~

Githubgithub.com

相关文章:

你组装的最得意的一台电脑是什么样的?www.zhihu.com图标稚晖:如何制作一支带逗比功能的笔zhuanlan.zhihu.com图标稚晖:如何自制一个超迷你的语音助手zhuanlan.zhihu.com图标

长期搞各种脑洞项目,大家不嫌弃的话也可以点一下上面关注~不定期更新

顺便微博@ _稚晖

编辑于 2019-07-17