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

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

За основу программного обеспечения берем примерчик из 5го урока и модифицируем следующим образом:
А) список каналов держим в отдельном файле – в этом случае можно просто обновлять файл без перекомпиляции программы. Думаю, нет смысла приводить код, стандартные файловые операции
Б) добавляем обработку второй кнопки (одна кнопка щелкает каналы вперед, другая – назад)
В) Когда переключаемся на другой канал – гасим светодиод. В случае успешного захвата канала – зажигаем светодиод. Достаточно тривиально.
Г) для автостарта пришлось вводить искусственную задержку в пару секунд – я подозреваю, что вайфаю нужно пару секунд, чтобы законектиться. Если в это время стартует плеер, программа подвисает.
Часть 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 была добавлена обработка с ИК:
Функцию read_IR_burst не привожу, но если нужно, могу поделиться.

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

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

За основу программного обеспечения берем примерчик из 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 не привожу, но если нужно, могу поделиться.

Получилось как-то так (ну, ИК датчик я закрепил на платки и надел на него трубку, дабы избежать отраженного сигнала).