Pull to refresh

Новая жизнь старого кассетника: малинка и ИК диод

Завалялся у меня старый проигрыватель дисков, кассет и т.д. – старый стал, лазер подсел, даже на максимальном токе диски уже не читал. Да и морально устарел – ни тебе MP3, ни USB. Но сделан был добротно, посему и выкинуть жалко было. Валялся в подвале, место занимал. Но благодаря гениально-простому применению ARM-а английскими инженерами, наличию свободного времени в связи с отсутсвием загрузки в проектах, решил я вдохнуть жизнь с железяку, безмолвно просившую меня открытой крышкой дископриемника. Да в принципе, я уже давно задумывался об устройстве, позволяющем мне слушать радио на русском/украинском языках, ввиду отсутсвия наличия эфирного радио на оных.

Проигрыватель был успешно принесен из подвала и разобран для идентификации нужных входов/выходов. А нужно мне было не много – 5В и вход стерео на усилитель мощности. В принципе, это заняло найбольшую часть времени, потраченного на конструирование – без осцилографа при помощи одного только мультиметра… Но, метод научного тыка доказал свою эффективность и необходимые входы были найдены. Правда вместо необходимых 5 В нашел только 13В, посему пришлось ставить КРЕН на 5В/1А, соответственно лишние 4..8Вт пришлось рассеивать, благо под рукой оказался радиатор из старого блока питания. Ну, зато дешево.

image

Дополнительно поставил релюшку – 13 вольт брались непосредственно с блока питания и в стендбае не отключались. Итак, привод диска – на выкинштейн. Плату управления – туда-же. Освобождаем место под радиатор. Закрепляем «малинку» винтами к корпусу. Между делом паяем блок управления и индикации (во как), состоящее из одного светодиода и двух кнопок, подтягиваем к +3.3В, чтобы противостоять наводкам от ВиФи (в «GPIO для чайников» все подробно описано).

image

За основу программного обеспечения берем примерчик из 5го урока и модифицируем следующим образом:
А) список каналов держим в отдельном файле – в этом случае можно просто обновлять файл без перекомпиляции программы. Думаю, нет смысла приводить код, стандартные файловые операции
Б) добавляем обработку второй кнопки (одна кнопка щелкает каналы вперед, другая – назад)

int do_parent (int fd, pid_t p, int n)
{
    signed char key_pressed =0;
    
    while(!key_pressed)
    {
      if (bcm2835_gpio_lev(KEY_UP)) key_pressed = INCREASE_STATION;
      if (bcm2835_gpio_lev(KEY_DN)) key_pressed = DECREASE_STATION;
      if (key_pressed) printf("Key : %d\n", key_pressed);
    }



В) Когда переключаемся на другой канал – гасим светодиод. В случае успешного захвата канала – зажигаем светодиод. Достаточно тривиально.

Г) для автостарта пришлось вводить искусственную задержку в пару секунд – я подозреваю, что вайфаю нужно пару секунд, чтобы законектиться. Если в это время стартует плеер, программа подвисает.

Часть 2

Через 3 месяца успешных испытаний приемника в полевых условиях (иногда подглючивал omxplayer) решил я приспособить ИК пульт. Как всегда, самым трудным было решить каким образом организовать прием ИК сигнала. На борту был родной диод, которым я все еще пользовался для регулировки звука и включения-выключения. Его было решено оставить, так как я не хотел лишаться вышеупомянутых функций. Посему был приобретен TSOP3848 с частотой модуляции 38кГц. Правда, согласно стандарту Sony SIRC, пульт работает на 40кГц, но никаких неудобств по этому поводу испытано не было. В общем, согласно с даташитом, подключаем ИК датчик на пины GPIO 14 (ground), 15 (GPIO22) и 1(+3.3V). В результате получаем два ИК приемника, которые, в принципе, почти не конфликтуют. Иногда увеличение или уменьшение звука детектируется как 0 и в результате приемник переключаеться на 1-й канал радио, но сие случается нечасто.

Достаточно сложно было декодировать сигнал с пульта. Биты кодируются согласно протокола SIRC, т.е. логический «0» есть 600мкс Hi + 600мкс Low, логическая «1» — 1200мкс Hi + 600мкс Low. И так от 12 до 21 бита. Но в моем случае удавалось распознать только 4-7 бит, похоже Сони недоимплементировал протокол — после нормальных бит шла пауза в десятки миллисекунд. В общем, я решил что мне этих самых 4-7 бит хватит.

В функцию do_parent, в конце цикла while была добавлена обработка с ИК:



  if (!bcm2835_gpio_lev(PIN_IR)) 
      {
    	  
    	    num_bits_burst = read_IR_burst(&burst_byte);
    	    if (num_bits_burst)
    	    {
    	    	if (burst_byte >=0 && burst_byte < 10)
    	    	{
    	    		key_pressed = INCREASE_STATION;
    	    		n = burst_byte;
    	    		bcm2835_delay(500); //dont read again
    	    		
    	    	}
    	    	if (burst_byte == 49) key_pressed = INCREASE_STATION;
    	    	if (burst_byte == 48) key_pressed = DECREASE_STATION;
    	    	printf("burst_byte = %d", burst_byte);
    	    }
      }


Функцию read_IR_burst не привожу, но если нужно, могу поделиться.

image

Получилось как-то так (ну, ИК датчик я закрепил на платки и надел на него трубку, дабы избежать отраженного сигнала).
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.