pATAq 发表于 2023-6-4 08:43:01

跟着思兼学习Klipper(24): 红外遥控3D打印机

## 前言
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。

文章如有更新请访问 (https://mc.dfrobot.com.cn/thread-316165-1-1.html?fromuid=725344) 或者 (https://www.cnblogs.com/sjqlwy/p/bttpi_irc.html)。

书接上回,这次补完红外遥控的部分。

## 6、番外:板载 USER_LED 的使用

上面 `3.1 pwr_status.sh` 说到启动后会控制板载用户可控 LED 间隔 0.5s 闪烁。但是在 BTT Pi v1.2 上无效,询问技术人员后得知新版是接在 PI3 引脚上,参考 [跟着思兼学习Klipper(06) 学用 Fly-Gemini 3D打印机控制板](https://mc.dfrobot.com.cn/thread-311661-1-1.html?fromuid=725344) 一文,计算得知引脚号为 gpio259,也是 `gpiochip0/gpio259`。

```shell
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
```

!(https://raw.iqiq.io/sjqlwy/blog_imgs/default/images/202306022308238.png)

U2C旁边的灯不可控?

## 7、添加红外遥控功能

BTT Pi 板载一个红外接收器(Infrared Remote,IR),可以实现红外遥控器控制灯光、播放 Music、开始打印、关闭打印机(需要二次确认)等操作。《红外遥控器坏了,待续》、《又买了一个红外遥控器,发现之前的是没电了》。最简单判断红外发射器好坏的方法就是用手机摄像头对着发射管。

网上关于使用红外接收器的文章比较乱,这次看 ArchWiki 没看懂。捋了一下,大概包括以下内容:

## 7.1 启用红外接收器

在 `/boot/BoardEnv.txt` 中添加 `overlays=ir`,RatOS 没有此 dtb 文件,可以从官方系统中拷贝。

```shell
sudo nano /boot/BoardEnv.txt
# RatOS 默认未包括,可以从/boot/dtb/5.16拷贝
# overlays=ir
```

## 7.2 测试红外遥控器发射编码

之前红外遥控器最常用于电视,不同品牌的编码不一样,最常见的有 NEC/JVC/SHARP 等,我们可以使用不同工具进行测试,包括 `evtest`、`mode2`、`ir-keytable` 等,如果编码选择错误,可能出现按下按钮无反应的情况。

```shell
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 红外发射与接收](https://www.cnblogs.com/jinsheng-79/p/15159144.html) 一文。

!(https://raw.iqiq.io/sjqlwy/blog_imgs/default/images/202306022327768.png)

```shell
# 查看可用键名,这里我们可用 KEY_、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` 命令,输入后对准接收器按下之前保存的按钮,就会看到结果。此外还可以输入命令显示已保存的按键列表
!(https://raw.iqiq.io/sjqlwy/blog_imgs/default/images/202306022338251.png)

如果测试没问题,可以参考格式结合 `ir-keytable` 结果手动添加其他按键。

!(https://raw.iqiq.io/sjqlwy/blog_imgs/default/images/202306031422907.png)

## 7.5 遥控器按键绑定程序

使用 `irexec` 命令将程序绑定按键。

```shell
## 注意此服务没有自启,需要开启
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 格式的音乐文件,例如:

```shell
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打印机控制板](https://mc.dfrobot.com.cn/thread-311661-1-1.html?fromuid=725344) 一文,不再赘述

```shell
## 我们不建议把用户添加到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", GROUP="gpio", MODE="0660"
_EOF_
# 重启 moonraker 并验证是否成功
systemctl restart moonraker
```

### 7.5.3 控制 LED 状态

这里调用 moonraker API,有两种控制方式:双按键对应开关两种状态;或者单按键切换两种状态,这里使用后者。注意此处为 POST 请求。

```shell
# 取消 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 归位,或者自定义的。参考 (https://moonraker.readthedocs.io/en/latest/web_api/#run-a-gcode),这里不带 & 参数,不用 POST 也可以。

```shell
config = curl localhost:7125/printer/gcode/script?script=G28
```

### 7.5.5 关闭上位机系统

最简单的就是 poweroff,复杂的就是写个打完安全关机的宏,Klipper + Moonraker 拓展性非常强,自己发挥即可。

参考文档:

* (https://forum.armbian.com/topic/1953-configuring-orange-pi-pc-to-receive-irinfrared/)
* (https://www.jianshu.com/p/28165c6a2ac5)
* (https://wiki.archlinux.org/title/LIRC)
* https://linux-sunxi.org/IR
* https://www.nanocode.cn/wiki/docs/gdk8_primer/primer_gdk8_remote
* https://wiki.archlinux.org/title/LIRC/Quick_start_guide

## 8、演示视频

录制了一个演示小视频:[红外遥控3D打印机](https://www.bilibili.com/video/BV1ru411p7x7)
页: [1]
查看完整版本: 跟着思兼学习Klipper(24): 红外遥控3D打印机