В 3-й части мы познакомимся с программной составляющей данного проекта и разберемся с функциональностью часов TalkingLEDClock. Предыдущую часть можно найти тут, все статьи находятся здесь.
Дополнение ко 2-й части
Сначала хочу сделать несколько дополнений к прошлой статье.
1. Модуль усилителя на PAM8403
Так как в данном модуле не выведен сигнал отключения усилителя, необходимо произвести некоторую доработку модуля. Для начала открываем Datasheet на микросхему PAM8403 и находим вот эту картинку:
Рис. 1. Микросхема PAM8403
Нас интересует вывод 12, который называется SHDN. Если на этом выводе установить уровень логического нуля, то усилитель PAM8403 отключается. Задача состоит в отключении этого вывода от +5 вольт на плате и подпайки к нему куска гибкого провода для последующего подключения этого сигнала к основной плате часов.
Доработку производил следующим образом. Сначала паяльным феном снимаю микросхему с платы:
Рис. 2. Перемычка между 12 и 13 выводами микросхемы
Между 12 и 13 выводами видим перемычку, которую необходимо удалить:
Рис. 3. Место перемычки
После этого запаиваю микросхему PAM8403 обратно и припаиваю проводок к 12-му выводу:
Рис. 4. Модуль PAM8403 после доработки
На этом доработка завершена. Все это можно было выполнить каким-либо другим способом, но я решил сделать именно так.
После этого устанавливаем разъемы типа «гребенка» в отверстия на плате и запаиваем их как показано на фото:
Рис. 5. Модуль усилителя перед установкой на основную плату часов
Так как в моем случае места в корпусе оказалось очень мало и динамик часов упирался в модуль усилителя, необходимо удалить желтые пластиковые элементы с «гребенок» перед установкой модуля на основную плату. Это позволяет выиграть лишние 2 миллиметра пространства, которых не хватало. После установки модуля необходимо срезать лишнюю длину гребенок с обеих сторон:
Рис. 6. Модуль PAM8403 установлен на основную плату
Провод от 12-го вывода микросхемы припаивается вот в это отверстие на плате:
Рис. 7. Отверстие подключения управляющего провода от PAM8403
2. Конденсатор С2 и С10
Конденсатор С10 диаметром 4 мм, емкость 22 мкф устанавливается боком. С2 диаметром 5 мм, емкость 100 мкф устанавливается с обратной стороны платы так же боком.
Рис. 8. Электролитические конденсаторы C2 и С10
После сборки всей конструкции нижняя часть динамика немного упирается в конденсатор C10, что предотвращает сильное прогибание корпуса часов и не допускает короткое замыкание от прикосновения динамика к модулю усилителя DA2.
3. Отладочная плата с МК STM32
Перед запайкой «гребенок» на отладочную плату STM32, желательно удалить из этой «гребенки» контакты выводов C15, C14 и C13 как показано на рисунке:
Рис. 9. Выводы, которые необходимо удалить на разъеме крепления отладочной платы
К этим выводам подключен часовой кварцевый резонатор на 32768 Гц и лишняя емкость в виде болтающихся в воздухе контактов разъема на этих линиях противопоказана.
На этом с дополнениями все, переходим к основной теме статьи 😉
Прошивка
Прошивка для данных часов состоит из двух частей:
- Управляющая программа для МК STM32
- Дамп для SPI-FLASH памяти с музыкальными фрагментами
После сборки часов первым делом необходимо прошить микроконтроллер STM32. Для этого нам понадобится программатор ST-Link, который подключается к 4-х контактной гребенке на отладочной плате. Нам понадобятся только 3 пина: GND, CLK, DIO. С небольшой инструкцией можно ознакомиться тут или на каком-либо стороннем ресурсе. После успешной загрузки прошивки в МК, отключаем питание часов и снова включаем, при этом часы должны запуститься и начать отсчет времени.
Теперь наступает время для следующего шага: загрузка дампа с музыкальными фрагментами в SPI-FLASH память AT45DB321. Для этого нам понадобится переходник USB-UART, либо RS232-UART с логическими уровнями 3,3 вольта. Я для этих целей использую китайский переходник на базе PL-230HX. Не самый лучший выбор, так как у него имеются некоторые проблемы с драйверами, но вариант рабочий. Подключается он к разъему XP3 на плате часов. Распиновка разъема представлена на рисунке ниже:
Рис. 10. Распиновка разъема UART
Подключение переходника выполняется так: GND->GND, RX->TX, TX->RX. Затем необходимо перевести часы в режим прошивки SPI-FLASH. Для этого отключаем питание часов, зажимаем кнопки «Alarm» и «-» (две крайние на верхней панели) и включаем питание. Если все сделано правильно, то дисплей часов гореть не должен.
Перейдем к программе для прошивки дампа SPI-FLASH на стороне ПК. Для этих целей служит консольная утилита tc_flasher.exe. На вход она принимает несколько параметров, включая имя файла с дампом и номер COM-порта, через который будет производиться загрузка этого дампа. Для удобства я написал два .bat файла, один для загрузки дампа в SPI-FLASH (programm.bat), другой для чтения (read.bat). Перед запуском соответствующего .bat файла, необходимо его немного подправить, а именно указать правильный номер COM-порта.
Для примера рассмотрим programm.bat. Нажимаем на нем правой клавишей мыши, выбираем пункт «Изменить». Файл открывается в блокноте и его содержимое имеет следующий вид:
tc_flasher.exe dump.bin COM5 w
Здесь нам надо только COM5 исправить на нужный номер порта. После этого сохраняем изменения, закрываем блокнот. В папке с tc_flasher.exe должен лежать файл с дампом флешки с именем dump.bin. Для запуска процесса достаточно 2 раза щелкнуть мышкой по файлу programm.bat. После этого откроется консоль, в которой будет выводиться прогресс загрузки дампа во флеш-память:
Рис. 11. Загрузка дампа флеш-памяти с помощью утилиты tc_flasher.exe
После завершения процесса в консоль будет выведено соответствующее сообщение:
Рис. 12. Сообщение о завершении загрузки
Бывают ситуации, когда процесс загрузки дампа может зависнуть. В этом случае процесс придется повторить заново, начиная с отключения питания часов и переводом их в режим программирования флеш-памяти с музыкальными фрагментами. Недоработочка однако, исправлю как-нибудь потом 🙂
Итак, после успешной загрузки дампа, отключаем питание часов, отключаем все переходники и подаем питание снова. Часы готовы к работе 🙂
Создание дампа с музыкальными фрагментами
Итак, мы разобрались с процедурой загрузки всех необходимых файлов в наши свежесобранные часики. Но что если мы хотим изменить голос озвучки часов или добавить новые сигналы будильника? Для начала давайте разберемся, как устроен дамп с музыкальными фрагментами.
Дамп SPI-FLASH в себе содержит следующее:
- Звуковые семплы речевого информатора
- Звуки будильников
Описание речевого информатора можно найти тут, он почти не изменился с предыдущей версии часов. Если кратко, то для создания звукового сообщения речевой информатор последовательно включает нужные звуковые фрагменты в нужном порядке. Например, чтобы озвучить время «12:23», информатор последовательно включит следующие звуковые фрагменты:
- двенадцать
- часов
- двадцать
- три
- минуты
Или для «21:31»
- двадцать
- один
- час
- тридцать
- одна
- минута
Идея, думаю, понятна.
Для замены озвучки часов на свою необходимо записать все используемые фрагменты и пересобрать дамп заново. Это выглядит следующим образом. Сначала готовятся все необходимые звуковые фрагменты в формате .wav. Затем, с помощью специальной утилиты dump_builder_tc_v2.0.exe производится объединение .wav-фрагментов в файл dump.bin, который в дальнейшем нужно загрузить в часы.
Требования к .wav-файлам следующие:
- Формат: PCM
- Частота дискретизации: 22050 Гц
- Количество каналов: 1 (Моно)
- Разрешение: 8 бит
- Скорость потока: 176 кбит/сек
Для удобства утилита dump_builder_tc_v2.0.exe имеет конфигурационный файл config.txt, в котором указывается какому музыкальному семплу соответствует данный .wav-файл. Файл config.txt имеет следующий вид:
; Test configuration file ; for build TalkingClock_v1.1 dump file SAMPLE_0 = "wav\0.wav" SAMPLE_1m = "wav\1m.wav" SAMPLE_1w = "wav\1w.wav" SAMPLE_2m = "wav\2m.wav" SAMPLE_2w = "wav\2w.wav" SAMPLE_3 = "wav\3.wav" SAMPLE_4 = "wav\4.wav" SAMPLE_5 = "wav\5.wav" SAMPLE_6 = "wav\6.wav" SAMPLE_7 = "wav\7.wav" SAMPLE_8 = "wav\8.wav" SAMPLE_9 = "wav\9.wav" SAMPLE_10 = "wav\10.wav" SAMPLE_11 = "wav\11.wav" SAMPLE_12 = "wav\12.wav" SAMPLE_13 = "wav\13.wav" SAMPLE_14 = "wav\14.wav" SAMPLE_15 = "wav\15.wav" SAMPLE_16 = "wav\16.wav" SAMPLE_17 = "wav\17.wav" SAMPLE_18 = "wav\18.wav" SAMPLE_19 = "wav\19.wav" SAMPLE_20 = "wav\20.wav" SAMPLE_30 = "wav\30.wav" SAMPLE_40 = "wav\40.wav" SAMPLE_50 = "wav\50.wav" SAMPLE_rovno = "wav\rovno.wav" SAMPLE_chas = "wav\chas.wav" SAMPLE_chasov = "wav\chasov.wav" SAMPLE_chasa = "wav\chasa.wav" SAMPLE_minut = "wav\minut.wav" SAMPLE_minuta = "wav\minuta.wav" SAMPLE_minuty = "wav\minuty.wav" SAMPLE_bell = "wav\bell.wav" SAMPLE_minus = "wav\minus.wav" SAMPLE_gradus = "wav\gradus.wav" SAMPLE_gradusa = "wav\gradusa.wav" SAMPLE_gradusov = "wav\gradusov.wav" SAMPLE_temperatura_out = "wav\temperatura_out.wav" SAMPLE_temperatura_in = "wav\temperatura_in.wav" SAMPLE_alarm1 = "wav\katusha.wav" SAMPLE_alarm2 = "wav\chip_i_deil.wav" SAMPLE_alarm3 = "wav\Pirates.wav" SAMPLE_alarm4 = "wav\ku-ka-re-ku.wav" SAMPLE_alarm5 = "wav\alarm_electro.wav" SAMPLE_alarm6 = "wav\alarm_radioclock.wav" SAMPLE_alarm7 = "" SAMPLE_alarm8 = "" SAMPLE_alarm9 = "" SAMPLE_alarm10 = "" SAMPLE_alarm11 = "" SAMPLE_alarm12 = "" SAMPLE_alarm13 = "" SAMPLE_alarm14 = "" SAMPLE_alarm15 = "" SAMPLE_alarm16 = "" ; End of file
Можно заметить, что этот файл состоит из 2-х частей: семплы звукового информатора и семплы будильника (SAMPLE_alarmX). Максимальное количество звуков для будильника может быть 16, однако, совсем не обязательно заполнять их все. Неиспользуемые ячейки в качестве имени файла должны содержать пустую строку:
SAMPLE_alarm7 = ""
Итак, после подготовки всех файлов и правке config.txt можно запускать утилиту dump_builder_tc_v2.0.exe, которая соберет из имеющихся .wav-файлов новенький дамп dump.bin. При возникновении каких-либо проблем (неверный формат файла, неправильная частота дискретизации) будет выдана соответствующая ошибка и процесс прервется:
Рис. 13. Сообщение утилиты dump_builder_tc_v2.0.exe об неверном формате wav-файла
После завершения сборки дампа, необходимо проверить его размер: он не должен превышать объема флеш-памяти часов (4 МБайта).
На этом пока все, в конце статьи дам ссылку на полный проект часов на GitHub и на архив на ЯндексДиск.
Ссылки
Ссылка на GitHub: https://github.com/DiMoonElec/TalkingLEDClock
Архив с проектом на ЯндексДиск-е: https://yadi.sk/d/2m6KqsUx66SI5A