DelleTenebre
10.01.2017, 22:33
После того как я разбил тач на Nexus 7 2013, а теперь сломалось запоминание канала HDMI на "народном" контроллере (+ отваливание хаба от, скорее всего, перегрева) появилась идея использовать вместо полной интеграции телефон с каким (ru.aliexpress.com/item/Baseus-Universal-360-Rotating-Magnetic-Car-Phone-Holder-Stand-For-All-Smartphone-Magnet-Mount-Stand-For/32696006846.html)-либо (ru.aliexpress.com/item/ROCK-Mobile-Car-Phone-Holder-for-iPhone-Samsung-car-styling-Car-Dashboard-Adjustable-Bracket-Movil-Car/32667080934.html) крепежом (ru.aliexpress.com/item/Car-Mobile-Phone-Holder-for-Iphone-6-Sumsung-Car-Air-Vent-Mount-Holder-USAMS-360-Degree/32604944534.html). Первым делом подумал о том, что зае... устану постоянно подключать/отключать, но затем понял, что скорее всего нет, с учётом того что будет всего один кабель.
Идея, конечно же, не нова. Вопросы надо решить следующие:
Зарядка телефона
Как пустить звук
Кнопки на руле (ну в целом управление)
Возможная периферия (датчики температуры и т.п.)
Камера заднего вида
Список выше составлен с учётом того что всё это уже было при "полной" интеграции.
1. Зарядка телефона
Всё просто - usb-кабель одним концом в телефон, другим в зарядник. Надеюсь что сработает.
2. Звук
Звук можно было бы пустить через предназначенный для этого разъём, но подключать два кабеля это перебор. Bluetooth... Bluetooth, в целом, это прекрасная штука. Но вот звук по bluetooth не всегда хороший. Я не претендую на экспертные знание в области bluetooth-звука, но есть у меня Alpine CDE-195BT и я пробовал соединение по BT. Не могу сказать, что качество ужас, но вот разницу с AUX слышу даже я со своими неаудиофильскими ушами. Причём, с Nexus 7 2013 было даже нормально, а вот с geekbox совсем никак. Я слышал про aptX (https://www.aptx.com), но поддержка должна быть и на "приёмнике" и на "передатчике".
Мне очень повезло наткнуться на проект USB audio dock for Android (http://blog.jfedor.org/2013/01/usb-audio-dock-for-android.html) товарища Jacek Fedoryński. Посмотрев что к чему, расчехлил Raspberry Pi и решил повторить, тем более, что Android Open Accessory Protocol 2.0 (https://source.android.com/devices/accessories/aoa2.html) решал почти все остальные проблемы из списка.
Сделав всё как в инструкции, я потерпел крах. Звук никак не хотел "идти" куда надо. Но! Сам протокол включался и телефон переходил в режим AOA2, и звук с него просто пропадал, значит он уходил к RPi, а он (пирог же, в переводе) уже лажал и не отдавал звук. Этот факт вселил в меня надежду и я начал дебажить RPi. Опытным путём было установлено что не пашет PulseAudio. Ну как не пашет... если после подключения телефона самому выполнить команду:
pactl load-module module-loopback source=`pactl list sources short | grep alsa_input.usb | cut -f 1`
то звук чудесным образом появлялся, но вот автоматически никак не хотел. Не хотел и от root'а. Я не знаток linux систем и не знаю от чьего имени выполняются скрипты из правил udev, но все возможные варианты сделать PulseAudio системным демоном/дать права всем пользователям положительного результата не дали.
Ситуация с PulseAudio меня деморализовала. В тщетных попытках нагуглить решение с PulseAudio я натыкаюсь на проект AndroidCarAudioDock (https://github.com/SquidIndustries/AndroidCarAudioDock). Меняем проблемную строчку на:
(sleep 1s ; alsaloop -P hw:1,0,0 -C hw:2,0,0 -f S16_LE -r 44100 -t 50000 -S 2)&
и всё работает. С чувством того, что я великолепен, слушая через RPi маршрутизованную музыку с android'а, начинаю доводить скрипты до совершенства (в моём понимании совершенства). Этот процесс вынуждает довольно часто переподключать телефон и далеко не сразу я заметил, что при каждом подключении, примерно через 30 секунд, мой ласкающий слух маршрутизованный звук зловеще превращался в тишину. Не хотелось бы показаться тупым, но эту проблему я решал два дня. Почему я не посмотрел системный лог сразу - не знаю, видимо сказались праздники и чрезмерно интенсивный отдых :drunk:... В общем, сейчас уже не вспомню как точно, но ключевым словом было timeout и путь до скрипта с alsaloop (который отвечает за маршрутизацию звука). Погуглив "udev timeout script" нашёл решение, что запустить скрипт можно с помощью утилиты at:
echo /path/to/script.sh | at now
и звук уже не пропадает. Проблема, ну на сколько я понял, такая: udev'у нужно чтобы скрипт что-то вернул, чаще всего: ноль - всё хорошо, отрицательные числа - что-то пошло не так. Например exit 0 в конце скрипта. Можно ещё запуск команды в фоне ( ... )$. Я честно всё перепробовал, но timeout срабатывал. Заработало только когда запускал через echo ... | at now.
В итоге получается, что по одному кабелю идёт зарядка (хоть и максимум 0.5А) и транслируется звук. К RPi можно подключить DAC или взять звук с HDMI и подключить в AUX.
3. Кнопки на руле
4. Возможная периферия (датчики температуры и т.п.)
Наверное можно объединить в один пункт. На счёт периферии все понятно, как подключать всякие модули к RPi информации куча. Плох тот факт, что у RPi нет аналогового входа, что осложняет подключение резистивных кнопок, находящихся на руле (ну и может быть каких-либо датчиков, которые Вы захотите подключить). Но есть куча вариантов решения, в том числе готовые модули (https://ru.aliexpress.com/item/16-Bit-I2C-4-Channel-ADS1115-Module-ADC-with-Pro-Gain-Amplifier-New/32660585805.html).
Передавать информацию с этих датчиков оказалось очень просто, учитывая тот факт, что я чуть-чуть умею писать программы, в том числе на Python и Android :blush:
AOA Protocol 2.0 сам умеет запускать нужную программу при подключении телефона к чему либо. Примерно так:
Подключаем usb-кабелем Android к ЧёрномуЯщику (назовём так).
ЧёрныйЯщик понимая что к нему что-то прицепилось по USB, посылает пакеты с информацией: название, производитель, версия. И ещё что он хочет принять аудио.
Если подключенным устройством оказался Android, то он отсылает версию AOA протокола, отдаёт звук (если может), и пытается запустить программу соответствующую этому конкретному ЧёрномуЯщику (так как уже знает название, производителя и версию).
Всё, дело в шляпе. Пишем программку типа моего ненавистного SerialManager'а, получаем и обрабатываем команды.
5. Камера заднего вида
Лично для меня это просто "Смотрите что ещё у меня в машине есть", а все "Ничего себе :shok: Как такое возможно".
Есть вариант подключения. Принцип такой (www.youtube.com/watch?v=OINrdbUVR6I) - при включении камеры релюшки отключают Android от RPi и подключают OTG с Easycap. Более элегантного решения я придумать не смог.
---- Промежуточный итог ----
Мой репозиторий: https://github.com/delletenebre/AndroidCarAudioDock (описание пока что от форкнутого AndroidCarAudioDock)
Программа для android как прототип уже работает.
Кстати, для облегчения подключения заказал такие магнитные адаптеры (https://ru.aliexpress.com/item/Phone-Charger-Adapter-Magnetic-Charging-Cable-Magnetic-Adapter-For-iPhone-Samsung-Huawei-Sony-LG-HTC-Xiaomi/32749686407.html?spm=2114.13010608.0.0.ZV3oFT).
На данный момент это просто эксперимент. Медленно продвигающийся. Возможно, что всё заброшу.
Кто что думает?
Идея, конечно же, не нова. Вопросы надо решить следующие:
Зарядка телефона
Как пустить звук
Кнопки на руле (ну в целом управление)
Возможная периферия (датчики температуры и т.п.)
Камера заднего вида
Список выше составлен с учётом того что всё это уже было при "полной" интеграции.
1. Зарядка телефона
Всё просто - usb-кабель одним концом в телефон, другим в зарядник. Надеюсь что сработает.
2. Звук
Звук можно было бы пустить через предназначенный для этого разъём, но подключать два кабеля это перебор. Bluetooth... Bluetooth, в целом, это прекрасная штука. Но вот звук по bluetooth не всегда хороший. Я не претендую на экспертные знание в области bluetooth-звука, но есть у меня Alpine CDE-195BT и я пробовал соединение по BT. Не могу сказать, что качество ужас, но вот разницу с AUX слышу даже я со своими неаудиофильскими ушами. Причём, с Nexus 7 2013 было даже нормально, а вот с geekbox совсем никак. Я слышал про aptX (https://www.aptx.com), но поддержка должна быть и на "приёмнике" и на "передатчике".
Мне очень повезло наткнуться на проект USB audio dock for Android (http://blog.jfedor.org/2013/01/usb-audio-dock-for-android.html) товарища Jacek Fedoryński. Посмотрев что к чему, расчехлил Raspberry Pi и решил повторить, тем более, что Android Open Accessory Protocol 2.0 (https://source.android.com/devices/accessories/aoa2.html) решал почти все остальные проблемы из списка.
Сделав всё как в инструкции, я потерпел крах. Звук никак не хотел "идти" куда надо. Но! Сам протокол включался и телефон переходил в режим AOA2, и звук с него просто пропадал, значит он уходил к RPi, а он (пирог же, в переводе) уже лажал и не отдавал звук. Этот факт вселил в меня надежду и я начал дебажить RPi. Опытным путём было установлено что не пашет PulseAudio. Ну как не пашет... если после подключения телефона самому выполнить команду:
pactl load-module module-loopback source=`pactl list sources short | grep alsa_input.usb | cut -f 1`
то звук чудесным образом появлялся, но вот автоматически никак не хотел. Не хотел и от root'а. Я не знаток linux систем и не знаю от чьего имени выполняются скрипты из правил udev, но все возможные варианты сделать PulseAudio системным демоном/дать права всем пользователям положительного результата не дали.
Ситуация с PulseAudio меня деморализовала. В тщетных попытках нагуглить решение с PulseAudio я натыкаюсь на проект AndroidCarAudioDock (https://github.com/SquidIndustries/AndroidCarAudioDock). Меняем проблемную строчку на:
(sleep 1s ; alsaloop -P hw:1,0,0 -C hw:2,0,0 -f S16_LE -r 44100 -t 50000 -S 2)&
и всё работает. С чувством того, что я великолепен, слушая через RPi маршрутизованную музыку с android'а, начинаю доводить скрипты до совершенства (в моём понимании совершенства). Этот процесс вынуждает довольно часто переподключать телефон и далеко не сразу я заметил, что при каждом подключении, примерно через 30 секунд, мой ласкающий слух маршрутизованный звук зловеще превращался в тишину. Не хотелось бы показаться тупым, но эту проблему я решал два дня. Почему я не посмотрел системный лог сразу - не знаю, видимо сказались праздники и чрезмерно интенсивный отдых :drunk:... В общем, сейчас уже не вспомню как точно, но ключевым словом было timeout и путь до скрипта с alsaloop (который отвечает за маршрутизацию звука). Погуглив "udev timeout script" нашёл решение, что запустить скрипт можно с помощью утилиты at:
echo /path/to/script.sh | at now
и звук уже не пропадает. Проблема, ну на сколько я понял, такая: udev'у нужно чтобы скрипт что-то вернул, чаще всего: ноль - всё хорошо, отрицательные числа - что-то пошло не так. Например exit 0 в конце скрипта. Можно ещё запуск команды в фоне ( ... )$. Я честно всё перепробовал, но timeout срабатывал. Заработало только когда запускал через echo ... | at now.
В итоге получается, что по одному кабелю идёт зарядка (хоть и максимум 0.5А) и транслируется звук. К RPi можно подключить DAC или взять звук с HDMI и подключить в AUX.
3. Кнопки на руле
4. Возможная периферия (датчики температуры и т.п.)
Наверное можно объединить в один пункт. На счёт периферии все понятно, как подключать всякие модули к RPi информации куча. Плох тот факт, что у RPi нет аналогового входа, что осложняет подключение резистивных кнопок, находящихся на руле (ну и может быть каких-либо датчиков, которые Вы захотите подключить). Но есть куча вариантов решения, в том числе готовые модули (https://ru.aliexpress.com/item/16-Bit-I2C-4-Channel-ADS1115-Module-ADC-with-Pro-Gain-Amplifier-New/32660585805.html).
Передавать информацию с этих датчиков оказалось очень просто, учитывая тот факт, что я чуть-чуть умею писать программы, в том числе на Python и Android :blush:
AOA Protocol 2.0 сам умеет запускать нужную программу при подключении телефона к чему либо. Примерно так:
Подключаем usb-кабелем Android к ЧёрномуЯщику (назовём так).
ЧёрныйЯщик понимая что к нему что-то прицепилось по USB, посылает пакеты с информацией: название, производитель, версия. И ещё что он хочет принять аудио.
Если подключенным устройством оказался Android, то он отсылает версию AOA протокола, отдаёт звук (если может), и пытается запустить программу соответствующую этому конкретному ЧёрномуЯщику (так как уже знает название, производителя и версию).
Всё, дело в шляпе. Пишем программку типа моего ненавистного SerialManager'а, получаем и обрабатываем команды.
5. Камера заднего вида
Лично для меня это просто "Смотрите что ещё у меня в машине есть", а все "Ничего себе :shok: Как такое возможно".
Есть вариант подключения. Принцип такой (www.youtube.com/watch?v=OINrdbUVR6I) - при включении камеры релюшки отключают Android от RPi и подключают OTG с Easycap. Более элегантного решения я придумать не смог.
---- Промежуточный итог ----
Мой репозиторий: https://github.com/delletenebre/AndroidCarAudioDock (описание пока что от форкнутого AndroidCarAudioDock)
Программа для android как прототип уже работает.
Кстати, для облегчения подключения заказал такие магнитные адаптеры (https://ru.aliexpress.com/item/Phone-Charger-Adapter-Magnetic-Charging-Cable-Magnetic-Adapter-For-iPhone-Samsung-Huawei-Sony-LG-HTC-Xiaomi/32749686407.html?spm=2114.13010608.0.0.ZV3oFT).
На данный момент это просто эксперимент. Медленно продвигающийся. Возможно, что всё заброшу.
Кто что думает?