Hooking New Stuff to Legacy Hardware
Long time ago I bought Onkyo TX-SV535 receiver/amplifier with a couple of decent speakers. I occasionally used it to listen radio or CD's spinning on another Onkyo device - DX-C320.I've realized lately that I could have much more fun with all that legacy hardware when got my first Raspberry PI device.
Installing Music Player Daemon (MPD) and Music Player Client (MPC) was not a problem. I've even managed to built MPD from sources to make sure that I can easily integrate it with Spotify, SoundCloud, last.fm and virtually any existing audio format.
It all worked well, but it was irritating a bit that I needed to use a native Onkyo's remote control for the receiver and MPC running on my mobile device or on a desktop to control Raspberry's MPD.
Then I came across the Adafruit's IR chip and realized that this is what I needed. Hooking up the chip to Raspberry's GPIO was easy - I used female to female connectors, drilled a hole in a Raspberry's clear case, used a bit of heat shrink tubing to make sure that the IR receiver can be fixed on the top of the case.
This is how everything looks together:
Making IR receiver to understand Onkyo's remote was a little bit harder, but eventually I've made it working.
Tuning IR to Onkyo's Remote
The first step was to install LIRC tools that have not been installed on my Raspberry OS by default:sudo apt-get install lirc
You'll also need to make sure that lirc_rpi driver is loaded before you can do anything:
sudo modprobe lirc_rpi
To make the module loaded at boot time add it to /etc/modules.
The next step is to record codes generated by remote's buttons that you want to use. Stop lircd daemon if it's running and use irrecord command line utility to record the codes:
sudo /etc/init.d/lircd stop
irrecord -d /dev/lirc0 ./lircd.conf
Follow instructions provided by irrecord and chose the buttons that you need.
This is how my lircd.conf file looks like:
begin remote name ONKYO-RC-287S flags RAW_CODES|CONST_LENGTH eps 30 aeps 100 gap 108090 begin raw_codes name KEY_POWER 9017 4480 624 509 579 1663 581 555 576 529 600 1670 577 530 600 1667 579 1662 583 1661 598 537 571 1670 599 1668 579 531 598 1678 569 1666 572 562 576 530 600 536 572 1669 598 536 581 555 574 531 600 534 582 554 576 1664 625 1618 598 536 584 1658 599 1675 576 1667 571 1672 592 1677 574 name KEY_LEFT 9054 4447 601 533 575 1667 601 533 625 509 579 1664 625 509 578 1672 616 1617 609 1659 579 538 604 1664 570 1676 622 501 574 1668 581 1661 607 527 581 1660 606 1673 565 1667 631 1610 606 530 577 556 574 1677 570 556 573 540 605 526 577 556 573 539 603 1666 569 1672 626 508 583 1652 631 name KEY_RIGHT 9040 4461 600 534 582 1658 601 535 572 562 578 1663 573 562 577 1663 588 1659 606 1660 576 531 609 1659 578 1665 591 543 576 1666 581 1661 608 526 581 553 576 1666 583 1660 606 1660 589 525 604 527 580 1667 600 540 569 1659 608 529 579 554 575 533 606 1662 575 1675 572 555 574 1667 579 name KEY_PLAY 9016 4485 628 505 581 1660 575 559 581 528 609 1657 583 527 601 1670 579 1666 570 1665 603 532 575 1665 604 1667 581 526 601 1666 582 1661 576 558 580 528 602 533 574 559 581 527 602 1667 580 527 603 1667 580 526 603 1672 581 1673 563 1666 603 1668 577 526 601 1673 572 527 602 1665 581 name KEY_PAUSE 9072 4439 569 555 574 1666 594 541 576 532 606 1664 574 532 606 1662 576 1677 570 1663 604 530 579 1661 607 1663 575 533 605 1672 565 1671 577 553 575 1668 579 555 574 1676 571 1663 606 529 579 554 575 1668 580 554 608 498 608 1669 567 534 605 530 579 1661 606 1662 576 532 616 1653 574 name KEY_LEFTALT 9015 4488 573 561 579 1660 575 560 579 528 601 1677 571 527 601 1669 578 1663 574 1665 603 533 583 1660 599 1668 579 528 601 1669 578 1665 574 562 575 530 599 1668 580 529 599 536 572 1670 598 536 571 1669 612 528 598 1649 600 526 581 1660 607 1672 565 532 608 1661 576 531 608 1659 578 name KEY_RIGHTALT 9044 4466 594 529 579 1664 603 529 579 556 573 1669 579 556 572 1669 587 1656 609 1667 567 538 600 1670 566 1676 583 546 572 1668 577 1665 601 533 573 1669 600 534 574 561 579 528 601 1668 577 531 600 1668 580 528 600 544 564 1668 598 1670 579 1664 573 561 578 1672 563 561 579 1664 572 name KEY_VOLUMEUP 9036 4464 597 537 579 1663 602 532 575 560 578 1662 573 567 573 1674 569 1663 599 1668 578 531 605 1665 571 1671 572 561 576 1667 579 1662 603 541 566 560 578 1661 573 563 575 534 603 530 576 558 580 1673 561 562 575 1668 577 556 572 1670 573 1668 597 1673 573 1669 574 560 577 1663 582 name KEY_VOLUMEDOWN 9032 4470 603 528 579 1666 605 529 574 559 580 1673 562 563 576 1615 627 1668 595 1677 567 533 603 1663 571 1672 573 575 563 1666 578 1662 603 533 574 1667 598 1679 565 534 603 538 569 559 579 528 598 1670 574 534 605 529 604 541 558 1674 572 1669 606 1662 572 1678 569 562 578 1661 579 end raw_codes end remote
Copy this file to /etc/lirc/lircd.conf to make it available for lircd daemon when it starts next time.
You'll also need to change /etc/lirc/hardware.conf to make it working with /dev/lirc0 device. The only two changes that I've made are below:
#DRIVER="UNCONFIGURED" DEVICE="/dev/lirc0"
'DRIVER' option was commented out and 'DEVICE' parameter was set to the IR device - /dev/lirc0.
If everything is done correctly, you can start lircd daemon now and check if IR receiver recognizes the configured keys using irw command:
sudo /etc/init.d/lirc start irw
Press configured buttons on remote sequentially and observe irw's output. If the irw shows all the keys that you've configured, proceed to binding the keys to actions using irexec daemon. You'll need to create a configuration file for irexec called lircrc and copy it it to /etc/lirc/lircrc. My lircrc file is provided below. You can find detailed description of the lircrc's file format here.
begin
remote = ONKYO-RC-287S prog = irexec button = KEY_POWER config = sudo shutdown -h now end begin remote = ONKYO-RC-287S prog = irexec button = KEY_RIGHT config = /usr/bin/mpc next end begin remote = ONKYO-RC-287S prog = irexec button = KEY_LEFT config = /usr/bin/mpc prev end begin remote = ONKYO-RC-287S prog = irexec button = KEY_PLAY config = /usr/bin/mpc toggle end begin remote = ONKYO-RC-287S prog = irexec button = KEY_PAUSE config = /usr/bin/mpc pause end begin remote = ONKYO-RC-287S prog = irexec button = KEY_LEFTALT config = /home/pi/load_playlist.py 0 end begin remote = ONKYO-RC-287S prog = irexec button = KEY_RIGHTALT config = /home/pi/load_playlist.py 1 end begin remote = ONKYO-RC-287S prog = irexec button = KEY_VOLUMEUP repeat = 1 config = mpc volume +1 end begin remote = ONKYO-RC-287S prog = irexec button = KEY_VOLUMEDOWN repeat = 1 config = mpc volume -1 end
KEY_POWER is used to shutdown Raspberry, for almost all other keys MPC command line utility is used to control MPD. I didn't find a simple way of loading a next or previous playlist from a server and had to write a small Python script called load_playlist.py to do that:
/home/pi/load_playlist.py
================================================================
#!/usr/bin/python # Load next/previous playlist from MPD server using MPC import os import sys import re CONFIG_FILE=os.path.expanduser("~/.load_playlist/current") if len(sys.argv) < 2: sys.exit("Usage: %s n [config_file]\n\tn 0 - prev, 1 - next\n\tconfig_file contains current playlist" % sys.argv[0]) cf = CONFIG_FILE next = True if len(sys.argv) > 2: cf = sys.argv[2] if sys.argv[1] == '0': next = False if not os.path.isfile(cf): if not os.path.isdir(os.path.dirname(cf)): os.system("mkdir -p %s" % os.path.dirname(cf)) os.system("echo '' >%s" % cf) if not os.path.isfile(cf): sys.exit("Can's create file %s" % cf) with file(cf) as f: s = f.read() s = re.sub(r'[\n\r]', "", s) print "S='%s'" % s ls = os.popen('mpc lsplaylists').read() # print ls lsa = ls.split("\n") del lsa [-1] # print lsa ind = 0 for i in range(0,len(lsa)-1): if (s == lsa[i]): if next: ind = i+1 else: ind = i-1 if ind < 0: ind = len(lsa) - 1 if ind >= len(lsa): ind = 0 if ind < 0: ind = 0 if ind < len(lsa): os.system("mpc clear") loaded = os.system("mpc load %s" % lsa[ind]) if loaded == 0: os.system("mpc play") os.system("echo %s >%s" % (lsa[ind], cf))
irexec daemon should start automatically when you restart lircd daemon.
That's very much it! Enjoy the quality of your old good HiFi improved by smartness of your PI integrated with IR and WiFi :)
Anybody, could you explain me, why it doesn’t work:
ReplyDeletebegin
prog = irexec
button = KEY_8
config = /usr/bin/cvlc http://www.a-1radio.com/listen.pls -I dummy &
end
begin
prog = irexec
button = KEY_9
config = /usr/bin/cvlc /home/pi/MUSIC/playlist.xspf --random &
end
Did you test your keys with irw?
ReplyDeleteHi!
ReplyDeleteThe hardware is working well, also some commands are running perfect, for instance:
begin
prog = irexec
button = KEY_0
config = sudo reboot
end
The only a problem is the VLC doesn't working with IREXEC as I wished.
AK
Check this one - https://wiki.videolan.org/How_to_Use_Lirc
ReplyDeleteIt looks like you need to run vlc with rc interface (vlc -rc) to be able to control it through remote.
I do not use VLC, so if this doesn't work, I don't know what else it could be. It looks like the problem is VLC specific.
Well, it'd be complex!
ReplyDeleteThat I've found some programs don't work like VLC, for example:
begin
button = KEY_7
prog = irexec
config = voicecommand -c
end
To me it looks like because of LIRC.
LIRC driver works fine, because you're getting keys. The problem most likely is that irexec runs in a different env compare to a normal user. Try to run irexec without -d and see if there are errors. Try to set a full path to voicecommand in 'config'. If a command requires a display you probably need DISPLAY env variable to be set. Permissions might be an issue as well.
ReplyDeleteI think, it's the same kind of problem when everything works from a command line, but doesn't work from 'cron'.
I'm sure, you'll find it :)