Introduction: Raspberry Pi Presentation Machine With Remote Control
Have you ever thought of having a little presentation box that you can just plug into the projector and start talking?
I have to give lecture in powerpoint frequently. Most of the time, I face different problems using the projector and PC. Sometimes my files get infected by virus and I am unable to find any presentation file while plugging my pen drive into the PC.
To get rid of this problem, I was thinking of an easy solution and suddenly an idea came to my mind. Why am I not using my Raspberry Pi as a presentation machine? Thereafter, I started working to make a little presentation box and finally, I made it. Now, I just plug the device into any projector and the presentation starts automatically from my pen drive. I can control the presentation using a remote. No keyboard and mouse is required.
Busy life, easy solution!!!
Here, I will share the complete recipe for my magic box (the presentation machine). So, keep reading.
Demo Video:
Step 1: Bill of Materials
1. A Raspberry Pi with an SD card(seeedstudio.com): Any version should work fine but for the higher version you will get higher speed. I recommend PI 3 if you want to buy a new one. I have one Pi 1 B version and using it for the project without buying a new one and it is working perfectly.
2. Minimum 2Ah Li-ion Battery (sparkfun.com): The capacity of the battery depends on your requirement. From a 2Ah battery, you can get 2 hours backup. If you required more then use a higher capacity battery.
3. 5V/1A Li-ion Charger and Booster (sparkfun.com):This module converts 3.7V to 5V and also has an integrated Li-ion charger circuit. You can also low price power bank module which has the same functionality. You can buy one from ebay.com at $3.
4. 1838B IR receiver: You can find it easily form any local electronic component shop. In fact, any three pin IR receiver should work which has an in-built decoder.
5. Car MP3 Remote: I select it for its small form factor. Any remote like your old TV remote will work. So, choose one as your convenience. I will show you how you can record your own remote in the next step.
6. Mini SPDT Switch: For on/off the raspberry pi as pi has no built-in on/off switch. You can collect it from any local electronic shop.
7. 3D printed case: I am preferring your own 3D printed case instead of a ready-made case because we will add battery and charger circuit inside the case. A ready-made case has no enough space for placing the battery. I will give you the 3D file in next step.
Tools Required
1. A soldering iron with solder
2. Some wire and wire cutter
3. Access to a 3D printer
4. A cup of coffee.
Step 2: Connecting IR Receiver to Raspberry Pi
I am assuming that you installed a fresh copy of Raspbian operating system to the SD card. If not so, please visit the link: https://www.raspberrypi.org/downloads/ and follow the instructions. I am also assuming you have some previous experience working with Raspberry Pi. If you are new to Raspberry Pi follow the getting started guide link given below:
https://www.imore.com/how-get-started-using-raspberry-pi
https://opensource.com/article/16/12/getting-started-raspberry-pi
https://www.raspberrypi.org/forums/viewtopic.php?t=4751
I am sure you are now more experienced about raspberry pi. So, let's start working.
The IR sensor has just three pins, that will connect with three pins on the GPIO connector. To do the connecting, we can use female to female jumper leads. These make a good reliable connection as the IR sensor has unusually thick leads for an IC. You can also solder the IR receiver with GPIO for permanent connection.
Make the connections as shown the schematic. The receiver has three terminal (VCC, GND, and SIGNAL).
Connect:
VCC pin of IR receiver to 3.3V pin of Raspberry Pi
GND pin of IR receiver to any Ground pin of Raspberry Pi
SIGNAL pin to GPIO 18 of Raspberry Pi (Add a transistor to increase the range. Amplifying the current output from signal pin increases the IR LED's signal strength)
After making the connection go to the next step to configure the software.
Step 3: Configuring Raspberry Pi for IR Remote
Each button of an IR remote control has a string of specific encoding. When a button is pressed, the IR transmitter in the remote control will send out the corresponding IR encoding signals. On the other side, when the IR receiver receives certain encoding signals, it will decode them to identify which button is pressed.
For my project, I used the lirc library to read infrared signals returned by buttons of the remote control and translate them to button values. Then I used pylirc (Python) to simplify the process for reading values from the remote control.
LIRC is a package that allows you to decode infrared signals of many (but not all) commonly used remote controls. LIRC runs as a daemon that will decode IR signals received by the device drivers and provide the information on a socket. We will then write a program in the user space to monitor this socket for input events using the LIRC client library.
To configure your Raspberry Pi for remote control follow the steps:
1. Download the LIRC library using the following command from terminal
sudo apt-get install lirc
2. Set up LIRC
Add the two lines below to /etc/modules. This will start the modules upon boot. Pin 18 below will be used to take the output from the IR sensor. Use the following command:
sudo nano /etc/modules
and add this two lines in the file opened
lirc_dev lirc_rpi gpio_in_pin=18
Type, Ctrl + X and then Y to save and exit. Also, edit your /boot/config.txt file. Open the file using the command:
sudo nano /boot/config.txt
and add the following line to the file:
dtoverlay=lirc-rpi,gpio_in_pin=18
Then, edit /etc/lirc/hardware.conf using the command:
sudo nano /etc/lirc/hardware.conf
and paste the following code exactly as shown below.
# /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=""Press Ctrl +X and Y to save and exit. Type following command to reboot.
sudo reboot
3. Test the configuration
To perform a quick test to see if LIRC is working, we need to stop the LIRC daemon and start mode2. mode2 shows the pulse/space length of infrared signals.
To start the LIRC in mode2 type the following command
sudo /etc/init.d/lirc stop mode2 -d /dev/lirc0
When buttons are pressed on your remote, mode2 will give a similar output to what is shown below.
pulse 627 space 514 pulse 624 space 513 pulse 599 space 521 pulse 618 space 1668 pulse 589 space 532
If you receive such output by pressing a button then Congratulation! Your configuration and connections are working!! Go forward!!!
Step 4: Recording IR Codes From a Remote
The irrecord command will help us discover the IR codes used by our remote and assist with creating a lircd.conf file which will be used by LIRC.
To record the IR code type the following command from the terminal:
irrecord -d /dev/lirc0 ~/lircd.conf
Once started, irrecord will show detailed instructions on how to setup your remote. However, here is summary;
1.When asked, press all buttons on your remote until asked to stop.
2.Assign a pre-defined name to each button. running irrecord --list-namespace will display a list of available names. You can set any name for any button but the name must be from the list (you can use the name from the following code). After successfully recording the config file for the Adafruit MinRemote looks like this;
# Please make this file available to others # by sending it to <lirc@bartelmus.de> # # this config file was automatically generated # using lirc-0.9.0-pre1(default) on Tue Oct 8 07:05:38 2013 # # contributed by # # brand: /home/pi/lircd.conf # model no. of remote control: # devices being controlled by this remote: # begin remote name /home/pi/lircd.conf bits 16 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 header 9006 4447 one 594 1648 zero 594 526 ptrail 587 repeat 9006 2210 pre_data_bits 16 pre_data 0xFD gap 107633 toggle_bit_mask 0x0 begin codes KEY_1 0x08F7 KEY_2 0x8877 KEY_3 0x48B7 KEY_4 0x28D7 KEY_5 0xA857 KEY_6 0x6897 KEY_7 0x18E7 KEY_8 0x9867 KEY_9 0x58A7 KEY_0 0x30CF KEY_DOWN 0xB04F KEY_LEFT 0x10EF KEY_UP 0xA05F KEY_RIGHT 0x50AF KEY_BACK 0x708F KEY_ENTER 0x906F KEY_SETUP 0x20DF KEY_PAUSE 0x609F KEY_PAUSE 0x807F KEY_STOP 0x609F KEY_VOLUMEUP 0x40BF KEY_VOLUMEDOWN 0x00FF end codes end remote
Now replace the existing conf file (which is most likely empty) with the new one you just created by the following command:
sudo cp lircd.conf /etc/lirc/lircd.conf
Now, restart LIRC by the following command:
sudo /etc/init.d/lirc restart
Test the new remote conf file
You can use irw to test the new config file. irw sends data from Unix domain socket to stdout You should get a similar output as below.pi@raspberrypi ~ $ irw pi@raspberrypi:~ $ irw 0000000000000001 00 KEY_CHANNELDOWN /home/pi/lircd.conf 0000000000000002 00 KEY_CHANNEL /home/pi/lircd.conf 0000000000000003 00 KEY_CHANNELUP /home/pi/lircd.conf 0000000000000004 00 KEY_PREVIOUS /home/pi/lircd.conf 0000000000000005 00 KEY_NEXT /home/pi/lircd.conf 0000000000000006 00 KEY_PLAYPAUSE /home/pi/lircd.conf 0000000000000007 00 KEY_VOLUMEDOWN /home/pi/lircd.conf 0000000000000008 00 KEY_VOLUMEUP /home/pi/lircd.conf 0000000000000009 00 KEY_EQUAL /home/pi/lircd.conf 000000000000000a 00 KEY_NUMERIC_0 /home/pi/lircd.conf 0000000000000014 00 BTN_0 /home/pi/lircd.conf 0000000000000015 00 BTN_1 /home/pi/lircd.conf
If you get the above result then Congratulation! You successfully setup the remote control.
Step 5: Controlling Keyboard & Mouse Using Remote
In this stage, I will show you how you can create virtual keystrokes and mouse clicks from the remote control. I will use Python code to do the job.
Install pylirc
First, download pylirc. Pylirc is LIRC Python wrapper and it's required to access LIRC from Python programs. To install Pylirc you should type following command from terminal
sudo apt-get install python-pylirc
Create a lircrc.conf file. The lircrc file is used to map the key symbols defined in lircd.conf to application-specific strings. Thus, this file cannot be configured until lircd has been configured to provide proper key symbols as displayed by irw. We already setup a lircd in the previous step.
The lircrc file should be placed in the home directory as ~/.config/lircrc. Optionally you can create a system-wide configuration file located in /etc/lirc/lircrc which will be used when no lircrc file can be found in the user's home directory. The idea is to have configuration information of all clients in one place. That lets you keep a better overview of clients and simplifies the use of modes explained later.
Following is the syntax of the lircrc file itself. The file consists of one or more of the following constructions:
begin prog = ... remote = ... button = ... [button = ...] (optional, for key sequences) repeat = ... delay = ... ignore_first_events = ... config = ... [config = ...] (optional, for toggle button behaviour) mode = ... flags = ... end
The complete lircrc file I prepared for my project is as follows:
begin button = KEY_PAUSE prog = irexec repeat = 0 config = pause end begin button = KEY_SETUP prog = irexec repeat = 0 config = setup end begin button = KEY_LEFT prog = irexec repeat = 0 config = left end begin button = KEY_RIGHT prog = irexec repeat = 0 config = right end begin button = KEY_DOWN prog = irexec repeat = 0 config = down end begin button = KEY_UP prog = irexec repeat = 0 config = up end begin button = KEY_VOLUMEUP prog = irexec repeat = 0 config = volumeup end begin button = KEY_VOLUMEDOWN prog = irexec repeat = 0 config = volumedown end begin button = KEY_0 prog = irexec repeat = 0 config = zero end begin button = KEY_1 prog = irexec repeat = 0 config = one end begin button = KEY_2 prog = irexec repeat = 0 config = two end begin button = KEY_3 prog = irexec repeat = 0 config = three end begin button = KEY_4 prog = irexec repeat = 0 config = four end begin button = KEY_5 prog = irexec repeat = 0 config = five end begin button = KEY_6 prog = irexec repeat = 0 config = six end begin button = KEY_7 prog = irexec repeat = 0 config = seven end begin button = KEY_8 prog = irexec repeat = 0 config = eight end begin button = KEY_9 prog = irexec repeat = 0 config = nine end
To know details about lircrc, you may visithttp://www.lirc.org/html/configure.html. You can modify my file I attached herewith to make it easy.
Install PyUserInput
PyUserInput is a cross-platform python module to take control of the mouse and keyboard in python that is simple to install and use.
PyUserInput is registered on PyPI (Python Package Index) and updated periodically, so tools such as pip or easy_install should work. Type the following command from terminal.
pip install PyUserInput
Attachments
Step 6: Python Program for Simulating Keyboard & Mouse Using Remote Control
Here is the complete python program to emulate keyboard & mouse from remote key-press.
#!/usr/bin/env python import pylirc, time from pykeyboard import PyKeyboard from pymouse import PyMouse k = PyKeyboard() m = PyMouse() blocking = 0; x = 0 y = 0 def setup(): pylirc.init("irexec") #pylirc.init("pylirc", "./conf", blocking) def key_press(config): if config == 'pause': k.tap_key(k.function_keys[5]) print 'Pause' if config == 'setup': k.press_key(k.shift_key) k.tap_key(k.function_keys[5]) k.release_key(k.shift_key) print 'Setup' if config == 'left': global x x -= 50 global y m.move(x,y) print 'left' if config == 'right': x += 50 m.move(x,y) print 'right' if config == 'up': y -= 20 m.move(x,y) print 'up' if config == 'down': y += 20 m.move(x,y) print 'down' if config == 'zero': k.press_key(k.control_key) k.tap_key('b') k.release_key(k.control_key) print 'blank screen' if config == 'one': k.tap_key(k.escape_key) print 'one' if config == 'two': k.tap_key(k.up_key) print 'up arrow' if config == 'three': print 'Green' if config == 'four': k.tap_key(k.left_key) print 'left arrow' if config == 'five': x_dim, y_dim = m.position() m.click(x_dim, y_dim, 1) print 'Green' if config == 'six': k.tap_key(k.right_key) print 'right arrow' if config == 'seven': m.scroll(-3, 0) print 'Green' if config == 'eight': k.tap_key(k.down_key) print 'down arrow' if config == 'nine': m.scroll(+3, 0) print 'Green' if config == 'volumeup': x += 10 m.move(x,y) print 'Blue OFF' if config == 'volumedown': x -= 10 m.move(x,y) print 'Light Blue' def loop(): while True: s = pylirc.nextcode(1) while(s): for (code) in s: print 'Command: ', code["config"] #For debug: Uncomment this # line to see the return value of buttons key_press(code["config"]) if(not blocking): s = pylirc.nextcode(1) else: s = [] def destroy(): pylirc.exit() if __name__ == '__main__': try: setup() loop() except KeyboardInterrupt: destroy()
Save the file as remote.py to the directory /home/pi in your raspberry pi. Make the file executable by the following command:
sudo chmod +x remote.py
Make a script to the same directory by the following command:
sudo nano myapp.shAdd the following lines in the script:
sleep 5 cd / cd home/pi sudo python remote.py cd /
Press Ctrl + X to save and exit. Make the file executable by typing the following command from the terminal:
sudo chmod +x myapp.sh
Open the autostart file by the command:
sudo nano /.config/lxsession/LXDE-pi/autostart
Add the following two lines at the end of the file:
@libreoffice --show /media/pi/VERBATIM/presentation.ppt --norestore @sh /home/pi/myapp.sh
Press Ctrl + X to save and exit. Here the file name which we want to load at startup is presentation.ppt. If you like another name make the change here. /media/pi/ is the path of USB flash drive and VERBATIM is the name of the flash drive. We are opening the presentation with LibreOfficewhich is preinstalled in raspberry pi. We are also starting myapp.sh which will run remote.py program after 5 seconds of loading GUI. Without GUI keyboard and mouse module will not work.
Step 7: Hacking the Raspberry Pi for Power Supply
As we are going to add the battery inside the case of the raspberry pi, the default micro USB port is not a good option. A good option is providing power using GPIO but it bypasses the fuse and may be damaged your Pi in case of any fault in the power supply. So, for better safety, I soldered two jumper wire at the bottom of the Pi. The image and the schematic are attached for better understanding. Connect two jumper wires accordingly. We will connect these wire to a 5V supply to provide power.
Step 8: Making the Connection of Battery
We already completed all software configuration. Now we need to connect the battery and boost converter circuit to the Raspberry Pi. First, connect the positive terminal of the battery to the B+ (or IN+) of the boost converter and negative terminal of the battery to the B- (or IN-) pin of the boost converter. Connect an SPDT micro switch to the positive output of the boost converter. Then connect another terminal of the switch to the positive input of the raspberry pi. Connect ground pin of the boost converter directly to the ground pin of the Raspberry Pi. I attached some snapshots for clear understanding.
Step 9: Putting All Inside the Box
3D print the case from the link: https://www.thingiverse.com/thing:215673. Thanks to ElliottMoo for his nice design. Scale the upper part 30% along Y axis to make enough place to attach the battery.
After making all the connection I place the battery to the upper part of the box using a double-sided tape. Then I placed boost converter using hot glue keeping the charging port outside. Again, I fix the switch with hot glue. Finally, I place the raspberry pi in the bottom part of the box.