2023-6-4 08:43:01 [显示全部楼层]
30412浏览
查看: 30412|回复: 0

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

[复制链接]

前言

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

文章如有更新请访问 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

image-20230602230829652

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 等,我们可以使用不同工具进行测试,包括 evtestmode2ir-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 红外发射与接收 一文。

image-20230602232756441

# 查看可用键名,这里我们可用 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 命令,输入后对准接收器按下之前保存的按钮,就会看到结果。此外还可以输入命令显示已保存的按键列表
image-20230602233840192

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

image-20230603142204683

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打印机

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail