8

How can I control my TV using only a Raspberry Pi and the Infrared diode from an old remote control. Plus how can I interpret IR commands from an existing remote control.

1
  • Nice tutorial! Lirc is certainly far from being "plug and play". Aug 9, 2017 at 9:57

3 Answers 3

11

I can switch my TV on using the following command:

irsend SEND_ONCE LG_AKB72915207 KEY_POWER

This is how I set it up.

Hardware Setup

I am using a Raspberry Pi P1 2011.12.

The bare Infrared LED connected to GPIO#18 and GND. hardware

Installing lirc

sudo apt-get install lirc -y

Update /etc/modules

sudo nano /etc/modules

And add the following lines which results in

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
lirc_dev
lirc_rpi gpio_in_pin=4 gpio_out_pin=18

Please note that I'm not (yet) using the gpio_in_pin in my setup.

Update /etc/lirc/hardware.conf

This is my hardware.conf

# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"

#Don't start lircmd even if there seems to be a good config file
#START_LIRCMD=false

#Don't start irexec, even if a good config file seems to exist.
#START_IREXEC=false

#Try to load appropriate kernel modules
LOAD_MODULES=true

# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev 
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""

Update /boot/config.txt

sudo nano /boot/config.txt

Update the line regarding lirc-rpi module

# Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi,gpio_in_pin=4,gpio_out_pin=18
# dtparam=gpio_in_pull=up

Download the Remote Control Preset

At lirc.sourceforge.net/remotes you find a huge repository of remote controls along with the presets.

In my case the closest to my Remote Control LG AKB73275606 was the LG_AKB72915207. Which looks more or less like my remote control.

So I copied the contents of lirc.sourceforge.net/remotes/lg/AKB72915207 to /etc/lirc/lircd.conf:

sudo nano /etc/lirc/lircd.conf
#
# this config file was automatically generated
# using lirc-0.8.6(default) on Fri Sep 10 22:02:46 2010
#
# contributed by
#
# brand:                       TV LG 42"LD420
# model no. of remote control: AKB72915207
# devices being controlled by this remote:
#

begin remote

  name  LG_AKB72915207
  bits           16
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       9056  4448
  one           601  1647
  zero          601   538
  ptrail        601
  repeat       9081  2199
  pre_data_bits   16
  pre_data       0x20DF
  gap          108229
  toggle_bit_mask 0x0

      begin codes
          KEY_POWER                0x10EF                    #  Was: power
          energy                   0xA956
          avmode                   0x0CF3
          input                    0xD02F
          tvrad                    0x0FF0
          KEY_1                    0x8877                    #  Was: 1
          KEY_2                    0x48B7                    #  Was: 2
          KEY_3                    0xC837                    #  Was: 3
          KEY_4                    0x28D7                    #  Was: 4
          KEY_5                    0xA857                    #  Was: 5
          KEY_6                    0x6897                    #  Was: 6
          KEY_7                    0xE817                    #  Was: 7
          KEY_8                    0x18E7                    #  Was: 8
          KEY_9                    0x9867                    #  Was: 9
          KEY_0                    0x08F7                    #  Was: 0
          KEY_LIST                 0xCA35                    #  Was: list
          q.view                   0x58A7
          KEY_VOLUMEUP             0x40BF                    #  Was: vol_up
          KEY_VOLUMEDOWN           0xC03F                    #  Was: vol_down
          KEY_CHANNELUP            0x00FF                    #  Was: ch_up
          KEY_CHANNELDOWN          0x807F                    #  Was: ch_down
          KEY_FAVORITES            0x7887                    #  Was: fav
          ratio                    0x9E61
          KEY_MUTE                 0x906F                    #  Was: mute
          KEY_MENU                 0xC23D                    #  Was: menu
          KEY_INFO                 0xD52A                    #  Was: guide
          q.menu                   0xA25D
          KEY_UP                   0x02FD                    #  Was: up
          KEY_DOWN                 0x827D                    #  Was: down
          KEY_LEFT                 0xE01F                    #  Was: left
          KEY_RIGHT                0x609F                    #  Was: right
          KEY_OK                   0x22DD                    #  Was: ok
          KEY_BACK                 0x14EB                    #  Was: back
          KEY_INFO                 0x55AA                    #  Was: info
          KEY_EXIT                 0xDA25                    #  Was: exit
          KEY_RED                  0x4EB1                    #  Was: red
          KEY_GREEN                0x8E71                    #  Was: green
          ellow                    0xC639
          KEY_BLUE                 0x8679                    #  Was: blue
          exit2                    0x04FB
          t.opt                    0x847B
          KEY_SUBTITLE             0x9C63                    #  Was: subtitle
          KEY_STOP                 0x8D72                    #  Was: stop
          KEY_PLAY                 0x0DF2                    #  Was: play
          KEY_PAUSE                0x5DA2                    #  Was: pause
          KEY_REWIND               0xF10E                    #  Was: <<
          KEY_FORWARD              0x718E                    #  Was: >>
          simplink                 0x7E81
      end codes

end remote

Now restart the lirc service:

sudo /etc/init.d/lirc restart

Sending commands

Now I'm able to switch my TV on and off like so:

irsend SEND_ONCE <DEVICE> <KEY>

namely:

irsend SEND_ONCE LG_AKB72915207 KEY_POWER

And voilà my TV switches on and off.




Update: Adding a receiver

Update /etc/modules

snd-bcm2835
lirc_dev
lirc_rpi gpio_in_pin=18 gpio_out_pin=17

Update /etc/lirc/hardware.conf

# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"

#Don't start lircmd even if there seems to be a good config file
#START_LIRCMD=false

#Don't start irexec, even if a good config file seems to exist.
#START_IREXEC=false

#Try to load appropriate kernel modules
LOAD_MODULES=true

# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev 
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""

Append the following to /boot/config.txt:

# LIRC
dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17
dtparam=gpio_in_pull=up

To test the remote run the following, which will show you the pulses

sudo /etc/init.d/lirc stop
mode2 -d /dev/lirc0

To record a new remote use the following commands. Make sure to share your remote with the lirc community by sending the config to [email protected].

irrecord --list-namespace # Shows the allowed identifiers for the commands
irrecord -f -d /dev/lirc0 ~/lirc.conf

Now to test the config you start the lirc service and run irw

#  sudo /etc/init.d/lirc start
[ ok ] Loading LIRC modules:.
[ ok ] Starting remote control daemon(s) : LIRC :.
root@phone2:~# irw
0000000008087887 00 KEY_POWER LG_6710CMAM09D
0000000008087887 01 KEY_POWER LG_6710CMAM09D
0000000008087887 02 KEY_POWER LG_6710CMAM09D
000000000808c837 00 KEY_PAGEUP LG_6710CMAM09D
000000000808c837 01 KEY_PAGEUP LG_6710CMAM09D
00000000080848b7 00 KEY_PAGEDOWN LG_6710CMAM09D
000000000808c837 00 KEY_PAGEUP LG_6710CMAM09D



Troubleshooting

Manually start the socket daemon

sudo lircd --device /dev/lirc0

Tutorials that helped me out

Error messages I got during my setup

irsend: hardware does not support sending
irsend: command failed: SEND_ONCE LG_AKB72915207 KEY_POWER
irsend: unknown remote: "/etc/lirc/lircd.conf"
lirc_rpi: gpio chip not found!

Other posts about lirc

lsmod

lsmod
...
lirc_dev               10211  1 lirc_rpi
rc_core                23776  1 lirc_dev

Showing errors related to the lirc process:

dmesg | grep -i lirc
[    5.118133] lirc_dev: IR Remote Control driver registered, major 244
[    7.148664] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
[    8.269729] lirc_rpi: auto-detected active high receiver on GPIO pin 4
[    8.270174] lirc_rpi lirc_rpi: lirc_dev: driver lirc_rpi registered at minor = 0
[    8.270188] lirc_rpi: driver registered!
[   16.197900] input: lircd as /devices/virtual/input/input0

Listing a remote:

Listing all remotes:

irsend LIST "" ""
irsend: LG_AKB72915207

Listing the commands for a given Remote

irsend LIST LG_AKB72915207 ""
irsend: 00000000000010ef KEY_POWER
irsend: 000000000000a956 energy
irsend: 0000000000000cf3 avmode
irsend: 000000000000d02f input
irsend: 0000000000000ff0 tvrad
irsend: 0000000000008877 KEY_1
irsend: 00000000000048b7 KEY_2
irsend: 000000000000c837 KEY_3
irsend: 00000000000028d7 KEY_4
irsend: 000000000000a857 KEY_5
irsend: 0000000000006897 KEY_6
irsend: 000000000000e817 KEY_7
irsend: 00000000000018e7 KEY_8
irsend: 0000000000009867 KEY_9
irsend: 00000000000008f7 KEY_0
irsend: 000000000000ca35 KEY_LIST
irsend: 00000000000058a7 q.view
irsend: 00000000000040bf KEY_VOLUMEUP
irsend: 000000000000c03f KEY_VOLUMEDOWN
irsend: 00000000000000ff KEY_CHANNELUP
irsend: 000000000000807f KEY_CHANNELDOWN
irsend: 0000000000007887 KEY_FAVORITES
irsend: 0000000000009e61 ratio
irsend: 000000000000906f KEY_MUTE
irsend: 000000000000c23d KEY_MENU
irsend: 000000000000d52a KEY_INFO
irsend: 000000000000a25d q.menu
irsend: 00000000000002fd KEY_UP
irsend: 000000000000827d KEY_DOWN
irsend: 000000000000e01f KEY_LEFT
irsend: 000000000000609f KEY_RIGHT
irsend: 00000000000022dd KEY_OK
irsend: 00000000000014eb KEY_BACK
irsend: 00000000000055aa KEY_INFO
irsend: 000000000000da25 KEY_EXIT
irsend: 0000000000004eb1 KEY_RED
irsend: 0000000000008e71 KEY_GREEN
irsend: 000000000000c639 ellow
irsend: 0000000000008679 KEY_BLUE
irsend: 00000000000004fb exit2
irsend: 000000000000847b t.opt
irsend: 0000000000009c63 KEY_SUBTITLE
irsend: 0000000000008d72 KEY_STOP
irsend: 0000000000000df2 KEY_PLAY
irsend: 0000000000005da2 KEY_PAUSE
irsend: 000000000000f10e KEY_REWIND
irsend: 000000000000718e KEY_FORWARD
irsend: 0000000000007e81 simplink

Displaying the lirc status:

The following command should not show any errors

sudo /etc/init.d/lirc status

This is what I see on my working setup:

$ sudo /etc/init.d/lirc status
● lirc.service - LSB: Starts LIRC daemon.
   Loaded: loaded (/etc/init.d/lirc)
   Active: active (running) since Wed 2017-08-09 08:21:34 UTC; 21min ago
  Process: 385 ExecStart=/etc/init.d/lirc start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/lirc.service
           ├─444 /usr/sbin/lircd --driver=default --device=/dev/lirc0 --uinput
           └─458 /usr/sbin/lircmd

Aug 09 08:36:22 JHD lircd-0.9.0-pre1[444]: accepted new client on /var/run/lirc/lircd
Aug 09 08:36:22 JHD lircd-0.9.0-pre1[444]: removed client
Aug 09 08:36:24 JHD lircd-0.9.0-pre1[444]: accepted new client on /var/run/lirc/lircd
Aug 09 08:36:25 JHD lircd-0.9.0-pre1[444]: removed client
Aug 09 08:36:26 JHD lircd-0.9.0-pre1[444]: accepted new client on /var/run/lirc/lircd
Aug 09 08:36:26 JHD lircd-0.9.0-pre1[444]: removed client
Aug 09 08:36:27 JHD lircd-0.9.0-pre1[444]: accepted new client on /var/run/lirc/lircd
Aug 09 08:36:27 JHD lircd-0.9.0-pre1[444]: removed client
Aug 09 08:36:29 JHD lircd-0.9.0-pre1[444]: accepted new client on /var/run/lirc/lircd
Aug 09 08:36:29 JHD lircd-0.9.0-pre1[444]: removed client

Badly formatted quotes taken from online tutorials

Badly formatted quotes in the config files caused some troubles that took me quite some time to resolve.

”/dev/lirc0″

instead of proper quotes

"/dev/lirc0"
3

@Besi thank you so much. It was really helpful for me.

For me I still have a problem when I reboot my rasp.

I think it's better to use to enable it on startup

systemctl enable lirc.service

than

sudo lircd --device /dev/lirc0

And now you needn't to edit the /etc/modules.

Here my install script :

#!/usr/bin/env bash

# Echo in Blue
function echoBlue () {
  echo -e "\x1B[0;34m\033[1m${1}\033[0m"
}

# Echo in Red
function echoRed () {
  echo -e "\x1B[0;31m\033[1m${1}\033[0m"
}

echoRed "For me PinIN=4 and PinOUT=26"

# Ask Pin Number
echoBlue "Pin In Number ?"
read pinIN
echoBlue "Pin OUT Number ?"
read pinOUT

# Install Lirc
echoBlue "Install Lirc"
sudo apt-get install lirc

# Load Module
# For raspberry instead use /boot/config.txt
#sudo cat >> /etc/modules <<EOF
#lirc_dev
#lirc_rpi gpio_out_pin=4 gpio_in_pin=26
#EOF

# Edit your /boot/config.txt by entering the command below
if ! grep -Fxq "dtoverlay=lirc-rpi,gpio_out_pin=$pinIN,gpio_in_pin=$pinOUT" /boot/config.txt; then
  echoBlue "Edit /boot/config.txt"
  cat >> /boot/config.txt <<EOF

dtoverlay=lirc-rpi,gpio_out_pin=$pinIN,gpio_in_pin=$pinOUT
EOF
else
  echoRed "Line already exist in /boot/config.txt"
fi

# Backup hardware.conf
echoBlue "Backup hardware.conf"
sudo cp /etc/lirc/hardware.conf /etc/lirc/hardware.bak.conf

# Add hardware
echoBlue "Create hardware.conf"
sudo cat > /etc/lirc/hardware.conf <<EOF
########################################################
# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"
# Don't start lircmd even if there seems to be a good config file
# START_LIRCMD=false
# Don't start irexec, even if a good config file seems to exist.
# START_IREXEC=false
# Try to load appropriate kernel modules
LOAD_MODULES=true
# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""
########################################################
EOF

# Now use systemcl instead of init.d
echoBlue "Stop lirc.service"
sudo systemctl stop lirc.service
echoBlue "Start lirc.service"
sudo systemctl start lirc.service
echoBlue "Status lirc.service"
sudo systemctl status lirc.service

# Launch it on startup
echoBlue "Launch it on startup"
echoBlue "o|O|y|Y ou n|N|*"
read repdrop
echo -e "\t"
case "$repdrop" in
  o|O|y|Y)
    sudo systemctl enable lirc.service
  ;;
  n|N|*)
    echoBlue "If you want to add it latter just run sudo systemctl enable lirc.service"
  ;;
esac

echoRed "You need to reboot pi"
echoRed "You have to check that /etc/lirc/lircd.conf exist or dl one on http://lirc.sourceforge.net/remotes"
0

Great tutorial, very detailed, but it didn't solve my problem. After hours trying I was still getting the "irsend: hardware does not support sending" message.

Finally I found this https://www.raspberrypi.org/forums/viewtopic.php?t=191425#p1213186

and it SOLVED my problem. To sum up...

sudo /usr/share/lirc/lirc-old2new

and restart lirc:

sudo /etc/init.d/lircd restart

Cheers, Daniel

Using RPi 3 lircd-0.9.4c

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.