使用 sg90 舵机控制 HP 1106 打印机

·708 Views·

家里打印机由于停电或者其他原因会中断与路由器的连接,导致打印文件时,没有反应,还得手动去重启打印机来解决,虽然出现这种情况不是很多,但是家人解决起来还是得靠口头指挥,非常不方便。

这种情况发生过几次,就考虑能否通过程序来检测打印机状态,一旦检测掉线,就让打印机重启。

程序定时检查打印机状态,这个对于搞程序的同学,不是难事。如何让打印机自动重启?有两种方法

  • 软件来解决,这个需要打印机提供重启命令,涉及到硬件。
  • 额外增加硬件,帮我们手动按重启键

起初,找了找打印机官方说明,没有找到任何线索,想到耗费时间长,先当作备选。

最后,就优先增加硬件来解决。在查询一番资料后,有两种硬件:

  • 推拉式电磁锁。比如小区的门禁,都是这类硬件,通电后,能吸动铁杆,放点后,铁杆通过弹簧还原到初始状态,优点结构简单,给电就行。缺点是,持续给电过程中,会发热;伸缩幅度需要通过机械调整才能精确控制;停留时间依赖通电时间。
  • 舵机。听起来高大上,其实生活中应用也很广泛,比如小朋友遥控车方向控制,有的就使用它。工业上机械臂就使用的是舵机。优点是,幅度和停留时间都可以通过软件精确控制。非工业用的舵机价格很便宜,某宝不到 10块钱。

比较后,最终选择舵机来帮我们手动点击开关。

确定软件和硬件后,剩下就是实现了。

控制舵机软件,采用 Python 来实现,整个代码,加上空行和注释,不到 50 行,非常简单。点击这里查看。

控制舵机,需要发送 PWA 命令,控制设备需要有 GPIO 引脚。家里闲置的树莓派正好派上用场,树莓派通过控制 GPIO 引脚来控制 舵机。

最后在树莓派,又启动了一个 web 服务,对外提供服务,路由器通过 HTTP 服务调用 python 来启动舵机,大致的流程是:

路由器 → 调用 HTTP 服务 → 调用 Python 服务 → 启动舵机

舵机硬件,直接粘贴在打印上,如下图

路由器在通过 shell 命令定时检测打印机存活,来完成打印机的重启,代码如下

1#!/bin/bash
2# 0 */1 * * * /bin/sh /opt/web/shell-collection/check-hp-1106-printer.sh
3
4currentPath="$(cd "$(dirname "$0")"; pwd)"
5source ${currentPath}/send-message-util.sh
6
7# 定时监测打印机是否存活
8# 打印机离线,调用 sg90 web 执行重启动作
9#PRINTER_STATUS="$(lsusb | grep P1106 2>/dev/null)"
10
11CHECK_RETRY=3
12RETRY_INTERVAL=3
13SG90_WEB_STATUS=`curl -o /dev/null -s -w %{http_code} <http://sg90.sixwifi.com/alive`>
14SG90_WEB_GO=http://sg90.sixwifi.com/go
15
16echo "----The information of environment----"
17echo "CHECK_RETRY: $CHECK_RETRY"
18echo "SG90_WEB_STATUS: $SG90_WEB_STATUS"
19echo "--------------------------------------"
20
21function func_send_log() {
22 send_message $1 "$(date '+%Y-%m-%d_%H:%M:%S') 执行 check-hp-1106-printer.sh"
23}
24
25function func_check_printer() {
26 PRINTER_STATUS="$(lsusb | grep P1106 2>/dev/null)"
27 echo "PRINTER_STATUS: $PRINTER_STATUS"
28 if [ "${PRINTER_STATUS}" != "" ];then
29 # 打印机正常,直接退出
30 exit 0
31 fi
32 echo "The printer has been offline. Start to run sg90"
33 if [ $SG90_WEB_STATUS != 200 ];then
34 # 打印机 和 sg90 proxy 都不正常,没有必要在循环了,直接退出
35 func_send_log "[ERROR] 「打印机」和「SG90 Web」均离线。"
36 exit 0
37 fi
38 # 执行 sg90
39 curl -o /dev/null -s $SG90_WEB_GO
40 # sg90 需要执行一段时间,所以停顿下
41 echo "wait 10s"
42 sleep 10
43}
44
45while [ $CHECK_RETRY -gt 0 ]
46do
47 echo "Start to retry..., $CHECK_RETRY"
48 func_check_printer
49 let CHECK_RETRY--
50 sleep $RETRY_INTERVAL
51 if [ "${CHECK_RETRY}" = 0 ]; then
52 func_send_log "[ERROR] 重试已达上限,打印机还在「离线」状态。"
53 fi
54done