IoT Starter Raspberry Pi Lirc





5.00/5 (6投票s)
IoT.Starter.Pi.Thing 由 Linux 红外线遥控器驱动
引言
本系列由 IoT.Starter.Pi.Core 发起,并在 IoT.Starter.Pi.Thing 的第二部分中介绍,旨在作为使用 Raspberry Pi 和 Linux 进行物联网项目的入门套件。
基于以下事实
- 如果我们更好地探索 Linux 已经拥有的出色开发成果,就能从 RPI 中获得最大收益。
- 大多数家庭自动化项目都应该处理我们家中现有的传统红外线 (IR) 控制设备,包括音频、图像、空调、加热器等。
- 如今有许多 RGB LED、LED 灯带和其他低成本的红外线控制照明设备可供选择。将低成本红外线 RGB LED 集成到物联网项目中是一个值得探索的好机会。
- Linux Lirc 是一个成熟且广泛的项目。它拥有一个庞大的遥控器数据库,包含超过 2,500 个设备的配置文件,并且还在不断增长。
IoT.Starter.Pi.Thing
可以受益于安装在 RPI 上的 Lirc,我们只需要将它们连接起来。
当前任务的规范是为 IoT.Starter.Pi.Thing
项目提供红外线 (IR) 输出能力。一直以来,让家用电器像万能遥控器一样工作,一直是家庭自动化项目的一个梦想。
LIRC:适用于 Raspberry Pi 的 Linux 红外线遥控器
适用于 Raspberry Pi 的 Linux 红外线遥控器源自 Aron Szabo 的原始 Lirc 串行驱动程序。Bengt Martensson 对 Lirc 驱动程序进行了进一步开发和改进。好消息是,对于首次安装 Lirc 的您来说,Raspberry Pi / Raspbian Stretch 自带 Lircd(此处版本为 0.9.4c),它已得到改进,可以使您的生活更轻松。早期版本中需要的文件已不再使用:/etc/modules 和 /etc/lirc/hardware.conf
Lirc 安装
为了更新和升级 Raspbian 并为 RPI 安装 Lirc,请运行以下命令:
apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y lirc \
&& rm -rf /var/lib/apt/lists/*
Config.txt
Lirc 版本 0.9.4c 仅通过文件 /boot/config.txt 进行配置。
添加到 /boot/config.txt
# Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up
更改默认驱动程序
编辑文件 /etc/lirc/lirc_options.conf 并进行更改:
from:
driver = devinput
device = auto
to:
driver = default
device = /dev/lirc0
重启并检查
请参阅项目仓库中提供的 RPI 设置说明,了解有关 Lirc 安装的更多详细信息。以下是一个快速检查,用于评估 Lirc 的安装情况。
lircd 状态
/etc/init.d/lircd status
[ ok ] lircd is running.
lsmod
lsmod | grep lirc
lirc_rpi 9032 0
lirc_dev 10583 1 lirc_rpi
rc_core 24377 1 lirc_dev
设备
mode2 --driver default --list-devices
/dev/lirc0
检查可用的遥控器及其各自的红外线代码
pi@lumi:~ $ irsend list "" ""
LED_24_KEY
LED_44_KEY
pi@lumi:~ $ irsend list LED_24_KEY ""
0000000000000001 BRIGHT_DOWN
0000000000000002 BRIGHT_UP
0000000000000003 OFF
0000000000000004 ON
0000000000000005 RED
0000000000000006 GREEN
0000000000000007 BLUE
0000000000000008 WHITE
0000000000000009 ORANGE
000000000000000a PEA_GREEN
000000000000000b DARK_BLUE
000000000000000c 7_JUMP
000000000000000d DARK_YELLOW
000000000000000e CYAN
000000000000000f BROWN
0000000000000010 ALL_FADE
0000000000000011 YELLOW
0000000000000012 LIGHT_BLUE
0000000000000013 PINK
0000000000000014 7_FADE
0000000000000015 STRAW_YELLOW
0000000000000016 SKY_BLUE
0000000000000017 PURPLE
0000000000000018 3_JUMP
向 RGB 灯发送红外线命令
# turn on
pi@lumi:~ $ irsend SEND_ONCE LED_44_KEY POWER
#change color
pi@lumi:~ $ irsend SEND_ONCE LED_44_KEY WHITE
pi@lumi:~ $ irsend SEND_ONCE LED_44_KEY CYAN
pi@lumi:~ $ irsend SEND_ONCE LED_44_KEY WHITE
# lights up and down
pi@lumi:~ $ irsend --count=10 SEND_ONCE LED_44_KEY BRIGHT_UP
pi@lumi:~ $ irsend --count=10 SEND_ONCE LED_44_KEY BRIGHT_UP
pi@lumi:~ $ irsend --count=20 SEND_ONCE LED_44_KEY BRIGHT_DOWN
pi@lumi:~ $ irsend --count=10 SEND_ONCE LED_44_KEY BRIGHT_UP
# turn off
pi@lumi:~ $ irsend SEND_ONCE LED_44_KEY POWER
Lirc-Console
Lirc-Console 扩展了 IoT.Starter.Pi.Thing
项目,以使用 Linux 红外线遥控器。
请注意,直到现在,home-ui
和 home-web
项目在构建时都不知道 Lirc。lirconsole
的目标是从 docker 容器启动 Lirc 命令,并与 RPI 主机上安装的 Lirc 进行通信。正如我们将看到的,irsend
命令在此将发挥重要作用,识别遥控器、其相应的代码,以及发送红外线 LED 流来控制家庭设备。
Console 程序是一个简单的循环,如下所示,它会回显命令。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
string example = "";
while (!example.ToLower().Equals("x"))
{
example = Console.ReadLine();
Console.WriteLine(example);
Console.WriteLine(example.Bash());
}
//Console.Read();
}
}
Loune.net 推荐的 ShellHelper
类完成了繁重的工作,启动 bash 进程,捕获答案,并返回 string
结果。
public static class ShellHelper
{
public static string Bash(this string cmd)
{
var escapedArgs = cmd.Replace("\"", "\\\"");
var process = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = $"-c \"{escapedArgs}\"",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return result;
}
}
做得好。实际上,我们现在已经完成了这个任务的真正工作。
Docker 容器中的 Lirc
基于原始 Lirc 基本设置流程,下面编辑的图显示了 Lirc 安装在 RPI 主机上。它包括所有低级设备、驱动程序、lircd
套接字和 lircd.conf 配置文件,它们都安装在 RPI 主机上,接近硬件级别。
------------
| remote |
------------
(air gap)
------------
! capture !
! device !
------------
|
v
|
------------
! kernel ! Sometimes needs
! driver ! modprobe(1) configuration.
------------
|
v IR pulse data Device like /dev/lirc0, /dev/ttyACM0.
| or /dev/ttyS0.
------------
| lirc | Configure lirc_options.conf
| driver | with driver and usually also device.
------------
|
v IR pulse data Use mode2(1) to debug
|
----------------
| lirc pass 1 | lircd.conf config file.
----------------
|
v Key symbols Output socket e. g.,
| /var/run/lirc/lircd. Use irw(1) to debug.
HOST
===============================================================================
CONTAINER
|
----------------
| lirconsole | lirconsole app.
----------------
在底部,lirconsole
程序正在 docker 容器内运行。通过 lircd
套接字进行通信,docker volume
实现了主机和容器之间的数据共享。以下是完成所有工作的 Lirc-compose.yml 和 Lirc.dockerfile。
Lirc-compose.yml
卷在套接字区域精确创建:/var/run/lirc。这确保了运行 irsend
命令的容器与安装在 RPI 主机上的 Lirc 输出套接字之间的正确通信。
version: '3'
services:
lirc:
container_name: lirconsole
image: josemottalopes/lirconsole
build:
context: .
dockerfile: Lirc/lirc.Dockerfile
network_mode: bridge
privileged: true
volumes:
- /var/run/lirc:/var/run/lirc
environment:
- ASPNETCORE_ENVIRONMENT=Development
Lirc.dockerfile
与往常一样,dotnet:2.0.0-runtime-stretch-arm32v7
镜像用作 base
,并且在安装 Lirc 之前对操作系统进行更新和升级。安装 Lirc 包后,RPI 配置将被复制到容器内的 Lirc。这确保了安装在 RPI 主机上的遥控器能够被 docker 容器软件识别。/boot/config.txt 已更新,遥控器配置文件已移至 /etc/lirc/lircd.conf.d,以保持与 RPI 主机上相同的设置。
FROM microsoft/dotnet:2.0.0-runtime-stretch-arm32v7 AS base
WORKDIR /app
ENV DOTNET_CLI_TELEMETRY_OPTOUT 1
RUN \
apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y \
lirc \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
RUN \
mkdir -p /var/run/lirc \
&& rm -f /etc/lirc/lircd.conf.d/devinput.*
COPY Lirc/setup/config.txt /boot/config.txt
COPY Lirc/setup/lirc_options.conf /etc/lirc/lirc_options.conf
COPY Lirc/setup/ir-remote.conf /etc/modprobe.d/ir-remote.conf
COPY Lirc/remotes /etc/lirc/lircd.conf.d
FROM microsoft/dotnet:2.0-sdk AS build
WORKDIR /src
ENV DOTNET_CLI_TELEMETRY_OPTOUT 1
COPY *.sln .
COPY Contest/Contest.csproj Contest/
RUN dotnet restore
COPY . .
WORKDIR /src/Contest
RUN dotnet build -c Release -r linux-arm -o /app
FROM build AS publish
RUN dotnet publish -c Release -r linux-arm -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Contest.dll"]
最后,Contest
控制台程序被构建并复制到 base
镜像。入口点被精确地设置在控制台程序上。现在是时候构建镜像并将其推送到 DockerHub 了。
构建并推送到 Dockerhub
您可以注意到解决方案中保留了几个 dockerfile 和 docker-compose 文件。要正确构建 lirconsole
,应使用 lirc-compose.yml 和 lirc.Dockerfile 文件,如下面的会话所示
$ docker-compose -f lirc-compose.yml build
Building lirc
Step 1/24 : FROM microsoft/dotnet:2.0.0-runtime-stretch-arm32v7 AS base
---> 6354e860c381
Step 2/24 : WORKDIR /app
---> Using cache
---> 05412cd53d5a
Step 3/24 : ENV DOTNET_CLI_TELEMETRY_OPTOUT 1
---> Using cache
---> 12cf4637e50e
Step 4/24 : RUN apt-get update && apt-get upgrade -y
&& apt-get install -y --no-install-recommends lirc && rm -rf /var/lib/apt/lists/*
---> Using cache
---> 0b28f4942ec9
Step 5/24 : RUN mkdir -p /var/run/lirc && rm -f /etc/lirc/lircd.conf.d/devinput.*
---> Using cache
---> 8599c290104e
Step 6/24 : COPY Lirc/setup/config.txt /boot/config.txt
---> Using cache
---> 1b90462496c0
Step 7/24 : COPY Lirc/setup/lirc_options.conf /etc/lirc/lirc_options.conf
---> Using cache
---> 4270b263f046
Step 8/24 : COPY Lirc/setup/ir-remote.conf /etc/modprobe.d/ir-remote.conf
---> Using cache
---> 19ac2e2872ff
Step 9/24 : COPY Lirc/remotes /etc/lirc/lircd.conf.d
---> Using cache
---> 4a710c8d0f7d
Step 10/24 : FROM microsoft/dotnet:2.0-sdk AS build
---> 730e3899d926
Step 11/24 : WORKDIR /src
---> e8abbbf5f6e9
Removing intermediate container 8a58bc431b60
Step 12/24 : ENV DOTNET_CLI_TELEMETRY_OPTOUT 1
---> Running in 6def39dc1fa7
---> 9aebdfd73284
Removing intermediate container 6def39dc1fa7
Step 13/24 : COPY *.sln .
---> 5e860a31d313
Step 14/24 : COPY Contest/Contest.csproj Contest/
---> 8a3caeb83910
Step 15/24 : RUN dotnet restore
---> Running in d0f9d060571c
/usr/share/dotnet/sdk/2.1.4/NuGet.targets(227,5): warning MSB3202:
The project file "/src/docker-compose.dcproj" was not found. [/src/Console.sln]
/src/docker-compose.dcproj : warning NU1503: Skipping restore for project
'/src/docker-compose.dcproj'. The project file may be invalid or
missing targets required for restore. [/src/Console.sln]
Restoring packages for /src/Contest/Contest.csproj...
Generating MSBuild file /src/Contest/obj/Contest.csproj.nuget.g.props.
Generating MSBuild file /src/Contest/obj/Contest.csproj.nuget.g.targets.
Restore completed in 198.79 ms for /src/Contest/Contest.csproj.
---> 209d1043c558
Removing intermediate container d0f9d060571c
Step 16/24 : COPY . .
---> 192e92eeb6c8
Step 17/24 : WORKDIR /src/Contest
---> 519396d48efb
Removing intermediate container 331d28acecc3
Step 18/24 : RUN dotnet build -c Release -r linux-arm -o /app
---> Running in f5f581f9dda0
Microsoft (R) Build Engine version 15.5.180.51428 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
Restoring packages for /src/Contest/Contest.csproj...
Installing runtime.linux-arm.Microsoft.NETCore.DotNetAppHost 2.0.0.
Installing runtime.linux-arm.Microsoft.NETCore.DotNetHostResolver 2.0.0.
Installing runtime.linux-arm.Microsoft.NETCore.DotNetHostPolicy 2.0.0.
Installing runtime.linux-arm.Microsoft.NETCore.App 2.0.0.
Restore completed in 6.63 sec for /src/Contest/Contest.csproj.
Contest -> /app/Contest.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:09.49
---> 5118d530dace
Removing intermediate container f5f581f9dda0
Step 19/24 : FROM build AS publish
---> 5118d530dace
Step 20/24 : RUN dotnet publish -c Release -r linux-arm -o /app
---> Running in 6d95b1cdfa40
Microsoft (R) Build Engine version 15.5.180.51428 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
Restore completed in 24.35 ms for /src/Contest/Contest.csproj.
Contest -> /src/Contest/bin/Release/netcoreapp2.0/linux-arm/Contest.dll
Contest -> /app/
---> 55409c2731a0
Removing intermediate container 6d95b1cdfa40
Step 21/24 : FROM base AS final
---> 4a710c8d0f7d
Step 22/24 : WORKDIR /app
---> Using cache
---> a2ea12d478d4
Step 23/24 : COPY --from=publish /app .
---> Using cache
---> 45d03827ff17
Step 24/24 : ENTRYPOINT dotnet Contest.dll
---> Using cache
---> 4b8ec200357a
Successfully built 4b8ec200357a
Successfully tagged josemottalopes/lirconsole:latest
jo@CANOAS24 MINGW64 /c/_git/Lirc-Console/Console (master)
$ docker push josemottalopes/lirconsole
The push refers to a repository [docker.io/josemottalopes/lirconsole]
bdfbceb06300: Mounted from josemottalopes/home-lirc
a5263a5a63ea: Mounted from josemottalopes/home-lirc
0308d77027ae: Mounted from josemottalopes/home-lirc
736189974ffd: Mounted from josemottalopes/home-lirc
6c15a4e79b6c: Mounted from josemottalopes/home-lirc
38cd25f9bbe4: Mounted from josemottalopes/home-lirc
f4dd319f6d5c: Mounted from josemottalopes/home-lirc
aa89badf53d9: Mounted from josemottalopes/conlirc
202255094ceb: Mounted from josemottalopes/conlirc
649673d2d837: Mounted from josemottalopes/conlirc
643a426f2599: Mounted from josemottalopes/conlirc
ccd48fa5ba35: Mounted from josemottalopes/conlirc
latest: digest: sha256:45413fab32528e3649035fb2e1af90c0f8e80272d7b93ae00f8949cff141b454 size: 2829
最后,镜像 josemottalopes/lirconsole 被推送到 Dockerhub。
在 RPI 上拉取和运行
以下是用于在 RPI 上加载和运行 lirconsole
的 docker 命令。请注意,Lirc 应根据 RPI 设置说明 正确安装和配置。
docker run -it --name home-lirc --privileged
-v /var/run/lirc:/var/run/lirc josemottalopes/lirconsole:latest
下面的测试会话以 Hello World!
消息开始。然后,irsend list "" ""
列出了可用的遥控器。您可以检查列表中是否存在三星红外遥控器。最后,再次使用 irsend
命令,控制三星显示器的“音量减小”键。
root@lumi:~# docker run -it --privileged --name lirconsole
-v /var/run/lirc:/var/run/lirc josemottalopes/lirconsole:latest
Unable to find image 'josemottalopes/lirconsole:latest' locally
latest: Pulling from josemottalopes/lirconsole
Digest: sha256:45413fab32528e3649035fb2e1af90c0f8e80272d7b93ae00f8949cff141b454
Status: Downloaded newer image for josemottalopes/lirconsole:latest
Hello World!
irsend list "" ""
irsend list "" ""
Samsung_BN59-00678A
LED_24_KEY
LED_44_KEY
irsend send_once Samsung_BN59-00678A KEY_VOLUMEDOWN
irsend send_once Samsung_BN59-00678A KEY_VOLUMEDOWN
irsend send_once Samsung_BN59-00678A KEY_VOLUMEDOWN
irsend send_once Samsung_BN59-00678A KEY_VOLUMEDOWN
x
x
/bin/bash: x: command not found
root@lumi:~#
任务完成
如下面的照片所示,显示器已确认并接受了用于减小音量的红外输出命令。
玩得开心!
历史
- 2018年1月22日:初始版本,仓库位于 https://github.com/josemotta/IoT.Starter.Pi.Lirc
- 2018年2月14日:版本 1.1,仓库位于 https://github.com/josemotta/IoT.Starter.Pi.Thing