Easily adds stepped IR volume control to any audio project.



Volume +mute receiver with remote
$179.00 (matte black) Bourns 100k
$199.00 (natural aluminum) Bourns 100k
$229.00 (matte black) ALPS 10k


New features for 2025, 3 user selectable modes of operation.
1 – ultra fine: 18 steps push and release, 100 steps push and hold. This is the default for all new devices.
2 – fine: 18 steps push and release, 70 steps push and hold.
3 – continuous: 50 steps push and release, push and hold for continuous.
Shown above in volume / mute configuration with pre-programmed remote and dc power supply.
Uses codes: Power , Volume Up , Volume Down , Volume Mute .
All quality parts including gold jacks, silver plated FR4 board, Mircochip PIC16F18323 micro-controller, Vishay TSOP IR receiver, Texas Instruments SN754410 motor driver and Bourns 100k motorized pot.
Completely passive audio path with non shorting mute circuit.
Dry contact outputs follow power status. Ideal for triggering external devices/amps. Contacts rated .5a @ 12Vdc.
Precise 2 speed motor control step rate. Click – Hold – Release will increment / decrement volume in small steps (60 steps). Rapidly clicking and releasing will increment / decrement volume at a high rate (11 steps).
Intelligent features include instruction received feedback via power led and return to low volume on shutdown.
Long range reliability of +30ft.
Compatible with any remote that supports Sony codes.
Also available as volume only.
Schematic and code for full version shown below.




Simple SONY IR receiver V3.1 :
'EULA: 'Copyright (2024) PJL Electronics LLC'Licenced under Creative Commons 'https://creativecommons.org/licenses/by-nc/4.0/ 'You are free to: 'Share — copy and redistribute the material in any medium or 'format 'Adapt — remix, transform, and build upon the material 'The licensor cannot revoke these freedoms as long as you follow 'the license terms.'Under the following terms: 'Attribution — You must give appropriate credit , provide a link 'to the license, and indicate if changes were made . You may do so in 'any reasonable manner, but not in any way that suggests the licensor 'endorses you or your use. 'NonCommercial — You may not use the material for commercial 'purposes . 'No additional restrictions — You may not apply legal terms or 'technological measures that legally restrict others from doing 'anything the license permits.'Notices:'You do not have to comply with the license for elements of the 'material in the public domain or where your use is permitted by an 'applicable exception or limitation .'No warranties are given. The license may not give you all of the 'permissions necessary for your intended use. For example, other 'rights such as publicity, privacy, or moral rights may limit how you 'use the material.'Simple IR receiver for the PIC16F18323: ' V3.1' PICBASIC PRODEFINE OSCCON_1K 1define OSC 32low portclow porta ' SETUP I/O TRISA = %00001001TRISC = %00100000 '''''''''''''''''''''''''''''''''''The initsinitIR:define PULSEIN_MAX 2800pwrswc var porta.0pwrled var porta.1source3 var porta.2IR_Sense var porta.3pwrrly var porta.4murly var porta.5source2 var portc.0source0 var portc.1source1 var portc.2mtrA var portc.3mtrB var portc.4 srcswc var portc.5st var wordIRWord var wordbits var byteID var word power var bit mute var bittemp var bytetemp1 var bytesource var bytesalt var bytedirection var bytebutton1 var bytebutton2 var bytebutton3 var bytebutton4 var bytebutton5 var bytebutton6 var byteircount var bytesalt =125read 0, sourceif source > 4 then source = 1low source0 low source1 low source2 low source3 mute = 1gosub volmutepower = 1gosub powersetmute = 0gosub volmutetoggle pwrled''''''''''''''''''''''''''''''''''''''Main Programdirection = 10gosub stpmtrtop: if pwrswc = 0 then gosub hardpwr if mute = 1 and power = 1 then toggle pwrled gosub scanir if button1 > 1 then gosub powerset if power = 0 then goto top if button6 > 1 then gosub volmute if mute = 1 then goto top if button4 > 1 then gosub volup if button5 > 1 then gosub voldown if button2 > 1 then gosub sourceup if button3 > 1 then gosub sourcedown if direction = 1 or direction = 2 then direction = 11 if direction > 10 then direction = direction + 1 if power = 1 and mute = 0 then high pwrled if srcswc = 0 then gosub hardsrcif direction = 25 then gosub stpmtrgoto topvolup:toggle pwrledgosub resetbuttonslow mtrBhigh mtrApause 50gosub debouncedirection = 1returnvoldown:toggle pwrledgosub resetbuttonslow mtrAhigh mtrBpause 50gosub debouncedirection = 2return hardpwr:gosub stpmtrgosub powerset debounceloop: pause 10 if pwrswc = 0 then goto debounceloop pause 500return hardsrc:if mute = 1 and power = 1 then returnsource = source + 1if source = 5 then source = 1gosub setsource debouncesrc: pause 10 if srcswc = 0 then goto debouncesrc pause 100return powerset:gosub resetbuttonsif power = 1 then power = 0 low pwrled low pwrrly mute = 1 high murly low source0 low source1 low source2 low source3 low mtrA high mtrB gosub longpause low mtrB mute = 0 low murly write 0, source else gosub setsource power = 1 high pwrled high pwrrly mute = 0 low murlyendifgosub stpmtr 'gosub debouncelongreturn volmute:gosub resetbuttonsif mute = 0 then toggle pwrled mute = 1 high murly else mute = 0 low murlyendif gosub stpmtr 'gosub debouncelongreturnsourceup:toggle pwrledgosub stpmtrgosub resetbuttonssource = source + 1if source = 5 then source = 4 gosub debounce returnELSE gosub setsourcegosub debouncereturnENDIFreturnsourcedown:toggle pwrledgosub stpmtrgosub resetbuttonssource = source - 1if source = 0 then source = 1 gosub debounce RETURNELSE gosub setsourcegosub debounce returnENDIFreturnsetsource:'high murlylow source0 low source1 low source2 low source3 pause 50 if source = 1 then high source0if source = 2 then high source1if source = 3 then high source2if source = 4 then high source3'pause 50'low murlyreturnlongpause:for temp = 1 to 25 high pwrled pause 250 low pwrled pause 250 nextreturnstpmtr:low mtrAlow mtrB direction = 0gosub debouncelong return resetbuttons:button1 = 0button2 = 0button3 = 0button4 = 0button5 = 0button6 = 0 returnscanir:for ircount = 1 to 3 gosub irin If irword > 2000 then if irword = 2069 then button1 = button1 + 1 if irword = 2173 then button2 = button2 + 1 if irword = 2158 then button3 = button3 + 1 if irword = 2066 then button4 = button4 + 1 if irword = 2067 then button5 = button5 + 1 if irword = 2068 then button6 = button6 + 1 endifnext returnirin:ID = 0irword = 0pulsin IR_Sense, 0, st IF st < 1100 or st >2600 Then ReturnFor bits=0 to 11 Pulsin IR_Sense,0,id ' Receive the IR bits ir_word.0[bits] = 0 If id >=450+salt then irword.0[bits] = 1 Nextreturndebounce:pulsin IR_Sense, 1, st'LCDOUT $FE, $C0, #st IF (st >1200) or (st = 0) Then Returngoto debounce debouncelong:ir_word = 0pulsin IR_Sense, 1, st'LCDOUT $FE, $C0, #st IF (st = 0) Then returngoto debouncelong
