Показать сообщение отдельно
Старый 10.01.2017, 22:33   #1
DelleTenebre
Старший Пользователь
 
Регистрация: 10.01.2015
Возраст: 32
Город: Бишкек
Регион: Казахстан
Машина: Subaru Outback
Сообщений: 163
DelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant futureDelleTenebre has a brilliant future
Lightbulb Android Open Accessory Protocol 2.0 и Raspberry Pi 3 (или любой linux)

После того как я разбил тач на Nexus 7 2013, а теперь сломалось запоминание канала HDMI на "народном" контроллере (+ отваливание хаба от, скорее всего, перегрева) появилась идея использовать вместо полной интеграции телефон с каким-либо крепежом. Первым делом подумал о том, что зае... устану постоянно подключать/отключать, но затем понял, что скорее всего нет, с учётом того что будет всего один кабель.

Идея, конечно же, не нова. Вопросы надо решить следующие:
  1. Зарядка телефона
  2. Как пустить звук
  3. Кнопки на руле (ну в целом управление)
  4. Возможная периферия (датчики температуры и т.п.)
  5. Камера заднего вида
Список выше составлен с учётом того что всё это уже было при "полной" интеграции.

1. Зарядка телефона
Всё просто - usb-кабель одним концом в телефон, другим в зарядник. Надеюсь что сработает.

2. Звук
Звук можно было бы пустить через предназначенный для этого разъём, но подключать два кабеля это перебор. Bluetooth... Bluetooth, в целом, это прекрасная штука. Но вот звук по bluetooth не всегда хороший. Я не претендую на экспертные знание в области bluetooth-звука, но есть у меня Alpine CDE-195BT и я пробовал соединение по BT. Не могу сказать, что качество ужас, но вот разницу с AUX слышу даже я со своими неаудиофильскими ушами. Причём, с Nexus 7 2013 было даже нормально, а вот с geekbox совсем никак. Я слышал про aptX, но поддержка должна быть и на "приёмнике" и на "передатчике".

Мне очень повезло наткнуться на проект USB audio dock for Android товарища Jacek Fedoryński. Посмотрев что к чему, расчехлил Raspberry Pi и решил повторить, тем более, что Android Open Accessory Protocol 2.0 решал почти все остальные проблемы из списка.

Сделав всё как в инструкции, я потерпел крах. Звук никак не хотел "идти" куда надо. Но! Сам протокол включался и телефон переходил в режим AOA2, и звук с него просто пропадал, значит он уходил к RPi, а он (пирог же, в переводе) уже лажал и не отдавал звук. Этот факт вселил в меня надежду и я начал дебажить RPi. Опытным путём было установлено что не пашет PulseAudio. Ну как не пашет... если после подключения телефона самому выполнить команду:
PHP код:
pactl load-module module-loopback source=`pactl list sources short | grep alsa_input.usb | cut -f 1
то звук чудесным образом появлялся, но вот автоматически никак не хотел. Не хотел и от root'а. Я не знаток linux систем и не знаю от чьего имени выполняются скрипты из правил udev, но все возможные варианты сделать PulseAudio системным демоном/дать права всем пользователям положительного результата не дали.

Ситуация с PulseAudio меня деморализовала. В тщетных попытках нагуглить решение с PulseAudio я натыкаюсь на проект AndroidCarAudioDock. Меняем проблемную строчку на:
PHP код:
(sleep 1s alsaloop -P hw:1,0,-C hw:2,0,-f S16_LE -r 44100 -t 50000 -S 2)& 
и всё работает. С чувством того, что я великолепен, слушая через RPi маршрутизованную музыку с android'а, начинаю доводить скрипты до совершенства (в моём понимании совершенства). Этот процесс вынуждает довольно часто переподключать телефон и далеко не сразу я заметил, что при каждом подключении, примерно через 30 секунд, мой ласкающий слух маршрутизованный звук зловеще превращался в тишину. Не хотелось бы показаться тупым, но эту проблему я решал два дня. Почему я не посмотрел системный лог сразу - не знаю, видимо сказались праздники и чрезмерно интенсивный отдых ... В общем, сейчас уже не вспомню как точно, но ключевым словом было timeout и путь до скрипта с alsaloop (который отвечает за маршрутизацию звука). Погуглив "udev timeout script" нашёл решение, что запустить скрипт можно с помощью утилиты at:
PHP код:
echo /path/to/script.sh at now 
и звук уже не пропадает. Проблема, ну на сколько я понял, такая: udev'у нужно чтобы скрипт что-то вернул, чаще всего: ноль - всё хорошо, отрицательные числа - что-то пошло не так. Например exit 0 в конце скрипта. Можно ещё запуск команды в фоне ( ... )$. Я честно всё перепробовал, но timeout срабатывал. Заработало только когда запускал через echo ... | at now.

В итоге получается, что по одному кабелю идёт зарядка (хоть и максимум 0.5А) и транслируется звук. К RPi можно подключить DAC или взять звук с HDMI и подключить в AUX.

3. Кнопки на руле
4. Возможная периферия (датчики температуры и т.п.)
Наверное можно объединить в один пункт. На счёт периферии все понятно, как подключать всякие модули к RPi информации куча. Плох тот факт, что у RPi нет аналогового входа, что осложняет подключение резистивных кнопок, находящихся на руле (ну и может быть каких-либо датчиков, которые Вы захотите подключить). Но есть куча вариантов решения, в том числе готовые модули.

Передавать информацию с этих датчиков оказалось очень просто, учитывая тот факт, что я чуть-чуть умею писать программы, в том числе на Python и Android

AOA Protocol 2.0 сам умеет запускать нужную программу при подключении телефона к чему либо. Примерно так:
  1. Подключаем usb-кабелем Android к ЧёрномуЯщику (назовём так).
  2. ЧёрныйЯщик понимая что к нему что-то прицепилось по USB, посылает пакеты с информацией: название, производитель, версия. И ещё что он хочет принять аудио.
  3. Если подключенным устройством оказался Android, то он отсылает версию AOA протокола, отдаёт звук (если может), и пытается запустить программу соответствующую этому конкретному ЧёрномуЯщику (так как уже знает название, производителя и версию).
Всё, дело в шляпе. Пишем программку типа моего ненавистного SerialManager'а, получаем и обрабатываем команды.

5. Камера заднего вида
Лично для меня это просто "Смотрите что ещё у меня в машине есть", а все "Ничего себе Как такое возможно".

Есть вариант подключения. Принцип такой - при включении камеры релюшки отключают Android от RPi и подключают OTG с Easycap. Более элегантного решения я придумать не смог.


---- Промежуточный итог ----
Мой репозиторий: https://github.com/delletenebre/AndroidCarAudioDock (описание пока что от форкнутого AndroidCarAudioDock)
Программа для android как прототип уже работает.
Кстати, для облегчения подключения заказал такие магнитные адаптеры.

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

Кто что думает?
__________________
Подсолнух (github) для авторегулировки яркости экрана по позиции солнца и синхронизации времени по GPS (v1.6 от 13.06.17)
Serial Manager для обработки данных с Arduino
Calls Assistant - замена TabletTalk

Последний раз редактировалось DelleTenebre; 10.01.2017 в 23:11.
DelleTenebre вне форума   Ответить с цитированием