Дистанционное управление громкостью

Хочу поделиться своей самоделкой. Когда я собирал свой аудиоусилок (о нем речь не пойдет, слишком он примитивный), мне хотелось, лежа на диване в другом конце комнаты, рулить громкостью воспроизведения.
Долгие и мучительные попытки собрать самому пульт и написать процедуру обмена в конце концов заставили меня освоить протокол SIRC (Sony Infrared Remote Control). Вообще-то, сначала я освоил RC-5, но потом мне попался в руки симпатичный пульт от видеокамеры Sony, и все заверте…

Короче, плата небольшая- микроконтроллер и два цифровых потенциометра. Сигнал принимается от TSOP1736.

Сверху


Снизу


Подключена


Пульт управления. Можно использовать любой другой фирмы Sony, только чтобы кнопки соответствовали.


Как работает.


Дичайше извиняюсь за отвратное качество фото, видео и звука. У меня мобильник из прошлого века.

Технические подробности

Схема

U2 — PIC16F886
U1,U3 — MCP41010
U4 — LM78L05

Исходник прошивки. Здесь описаны процедуры приема для двух протоколов, но используется только один.

#include<16f886.h>
#fuses INTRC,NOLVP,NOWDT,NOBROWNOUT
#use delay(internal=4M)

#define CS PIN_C0
#define SI PIN_C2
#define SCLK PIN_C1

/////////POT/////////////
void set_pot (int8 data) 
{
   BYTE i;
   BYTE cmd[2];

   cmd[0] = data;
   cmd[1] = 0x11;

   output_low(SCLK);
   output_low(CS);

   for(i=1;i<=16;++i) {
      output_bit(SI, shift_left(cmd,2,0));

      output_high(SCLK);
      output_low(SCLK);
   }
   output_high(CS);
}

//Reading received data using RC-5 Protocol (designed by Philips Electronics N.V. All rights reserved.)
int RX_RC5()
{
int8 i;
int16 bittime;
int8 data[1] = {0};
int8 address[1] = {0};
bittime = 226;

while (input(PIN_B0)) {};
set_timer1(0);

	for (i=2;i<=14;++i)
	{
	if(i>=4 && i<=8){shift_left(address,1,(!input(PIN_B0)));};
	if(i>=9){shift_left(data,1,(!input(PIN_B0)));};
	set_timer1(0);
	while(get_timer1()<=(bittime)){};	
	};

return(data[0]);
}

//Reading received data using SIRC Protocol (by Sony Corporation. All rights reserved.)
int RX_SIRC()
{
int8 i;
int8 data[1] = {0};
int8 address[1] = {0};

while (input(PIN_B0)) {};
while (!input(PIN_B0)) {};
while (input(PIN_B0)) {};

	for (i=1;i<=7;++i)
	{
	set_timer1(0);
	while (!input(PIN_B0)) {};
	if(get_timer1()>=140)	{shift_left(data,1,1);};
	if(get_timer1()<100)	{shift_left(data,1,0);};
	while (input(PIN_B0)) {};
	};

return(data[0]);
}
/////////////////////////////



void main()
{
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );

int8 value,data;
int1 mute;
mute = 0;
value = 0;
delay_ms(50);
set_pot(0x00);


	while(1)
{

data = RX_SIRC();
//output_a(0);
//output_a(data);

	//volume up
	if (data==0x2C) 
	{
	if (value<=254){value = value+1;}; 
	set_pot(value);
	};
	
	//volume down
	if (data==0x6C) 
	{
	if (value>=1){value = value-1;};
	set_pot(value);
	};

	//mute
	if (data==0x4C) 
	{
	mute = !mute;
	if (mute==1){set_pot(0);}
	else{set_pot(value);};
	delay_ms(200);
	};

	delay_ms(120);


}


}


Комментарии (8)

RSS свернуть / развернуть
схемы? код?
по поводу протокола — не думали что стоит сделать режим обучения и просто привязывать на нужные кнопки нужные функции?
0
Сначала именно так и было. Но потом это мне разонравилось и я завязал жестко.
0
Попробуй снимать платы на мобилу, приставив увеличительное стекло к камере.
0
Или держать стекло между платой и телефоном. Так удобно будет участки платы фоткать.

Кроме того, очень удобно платы сканировать! При наличии, конечно, технической возможности :)
0
сканировать — удобно голые платы, или в крайнем случае без запаянных разъемов. если пытаться сканить с PLS, глубины резкости сканера может оказаться недостаточно.
0
Смотря какого. У CCD-шек обычно не менее 5-6 сантиметров, а мой так и с 20см четкое изображение захватывает. С LED хуже, такую плату им можно отсканировать только если убрать разъемы и нечто в TO-92.
0
А сам усилитель по какой схеме сделан?
0
STK4152-II в типовом включении.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.