Автомобильная говорилка своими руками

Своими руками

Панель приборов как-то примелькивается, далеко не всегда кидаю на неё взгляд. Бывало как-то еду себе еду, а дверь оказывается неплотно закрыта — не обратил внимание на лампочку, проехал достаточно. А ещё бывает ручник не до конца отпустился, а я поехал. А ещё бывали случаи когда заглушил машину, а селектор в положение P забыл поставить… А ещё бывает багажник не закрыт до конца…

В общем, хотелось бы чтобы машинка издавала какой-нибудь звук при этих событиях, а она молчит, как рыба об лёд. Только истошно трынчать начинает, стоит отстегнуть ремень безопасности.

Ну тут я подумал: «а в чём, собственно, дело? Можно же сделать свой электронный бубенчик, благо опыт есть, повесить его на сигнал скорости и сигнал ручника, и чтобы он бзынкнул разок, когда есть скорость и ручник тоже есть?

А ещё чтобы за дверьми последил…
И за багажником…
И если рычаг забыл в P перевести, чтобы тоже…
И если давление масла упадёт, чтобы сказал…
И если аккумулятор не заряжается…
Топлива осталось мало — тоже пусть предупредит…
Ну и озвучит как-то срабатывание ABS и TCS…
И за напряжением в сети последит…
И за нагревом двигателя…

И… » — так я мечтал и мечтал составляя список всех событий, которые бы мне хотелось озвучить в машине. Затем пришёл в себя, посмотрел внимательно, вычеркнул половину и побежал проектировать то, что в итоге станет вот такой штукой:

Автомобильная говорилка своими руками

Решено было что события должны озвучиваться голосом. Все звуки сохраняются в формате wav на карте MicroSD, в файловой системе fat16, прямо в корневой папке. О том, как читать MicroSD, fat16 и wav я уже писал ранее

Схемка

Автомобильная говорилка своими руками, схема

Питание

Схема полностью обесточивается при помощи мощного транзистора VT1 IRLML9301, который открывается тразистором VT2, который, в свою очередь, открывается появлением питания на проводе зажигания, через VD1, R1, и продолжает удерживаться открытым самим МК через VD2, R7.

Далее питание расходится на три цепи:

1) VD6 и C4 питают громкоговорители
2) независимо от них VD7 и C5 питают стабилизатор. Разделение цепей позволяет уменьшить всплески на одной сети, когда на другой сильно скачет ток.
3) и третья цепь — делитель, образованный R16 и R17 с фильтрующим конденсатором С6, которые нужны для измерения напряжения в сети. Делитель 16.5 к 1 позволяет измерять напряжение, используя в качестве референтного 1.1 Вольт.

Все компоненты выбирались так, чтобы работать в холодную погоду. В схеме присутствует SD карта, которая должна питаться не более чем 3.6 Вольтами. На момент разработки схемы у меня не было стабилизатора на 3.3 Вольта, поэтому его роль играет регулируемый стабилизатор LM217L, работающий при температуре до -40 (и все используемые конденсаторы поэтому, кстати, X7R).

У регулируемых стабилизаторов есть один неприятный момент — чтобы они работали как следует через них должен течь минимально некоторый ток, в частности для LM217 при разнице входного и выходного напряжения 13 Вольт, должно составлять около 0.8мА. Этот ток организуется при помощи делителя из резисторов R19 и R20, которые и задают выходное напряжение на уровне 3.33 Вольта.

Воспроизведение звука

Автомобильная говорилка своими руками

С воспроизведением звука решил не заморачиваться, взял два 30мм динамика SG мощностью 1 Вт и сопротивлением 50 Ом, подключил их последовательно. Звук формируется при помощи ШИМ выхода, который подаётся на базу транзистора VT7 через резистор R21. R21 ограничивает ток на базе транзистора что, в свою очередь, ограничивает ток на его коллекторе. Выравнивание ШИМ сигнала происходит прямо параллельно динамикам при помощи конденсатора C8, который. Диоды VD8 и VD9 защищают линию от индуктивных всплесков.

Одним из недостатков такого вывода звука является постоянное потребление схемой тока при не-нулевой заполненности ШИМ. Как известно, запись звука представляет собой колебания значений вокруг некоего среднего, значит вывод звука нулевой громкости уже будет создавать половинную нагрузку на схему вывода. Чтобы этого избежать, форма сигнала изменяется программно, реализуется схема которую я назвал «электронный конденсатор».

Суть её заключается в том, что значения коэффициента заполнения ШИМ постепенно сводятся к нулю, и увеличиваются, только если выводится звук достаточно большой амплитуды. В результате вывод тихих звуков пропорционально снижает электрическую нагрузку на эту схему.

Карта MicroSD

Посколюку SD (но не SDHC) карты умеют работать по интерфейсу SPI, использовать её достаточно просто. Карта подключается к SPI порту микроконтроллера. Вывод CS карты подтянут резистором R23 200кОм к линии питания, дабы карта не реагировала на всплески на линии, пока МК находится в состоянии сброса. Нашёл несколько карт MicroSD у себя дома, но все они оказались на 2Гб. Несколько расточительно использовать карты такого объёма для 3 мегабайт звуков. Но зато есть запас на будущее 😉

Сигналы «по плюсу»

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

Сигналы, присутствие которых обозначается наличием положительного напряжения на линии, такие как «зажигание», «ABS», положения селектора АКПП (блок А), подключаются через полевые транзисторы VT3, который замыкает вход МК на «землю». Вход МК внутренним резистором подтягивается к линии питания. Подавление дребезга на этих входах идёт программно

Входы импульсов от тахометра и спидометра подходят на входы внешних прерываний INT1 и INT0 (блок B). Для них дребезг уменьшается аппаратно, при помощи конденсаторов C2.

Снимок65

Сигнал тахометра
Снимок66

Сигнал спидометра

Сигнал от генератора (charge) считается активным, когда на нём низкий уровень. Но по факту между «общим» проводом и этой линией возникает разность потенциалов в этот момент более 1.5 Вольт. Поэтому на нём собрана схема «по плюсу», единственное отличие — это делитель из резисторов R10/R14. Пороговое напряжение транзистора 1-3 Вольта. При таком делителе, чтобы транзистор открылся напряжение на линии должно составить минимум 3.5 Вольта (максимум 10.5), что вполне отвечает нуждам этого входа.

Сигналы «по минусу»

Сигналы от датчиков недостаточного уровня омывающей жидкости, недостаточного давления масла, непристёгнутого ремня, концевиков ручного тормоза, дверей и багажника, и сигнал «check engine» замыкаются на «землю» (блок C). Схема управляется при помощи биполярного PNP транзистора VT6, который замыкает вход МК на линию питания, в остальное время вход притянут к низкому уровню резистором R18.

Аналоговые сигналы

Сигналы от датчика уровня топлива и датчика температуры охлаждающей жидкости притягиваются к стабилизированному напряжению самой приборной панелью. В результате, на этих линиях образуются напряжения в диапазоне 1…8 Вольт . Чтобы снять эти напряжения, используется делитель из резисторов R12 и R15 (блок D), всплески и помехи фильтруются конденсатором С3.

Изготовление

Всё это дело я разместил на двусторонней плате 40х60мм.

Автомобильная говорилка своими руками Автомобильная говорилка своими руками

Для подключения использовал разъёмы из серии CHU / CWF-R с шагом контактов 2.5мм. Контакты везде пропаяны с обеих сторон платы, дабы избежать проникновения влаги в отверстия с последующим обледенением и всем смежным.

Автомобильная говорилка своими руками

Засунул внутрь коробки BOX-KA08 производства МастерКит.

Автомобильная говорилка своими руками

При сверлении отверстий под динамики застряло сверло, в результате чего немного попортился дизайн. Но мне на него не глазеть, так что оставил как есть. Сами динамики к крышке приляпаны на «суперклей». Плату покрыл прозрачным цапонлаком, дабы защитить от влаги и сырости.

Работа прошивки

Прошивка написана для ATmega168PA, но может быть без изменений залита в ATmega328P (что я и сделал, поскольку в нашем магазине почему-то 328P дешевле чем 168PA).

Тактируется от внутреннего RC-генератора на 8МГц.

Работает программа по принципу смешанной, вытесняюще-кооперативной многозадачности.

Сразу после запуска программа анализирует структуру раздела на sd карте, и начитывает корневую директорию, запоминая адреса первых кластеров интересующих wav файлов. Это ускоряет воспроизведение, поскольку в дальнейшем обращение к списку файлов не происходит, а сразу начитывается таблица размещения и файл, начиная с нужного кластера.

Для чтения sd карты используется аппаратная поддержка SPI, а процедуры чтения написаны таким образом, чтобы выполнять упреждающее чтение. В результате, пока значение последнего прочитанного байта обрабатывается, интерфейс SPI уже начитывает следующий байт.

Для воспроизведения файлов реализована очередь на 64 элемента, в которую помещаются номера файлов для дальнейшего воспроизведения.

Основное тело программы, после проведения необходимых процедур инициализации, передаёт управление циклу воспроизведения wav-файлов. Этот цикл ждёт появления чего-нибудь в очереди воспроизведения. Если очередь пуста, МК отправляется в состояние idle, если же в очереди появился элемент на воспроизведение, то передаётся управление процедуре воспроизведения файла.

Процедура воспроизведения начитывает его структуру, параметры, и начинает читать, преобразуя формат в «моно, 8 бит», при необходимости ресемплируя до частоты 32000. Полученный в итоге поток помещается в кольцевой буфер, размером 256 элементов. Если буфер заполнен, то ожидается его освобождение, а МК отправляется в idle. Скорости чтения и обработки хватает, чтобы без задержек читать файлы формата «16 бит, моно, 44100 sps», однако на стерео файлы этой частоты уже не хватает скорости. Для упрощения воспроизведения рекомендуется все файлы сохранять сразу в формате 8 бит, моно, 32000 или 16000 сэмплов в секунду.

Модуль работы с файловой системой, как и следует, поддерживает фрагментированные файлы, но если файл не фрагментирован, и его кластеры идут друг за другом, то сразу определяется число подрядыдущих кластеров, которые затем начитываются одним непрерывным блоком, что минимизирует возможные задержки в чтении файлов.

В прерывании таймера 0, который используется для формирования ШИМ и воспроизведения, извлекается очередное значение из кольцевого буфера и передаётся в качестве значения заполнения ШИМ. Если буфер опустошён, но воспроизведение идёт, то ожидается его заполнения — в этом случае ШИМ несколько раз подряд выдаёт одно и то же значение заполнения. Если же воспроизведение закончено, то выполняется плавное уменьшение значения ШИМ до нуля, затем таймер останавливается, ШИМ выход отключается. Такое уменьшение позволяет избежать щелчка в конце воспроизведения файла.

Компилятор gcc даёт не очень эффективный код для обработчика прерываний, поэтому этот обработчик написан на ассемблере и выполняется максимум 38 тактов.

Два вспомогательных прерывания по сигналам на входах INT0 и INT1 также написаны на ассемблере и призваны считать импульсы спидометра и тахометра.

Вся основная программа написана в прерывании Timer2, которое выполняется около 1000 раз в секунду. Прерывание запускает АЦП для замера значений на одном из трёх аналоговых входов (напряжение в сети, уровень топлива, температура двигателя). Значение складывается из 64 идущих подряд измерений, что дополнительно уменьшает шумы.

Каждый 16й вызов прерывания (т.е. около 30 раз в секунду) запускается основной цикл обработчика. В нём отключается прерывание Timer2, и разрешаются глобальные прерывания. В результате, пока он работает, прерывания воспроизведения звука и входов INT0 и INT1 будут работать нормально.
Далее анализируются значения на всех входах, выполняется функция подавления дребезга и запускается логика обработки, которая уже при необходимости помещает нужные звуки в очередь воспроизведения.

Обрабатываемые события

Система контролирует и предупреждает при следующих событиях:

— Напряжение сети меньше заданного уровня (отдельно при остановленном двигателе, отдельно при запущенном)
— Напряжение сети выше заданного уровня
— Уровень топлива ниже заданного уровня (чтобы компенсировать плескание топлива, полученные значения фильтруются, и низкий уровень должен присутствовать в течение длительного времени)
— Температура двигателя выше заданной границы (предупреждения будут повторяться, если температура будет повышаться дальше)
— Низкий уровень в бачке омывателя.
— Не пристёгнут ремень безопасности при движении машины.
— Поднят ручной тормоз при движении машины.
— Не закрыта дверь при начале движения машины.
— Не закрыт багажник при переводе рычага в положение D.
— Двигатель заглох, при включенном зажигании.
— При включении D селектора, температура двигателя ниже заданного уровня
— Зажигание ламп «генератора», «проверить двигатель» при работающем более 3х секунд двигателе и включенном зажигании.
— Срабатывание ABS и TCS
— Спонтанное движение машины при остановленном двигателе.

Большинство из этих событий произносятся только один раз за поездку. Поэтому случайное срабатывание какого-нибудь датчика не станет назойливым повтороением одних и тех же фраз.

Кроме того, если три раза поднять-опустить ручной тормоз, не более 2х секунд между подъёмами, то скажет текущее напряжение в бортовой сети.

Ещё было приветствие и прощание (мелодичные «блим») после первого запуска двигателя, и после выключения зажигания, плюс «счастливого пути» после первого перевода селектора в D. Но я их отключил, удалив с флешки. Кстати любое «лишнее» сообщение можно просто удалить с флешки.

Если двигатель остановлен, зажигание включено, дверь открыта, то быстрое трёхкратное закрывание двери (т.е. нажатие на концевик), а затем трёхкратное поднятие ручника включат режим настроек, в котором можно откалибровать замер напряжения, задать граничные значения напряжений, установить текущую температуру двигателя в качестве минимальной, или максимальной, задать текущий уровень топлива в качестве минимального.

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

Демонстрацию некоторых сообщений и режима настройки можно посмотреть тут:

Прошивка, исходный код, разводка платы в Sprint Layout 6 тут: архив…
Набор звуковых файлов тут: архив.

Автор; Дмитрий Погребняк г.Самара, Россия

.

Оцените статью