65.9K
CodeProject 正在变化。 阅读更多。
Home

IoT Starter Raspberry Pi Lirc

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2018 年 1 月 22 日

CPOL

4分钟阅读

viewsIcon

21963

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-uihome-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.ymlLirc.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

您可以注意到解决方案中保留了几个 dockerfiledocker-compose 文件。要正确构建 lirconsole,应使用 lirc-compose.ymllirc.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:~#

任务完成

如下面的照片所示,显示器已确认并接受了用于减小音量的红外输出命令。

玩得开心!

历史

© . All rights reserved.