• Дистрибутив собранный в Yocto Project

    Berserk

    Мультимедиа центр - платформой для которого является Raspberry PI базируется на версии Kodi 17.6 Версия операционной системы собрана с помощью системы сборки "Yocto Project". читать далее

    Коди в Yocto Project
  • Yocto Project

    Роутер на Raspberry PI

    Сборка маршрутизатора c "нуля" для Raspberry Pi c использованием системы сборки "Yocto Project" читать далее

    Маршрутизатор с нуля
  • Феерический хранитель экрана

    Kodi Universe

    Проект является простым плагином для Kodi. Проект показывает как можно создать очень красивый хранитель экрана целиком опираясь на работу "open source" мирового сообщества. читать далее

    Феерический Хранитель экрана
  • примеры проектов

    Raspberry Pi

    Разное → Raspberry Pi — что можно сделать на основе «малинки»?read more

    Ссылка на статью с Хабрахабра
  • Дистрибутив собранный в Yocto Project

    Berserk

    Мультимедиа центр - платформой для которого является Raspberry Pi базируется на версии Kodi 17.6 Версия операционной системы собрана с помощью системы сборки "Yocto Project". читать далее

Простейшая интернет радио колонка "Kodi"
или спасение "Малинового" кирпича





дата: 02.01.2020

Основные предпосылки:

  1. Есть старая неиспользуемая плата Raspberry Pi первого поколения
  2. Плата лежит на шкафу мертвым грузом и не используется - плата "Кирпич"

Что хотелось бы получить:

  1. В определенный момент времени (например по настроению)
    плата перестает быть "Кирпичом", и в нее вставляется волшебная карта памяти;
  2. К плате подключается Ethernet кабель и штекер от обычной бытовой колонки или наушников;
  3. После подачи питания бывший "Кирпич" - поет

Основная идея:

  1. Минимальное количество телодвижений для какой либо настройки,
    в самом идеальном случае, подключаем только "Ethernet" кабель, питание
    и колонки, и больше ничего не делаем, от слова "совсем".
  2. Бывший "Кирпич" из коробки поддерживаем например 20 интернет радиостанций, переключение
    которых по кругу можно повесить на нажатие колесика мыши или же на определенный pin GPIO
    (подключить два провода и их замкнуть (моя мечта с детства)).
  3. Управление осуществляется по радио каналу, и этим радио каналом может стать обычная радио мышь.
  4. Взять уже готовую систему, дистрибутив собрать в "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

И такое решение имеет ряд преимуществ:

  1. Достаточно быстрое (выход на рабочий режим от подачи питания 30-40сек)
  2. Достаточно надежное (меньше программ, меньше точек отказа)
  3. Консольный дистрибутив намного проще перевести в режим только чтение
    т.е. программы ничего не записывают корневую в файловую систему
    (а файловая система на носителе microSDHC является на мой взгляд первым кандидатом по отказам)
Примечание:
	В 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 = "0"
	R1_LINE = "1"
	# конфигурация вывода звука, всегда подключен только аналоговый аудио выход
	F2_LINE = "PI:HDMI"
	R2_LINE = "PI:Analogue"
	# так как HDMI по умолчанию не используется отключаю автоматическое обновление
	# а то может получиться что питание уехало, а данные остались не записанными
	F3_LINE = "0"
	R3_LINE = "2"
	
	 
	# метод отвечает за добавление конфигурации:
	# которая превращает "Умный телевизор" в "простую Интернет Радио колонку"
	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, да он особо не нужен, но он есть.
(Aх да, совсем забыл, 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 идентификатор левой кнопки

более подробная информацию по настройке событий мыши:

https://kodi.wiki/view/Alternative_keymaps_for_mice
https://kodi.wiki/view/Action_IDs
https://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' 
	
	  рецепт сборки образа  => 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
	
	(более подробную инструкцию по сборке и записи на microSDHC карту см. в предыдущей статье)
	
	можно тоже самое собрать для плат Raspberry Pi 3B Plus, 3B и 2B:
	repo init -u https://github.com/berserktv/bs-manifest -m raspberry/rocko/radio-0.2.8.xml
	


Постскриптум


Конечно идея Интернет радио колонки типовая, она всем известна и на хабре вы найдете немало статей по этому поводу, например здесь

И еще вы можете подумать, что я просто подогнал требования к готовому решению. На это я могу парировать и сказать, что нет, честно честно.

История мистера «Лю»
	
	Выйдя на улицу в тишину осенней ночи, я поднял взгляд на небо, 
	полное звезд, и, казалось, ветер донес голос моего тренера: 
	
	«Ключ к замечательной жизни — это страстное увлечение чем-либо».
	
	Теперь я понимал, как он был прав. 
	Моя жизнь превратилась в стремительно несущуюся ракету (см. выше), 
	
	и у меня было только одно желание: услышать, как она взрывается, 
	попав в цель. Цель эта не имела никакого практического смысла, но, 
	когда я ее достигну, можно будет считать, что моя жизнь состоялась. 
	
	Я не знал, почему направляюсь именно туда, 
	но достаточно было одного только желания идти, 
	этого импульса, лежащего в основе человеческой природы. 
	
	Как это ни странно, я никогда не изучал материалы, связанные с Этим. 
	
	Мы с Ним были двумя рыцарями, посвятившими всю свою жизнь подготовке 
	к одному-единственному поединку, и до тех пор, пока я не буду готов, 
	я не буду Его искать и не буду о Нем думать.
	
	                                        Лю Цысинь - «Шаровая молния»
	


Побольше вам сборок хороших и разных.



Продолжение следует ...