GPIO для чайников (часть 6)
-
Она действительно далека от идеала
Например хардкодать список радиостанций это совсем не true way.
Форкаться необязательно нужно просто использовать неблокирующе функции.
Ну кроме того такую программу я бы написал на bash гораздо проще.
А в качестве плеера гораздо лучше подойдет mpd. Он специально заточен на управление извне и прочие фенечки.
http://mpd.wikia.com/wiki/What_MPD_Is_and_Is_Not -
Коллега, подскажите пожалуйста на какой версии сборки Вы реализовали этот проект. У меня сборка 2012-10-28-wheezy-raspbian и команда omxplayer не выполняется, только выдает сообщение: have a nice day ;).
Конкретно перепробовал разные адреса непосредственно взятые из Radio Tray, т.е. заведомо работающие и никак у меня не получается укротить omxplayer. -
Спасибо владельцам сайта за новый движок. Конечно пока не привычно и не обошлось без косяков. Кто захочет повторить приведенную в этом блоге программу для интернет-радио будьте внимательны к синтаксису. В данном случае закралась ошибка, которой, как мне кажется небыло на старом движке, а именно в строках содержащих оператор #include вместо уловых скобок <> появились апострофы '', т.е. если написано #include 'bcm2835.h', то следует читать #include <bcm2835.h>, иначе компилятор выдаст ошибку.
Теперь касательно темы блога.
У меня все получилось повторить, но пока до автозагрузки.
Спасибо автору.
К сожалению наша переписка после 31.01.13 пропала, поэтому повторюсь, т.к. решение вопроса по применению omxplayer, на мой взгляд не лежит на поверхности и может быть интересным другим пользователям, интересующимся проблемой воспроизведения аудио и видео.
Итак, для того, чтобы заставить omxplayer воспроизводить аудио необходимо в настройках raspi-config в параметре Memory_split указать значение 32, а для воспроизведения видео соответственно 64. -
Про угловые скобки знаю. Не было времени исправлять, хотелось побыстрее обновлённую версию выложить.
-
Не беда.
Все наладится. -
У меня не получилась автозагрузка как предлагает автор. Почему? Разбираться не стал, оставил на потом. Предполагаю, что предложенный автором способ заключается в вызове программы до запуска графической оболочки LXPanel. Я пошел иным путем, а именно включил функцию вызова программы в меню LXPanel и заставил ее выполняться после полной загрузки RPI, тем самым она работает в фоновом режиме и не мешает работе других приложений. Правда кроме звука визуально ничего не говорит о ее присутствии. Т.е. можно применять как чистое радио без клавы, мыши и пр. или полноценно как фоновую среду. На кнопочку отзывается из под любого приложения ну а удалить можно так как предлагает автор из LxTerminala Killall radio. На кнопку q у меня почему-то. хотя думаю понятно почему, не срабатывает, да это и к лучшему, не будет мешать другим приложениям.
Коротко:- В /usr/bin создал скрипт или исполняемый файл, не знаю как корректно выразиться, radio c содержимым
#! /bin/sh cd /home/pi/ sudo ./radio
- В /usr/share/applications/ , /home/pi/desktop , /home/pi/config/autostart создал файл radio.desktop c содержимым:
[Desktop Entry] Name=internet-radio Encoding=UTF-8 Comment=Amateur radio weak signal communications Exec=/usr/bin/radio TryExec=radio Terminal=true Type=Application Categories=AudioVideo;Audio;Player;GTK; Icon=radiotray
Может в какой из указанных папок и не нужно было вставлять его (radio.desktop). но у меня так получилось,
Теперь в главном меню в пункте Sound&Video появился пункт internet-radio и его при желании можно запускать непосредственно из главного меню. Категорию и иконку я взял от Radiotray, т.к. это ближе к теме, но можно указать любую другую или создать собственную указав в Categories=, хотя если честно, то я не пробовал. Икону также взял готовую от radiotray, свою создавать не пробовал.
Для того, чтобы программа не загружалась автоматически необходимо удалить radio.desktop из папки /home/pi/config/autostart.
Все. -
Надеюсь последний на сегодня мой комментарий.
При работе этой программы получаем 100% загрузку процессора и если пользуем ее в фоновом режиме, то это не очень хорошо, поэтому предлагаю лобовое решение по снижению загрузки проца до 15-20% без заметной потери функциональности. Просто несколько увеличилось время нажатия кнопки и все. Дискомфорта у мня такое решение не вызвало. Итак модифицируем одну строку:
while(bcm2835_gpio_lev(PIN_IN)){delay(1000);} // Просто ждём, пока не будет нажата кнопка управления
т.е. добавлен delay(1000);
Все. -
Несовсем верный вывод. Это в Виндусе, если показывается 100% загрузка процессора, значит компьютер задохнулся от возложенных на него задач и находится на грани зависания. В Линуксе на вашем RPi индикатор загрузки процессора показывает не его реальную загрузку, а скорее процент загрузки свободного времени. Если вы запустите ещё какое-либо приложение, оно спокойно запустится и будет работать. Просто на опрос кнопки процессор будет выделять меньше своего свободного времени. Задачи же имеющие более высокий приоритет, чем наша программа, сами прекрасно отберут себе ресурсов столько, сколько им нужно. Опрос состояния кнопки не является ресурсоёмкой задачей, поэтому и не представляет для процессора сколь-либо заметной нагрузки. Но раз у процессора куча свободного времени и делать ему больше нечего, он с удовольствием отдаёт всё своё свободное время процессу опроса кнопочки. Разумеется, если мы запусти несколько десятков тысяч процессов опроса кнопки, то они уже реально смогут загрузить процессор.
И ещё, если вы продолжаете использовать RPi как десктоп, то в репозитариях есть масса уже готовых интрнет-приёмников с графической оболочкой и тысячами радиостанций в плей-листе. Так что в вашем случае лучше выбрать одну из таких программ. (просто вбейте в поиск репозитария слово radio и выбирайте любую). -
Спасибо за разъяснение работы индикатора загрузки. Я не заядлый любитель линукс, но чисто визуально мне показалось, что при индикации полной загрузки процессора другие приложения прихрамывают, но это видимо отдельная тема.
Что касается второго вопроса о графической оболочке, то Вы видимо меня не совсем поняли. Я предложил иной способ загрузки прогаммы интернет радио в отличии от Вашего, т.к. Ваша методика у меня не сработала. Т.е. при описанном мною способе программа так же как и Вас загружается при включении RPI без клавы, мыши и пр.. Включил и получил радио, управляемое кнопкой. Ну так у меня получилось и не надо меня ругать. Это работает. Просто я имел в виду, что при таком способе сохраняется возможность полноценно применять графическую оболочки, при условии, что это необходимо. Еще раз повторюсь, что окна программы не видно. но кнопка работает. Может изложил сумбурно, но все это работает именно так как описано в Ваших техусловиях. -
Еще раз про загрузку программ из графической оболочки.
Как я понял есть программы, которые необходимо запускать именно при работаещей графике. Я столкнулся с этим при экспериментах с радиолюбительской программой WSPR. Все попытки загрузить эту прогу без графической оболочки у меня провалились. Это видимо от незнания и непонимания, но тем не менее результат был достигнут и прога стала загружаться автономно, т.е. при включении питания RPI. И я не вижу ничего зазорного при таком подходе. Может кому и пригодится. -
Ну дак а я вас и не ругаю. Способ, который описал я, является стандартным способом автозапуска приложений в Линуксе. Это не моё изобретение. Почему он у вас не сработал, я ничего сказать не могу, т.к. тоже в Линуксе чайник и сам с ним разбираюсь потихоньку.
-
Х-сервер (который запускается при старте графической оболочки LXDE, либо другой) требуют программы, которые для отображения графики используют его API. Грубо говоря, если интерфейс этих программ выглядит в виде типичного окна со стандартными кнопочками, то разумеется, просто в терминале такая программа не заработает. Есть программы, которые с графикой работают напрямую. Им LXDE тоже ненужен. В основном это либо игрушки, либо всякие демки с красивыми визуальными эффектами. А есть программы с псевдографическим интерфейсом, это когда графика рисуется в терминале печатными символами. Им тоже LXDE без надобности.
-
ОК!
Будем работать над ошибками.
Мой респект Вам! -
Куда уж подробнее. И так всё разжёвано
-
Здравствуйте!
А не могли бы рассмотреть работу RPI и датчика температуры DS18B20? -
У меня нет такого датчика. Создайте тему в форуме. Не я, так кто-нить другой подскажет.
-
Привет всем!
По поводу кода возник следующий вопрос:
В какое место кода добавить write(); чтобы передать работающему дочернему процессу кнопку ENTER сразу после открытия станции? и как правильно передать нажатие этой кнопки? в ascii?
Пробую с другими плеерами ибо omx не установился на archlinux. -
в случае с mocp плеером можно запустить один раз в начале сервер
execlp("mocp", "mocp", "-S", NULL);
а затем каждую радиостанцию скармливать ему с параметром -l
вот только после запуска сервера программа завершает свою работу.
что тут можно придумать? -
У меня вылазят ошибки при компиляции
radio.c:32:1: warning: excess elements in scalar initializer [enabled by default] radio.c:32:1: warning: (near initialization for ‘station1’) [enabled by default] radio.c:33:1: warning: excess elements in scalar initializer [enabled by default] radio.c:33:1: warning: (near initialization for ‘station2’) [enabled by default] radio.c:34:1: warning: excess elements in scalar initializer [enabled by default] radio.c:34:1: warning: (near initialization for ‘station3’) [enabled by default] radio.c:35:1: warning: excess elements in scalar initializer [enabled by default] radio.c:35:1: warning: (near initialization for ‘station4’) [enabled by default] radio.c: In function ‘play_station’: radio.c:91:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:92:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:93:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:94:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’
в чем причина?
-
Спасибо за интересную и полезную статью! Хорошая статья и ее реализация! Только вот у меня не компилируется кнопка, а об этой программе вообще нет смысла говорить... надо разобраться с работой кнопки...