Говорящая сигнализация (говорящий колокол) или дешифратор сирены
Здравствуйте, все кто читает мою запись.
Итак, вот он момент истины! Наконец то я это сделал! Начну рассказ с того, что случайно наткнулся на видео в котором можно было наблюдать работу сего девайса. Приспособление озвучивало все сигналы подаваемые автосигнализацией. И я был полон энтузиазма повторить данное устройство, однако нашел на несколько подводных камней, которые мне попались при этом. Никто не хотел делиться прошивкой для контроллера, лежащего в основе данного устройства. Точнее вроде как делились, но не полной версией, а так сказать демо. И это не взирая на то, что и не совсем является их разработкой. Почти все проигрыватели основаны на трудах мистера Хана (Chan) открыто распространяющего исходники своей прошивки. Меня бесило не то, что прошивку пытались продавать, а то что делали это корыстные люди, брали чужой труд (бесплатно), загоняли его в какие то рамки, тобешь подгоняли прошивку под свои нужды и продавали, пусть дешево, пусть по цене пустого контроллера, но блеадь продавали! Тогда я уже переполнился энтузиазмом одолеть цинизм и корысть, возмезднуть возмездие!))))
Для тех кто не в курсе, или не обращал внимания на это, обычная автомобильная сигнализация (охранное устройство) подает от одного до четырех сигналов (кратковременных «пик»ов)))) в моем случае. 1 сигнал при постановке на охрану, 2 сигнала при снятии с охраны, 3 оповещение о срабатывании датчика удара, 4 предупреждение при не постановке на охрану. Ну и сама сигнализация при срабатывании датчика удара, либо нажатии кнопки поиска авто по звуковому сигналу. Согласитесь намного приятней слышать когда ваш автомобиль скажет что то вроде «Эй чувак я на стреме», или при открытии «Садись братка, тапок в пол и погнали отсюда нахрен», вместо назойливой сирены прокуренным голосом скажет «Отойди…Отойди пока я не закричал», а когда забудете поставить на охрану крикнет вслед «мне то пофиг самому потом слушать нечего будет»))))) Правда здорово))))
Искал я искал способ реализовать задумку, и все же нашел (есть добрые люди) на сайте «гет-чип», уважаемый Евгений выложил схему устройства под названием «SD card talking device», которое больше было похоже на игрушку, но я сразу же понял что получится переделать его под свои нужды. Благо Евгений распространял и исходники и отзывчиво помогал подстраивать прошивку, за что ему огромное спасибо!
И так, с облегченной душей могу сказать, что хак автомобильной говорящей сигнализации был произведен, может как то своеобразно, но все же выполнен, и сейчас я поделюсь всем своим трудом бескорыстно и безвозмездно!
Девайс — он же SD проигрыватель (SD talking device) работает с SD картами до 2 Гб, отформатированных в формате FAT16
Формат файла – WAV.
Параметры :
(Frequency) – 32000 Гц;(Channels) – 1 (mono)(Sample size) – 8 бит.
сокращенно – WAV PCM 8U
Номер трека определяется по начальной букве в названии трека т.е. первый трек будет трек с названием начинающимся с заглавной А, второй B, третий C, и т.д! не важно что будет написано дальше, главное при нумерации ставим в начале заглавные буквы английского алфавита.Треки располагаются в двух папках 1 и 2, выбор папки производится переключателем dir1/2.
Схема подключения контроллера (ATtiny 2313) достаточно проста, и думаю не составит труда ее спаять человеку умеющему держать паяльник в руке. Я использовал платку с планарным контроллером, так как уже была готовая от какого то датчика, по моему термометра или манометра, оставалось перерезать ненужные дорожки и отпаять лишние детали.
Как видно сборка сводится к подпаиванию считанных деталей. Питание подавал через 3 вольтовый стабилизатор, 117 что то там название было))), можно использовать любой на 3 вольта.
Коммутация производится кнопкой Select/play. Куда я подключил обычную оптопару. На вход оптопары через ограничительный резистор 2-3 кОм (подбирается под оптопару) подается напряжение с выхода сигналки (провод идущий на колокол), а выход коммутирует пятую ножку контроллера на землю, ничего сложного. Единственной проблемой было срабатывание контроллера при работающем режиме тревоге, так как напряжение подается на колокол постоянное а не импульсы, тогда то я и включил в цепь так называемое реле времени, которое отключает подаваемое на оптопару напряжение через 1,5 секунды (время требуемое для зарядки конденсатора)
Таким образом пока подается постоянное напряжение на оптопару, кнопка select/play остается зажатой, в этот момент контроллер перебирает треки от начала и до момента пока сработает реле и не отключит подаваемое напряжение, контроллер запускает насчитанный трек (дабы избежать ошибки все треки после четвертого, начинающегося на «D» трека, одинаковые! но имеют названия E, F, G… и т.д. все эти треки нужны именно для озвучивания самой сигнализации))))) да да, ничего умнее не придумал)))))
Усилитель собрал на TDA2003, можно любой, так как используется ключ для включения, в режиме ожидания усилитель выключен и не потребляет ток!
Колокол переделал, заменил динамик на какой то бумажный от радио, хотя хочу поставить другую колоночку, на подобии малогабаритного китайского «САМБУФЕРА»)))))
Прошивал программатором Atmel заказанным из китая прогой progisp 2.0.
Несомненно немного пришлось повозиться с прошивкой, но при содействии с автором говорящего устройства удалось добиться желаемого результата!
Теперь сигналка стала более общительной и информативной, жаль не знаю как залить видео!
Поделки своими руками для автолюбителей
Говорилка в автомобиль своими руками
Вот решил сделать в автомобиль говорилку на задний ход, но её можно поставить и на сигнализацию, и на ручник, и ещё много вариантов, например;
-пожалуйста, закройте двери
-пожалуйста выключи фары,
-Ваше топливо на исходе,
-превышена температура двигателя,
-пожалуйста, залейте омывающую жидкость,
-пожалуйста, долейте антифриз и т.д.
фантазиям нет предела.
Вот собранных два модуля… это пока так, для пробы навесным монтажом.
Но рассмотрим пока мой вариант, один голос я поставил на ручник себе, засунул в подлокотникон говорит-«Вы забыли снять ручник», а второй просто на задний ход — «Внимание движение задним ходом». Когда-то это было популярно, но я решил сделать из соображений безопасности, пусть будет. Вот небольшое видео, как это у меня работает….
Нажимаешь кнопку «Запись» записываешь свой голос (для записи есть 10 сек.) и всё, а потом что хочешь, то он и озвучит. Вот как всё просто.
Так же надо будет приобрести преобразователь напряжения, так как голосовой модуль работает от 5 вольт.Преобразователь с 12 на 5 вольт заказываем ЗДЕСЬ…
Да и ещё нам потребуется небольшой усилитель, кстати ничего паять не надо, его тоже приобретаем на Али. вот ЗДЕСЬ… и запитываем его тоже от 5 вольт.
Это как я мастерил в багажнике для заднего хода.
Автомобильная говорилка
Панель приборов как-то примелькивается, далеко не всегда кидаю на неё взгляд. Бывало как-то еду себе еду, а дверь оказывается неплотно закрыта — не обратил внимание на лампочку, проехал достаточно. А ещё бывает ручник не до конца отпустился, а я поехал. А ещё бывали случаи когда заглушил машину, а селектор в положение P забыл поставить… А ещё бывает багажник не закрыт до конца…
В общем, хотелось бы чтобы машинка издавала какой-нибудь звук при этих событиях, а она молчит, как рыба об лёд. Только истошно трынчать начинает, стоит отстегнуть ремень безопасности.
Решено было что события должны озвучиваться голосом. Все звуки сохраняются в формате 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 Вольт.
С воспроизведением звука решил не заморачиваться, взял два 30мм динамика SG мощностью 1 Вт и сопротивлением 50 Ом, подключил их последовательно. Звук формируется при помощи ШИМ выхода, который подаётся на базу транзистора VT7 через резистор R21. R21 ограничивает ток на базе транзистора что, в свою очередь, ограничивает ток на его коллекторе. Выравнивание ШИМ сигнала происходит прямо параллельно динамикам при помощи конденсатора C8, который. Диоды VD8 и VD9 защищают линию от индуктивных всплесков.
Одним из недостатков такого вывода звука является постоянное потребление схемой тока при не-нулевой заполненности ШИМ. Как известно, запись звука представляет собой колебания значений вокруг некоего среднего, значит вывод звука нулевой громкости уже будет создавать половинную нагрузку на схему вывода. Чтобы этого избежать, форма сигнала изменяется программно, реализуется схема которую я назвал «электронный конденсатор». Суть её заключается в том, что значения коэффициента заполнения ШИМ постепенно сводятся к нулю, и увеличиваются, только если выводится звук достаточно большой амплитуды. В результате вывод тихих звуков пропорционально снижает электрическую нагрузку на эту схему.
Посколюку SD (но не SDHC) карты умеют работать по интерфейсу SPI, использовать её достаточно просто. Карта подключается к SPI порту микроконтроллера. Вывод CS карты подтянут резистором R23 200кОм к линии питания, дабы карта не реагировала на всплески на линии, пока МК находится в состоянии сброса. Нашёл несколько карт MicroSD у себя дома, но все они оказались на 2Гб. Несколько расточительно использовать карты такого объёма для 3 мегабайт звуков. Но зато есть запас на будущее 😉
Все цепи сигналов развязаны с МК при помощи однотипных схем на транзисторах и отделены диодом. Конечно, их можно было бы упростить, например, используя простые делители. В этом случае, правда пришлось бы точно подбирать номинал резисторов, а ещё существует опасность что, пока схема неактивно, напряжение через делители будет нагружать защитные диоды микроконтроллера.
Сигналы, присутствие которых обозначается наличием положительного напряжения на линии, такие как «зажигание», «ABS», положения селектора АКПП (блок А), подключаются через полевые транзисторы VT3, который замыкает вход МК на «землю». Вход МК внутренним резистором подтягивается к линии питания. Подавление дребезга на этих входах идёт программно
Входы импульсов от тахометра и спидометра подходят на входы внешних прерываний INT1 и INT0 (блок B). Для них дребезг уменьшается аппаратно, при помощи конденсаторов C2.
Сигнал от генератора (charge) считается активным, когда на нём низкий уровень. Но по факту между «общим» проводом и этой линией возникает разность потенциалов в этот момент более 1.5 Вольт. Поэтому на нём собрана схема «по плюсу», единственное отличие — это делитель из резисторов R10/R14. Пороговое напряжение транзистора 1-3 Вольта. При таком делителе, чтобы транзистор открылся напряжение на линии должно составить минимум 3.5 Вольта (максимум 10.5), что вполне отвечает нуждам этого входа.
Сигналы от датчиков недостаточного уровня омывающей жидкости, недостаточного давления масла, непристёгнутого ремня, концевиков ручного тормоза, дверей и багажника, и сигнал «check engine» замыкаются на «землю» (блок C). Схема управляется при помощи биполярного PNP транзистора VT6, который замыкает вход МК на линию питания, в остальное время вход притянут к низкому уровню резистором R18.
Всё это дело я разместил на двусторонней плате 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, которое выполняется около 488 раз в секунду. Прерывание запускает АЦП для замера значений на одном из трёх аналоговых входов (напряжение в сети, уровень топлива, температура двигателя). Значение складывается из 64 идущих подряд измерений, что дополнительно уменьшает шумы.
Каждый 16й вызов прерывания (т.е. около 30 раз в секунду) запускается основной цикл обработчика. В нём отключается прерывание Timer2, и разрешаются глобальные прерывания. В результате, пока он работает, прерывания воспроизведения звука и входов INT0 и INT1 будут работать нормально.
Далее анализируются значения на всех входах, выполняется функция подавления дребезга и запускается логика обработки, которая уже при необходимости помещает нужные звуки в очередь воспроизведения.
Система контролирует и предупреждает при следующих событиях:
— Напряжение сети меньше заданного уровня (отдельно при остановленном двигателе, отдельно при запущенном)
— Напряжение сети выше заданного уровня
— Уровень топлива ниже заданного уровня (чтобы компенсировать плескание топлива, полученные значения фильтруются, и низкий уровень должен присутствовать в течение длительного времени)
— Температура двигателя выше заданной границы (предупреждения будут повторяться, если температура будет повышаться дальше)
— Низкий уровень в бачке омывателя.
— Не пристёгнут ремень безопасности при движении машины.
— Поднят ручной тормоз при движении машины.
— Не закрыта дверь при начале движения машины.
— Не закрыт багажник при переводе рычага в положение D.
— Двигатель заглох, при включенном зажигании.
— При включении D селектора, температура двигателя ниже заданного уровня
— Зажигание ламп «генератора», «проверить двигатель» при работающем более 3х секунд двигателе и включенном зажигании.
— Срабатывание ABS и TCS
— Спонтанное движение машины при остановленном двигателе.
Большинство из этих событий произносятся только один раз за поездку. Поэтому случайное срабатывание какого-нибудь датчика не станет назойливым повтороением одних и тех же фраз.
Кроме того, если три раза поднять-опустить ручной тормоз, не более 2х секунд между подъёмами, то скажет текущее напряжение в бортовой сети.
Ещё было приветствие и прощание (мелодичные «блим») после первого запуска двигателя, и после выключения зажигания, плюс «счастливого пути» после первого перевода селектора в D. Но я их отключил, удалив с флешки. Кстати любое «лишнее» сообщение можно просто удалить с флешки.
Если двигатель остановлен, зажигание включено, дверь открыта, то быстрое трёхкратное закрывание двери (т.е. нажатие на концевик), а затем трёхкратное поднятие ручника включат режим настроек, в котором можно откалибровать замер напряжения, задать граничные значения напряжений, установить текущую температуру двигателя в качестве минимальной, или максимальной, задать текущий уровень топлива в качестве минимального. Нажатие на концевик двери выбирает настраиваемый параметр, поднятие ручника — изменяет его. Нажатие на концевик сохраняет значение и переходит к следующему параметру. Выключение зажигания, или запуск двигателя завершают режим настройки.
Демонстрацию некоторых сообщений и режима настройки можно посмотреть тут:
О процессе внедрения сего девайса в машину, в бортжурнале машины
UPD от 24.11.2014: обновлена прошивка и набор звуков.
Прошивка, исходный код, разводка платы в Sprint Layout 6 тут: zip, 295кб
Набор звуковых файлов тут: zip, 2.1Мб
Что изменилось?
— Перезаписаны некоторые голосовые сообщения
— Изменена структура меню настройки, теперь концевиком двери выбирается настройка, ручник — войти в подменю. В подменю можно задать новую настройку, затем отменить (вернуть предудущее значение), либо сохранить новое значение, также можно сбросить настройку на значение по-умолчанию. Появились поддержки профилей. Все настройки можно разом сохранить в один из трёх профилей, а затем загрузить любой профиль обратно.
Говорилка в автомобиль своими руками
С некоторых пор представляет интерес говоруна в авто, были сделаны несколько штук, но случайно наткнувшись на описание одного такого девайса решил его повторить, мне он очень понравился в работе, может кто захочет и себе его повторить.
Автор устройства AterLux, за что ему респект и уважуха.
далее копирую описание автора.
Что эта штука умеет?
На видео выше показаны далеко не все возможности. Эта штука скажет голосом, если вдруг:
— Напряжение сети меньше заданного уровня (отдельно при остановленном двигателе, отдельно при запущенном)
— Напряжение сети выше заданного уровня
— Уровень топлива ниже заданного уровня (чтобы компенсировать плескание топлива, полученные значения фильтруются, и низкий уровень должен присутствовать в течение длительного времени)
— Температура двигателя выше заданной границы (предупреждения будут повторяться, если температура будет повышаться дальше)
— Низкий уровень в бачке омывателя.
— Не пристёгнут ремень безопасности при движении машины.
— Поднят ручной тормоз при движении машины.
— Не закрыта дверь при начале движения машины.
— Не закрыт багажник при переводе рычага в положение D.
— Двигатель заглох, при включенном зажигании.
— При включении D селектора, температура двигателя ниже заданного уровня
— Зажигание ламп «генератора», «проверить двигатель» при работающем более 3х секунд двигателе и включенном зажигании.
— Срабатывание ABS и TCS
— Спонтанное движение машины при остановленном двигателе.
Кроме того, если три раза быстро поднять-опустить ручной тормоз, то скажет текущее напряжение в бортовой сети.
мой вариант ( полный клон )
фьюзы
видео автора девайса
Автомобильная говорилка своими руками
Панель приборов как-то примелькивается, далеко не всегда кидаю на неё взгляд. Бывало как-то еду себе еду, а дверь оказывается неплотно закрыта — не обратил внимание на лампочку, проехал достаточно. А ещё бывает ручник не до конца отпустился, а я поехал. А ещё бывали случаи когда заглушил машину, а селектор в положение 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 Вольт.
У регулируемых стабилизаторов есть один неприятный момент — чтобы они работали как следует через них должен течь минимально некоторый ток, в частности для 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.
Сигнал от генератора (charge) считается активным, когда на нём низкий уровень. Но по факту между “общим” проводом и этой линией возникает разность потенциалов в этот момент более 1.5 Вольт. Поэтому на нём собрана схема “по плюсу”, единственное отличие — это делитель из резисторов R10/R14. Пороговое напряжение транзистора 1-3 Вольта. При таком делителе, чтобы транзистор открылся напряжение на линии должно составить минимум 3.5 Вольта (максимум 10.5), что вполне отвечает нуждам этого входа.
Сигналы “по минусу”
Сигналы от датчиков недостаточного уровня омывающей жидкости, недостаточного давления масла, непристёгнутого ремня, концевиков ручного тормоза, дверей и багажника, и сигнал “check engine” замыкаются на “землю” (блок C). Схема управляется при помощи биполярного PNP транзистора VT6, который замыкает вход МК на линию питания, в остальное время вход притянут к низкому уровню резистором R18.
Аналоговые сигналы
Изготовление
Всё это дело я разместил на двусторонней плате 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 тут: архив…
Набор звуковых файлов тут: архив.
Автор; Дмитрий Погребняк г.Самара, Россия