因为Linux系统每次开机或者执行一些需要权限的命令时要输入密码,但是本身输入密码这件事就不太安全。综合现有情况,windows可以很方便的使用人脸识别,但是linux上指纹都不方便,也怕破坏启动配置。于是决定使用外部硬件的方式实现指纹识别后自动输入密码的功能。相对安全了点。
功能逻辑¶
- 通过蓝牙连接ESP32
- 通过AS608校验指纹
- 指纹校验通过则模拟成蓝牙键盘发送密码
硬件方面¶
- 采用的ESP32作为主控,其本身自带WIFI和蓝牙,非常便于之后的功能改善。
- AS608作为指纹传感器,负责指纹的录入和校验。
- OLED SSD1306作为屏幕进行必要的显示,方便了解处理进度。
ESP32的管脚图:


ESP32原理图:


IDE图方便选择的是Arduino的环境,在板子管理处添加如下字段,添加Esp32板子信息:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json。
选择开发版ESP32 Dev Module。
安装库:ESP8266 and ESP32 OLED driver for SSD1306 displays和Adafruit Fingerprint Senser Library。
安装第三方库:从https://github.com/T-vK/ESP32-BLE-Keyboard下载并添加。
电路连接¶
OLED:
- VCC->3.3V
- GND->GND
- SCL->接D22
- SDA->D21
AS608:
- VCC->3.3V(5V会烧坏元件)
- GND->GND
- TX->RX2
- RX->TX2

代码¶
指纹注册代码¶
1 |
|
删除指纹代码¶
1 |
|
使用代码¶
1 |
|
想要修改默认的蓝牙名称需要在默认C:\Users\<用户名>\Documents\Arduino\libraries\ESP32-BLE-Keyboard的BleKeyboard.h的第101行进行修改。
遇到的问题¶
在开发过程中,当OLED显示屏没有在和ESP32同时上电,可能导致OLED屏幕无法显示。但是在电脑端未出现此问题。同时采用ESP32的电源进行供电就没有此问题。
可选升级¶
通过树莓派控制供电¶
USB 接口的供电并不是通过 GPIO 直接控制的,而是通过 USB 集线器 LAN9514 控制的。CPU 可以通过设置集线器的 PORT_POWER 选项完成 USB 供电电路的开关。
控制 USB 供电的电路出现在 Raspberry Pi Model B+ 之后的版本。原版的 Raspberry Pi Model B 的 USB 供电电路直接与 5V 相连,不受控制。
-P 参数用于指定要控制的端口,1 为集成网卡,2 为 4 个 USB 口。网卡的供电可以独立控制,所以开关 USB 口的供电并不会导致 ssh 断开。
下载并编译 hub-ctrl.c(这个程序依赖于 libusb,编译时请带上参数 -lusb)。
调用如下命令控制USB的供电:
1 | //查看设备 |
设置定时任务:
1 | sudo crontab -e |
添加触摸传感器¶
为了避免长时间供电损坏引脚以及避免烧屏,采用传感器触发开启指纹。
添加触摸传感器,其只有三个引脚VCC、GND、Sig。
通过Respeaker上的Grove接口预留的GPIO12采集其信号。当检测到触摸传感器被触摸后返回的高电平信号,树莓派给USB口供电,启动指纹蓝牙键盘。使用树莓派的连接SSD1306的OLED屏幕显示树莓派当前状态,并将每次的log信息保存在项目文件夹中。
代码如下:
1 | import time |
最终的crontab:
1 | sudo crontab -e 定时任务 |