Paul Baumgarten

Computer Scientist, teacher, freelance programmer and self confessed geek

LIRC with Python

The following is to use Python on the Raspberry Pi to receive/transmit infrared signals. ie: To have the Raspberry Pi act as an IR remote control unit.

Requirements

Components Required:

  • Raspberry PI 3
  • 220ohms resistors
  • LED
  • IR LED
  • BC547 (PnP) Transistors
  • TSOP4838 IR Recievers
  • Breadboard
  • Jumper cables

Wiring

  • Warning: Check the pin layout of your IR receiver as some of them are wired with the data and ground pins swapped

Raspberry Pi configuration

Ensure your Raspberry Pi is up to date

sudo apt-get update
sudo apt-get upgrade

Install LIRC

sudo apt-get install lirc

Edit /etc/modules file

sudo nano /etc/modules

Add to the bottom of file:

lirc_dev
lirc_rpi gpio_in_pin=18 gpio_out_pin=22

Edit /etc/lirc/hardware.conf:

sudo nano /etc/lirc/hardware.conf

Change it to:

LIRCD_ARGS="--uinput"
LOAD_MODULES=true
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
LIRCD_CONF=""
LIRCMD_CONF=""

Edit the /boot/config.txt file:

sudo nano /boot/config.txt

Add this line:

dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=22

Create /etc/modprobe.d/ir-remote.conf file:

sudo nano /etc/modprobe.d/ir-remote.conf

Add this line:

options lirc_rpi gpio_in_pin=18 gpio_out_pin=22

Go ahead and reboot the Pi:

sudo reboot

Test IR receiver

Time to test IR Reciever:

sudo modprobe lirc_rpi

then

sudo kill $(pidof lircd)

then

mode2 -d /dev/lirc0

At this point you should be able to press buttons on your remote and see output similar to this:

(hit “ctrl + c” to exit)

sudo kill $(pidof lircd)

save output to text file for future reference:

irrecord -d /dev/lirc0 /home/pi/lircd.conf

Recording IR signals

run

sudo kill $(pidof lircd)

then

irrecord --disable-namespace -d /dev/lirc0 /home/pi/lircd.conf

Important

  • Carefully read and follow the prompts given by the program. The instructions are quite exact.
  • Write down (case-sensitive) the name of your device and the names used for each key when prompted. These will be the codes you need to use in your program later.

verify /home/pi/lircd.conf created successfully:

cat /home/pi/lircd.conf

(if so continue, if not start over at MAPPING REMOTE CODES section)

copy/overwrite /home/pi/lircd.conf to /etc/lirc/

sudo cp /home/pi/lircd.conf /etc/lirc/lircd.conf

Restart LIRC:

sudo /etc/init.d/lircd restart

Sending IR signals

Before issuing commands run this:

sudo lircd --device /dev/lirc0

Test sample command:

  • Note: 'projector' and 'Power' are the device name and key code as recorded in /etc/lirc/lircd.conf
irsend SEND_ONCE projector Power

Python coding

#!/usr/bin/env python
import os
import time

#turn projector on, change input source etc
os.system('irsend SEND_ONCE projector Power')
time.sleep(12)
os.system('irsend SEND_ONCE projector Source')
time.sleep(4)
os.system('irsend SEND_ONCE projector Freeze')
time.sleep(4)
os.system('irsend SEND_ONCE projector Mute')

Sourced from

Sample lircd.conf

This was for an Epson projector

begin remote

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

  header       9013  4452
  one           607  1646
  zero          607   521
  ptrail        608
  pre_data_bits   16
  pre_data       0xC1AA
  gap          107902
  toggle_bit_mask 0x0
  frequency    38000

      begin codes
          Power                    0x09F6
          Source                   0x31CE
          Freeze                   0x49B6
          Mute                     0xC936
      end codes

end remote