前言
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。
文章如有更新请访问 DFRobot 社区 或者 cnblogs 博客园。
书接上回,这次补完红外遥控的部分。
6、番外:板载 USER_LED 的使用
上面 3.1 pwr_status.sh
说到启动后会控制板载用户可控 LED 间隔 0.5s 闪烁。但是在 BTT Pi v1.2 上无效,询问技术人员后得知新版是接在 PI3 引脚上,参考 跟着思兼学习Klipper(06) 学用 Fly-Gemini 3D打印机控制板 一文,计算得知引脚号为 gpio259,也是 gpiochip0/gpio259
。
sudo su
# 启用 GPIOI3
echo 259 > /sys/class/gpio/export
# 设置引脚方向为输出
echo "out" > /sys/class/gpio/gpio259/direction
# 设置引脚输出值为1
echo 1 > /sys/class/gpio/gpio259/value
# 释放引脚
echo 259 > /sys/class/gpio/unexport
# 0亮,1灭
gpioinfo
sudo cat /sys/kernel/debug/gpio
U2C旁边的灯不可控?
7、添加红外遥控功能
BTT Pi 板载一个红外接收器(Infrared Remote,IR),可以实现红外遥控器控制灯光、播放 Music、开始打印、关闭打印机(需要二次确认)等操作。《红外遥控器坏了,待续》、《又买了一个红外遥控器,发现之前的是没电了》。最简单判断红外发射器好坏的方法就是用手机摄像头对着发射管。
网上关于使用红外接收器的文章比较乱,这次看 ArchWiki 没看懂。捋了一下,大概包括以下内容:
7.1 启用红外接收器
在 /boot/BoardEnv.txt
中添加 overlays=ir
,RatOS 没有此 dtb 文件,可以从官方系统中拷贝。
sudo nano /boot/BoardEnv.txt
# RatOS 默认未包括,可以从/boot/dtb/5.16拷贝
# overlays=ir
7.2 测试红外遥控器发射编码
之前红外遥控器最常用于电视,不同品牌的编码不一样,最常见的有 NEC/JVC/SHARP 等,我们可以使用不同工具进行测试,包括 evtest
、mode2
、ir-keytable
等,如果编码选择错误,可能出现按下按钮无反应的情况。
sudo apt install ir-keytable lirc
# 监听所有编码,方便确认遥控器编码,如下结果可知使用 nec 编码
ir-keytable -p all -t -v
1333.957318: lirc protocol(necx): scancode = 0xbf08
1333.957352: event type EV_MSC(0x04): scancode = 0xbf08
1333.957352: event type EV_SYN(0x00).
## 设定接收器编码
ir-keytable -p NEC
## 修改 lircd 服务
sudo nano /lib/systemd/system/lircd.service
ExecStartPost=/usr/bin/ir-keytable -p NEC
7.3 录制、定义按键功能
irrecord 软件操作逻辑刚开始会不习惯,建议参考 树莓派4b 红外发射与接收 一文。
# 查看可用键名,这里我们可用 KEY_[0-9]、KEY_DOWN、KEY_UP、KEY_PLAYPAUSE、KEY_NEXT、KEY_NEXT、KEY_PREVIOUS、KEY_VOLUMEUP、KEY_VOLUMEDOWN、KEY_POWER、KEY_STOP、KEY_EQUAL 等
irrecord -l
## 录制按键,此步比较特殊
irrecord
## 移动生成的遥控器文件到指定目录
sudo mv dfrobot.lirc.conf /etc/lirc/lircd.conf.d/
## 重启服务生效
sudo systemctl restart lircd
- 根据提示输入两次 Enter
- 输入 遥控器配置名称
- 按照要求随机按遥控器(不是按住一个键,可按多个键直到提示下一步,每次会出现一个小点)
- 输入按钮名称(如 KEY_0),短按对应的遥控器按钮采集信号。
- 回车退出信号采集
- 最后会生成一个
遥控器名称.lirc.conf
的文件
7.4 测试录入的按键
使用 irw
命令,输入后对准接收器按下之前保存的按钮,就会看到结果。此外还可以输入命令显示已保存的按键列表
如果测试没问题,可以参考格式结合 ir-keytable
结果手动添加其他按键。
7.5 遥控器按键绑定程序
使用 irexec
命令将程序绑定按键。
## 注意此服务没有自启,需要开启
systemctl enable --now irexec
## 修改配置文件:/etc/lirc/irexec.lircrc,示例如下
begin
button = KEY_0
prog = irexec
config = bash -c "echo 0 > /sys/class/gpio/gpio259/value"
end
begin
prog = irexec
button = KEY_1
#config = echo "KEY_1"
config = bash -c "echo 1 > /sys/class/gpio/gpio259/value"
end
## 测试,关闭 pwr_status.sh 命令
sudo htop
## 重启服务生效
systemctl restart irexec
使用红外遥控器实现按 0 键打开 uesr_led,按 1 键关闭 uesr_led。
7.5.1 播放音乐
和之前的一样,使用 mpg123
播放 mp3 格式的音乐文件,例如:
config = DISPLAY=:0 mpg123 /home/pi/Music/xy_glz.mp3
7.5.2 控制灯光照明
我们先在 moonraker.conf
文件中定义一个设备,例如 printer_led,这里使用上面的 user_led 为例,测试发现需要添加权限。
设置gpio权限
见 跟着思兼学习Klipper(06) 学用 Fly-Gemini 3D打印机控制板 一文,不再赘述
## 我们不建议把用户添加到root组,所以新建gpio组添加当前用户进去,重新登录 (Relogin) 生效
sudo su
groupadd gpio
gpasswd -a $user gpio
#####################################################
# 不建议使用usermod,会覆盖辅用户组
# sudo usermod -a -G gpio $user
# usermod -a -G tty,disk,dialout,sudo,audio,gpio,fly,plugdev,users,systemd-journal,input,netdev,ssh,mnrkrsudo $user
# chown -R root:gpio /sys/class/gpio 似乎不需要
#####################################################
# 添加 /etc/udev/rules.d/60-gpiod.rules
# sudo bash -c '' # https://www.cnblogs.com/sparkdev/p/10287164.html
cat << _EOF_ > /etc/udev/rules.d/60-gpiod.rules
# udev rules for gpio port access through libgpiod
SUBSYSTEM=="gpio", KERNEL=="gpiochip[0-4]", GROUP="gpio", MODE="0660"
_EOF_
# 重启 moonraker 并验证是否成功
systemctl restart moonraker
7.5.3 控制 LED 状态
这里调用 moonraker API,有两种控制方式:双按键对应开关两种状态;或者单按键切换两种状态,这里使用后者。注意此处为 POST 请求。
# 取消 led 控制,注释 ./pwr_status.sh &
sudo nano /etc/scripts/init.sh
# 控制照明灯光
config = curl -XPOST "localhost:7125/machine/device_power/device?device=printer_led&action=toggle"
7.5.4 一键归位 G28
和上面类似,可以调用 Klipper 宏命令,可以使用已有的比如 G28 归位,或者自定义的。参考 moonraker api: run a gcode,这里不带 & 参数,不用 POST 也可以。
config = curl localhost:7125/printer/gcode/script?script=G28
7.5.5 关闭上位机系统
最简单的就是 poweroff,复杂的就是写个打完安全关机的宏,Klipper + Moonraker 拓展性非常强,自己发挥即可。
参考文档:
8、演示视频
录制了一个演示小视频:红外遥控3D打印机