Основные предпосылки:
- Есть старая неиспользуемая плата Raspberry Pi первого поколения;
- Плата лежит на шкафу мертвым грузом и не используется — плата «Кирпич»;
Что хотелось бы получить:
- В определенный момент времени (например по настроению)
плата перестает быть «Кирпичом», и в нее вставляется волшебная карта памяти; - К плате подключается Ethernet кабель и штекер от обычной бытовой колонки или наушников;
- После подачи питания бывший «Кирпич» — поет
Основная идея:
- Минимальное количество телодвижений для какой либо настройки, в самом идеальном случае, подключаем только «Ethernet» кабель, питание и колонки, и больше ничего не делаем, от слова «совсем»;
- Бывший «Кирпич» из коробки поддерживаем например 20 интернет радиостанций, переключение которых по кругу можно повесить на нажатие колесика мыши или же на определенный pin GPIO (подключить два провода и их замкнуть (моя мечта с детства));
- Управление осуществляется по радио каналу, и этим радио каналом может стать обычная радио мышь;
- Взять уже готовую систему, дистрибутив собрать в «Yocto Project»
т.е. как обычно мы с вами ничего делать не будем, так как все уже сделано.
(достаточно только поместить стороннего наблюдателя с другой стороны «Телевизора»);
Описание
Простейшая Интернет Радио колонка «KODI»
Сборка предназначена для старых Raspberry Pi 1 плат
(пылящихся где то на шкафу, но которые готовы еще поработать)
По умолчанию используется список m3u8 из 12 Интернет радиостанций.
Предполагается, что плата работает без HDMI выхода, и для ее выключения достаточно выдернуть адаптер питания из розетки. А в качестве ультра современного беспроводного пульта управления, вы можете использовать вашу супер радио мышь (ну или подключить обычную серую с хвостом).
При включении сетевой интерфейс по умолчанию настраивается через DHCP протокол и проигрывается последняя запомненная радиостанция из списка, управление громкостью воспроизведения осуществляется обычной мышью:
(назначьте наконец свою мышь «начальницей управления», и поздравьте ее, она это заслужила)
колесико вперед - увеличение громкости звука колесико назад - уменьшение громкости звука длительное нажатие (3сек и более) на правую кнопку мыши - выбор следующий радиостанции длительное нажатие (3сек и более) на левую кнопку мыши - выбор предыдущей радиостанции
Для добавления собственного списка Интернет радиостанций
вы всегда можете подключить HDMI кабель от телевизора
и воспользоваться штатным графическим интерфейсом Kodi 17.6
(выключите плату, подключите HDMI и включите адаптер питания)Основное меню Kodi => «Дополнения» => «Мои дополнения»
=> «Клиенты PVR» => «PVR IPTV Simple Client»
Первоначальная реализация
(возможная)
Изначально, когда я решил сделать «Интернет Радио колонку», я планировал следующее:
- Минималистический консольный дистрибутив в Yocto Project;
- Аудио поток проигрывается через GStreamer;
- Сетевой интерфейс настраивается по DHCP;
И такое решение имеет ряд преимуществ:
- Достаточно быстрое (выход на рабочий режим от подачи питания 30-40сек);
- Достаточно надежное (меньше программ, меньше точек отказа);
- Консольный дистрибутив намного проще перевести в режим только чтение
т.е. программы ничего не записывают в корневую в файловую систему
(a файловая система на носителе SDHC является на мой взгляд первым кандидатом по отказам);
В Yocto перевести корневую файловую систему (rootfs) в режим только чтение можно сделать достаточно просто, изменив один параметр во время сборки Из коробки Yocto предлагает два варианта: 1) Работа файловой системы в обычном режиме чтение/запись (так работают все дистрибутивы общего назначения, например Ubuntu) 2) Работа файловой системы в режиме только чтение (так работают специализированные дистрибутивы, например в маршрутизаторах) В режиме только чтение все каталоги, в которые обычно записываются данные приложений и сервисов во время работы монтируются в оперативную память (например каталог /var/log и т.п.) Данные актуальны только для текущего сеанса работы и после сброса питания данные теряются. Если в Yocto Project вы укажете при сборке использовать "read only", то после сборки ваш дистрибутив будет настроен только на чтение, но вы всегда можете добавить возможность динамического перевода из "read only" в "read/write", но это уже совсем другая история ...
И один главный недостаток:
«Его надо делать» т.е. мне необходимо потратить N количество вечеров
(обычно после работы, и это самое неэффективное время, в это время мозг, уже не думает, он обычно спит)
И еще, свою предыдущую статью на Хабре я писал про мультимедиа центр Kodi и Yocto project
и возможность продолжить в том же ключе, пересилила мой исследовательский порыв. Об этом в следующей главе.
Превращение Kodi в интернет радио колонку
Для внесения нужной мне функциональности, я добавлю еще один метод в рецепт сборки дистрибутива описанного в предыдущей статье см. файл berserk-image.bb
GUI_SETTINGS = "home/root/.kodi/userdata/guisettings.xml" # конфигурация запуска последнего выбранного ТВ канала (1-фон 2-передний план) F1_LINE = "<startlast default=\"true\">0</startlast>" R1_LINE = "<startlast>1</startlast>" # конфигурация вывода звука, всегда подключен только аналоговый аудио выход F2_LINE = "<audiodevice default=\"true\">PI:HDMI</audiodevice>" R2_LINE = "<audiodevice>PI:Analogue</audiodevice>" # так как HDMI по умолчанию не используется отключаю автоматическое обновление # а то может получиться что питание уехало, а данные остались не записанными F3_LINE = "<addonupdates default=\"true\">0</addonupdates>" R3_LINE = "<addonupdates>2</addonupdates>" # метод отвечает за добавление конфигурации: # которая превращает "Умный телевизор" в "простую Интернет Радио колонку" add_radio_guisettings() { sed -i "s|${F1_LINE}|${R1_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS} sed -i "s|${F2_LINE}|${R2_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS} sed -i "s|${F3_LINE}|${R3_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS} } FIND_STR = "touch ./tmp/.FIRST_RUN." SCRIPT_FIRST_RUN = "etc/init.d/first-run.sh" # так как HDMI выход может не использоваться, # то необходимо отключить "стартовое приветствие" off_kodi_welcome() { sed -i "s|${FIND_STR}|#&|" ${IMAGE_ROOTFS}/${SCRIPT_FIRST_RUN} }
Методы предназначены для модификации корневой файловой системы перед формированием образа дистрибутива в виде одного raw файла, который записывается на карту памяти командой dd
Это делается таким образом:
ROOTFS_POSTPROCESS_COMMAND += «add_radio_guisettings; off_kodi_welcome;»
Если вкратце, то в основном файле конфигурации Kodi 17.6, меняются «три пункта»
- Конфигурация запуска последнего выбранного ТВ канала;
- Конфигурация вывода звука, всегда подключен только аналоговый аудио выход;
- Отключение автоматического обновления;
-
Примечание:
Единственное с чем у меня возникли сложности, это то, что пришлось еще подтащить файл базы данных в формате sqlite => TV29.db, в котором указывается текущий проигрываемый ТВ канал (так как по умолчанию никакой из каналов не выбран), а через xml конфигурацию в Kodi этого не сделать.
более подробная последовательность действий для каждого пункта:
1) Нажмите на значок «шестеренки» в левом верхнем углу экрана
и выберите пункт «Настройки PVR и ТВ» (изображение телевизора с двумя рожками)
далее в левой части меню, выберете пункт «Воспроизведение», а в центральной секции «Общие»
укажите в выпадающем списке «Продолжить с последнего канала при запуске»
выбрав настройку «Передний план»
или более наглядно:
"Настройки PVR и ТВ" => "Воспроизведение" => "Продолжить с последнего канала при запуске" => "Передний план"
2) Нажмите на значок «шестеренки» в левом верхнем углу экрана и выберите пункт:
"Системные настройки" => "Дополнения" => "Обновления" => "Никогда не проверять обновления"
3) Нажмите на значок «шестеренки» в левом верхнем углу экрана и выберите пункт:
"Системные настройки" => "Аудио" => "Устройство вывода звука" => "PI: Analogue"
Как я два года неправильно смотрю телевизор.
Должен вам признаться, что я за два года так и не научился правильно смотреть телевизор.
Обычно я смотрю телевизор на кухне. К телевизору подключена плата Raspberry Pi 2B, а к плате Ethernet и HDMI разъемы. Питание платы подается через обычный USB кабель, который воткнут в USB порт телевизора т.е. по сути, включение телевизора с помощью штатного пульта дистанционного управления, подает питание и на плату Raspberry Pi, а отключение телевизора с пульта, также сразу сбрасывает питание и с платы Raspberry Pi.
Да я прекрасно осознаю, что так делать нельзя, потому что корневая файловая система мультимедиа центра Kodi (ext3), у меня функционирует в обычном режиме чтение/запись. Но я человек ленивый, и для начала я решил проверить насколько долго так можно выключать систему, до того момента, пока она совсем не перестанет грузиться, но к сожалению за два года мне этого так и не удалось сделать (возможно мне просто повезло, не знаю).
И на мой взгляд, если такой режим подошел для моего телевизора, то и для «простой Интернет Радио колонки» тоже подойдет, а так как я принудительно отключил автоматическое обновление плагинов Kodi, то и вероятность отказа файловой системы, станет еще меньше. Пока я проблемы с этим не вижу
Но вы всегда при желании можете с помощью одной yocto команды IMAGE_FEATURES += "read-only-rootfs" и определенной магии перевести ваш дистрибутив в режим "read only"
Дистрибутив «интернет радио колонки», описываемый в статье является бытовым, а что главное для бытового дистрибутива — это красивый GUI. На мой взгляд очень трудно или почти невозможно научить обычного пользователя вбивать какие либо непонятные магические команды в консоли, да он и слово то такого не знает. А вот GUI, это пожалуйста.
И это пожалуй мой главный аргумент в пользу не консольного дистрибутива. Теплый ламповый графический интерфейс пользователя Kodi, да он особо не нужен, но он есть.
(Еще я совсем забыл упомянуть, о том, что Kodi можно управлять дистанционно, например со смартфона, установив приложение «Yatse», и возможно для кого то, это будет плюсом)
Конфигурация Kodi, для управления мышью
<keymap> <global> <mouse> <wheelup>VolumeUp</wheelup> <wheeldown>VolumeDown</wheeldown> <middleclick>ChannelDown</middleclick> <longclick id="0">ChannelDown</longclick> <longclick id="1">ChannelUp</longclick> <!-- конфигурационный rocket --> </mouse> </global> </keymap>
Конфигурация переопределяет общие (global) события для следующих элементов:
- прокрутка колеса мыши вперед
- прокрутка колеса мыши назад
- нажатие на среднюю кнопку мыши
- обработка длительного нажатия мыши (3сек и более),
0 идентификатор правой кнопки, 1 идентификатор левой кнопки
более подробная информацию по настройке событий мыши:
kodi.wiki/view/Alternative_keymaps_for_mice
kodi.wiki/view/Action_IDs
kodi.wiki/view/Window_IDs
Что делать если кабельная система к вам не пришла
«Но у меня дома нет свободных Ethernet портов (или никогда и не было)» — может воскликнуть часть счастливых обладателей старых плат Raspberry Pi 1 (возможно плата покупалась для исследования и так и осталась лежать на шкафу)
А так как на плате нет встроенного Wifi, то без Ethernet подключения, она не очень функциональна.
Конечно возможность использования платы Raspberry Pi 1 без Ethernet существует, но потребует от вас определенных усилий. Обычно такие вещи интересно выполнять только в рамках изучения чего то нового т.е. это не пользовательская работа.
Итак, рассмотрим гипотетический вариант использования платы без Ethernet:
Можно подключить внешний USB — Wifi адаптер, руководствуясь тем соображением,
что адаптер должен хорошо работать под Linux
К сожалению часть WiFi адаптеров работать не будет, это не особенность представленного в данной статье дистрибутива, а скорее проблема конкретных драйверов WiFi адаптеров в ядре Linux. Можно констатировать тот факт, что в настоящий момент вы не можете просто пойти в магазин и купить любой WiFi адаптер. Скорее вы должны подобрать WiFi адаптер из списка менее проблематичных и хорошо работающих под Linux. я проверял только следующии модели: - WiFi адаптер на чипсете Atheros D-Link DWA-126 802.11n (AR9271) - WiFi адаптер NetGear WNDA3200 - WiFi адаптер NetGear WNA1100 - WiFi адаптер TP-Link TL-WN722N (AR9271) - WiFi адаптер TL-WN322G v3 - WiFi адаптер TL-WN422G - Wifi адаптер Asus USB-N53 chipset Ralink RT3572
Если у вас уже есть usb Wifi адаптер, вы можете проверить хорошо ли он работает под Linux следующим образом:
- Установите какой нибудь широко распространенный Linux дистрибутив
общего назначения, например «Ubuntu Desktop» - Загрузите систему
- Подключите ваш Wifi usb адаптер
- Запустите сетевой менеджер, и попытайтесь подключиться к вашей WiFi точке доступа
- Если все хорошо работает и ваше интернет соединение стабильное, значит ваш адаптер хорошо поддерживается и вы можете продолжить свою работу по подключению этого адаптера в специализированном дистрибутиве и возможно с другими версиями ядра
(если нет, то нет, увы — лучше даже и не пытаться)
Поддержка внешнего Wifi адаптера в «Raspberry PI»
Для корректной работы WiFi адаптера в Linux: нам потребуется две вещи:
1) Поддержка Linux ядром определенного Wifi адаптера
2) Наличие в системе модуля ядра для определенного Wifi адаптера
Возьмем к примеру адаптер TP-Link TL-WN722N. У него просто великолепная антенка.
Найдем чипсет на котором плата работает — у меня это «AR9271»,
что самое интересное, это то, что для одной и той же модели одного и того же производителя, чипсет Wifi может отличаться. Я например сталкивался с тем, что для TL-WN722N версии 2, используется уже другой чипсет Realtek RTL8188, а он уже плохо работал под Linux (на тот момент), увы такие вот дела, т.е. иногда нужно еще приглядываться к маленьким цифрам версии на обратной (темной) стороне адаптера.
Теперь найдем название параметра в конфигурации ядра отвечающую за драйвер чипсета AR9271, лучше всего поискать сочетание слов «AR9271 cateee.net»
где «cateee.net» — классный сайт с описанием конфигураций модулей ядра Linux
Сразу находим название конфигурации ядра — CONFIG_ATH9K_HTC
и название нужного нам модуля ядра ath9k_htc
и далее достаточно указать название нужного модуля в файле фрагмента конфигурации
Linux ядра => recipes-kernel/linux/files/rbpi.cfg, добавьте строку:
CONFIG_ATH9K_HTC=m
Таким образом в дальнейшем вы можете подключить любое дополнительное оборудование к вашей системе (ну если конечно в Linux ядре оно уже поддерживается)
Что делать если вы хабра гик — конструктор
И создаете крутейшие вещи, например такие как здесь или вы студент и мечтаете создать, что то похожее.
То навскидку можно взять какой нибудь Touch Screen экран для RPI на aliexpress, там же заказать подходящую аккумуляторную батарею, подключить все это к плате Raspberry Pi 1,2 или 3 (лучше к 3, так как она со встроенным Wifi), выбрать тему оформления графического интерфейса в Kodi, рассчитанную на сенсорный экран и вуаля => у вас может получиться простой audio плейер. Конечно он будет достаточно громоздкий, но он будет вашим.
Примечание: A для того, чтобы собрать Мультимедиа центр Kodi для самой бюджетной платы Raspberry Pi Zero Wifi в yocto вам достаточно изменить две строки: конфигурационный файл => build/conf/local.conf MACHINE = 'raspberrypi0-wifi' рецепт сборки Kodi => recipes-mediacentre/kodi/kodi_17.bbappend EXTRA_OECONF_append = "${@bb.utils.contains('MACHINE', \ 'raspberrypi0-wifi', '${BS_RPI}', '', d)}"
Если отзывчивость GUI Kodi 17.6 из за одного процессорного ядра в Zero вам покажется загадочной, то можно сделать финт ушами и собрать более старую, но очень быструю версию, например Kodi 15.2, он в этом плане более "дружелюбный" (иногда legacy решает все)
К сожалению платы у меня нет, поэтому проверить не могу, но по моим ощущениям это должно заработать.
1) Установите зависимости Yocto Project (например в Ubuntu): sudo apt-get install -y --no-install-suggests --no-install-recommends \ gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential \ chrpath socat cpio python python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping python3-git python3-jinja2 \ libegl1-mesa libsdl1.2-dev xterm 2) Скачайте и установите Repo: mkdir ~/bin curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo 3) Загрузите проект с github: PATH=${PATH}:~/bin mkdir radio cd radio repo init -u https://github.com/berserktv/bs-manifest \ -m raspberry/rocko/radio-rpi-0.2.8.xml repo sync 4) Соберите проект: ./shell.sh bitbake berserk-image можно тоже самое собрать для плат Raspberry Pi 3B Plus, 3B и 2B: repo init -u https://github.com/berserktv/bs-manifest \ -m raspberry/rocko/radio-0.2.8.xml
более подробную инструкцию по сборке
и записи на microSDHC карту см. в предыдущей статье
Постскриптум
Конечно идея Интернет радио колонки типовая, она всем известна и на хабре вы найдете немало статей по этому поводу, например здесь
И еще вы можете подумать, что я просто подогнал требования к готовому решению. На это я могу парировать и сказать, что нет, честно честно.
Хотите верьте, хотите нет, а дело было так: Наш рабочий офис граничит с фирмой по производству разного звукового оборудования, и однажды директор этой фирмы, назовем его мистер "Эрви" подошел к нашему заместителю директора филиала мистеру "Арсению" и спросил у него, насколько сложно повесить на плату Raspberry Pi проигрывание звукового потока т.е. плата подключается к сети и колонкам, и "слышен характерный звук". После этого мистер Арсений подошел к заместителю моего начальника - мистеру "Борису" и переадресовал вопрос ему, ну а я, как сторонний наблюдатель случайно эту идею запомнил и назвал ее "Задача трех начальников". В общем хотели как лучше, а получилось, цитата - "Но мистер Эрви, как всегда, помог." Через некоторое время я поинтересовался у мистера "Бориса" его мнением по поводу написания небольшой заметки на эту тему на "Хабре", на что "Борис" ответил, что изменение "трех пунктов меню" в Kodi, особо не привносит никакой новой информации и не заслуживает отдельного упоминания. Конечно я с ним полностью согласен и поэтому, я не расскажу ему, что что-то написал по этому поводу. Статья написана исключительно для платы "Raspberry Pi 1" взятой у мистера "Бориса" на время эксперимента, совпадения со всеми другими платами "Raspberry Pi 1" случайны.
Побольше вам сборок хороших и разных, и пусть для вас в этом году даже бывший кирпич — поет.
ссылка на оригинал статьи https://habr.com/ru/post/482714/
Добавить комментарий