Основные предпосылки:
- Есть старая неиспользуемая плата 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" случайны.
Побольше вам сборок хороших и разных, и пусть для вас в этом году даже бывший кирпич — поет.