OYB软件, 树莓

使用电视遥控器控制Raspberry Pi

 

这个小脚本可让您使用常规电视遥控器中的按钮控制Raspberry Pi。

用法

您可以按遥控器上的以下按钮。

  • 好吧– launch kodi
  • 向上– launch browser
  • 下来–更改墙纸(这是我的自定义脚本)
  • 左–暂停台式机
  • 背– halt Raspberry Pi
  • 停止– enter “mouse mode”,使用箭头移动鼠标。单击确定以双击
  • 玩– exit “mouse mode”

这些绑定仅作为示例设置。每个人都应根据自己的需要进行更改。

安装方式

首先,按照 指示 编译并安装libcec。下面有更多详细信息。

然后,从 我的要旨,并创建一个可执行脚本

wget //gist.githubusercontent.com/nachoparker/96fa8036d93603b3eee01ee69d3c1606/raw/74ae036ae3e50e7153231e0694c2ca7dd8f43c8a/picec.sh
chmod +x picec.sh

你可以跑 picec.sh不论什么“startup programs”桌面提供的配置。就我而言,我只需在 /etc/rc.local

/home/pi/picec.sh

(可选)您可以安装 xdotoolÂ移动鼠标,以及 osd_catÂ以电视OSD方式显示信息。下面有更多详细信息。

sudo 易于-get install xosd-bin xdotool
细节

作为控制RPi的一种方式,我们将使用HDMI的CEC(消费电子控制)功能,这是一种标准协议,可以通过HDMI来回发送命令。

CEC允许消费者设备在有或没有用户干预的情况下互相控制。就像大多数现代电视一样,Raspberry Pi的GPU已经支持CEC协议。有兼容性列表 这里.

一个经常遗漏的要求是您的HDMI电缆也必须支持CEC。大多数电缆都可以,但是一些最便宜的电缆不能使用CEC,因此请务必小心。

为了使用CEC标准与我们的电视通话,我们使用 libcec库 通过脉冲八。这个库已经包含在Kodi中,是开箱即用的,这就是我们可以使用遥控器轻松控制媒体中心的原因。

从他们 网站,我们可以按照说明在Raspberry Pi上编译和安装libcec。

sudo 易于-get update
sudo 易于-get install cmake libudev-dev libxrandr-dev python-dev swig
cd
git clone //github.com/Pulse-Eight/platform.git
mkdir platform/build
cd platform/build
cmake ..
make
sudo make install
cd
git clone //github.com/Pulse-Eight/libcec.git
mkdir libcec/build
cd libcec/build
cmake -DRPI_INCLUDE_DIR=/opt/vc/include -DRPI_LIB_DIR=/opt/vc/lib ..
make -j4
sudo make install
sudo ldconfig

之后,我们获得了该库,一些python绑定以及一个名为C的包装器实用程序 客户端一个 。

现在我们可以列出已连接的设备,

tv# 客户端 -l
libCEC version: 3.1.0, 吉特 revision: libcec-3.1.0+5-6d68d21, compiled on Fri  8 Apr 15:44:58 UTC 2016 通过  nacho@tv on Linux 4.1.19-v7+ (armv7l), features: P8_USB, DRM, P8_detect, randr, RPi
Found devices: 1

device:              1
com port:            RPI
vendor id:           2708
product id:          1001
firmware version:    1
type:                Raspberry Pi

,通过SSH打开和关闭电视,

echo "on 0"      | 客户端 -s # turn on the television
echo "待机0" | 客户端 -s # turn it off

,甚至配置电视。要查看所有可用命令:

tv# echo h | 客户端 -s -d 1
打开与CEC适配器的连接...

================================================================================
Available commands:

[tx] {bytes}              transfer 通过 tes over the CEC line.
[txn] {bytes}             transfer 通过 tes but don't wait for transmission ACK.
[on] {address}            power on the device with the given logical address.
[standby] {address}       put the device with the given address in standby mode.
[la] {logical address}    change the logical address of the CEC adapter.
[p] {device} {port}       change the HDMI port number of the CEC adapter.
[pa] {physical address}   change the physical address of the CEC adapter.
[as]                      make the CEC adapter the active source.
[is]                      mark the CEC adapter as inactive source.
[osd] {addr} {string}     set OSD message on the specified device.
[ver] {addr}              get the CEC version of the specified device.
[ven] {addr}              get the vendor ID of the specified device.
[lang] {addr}             get the menu language of the specified device.
[pow] {addr}              get the power status of the specified device.
[name] {addr}             get the OSD name of the specified device.
[poll] {addr}             poll the specified device.
[lad]                     lists active devices on the bus
[ad] {addr}               checks whether the specified device is active.
[at] {type}               checks whether the specified device type is active.
[sp] {addr}               makes the specified physical address active.
[spl] {addr}              makes the specified logical address active.
[volup]                   send a volume up command to the amp if 当下
[voldown]                 send a volume down command to the amp if 当下
[mute]                    send a mute/unmute command to the amp if 当下
[self]                    show the list of addresses controlled 通过  libCEC
[scan]                    scan the CEC bus and display device info
[mon] {1|0}               enable or disable CEC bus monitoring.
[log] {1 - 31}            change the log level. see cectypes.h for values.
[ping]                    send a ping command to the CEC adapter.
[bl]                      to let the adapter enter the bootloader, to upgrade
                          the flash rom.
[r]                       reconnect to the CEC adapter.
[h] or [help]             show this help.
[q] or [quit]             to quit the CEC test client and switch off all
                          connected CEC devices.
================================================================================

作为一种快速而肮脏的方式,我编写了这个小脚本,仅用于解析 客户端 效用。我认为实现起来比使用C库并最终调用要快 系统()popen() 无论如何。

有很多改进的空间,但是我希望这可以为您提供入门的思路。

#!/bin/bash

# Simple script to control your Raspberry Pi with your TV remote using libcec
#
# Copyleft 2017 通过  Ignacio Nunez Hernanz <nacho _a_t_ ownyourbits _d_o_t_ com>
# GPL licensed (see end of file) * Use at your own risk!
#
# You can set this to be run in your desktop "启动程序", or 
# at the last line of /etc/rc.local, just to say a couple options
#
# keys:
#   OK   - launch kodi 
#   up   - launch browser
#   down -更改墙纸(这是我的自定义脚本)
#   left - suspend my desktop computer
#   back - exit desktop session
#
# You can hit 'stop' to enter "滑鼠模式", or 'play' to exit it.
# In "滑鼠模式" you can move around the mouse with the remote arrows, hit ok
# to double-click.
#
# This is just an example to provide ideas, so you should change what each button does
#

USER=pi                        # user that will be logged in
OSDCOLOR=red                   # color for xosd messages
MOUSESPEED=50                  # how many pixels a mouse will move on each press
#dbg=echo                      # uncomment to print the command without running it
VERBOSE=0                      # print echov lines
#DRY_RUN="yes"                 # uncomment to actually ignore button presses

type 客户端 &>/dev/null || { echo "客户端 is requiered"; exit; }
type xdotool    &>/dev/null || NOXDOTOOL=#

USR_CMD="su - $USER -c"
_XAUTH="/home/$USER/.Xauthority"

         d(){ eval "$NOXDOTOOL $@"                                            ; }
     echov(){ [[ "$VERBOSE" == "1" ]] && echo $@                              ; }
filter_key(){ grep -q "key pressed: $1 .* duration" <( echo "$2" )            ; }
mouse_move(){ XAUTHORITY="$_XAUTH" DISPLAY=:0 xdotool mousemove_relative -- $@; }
mouseclick(){ XAUTHORITY="$_XAUTH" DISPLAY=:0 xdotool click --repeat 2 1      ; }
   osdecho(){ type osd_cat &>/dev/null && echo "$@" | \
              XAUTHORITY="$_XAUTH" DISPLAY=:0 osd_cat -ptop -Acenter -c$OSDCOLOR; }

while :; do 
  客户端 | while read l; do
    echov $l

    [[ "$DRY_RUN" != "" ]] && continue

     pgrep kodi && { echov "Ignoring key, because Kodi is running"; continue; }

    if  filter_key "select" "$l"; then
      [[ "$MOUSEMODE" == "1" ]] && mouseclick || {
        $dbg $USR_CMD kodi
        killall 客户端
      }
      打破
    fi
    if  filter_key "up" "$l"; then
      [[ "$MOUSEMODE" == "1" ]] && mouse_move 0 -$MOUSESPEED || \
      $dbg $USR_CMD "DISPLAY=\":0\" x-www-browser" &
    fi  
    if  filter_key "left" "$l"; then
      [[ "$MOUSEMODE" == "1" ]] && mouse_move -$MOUSESPEED 0 || \
        $dbg nohup su - nacho -c "ssh nacho@desktop sudo pm-suspend" &
    fi  
    if  filter_key "down" "$l"; then
      [[ "$MOUSEMODE" == "1" ]] && mouse_move 0 $MOUSESPEED || \
        $dbg $USR_CMD "DISPLAY=\":0\" /home/pi/.config/lxsession/LXDE-pi/random_wp.sh"
    fi  
    if  filter_key "right" "$l"; then
      [[ "$MOUSEMODE" == "1" ]] && mouse_move $MOUSESPEED 0 
    fi
    if  filter_key "exit" "$l"; then
      $dbg $USR_CMD "pkill -SIGTERM -f lxsession"
    fi  
    if  filter_key "stop" "$l"; then
d     echov   "滑鼠模式 on"
d     osdecho "滑鼠模式 on"
d     MOUSEMODE=1
    fi
    if  filter_key "play" "$l"; then
      echov   "滑鼠模式 off"
      osdecho "滑鼠模式 off"
      MOUSEMODE=0
    fi
  done
done

# License
#
# This script is free 软件; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published 通过 
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This script is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this script; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
# Boston, MA  02111-1307  USA

该脚本利用 osd_cat 视觉反馈,以及 xdotoolÂ鼠标控制功能。建议使用 易于, 但它’不需要,因为脚本会检测它们是否可用。

如您所见 这个清单,每个制造商在不同程度上都支持该协议,因此您必须花点时间查看可以检测到的按钮,并获得按钮按下的持续时间。例如,在我的Philips遥控器上,我无权访问这些号码。

移动鼠标并不是真的很有用,因为延迟非常糟糕。但是,您可能还想使用xdtool将其他有趣的东西与您的遥控器关联,例如,您可以阅读PDF或网站绑定

xdotool key Page_Down
xdotool key Page_Up
xdotool key 首页
xdotool key End

,甚至绑定到 <CTRL><TAB>Â浏览浏览器选项卡。

作者: 纳乔帕克

谦虚地分享我认为有用的东西 [ 的github 码头工人hub ]

8 评论s

  1. 我看到您拥有一个与我相似的遥控器。可能是因为您正在使用Phillips电视。我有一个,CEC没有’似乎行得通。 EasyLink已启用,但不响应`echo“on 0000”| 客户端 -d 1 -s“standby 0”Pi启动时发送的RPI`。那应该给电视通电

  2. 嗨,这不’在我的松下上工作。一世’ve启用了详细模式,这是输出,您有什么想法吗?谢谢!!

    未提供设备类型。使用‘recording device’
    CEC解析器已创建–libCEC版本4.0.2
    没有给出串口。尝试自动检测:
    路径:Raspberry Pi
    通讯端口:RPI

    打开与CEC适配器的连接…
    DEBUG: [ 53] 广播 (F): osd name set to ‘Broadcast’
    调试:[56]打开– vc_cec initialised
    DEBUG: [ 56] logical address changed to 免费使用 (e)
    注意:[56]连接已打开
    调试:[58]个处理器线程已启动
    调试:[58]< TV (0): POLL
    调试:[58]启动器‘Broadcast’不被CEC适配器支持。使用‘Free use’ instead
    交通:[58]<> POLL sent
    调试:[89]电视(0):设备状态更改为‘present’
    调试:[89]<<要求的供应商ID'TV' (0)
    交通:[89]<> 0f:87:00:80:45
    调试:[298]TV (0): vendor = Panasonic (008045)
    调试:[298]>> TV (0) -> 广播 (F): device vendor id (87)
    调试:收到[298]预期响应(87:设备供应商ID)
    调试:[298]replacing the command handler for device ‘TV’ (0)
    注意:[298]注册新的CEC客户端– v4.0.2
    调试:[298]检测类型的逻辑地址‘playback device’
    调试:[298]trying logical address ‘Playback 1’
    调试:[298]< 播放1 (4): POLL
    交通:[298]<< 44
    交通:[568]<> POLL not sent
    调试:[839]using logical address ‘Playback 1’
    调试:[839]播放1(4):设备状态更改为‘handled 通过 libCEC’
    调试:[839]播放1 (4): power status changed from ‘unknown’ to ‘on’
    调试:[839]播放1 (4): vendor = Pulse Eight (001582)
    调试:[839]播放1 (4): CEC version 1.4
    调试:[839] AllocateLogicalAddresses– device ‘0’, type ‘playback device’, LA ‘4’
    调试:[839]logical address changed to 播放1 (4)
    调试:[839]播放1 (4): osd name set to ‘CECTester’
    调试:[839]播放1 (4): menu language set to ‘eng’
    调试:[839] GetPhysicalAddress–物理地址= 1000
    调试:[839] AutodetectPhysicalAddress–自动检测到的物理地址‘1000’
    调试:[839]播放1(4):物理地址从ffff更改为1000
    调试:[839]<广播(F):物理地址1000
    交通:[839]<< 4f:84:10:00:04
    注意:[990]已注册CEC客户端:libCEC版本= 4.0.2,客户端版本= 4.0.2,固件版本= 1,逻辑地址=播放1(4),物理地址:1.0.0.0,git版本: libcec-4.0.2 + 8-8563411〜dirty,在UTC 2017年4月2日17:04:01 UTC上通过root @ hostname编译:名称或服务在Linux 4.4.0-57-generic(armv7l)上未知,功能:P8_USB ,DRM,P8_detect,randr,RPi
    调试:[990]播放1 (4): vendor = Panasonic (008045)
    调试:[990]替换设备的命令处理程序'Playback 1' (4)
    调试:[990]< TV (0): OSD name ‘CECTester’
    交通:[990]<<40:47:43:45:43:54:65:73:74:65:72
    调试:[1290]<<请求电源状态'TV' (0)
    交通:[1290]<> 04:00:47:00
    调试:[1471]标记操作码‘set osd name’作为设备不支持的功能‘TV’
    调试:[1471]>> TV (0) -> 播放1 (4): feature abort ( 0)
    交通:[1540]>> 04:90:00
    调试:[1540]TV (0): power status changed from ‘unknown’ to ‘on’
    调试:[1540]>> TV (0) -> 播放1 (4): report power status (90)
    等待输入
    调试:[1540]expected response received (90: report power status)
    交通:[2026]>> 04:8c
    调试:[2026]<电视(0):供应商ID Panasonic(8045)
    交通:[2026]<> TV (0) -> 播放1 (4): give device vendor id (8C)
    交通:[2305]>> 04:89:10:01:05
    交通:[2305]<> TV (0) -> 播放1 (4): vendor command (89)
    交通:[2852]>>04:a0:00:80:45:06:05
    调试:[2853]>> TV (0) -> 播放1 (4): vendor command with id (A0)
    交通:[4031]>>04:a0:00:80:45:06:05
    调试:[4031]>> TV (0) -> 播放1 (4): vendor command with id (A0)
    交通:[5206]>>04:a0:00:80:45:06:05
    调试:[5206]>> TV (0) -> 播放1 (4): vendor command with id (A0)

  3. Hi –有帮助! Pi Zero mini HDMI也可以使用吗?你懂?和我’我只是试图构建一个可在信号源,电视和PC计算机之间切换的RPi触摸屏。

    感谢您的任何想法。

  4. 你知道那里吗’在Chromium中用Javascript触发此方法的任何方法?特别考虑标牌显示,能够使用标牌应用程序(DAKboard)安排电视开/关

  5. 该程序有效。但是,当您单击确定按钮时,它不会’不再工作了。我意识到文字“break”从代码中找出问题所在,如果您遇到同样的问题,只需删除该文本即可。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *