Этим летом на даче, в конце августа, добившись наконец нормального обмена устройства, которое будет описано ниже, с электросчетчиком, я сидел на крылечке и слушал разговор двух белок, одна сидела на большой туе, а вторая – на яблоне. Тут позвонил мой друг, только что вернувшийся из автопохода на Белое море. На его вопрос «как дела?» я ответил, пребывая все еще погруженным в проект: «поговорил со счетчиком, сижу вот, слушаю разговор двух белок». Друг помолчал и сказал: «Ну про белочек после литра выпитой я конечно знаю, но после разговора со счетчиком???» :)))
В статье описано устройство (далее – «Говорилка»), предназначенное для снятия показаний с электросчетчика и проговаривания их синтезированным голосом в телефонную линию. Кроме собственно показаний потребленной энергии Говорилка считывает текущие дату, напряжения по фазам, токи по фазам, потребление общее и по фазам и отображает эти данные на встроенном TFT дисплее. Также к Говорилке подсоединены датчики температуры, влажности, атмосферного давления и освещенности.
На рис. 1 приведена фотография устройства. Белыми цифрами помечены следующие узлы:
1. Модуль RS232
2. Разъем RJ45 для подключения 1Wire датчиков
3. Разъем RJ45 для подключения I2C датчиков
4. Зона формирования аналогового речевого сигнала
5. WT588D-U
6. Дисплей на базе ILI9341
7. Зона размещения 2-х DAC
8. Плата Blue Pill на STM32F103R8C6
9. Узел защиты по питанию
10. Модуль DTMF
11. DC/DC преобразователь 15 – 5 вольт
12. Плоский кабель 6 проводов для присоединения к разъему гарнитуры CCU6225LT
Рис. 1 Внешний вид Говорилки
Использован корпус G2113С с размерами240х120х60мм, с прозрачной крышкой. На фото корпус показан без прозрачной крышки. Фотография устройства с крышкой приведена на рис. 2.
Рис. 2 Устройство в собранном корпусе.
Потребность в этом устройстве появилась после заключения индивидуального договора с МОЭСК на электроснабжение в результате длительной работы нашего председателя СНТ. Это действие повлекло за собой множество последствий. Чтобы заключить договор с МОЭСК надо поставить новый счетчик в щите учета на столбе. Новый счетчик – следовательно новый подвод к дому. Раз новый подвод – тогда почему бы не взять три фазы и 15 квт за 500 рублей?
В результате в старом дачном домике появился новый трехфазный ввод на 15 квт и вся внутренняя проводка в доме была заменена. Появился новый щит, в котором помимо стандартного набора автоматов и ВДТ (УЗО) были смонтированы четыре контактора для управления подачей электричества. Три контактора управляют включением обогрева, четвертый – подачей питания на освещениебытовые розетки. При выключении всех четырех контакторов электричество остается только внутри стального закрытого щита, все внешние цепи обесточиватся. Контакторы управляются симисторными ключами с оптической развязкой S202S02. Симисторы управляются от охранного контроллера CCU6225LT тульской фирмы RADS. Контроллеру лет наверно 10, работает безукоризненно в режиме 24*7, управляя электрическим отоплением и формируя СМС при срабатывании дверных датчиков. Единственной проблемой за эти годы стала необходимость в смене сим-карты. В какой-то момент устройство исчезло из сети. Перестановка сим карт из телефона в устройство и наоборот показала, что в телефоне работают обе сим-карты, а в CCU6225 – только свежая из телефона. Консультация с провайдером и замена сим-карты проблему решило полностью. Пришлось также заменить свинцовую батарею резервного питания, но 7 лет – это хороший срок службы для такой батареи.
CCU6225 дает возможность управлять нагрузкой независимо по смс, по телефону посредством DTMF, либо выключателем в доме. Несколько выключателей обеспечили местное управление контакторами, создав дополнительное удобство и гибкость в управлении оборудованием дома. Выключатель «я дома» позволил управлять через CCU6225 контактором подачи питания на цепи света и бытового оборудования. При выходе достаточно перевести его в положение «я ушел» и вся техника в доме будет обесточена. При приходе – переключить в положения «я дома» и будет подано питание на все внутренние цепи. CCU6225 позволяет запрограммировать выключение цепей при выходе из дома и включение только одной (освещения) при входе. Смысл в том, что, уходя следует выключить обогрев, но не факт, что при входе его надо включить.
Также в щите установлены четыре автомата для аварийного принудительного включения контакторов путем прямой подачи тока на катушки параллельно симисторным ключам. Это сделано на случай отказа либо симисторов, либо CCU6225.
Договор с МОЭСК привел к необходимости подавать показания потребленного электричества раз в месяц. Т.е. надо раз в месяц снять показания счетчика. Летом это не проблема, но осенью-зимой-весной там никто не живет и ездить на дачу только ради считывания показаний неразумно.
Счетчик Меркурий 231 имеет инфракрасный порт для дистанционного считывания показаний, есть программа «Конфигуратор» для общения с такими счетчиками, т.е. техническая возможность электронно считать показания существует. Автор «конфигуратора» ведет блог и доступен по электропочте.
Выбор способа передачи показаний.
Для передачи показаний существуют готовые промышленные решения (системы АСКУЭ) – и софт и железо. Но они достаточно дороги для единичного некоммерческого использования и требуют организации линии связи. Как правило, используется какая-то разновидность канала сотовой связи. Оплата за такой канал на сегодня – примерно 300 р в месяц. Т.е. для передачи 24 показаний (я попросил двухтарифный режим при заключении договора) надо будет заплатить за год 300 р * 12 = 3600 р.
С одной стороны, это немного. С другой стороны – и эти деньги надо заработать. Также очевидна техническая избыточность инет-канала через сотовую связь. Дом застрахован, рассматривать лица крадунов, если что случится, особого смысла не имеет, контроль 24*7 не нужен. Для передачи показаний желателен самый дешевый вид связи, чтобы платить по минимуму.
Такой вариант есть – это аудиоканал в уже имеющейся CCU6225LT. Входящий вызов бесплатен, голосом передать показания займет минуту-другую, т.е. несколько рублей в месяц будет стоить такой режим передачи данных. Экономия на пару порядков – это серьезно, несмотря на абсолютные значения сумм :).
Получается такая схема: надо сделать контроллер, который будет считывать показания со счетчика через инфракрасный порт и проговаривать их в телефонную линию.
Размещение счетчика
Счетчик Меркурий 231 и инфракрасный адаптор размещены в щите на столбе. От щита до места размещения Говорилки в доме проложена витая пара FTP для наружного размещения суммарной длиной около 35 м. Витая пара была проложена одновременно с установкой нового счетчика и заменой однофазной подводки к дому на трехфазную. Кабель состоит из 4-х стандартных витых пар в общем экране и защитной оболочки черного цвета. Внешняя оболочка черного цвета – признак кабеля для наружной эксплуатации. Пластик черного цвета содержит добавки, повышающие устойчивость пластика к Солнечной радиации. Инфракрасный адаптор размещен в корпусе размером 60 на 40 на 30 мм и со стороны Говорилки выглядит как стандартный порт RS232.
К корпусу приклеены магнитики со стороны, противоположной отверстию для инфракрасного приемопередатчика. Это позволило прикрепить модуль напротив счетчика на внутренней стороне дверцы щита, просто примагнитив его к нужному месту.
На обратной стороне кабеля в доме смонтировано устройство защиты из пяти диодов типа 1.5KE18CA (Защитный диод двунаправленный, 1500Вт, 18В, [DO-201]), стандартная вилка DB9 и разъем USB для подачи питания на инфракрасный адаптор. Это конечно не полноценная грозозащита, но сколько-то энергии может поглотить. На принципиальной схеме Говорилки устройство защиты от статики обозначено как «модуль защиты».
Стандартный разъем RS232 и стандартный USB разъем позволяют помимо Говорилки подключить обычный ноутбук и воспользоваться программой «Конфигуратор» для, например, подстройки часов или считывания данных счетчика для анализа потребления по месяцам. Таким подключением я пользовался чтобы посмотреть обмен программы со счетчиком, записать команды счетчику и ответы счетчика. Из доступной в сети технической документации не всегда можно правильно понять какую команду надо выдать счетчику и как правильно расшифровать ответ. Сравнивая же запомненные скриншоты, например, чтения энергии или тока из счетчика и запомненного побайтового обмена достаточно просто выделить команду и расшифровать ответы.
Попутно замечу, что ноутбуком с программой-сниффером очень удобно смотреть за обменом Говорилки и счетчика при отладке скетча, достаточно подсоединить параллельно вход RX Говорилки и вход RX ноутбука. Я использовал для выполнения этих соединений электротехнические быстрозажимные клеммы Wago на три и пять позиций. Фото такой клеммы приведено на рис. 3. Эти клеммы оказались чрезвычайно удобными для быстрого монтажа соединений из жил витой пары.
Рис. 3 Клемма Wago
Выбор элементной базы Говорилки
На этом этапе проектирования я задумался над основой Говорилки – на какой элементной базе делать систему? Вариантов несколько:
• Использовать старый компьютер из наличия, снимать данные и проговаривать программно.
• Использовать что-то на базе Ардуино.
Первый вариант интересен невысокой трудоемкостью разработки и огромными возможностями расширения функционала. Но поскольку зимой дом не отапливается, то надо обеспечить работу компьютера и при сильно отрицательных температурах. Причем не столько работу саму по себе, сколько перезапуск компа после прекращения подачи электричества. Это бывает нечасто, но раз в месяц электричество исчезает на время, достаточное, чтобы компьютер остыл до температуры окружающей среды. Запуск компьютера при температурах ниже +5 градусов Цельсия проблематичен.
Первая серьезная проблема – старт винчестера. В мануалах указывают допустимый диапазон от +5 градусов. Т.е. при более низкой температуре ничего не гарантируется. Личный опыт эксплуатации сервера на балконе тоже говорит, что винчестеры не стартуют при низких температурах. Причины банальны – загустевание смазки в подшипниках и недостаточный момент шпиндельного мотора для страгивания с места пакета блинов. Это явление для ненового, поработавшего винчестера усугубляется.
Вторая проблема – резкое изменение параметров электрорадиоэлементов (ЭРЭ) с падением температуры. Так, можно ожидать резкого ухудшения емкости разнообразных конденсаторов в цепях питания, что приведет к заметному увеличению уровня помех по цепям питания при низких температурах и возможно к другим странным эффектам, таким как нестабильность работы, зависания и пр., что для автономно и удаленно работающего компьютера недопустимо. Бытовые компьютеры предназначены для использования при плюсовых температурах и ставить в них ЭРЭ с большим температурным диапазоном излишне расточительно.
Очевидно, что обе эти проблемы можно обойти, поместив компьютер в термостабилизированный кожух и, возможно, добавив сторожевой таймер для перезагрузки зависшей машины. Но это уже слишком дорогое решение. Замену обычного винчестера на SSD также не имеет смысла рассматривать – нецелесообразно дорого.
При использовании Ардуино подобных проблем нет – дисков там нет, сам кристалл рассчитан на работу от -40 до +105С°, а фильтрующие конденсаторы по питанию легко дублируются элементами, пригодными для работы в расширенном температурном диапазоне. Сторожевой таймер уже встроен.
Есть и третья проблема. Раз уж делается расширение возможностей дистанционного управления, разумно остановиться не только на считывании показаний счетчика, но и поставить несколько других датчиков – температуры внутри и снаружи дома, влажности, освещенности, атмосферного давления. Все эти датчики имеют как правило интерфейс типа I2C или 1Wire, т.е. так или иначе требуется преобразователь данных, полученных по этим интерфейсам, в понятные для компьютера. Один из разумных вариантов – Ардуино.
Таким образом получается, что разумно использовать Ардуино для считывания показаний счетчика и всех подключенных датчиков и передачи их голосом по речевому каналу CCU6225.
Я мог использовать стандартную Ардуину Нано на процессоре ATMEL 328p, но у меня лежали 4 платы на процессоре STM32F103C8T6 (рис. 4) и я решил, что будет интересно использовать этот более продвинутый 32-х битный процессор. STM32F103C8T6 имеет 64 кб флеш-памяти для программы и 20 кб ОЗУ и может работать с тактовой частотой 72 МГц. В реальности флеш-памяти больше вдвое. На форуме www.stm32duino.com были сообщения об успешной работе модулей и программ при выборе опции «128 кб памяти».
Рис. 4 Внешний вид платы на процессоре STM32F103C8T6 (Blue Pill)
Платы STM32F103C8T6 приходят без загрузчика, но процедура зашивки загрузчика несложна, после чего плата может программироваться посредством стандартного Ардуиновского IDE. На форуме www.stm32duino.com имеется подробное описание действий, которые надо предпринять для установки IDE и прошивки загрузчика.
Плата («Blue pill») c STM32F103C8T6 имеет часовой кварц (32768 Гц) на борту и может хранить текущее время при подключении backup батареи с напряжением около 3В к контакту VBATT. В моем проекте эта возможность не использована, поскольку время можно считать из счетчика.
В момент принятия решения о платформе Говорилки я еще не располагал реальным опытом работы с процессором STM32F103C8T6. Тем не менее я принял решение использовать именно этот процессор и не пожалел – работать с ним оказалось ничуть не сложнее, чем с Atmel328р, а возможностей и ресурсов существенно больше, процессор быстрее. Работа с дисплеем оказалась проще – не нужны преобразователи уровня 5 – 3.3 вольт, все датчики также подключаются напрямую. Изображение на экране формируется существенно быстрее даже в обычном режиме обмена без использования DMA.
На рис. 5 приведена схема электрическая принципиальная.
Рис. 5 Говорилка. Схема электрическая принципиальная
В STM32F103C8T6 имеется два аппаратных контроллера I2C и я хотел разнести разные группы датчиков по разным каналам. Так, на один канал я хотел присоединить датчики внешней температуры и влажности, а на второй – остальные, размещенные внутри корпуса Говорилки. Я хотел таким образом увеличить надежность и живучесть системы, чтобы при коллизиях с внешними датчиками отказал только один канал, а все остальное осталось в рабочем состоянии. Первый канал заработал сразу и без проблем (на выводах PB6, PB7), как в аппаратном режиме с тактовой частотой 400 КГц, так и с использованием программного обмена. Запустить второй канал I2C (на выводах PB10, PB11) с использованием библиотеки HARDWIRE, адаптированной под Blue Pill, оказалось непросто. Сейчас я считаю, что в библиотеке HARDWIRE имеются особенности, проявляющиеся именно при работе со вторым каналом. После долгой борьбы второй канал I2C запустить удалось. Ситуация парадоксальная – при подключении какого-либо датчика к первому каналу и загрузке тестовой программы например, сканера I2C – все работает сразу. Переключение датчика на второй канал и замена цифры 1 на цифру 2 в команде создания объекта (HardWire H2Wire(2, I2C_FAST_MODE);) приводит к полной неработоспособности системы. Плата наглухо виснет и выводится из этого состояния только кнопкой Reset. Детальные исследования проблемы с применением отладочных точек после каждого оператора и логического анализатора для просмотра сигналов, генерируемых на шине I2C2, позволили найти место зависания и устранить его. Для меня решением проблемы послужило задание точного размера всех критичных переменных, используемых в обмене по I2C2 (int16_t вместо int и т.п.). Очень осторожно предположу, что неверный размер переменных, используемых для обмена с подпрограммами библиотеки HARDWIRE, приводит к записи (или чтению) неверных областей памяти, что в свою очередь дает непредсказуемые результаты. Почему это проявляется при использовании второго канала I2C и не проявляется при использовании первого – я не знаю. Также эта гипотеза не объясняет странности с сигналами SDA и SCL, один из которых при уже при загрузке скетча ушел в ноль и так там и оставался до сброса. Как это связано с объявлением переменных и их разным размером – я даже предположить не могу.
Генерация звука
После анализа всех желаний (ака хотелок) стало понятно, что фраз для произношения надо много (до сотни). В текущем варианте использовано 76 фрагментов. Использовать под это невеликую память Ардуино неразумно. Поиск по инету способов генерировать звук дал неожиданно замечательные результаты: в продаже в интернете имеются модули WT588D-U с памятью 32 мегабита, которые могут запомнить до 220 фрагментов звука суммарной продолжительностью несколько минут при наилучшем качестве. Модули оснащены разъемом мини USB и могут работать в разных режимах: воспроизводить звук по команде от МК, от кнопок. Фото модуля представлено на рис. 10 поз 1. В модуле имеется встроенный 13 битный ЦАП и PWM усилитель для динамика мощностью 0.5 Вт на 8 ом. Этот модуль понимает только формат WAV с частотой дискретизации от 6 до 22 КГц. Напряжение питания модуля 2,8 – 5,5 вольт, сопряжение с МК – 3.3 вольта. Если надо использовать МК с логическими уровнями 5 вольт – надо применить конвертор (годятся от простейших резисторных делителей до микросхемных).
Программно модуль может управляться либо по однопроводному интерфейсу, либо по трехпроводному. Подробнее см voice-chip.ru/waytronic2.htm. Любопытной особенностью модуля является метод формирования звуковых фрагментов: они могут состоять из произвольного количества загруженных в память звуков и пауз. Паузы места в памяти не занимают, т.е. можно загрузить в память много атомарных звуков и конструировать из них разные фрагменты, разнообразно соединяя одни и те же звуки. Для воспроизведения конкретного фрагмента (или голоса, как это названо в мануале) надо передать в модуль номер этого фрагмента, дождаться появления сигнала BUSY и дождаться пропадания сигнала BUSY. Именно в этой последовательности – сигнал BUSY появляется с довольно большой задержкой после получения команды. Конкретный тип сигнала BUSY (низкий, высокий, с открытым коллектором) определяется при создании проекта. Можно переключать эти опции в готовом проекте, но требуется перекомпилировать проект заново перед записью в модуль. Галка «Pull high resistor» (рис. 5) управляет типом выхода «Busy» — полноценный двухтактный пуш-пулл или открытый коллектор. Режим ОК полезен при подключении сигнального светодиода, а пуш-пулл – при подаче сигнала на управляющий МК. Проект создается программой, которую можно скачать, например, yadi.sk/d/WV3W64rdzp4tV тут (версия 1.6 beta) или найти в инете самостоятельно. Тут ( voice-chip.ru/prog//wt588d_soft.rar ) есть версия 1.0.
Я использовал версию 1.6 бета, просто потому что она попала ко мне в руки первой.
Режим проговаривания я использовал упрощенный. Так, числа проговариваются просто по одной цифре без разбиения на сотни, тысячи, не учитываются рода и склоненияпадежи и пр. Например, число 397.45 будет проговорено как «Три девять семь точка четыре пять», а фраза про число обнаруженных датчиков 18b20 будет выглядеть так: «обнаружено один датчиков температуры». Такой способ использует свойство значительной информационной избыточности русского языка, однозначность восприятия информации на слух не уменьшается, хотя неверные падежи и склонения конечно режут слух. Но простота программирования такого режима перевесила желание сделать академически правильное произношение. Замечу, что никакой rocket science в программировании правильных склонений и спряжений нет, есть масса примеров, где числа преобразуются в числа прописью, во всех мыслимых вариантах: от искусных таблиц и макросов в Экселе до отдельно стоящих dll на Си, но трудоемкость вопроса велика. Исходя из этих факторов я решил максимально упростить программу собственно проговаривания на первом этапе работы, уделив максимум внимания функционированию программы в целом и оставив доработки второго порядка для занятий темными зимними вечерами :). Свободной памяти в WT588D-U и STM32F103C8T6 осталось достаточно для любых мыслимых изысков в организации правильного произношения. На рис. 5 в правом нижнем углу видно, что весь мой проект занял менее 23% памяти модуля WT588D-U при суммарной длительности всех фрагментов 78 секунд.
Звуковые файлы можно попытаться записать самому либо сгенерировать одной из программ синтеза речи. Имея некоторый опыт записи приветствий для офисных телефонных станций, я выбрал второй вариант без колебаний. Опыт говорит, что самостоятельно сделать качественный звуковой файл непросто – нужен хороший студийный микрофон, помещение с хорошей звукоизоляцией и определенная тренировка в произношении. Среди интернет-проектов с синтезом русского голоса мне больше всего понравилась Ивонна.
Я подготовил список фраз ( yadi.sk/i/WO64jsXRzp5XF ) и за небольшое время получил набор нужных звуков. Есть некоторые недостатки: в некоторых фразах неверны ударения, какие-то слова произносятся непривычно. Например, слово «ампѐр» машина говорит, как «а̀мпер». Разборчивость фраз очень хорошая и на перечисленные недостатки я закрыл глаза, хотя наверняка есть способы тонкой настройки речевых синтезаторов, которые позволят добиться идеального результата. Основная задача Говорилки – разборчиво произнести цифры потребления и выходных данных датчиков.
Преобразование полученных файлов в формат WAV я сделал конвертором из комплекса AIMP. Методом проб и ошибок выяснилось, что в batch-конверторе надо явно указывать все параметры выходного файла, явно включая все опции, иначе программа записи данных в wt588 не позволяет импортировать файл с сообщением «неверный формат». Детально я не разбирался, возможно проблема в отсутствии какого-либо параметра в заголовке файла, что программой импорта воспринимается как неверный формат. Естественно, можно использовать и разнообразные онлайн конверторы.
Попутно выяснилось, что с кириллицей в названиях файлов проблем нет.
Работа с этой программой имеет некоторые особенности. Сначала надо создать проект (рис. 6).
В проект на левую панель надо набрать звуковые файлы. Это исходные звуки, из которых можно конструировать фрагменты. Звуковые файлы требуются в формате WAV с частотой дискретизации от 6 до 22 кГц с шагом 2 кГц. Программа при импорте файла проверяет эти параметры и не позволит импортировать файл с недопустимой частотой дискретизации.
Для создания фрагмента в правой части надо выбрать номер фрагмента (Equation No) и в строки правой панели набрать файлов с левой панельки. Фрагмент может включать всего один звуковой файл из правой панели или состоять из многих звуков и пауз. В разные позиции справа можно набирать одни и те же файлы из левой панельки. Т.е. внутри модуля хранится одна копия файла и ее можно использовать в нескольких фрагментах. В моем проекте все фрагменты содержат только один звуковой файл. Для запуска воспроизведения, например, фрагмента номер 0xD0 надо передать в модуль команду 0xD0.
Рис. 6 Скриншот проекта
Пока фрагмент играется – выход BUSY прижат к нулю (или напротив – к питанию, опция в настройках). На рис. 7 представлены опции создания проекта.
Рис. 7 Опции создания проекта
Также в опциях проекта задается и тип выходного устройства – ЦАП (DAC) или PWM усилитель. Выход ЦАПа подавать на динамик не следует, надо использовать дополнительный усилитель.
Я усилитель делать не стал, а приготовил два проекта – один с ЦАП, другой с PWM и переставлял модули в Говорилке при отладке. В модулях следующих поколений оба выхода работают одновременно – т.е. можно и присоединить динамик и использовать выход ЦАПа.
После создания проекта и набора нужных фрагментов надо скомпилировать проект. На рис. 8 представлен результат компиляции проекта.
Рис. 8 Результат компиляции проекта
Далее надо подсоединить модуль к компьютеру и через меню открыть модуль кнопкой «Connect» (индикатор «Status» станет зеленым), стереть память модуля («Erase») и записать проект («Download»). Можно сделать это одной кнопкой «OnekeyDownLoad».
Рис. 9 Запись проекта в модуль
Готовый проект можно скачать тут yadi.sk/d/cSzqFg8gzp66T
Управление WT588D-U от микропроцессора
Поиск по инету готовой библиотеки для управления WT588 дал довольно скудные результаты – нашлась одна приемлемая библиотека, работающая с модулем в режиме 3-х проводного интерфейса. Модуль может управляться от процессора либо по однопроводному интерфейсу, либо по трехпроводному. В реальности требуется еще считывать состояние вывода BUSY и управлять выводом CS, т.е. суммарно нужно 5 выводов от МК. То, что в китайском мануале называется «однопроводным интерфейсом» в реальности требует три вывода МК.
В тестовой схеме модуль заработал, но выяснилась неприятная особенность – если систему выключить и включить – модуль переставал реагировать на команды. Экспериментальным путем я выяснил, что отключать питание надо более чем на 30 секунд, после чего модуль опять работает. Манипуляции выводом «reset» не помогали, модуль на это не реагировал вовсе. Ничего не найдя в инете по этой проблеме, я написал в фирму “Sound technologies” письмо с просьбой о техподдержке. К моему удивлению, я получил вполне вменяемый ответ. Оказалось, что модулей WT588D-U было несколько модификаций и более ранние версии как раз и отличались замеченным мной поведением при быстром отключении-подаче питания. Стала понятна низкая цена купленных мной модулей :).
При обсуждении вопросов коллега из “Sound technologies” рассказал, что сейчас есть более интересные модели этой фирмы, мы пообщались и он прислал мне несколько модулей на тестирование. Фотографии модулей приведены на рис. 10.
Рис. 10 Звуковоспроизводящие модули, 1 – WT588D-U, 2 – WT200302, 3 – WT2003M03
Присланный модуль WT588D–U действительно не зависал при быстром выключениивключении питания. Внешне новый и старый совершенно одинаковы, я их тщательно сравнил под микроскопом, видимо отличаются номиналы конденсаторов по цепям формирования импульса сброса при подаче питания.
В посылке также были и новые модули, более интересные. Так, модуль WT200302 со встроенной флеш-памятью (рис. 10 поз 2) в два раза меньше, работает с форматом MP3, и не требует отдельного программатора. Значительно увеличено максимальное количество звуковых фрагментов – 3584. Его очень просто программировать — достаточно просто подключить модуль к компьютеру по USB и записать нужные звуковые файлы как на обычную флешку. Управляется модуль одновременно кнопками и командами по одному проводу. Режима управления по трем проводам нет. Точно так же, как и у предшественника, вывод BUSY активен, пока играется звуковой файл. В отличие от предыдущего модуля BUSY только низкий, т.е. когда звук воспроизводится – сигнал BUSY падает к нулю. У модуля есть любопытная особенность – при подключении по USB он становится звуковой картой, т.е. можно прямо с компьютера послушать свои фрагменты.
Еще один модуль WT2003M03 (рис. 10 поз 3) может работать со стандартной микро флеш картой размером от 32 мб до 32 гб. Управляется точно так же – по одному проводу. Возможности модуля еще шире: он поддерживает как WAV, так и MP3 и может использовать до 65487 фрагментов.
В посылке также оказались модули в минималистичном исполнении и программатор для них, фото представлено на рис. 11. Эти модули содержат необходимый аппаратный минимум – одну микросхему флеш-памяти и управляющий контроллер wt588. Для их программирования требуется внешний контроллер. Их можно использовать при жестких требованиях по стоимости и размерам к устройству. Подробности, детали комплектаций, возможные напряжения питания и пр. техническая информация обильно представлена на сайте voice-chip.ru
Рис. 11 Минималистичные модули
Все звуковые модули имеют разъемы с круглыми ножками (DIP цанговые), которые почти не держатся в DIN планках. У меня в хозяйстве таких разъемов не нашлось, специально покупать их неразумно. Поэтому для тестовых целей были приспособлены уже имевшиеся маленькие разъемы.
Для использования независающего модуля в Говорилке я перепаял разъем. Поскольку оборудования для выпаивания таких разъемов у меня нет, я поступил так: сначала бокорезами раскусил разъем на плате на мелкие части, затем выпаял эти части, очистил отверстия стальной иглой и запаял новый DIN разъем со стандартными квадратными ножками, плотно входящими в разъем на плате.
Технологический хинт: очистка стальной иглой отверстий, залитых припоем, делается так: нагревается отверстие и без флюса! (это важно) в отверстие быстро вставляется стальная игла. Олово застывает трубочкой, игла вынимается – отверстие готово. Припой без флюса плохо липнет к стальной игле, что и позволяет заново формировать отверстия в печатной плате. Если олово начинает прилипать – достаточно остывшую иглу повращать в пальцах, тонких слой жира с рук ухудшит смачиваемость припоем поверхности иглы. Если есть вакуумный оловоотсос – все намного проще :).
Уже после отладки Говорилки я занялся подключением модуля WT588D-U по однопроводному интерфейсу. В процессе отладки c применением логического анализатора обнаружились две неточности в мануале. Первая проблема – после поступления команды модуль выставляет сигнал BUSY через примерно 34 мс (а не 5, как в мануале). Вторая – вывод RESET нельзя оставлять неприсоединенным, он должен быть присоединен либо к питанию 3.3 в, либо к выходу МК. Это с одной стороны общее правило, с другой – об этом всегда явно пишут в мануалах.
Я до этого додумался не сразу и довольно долго не мог понять, отчего система издает странный хрипящий звук вместо нормальных фраз.
Модули WT2003M2 и M3 отличается от WT588 размером управляющего слова и порядком передачи бит в слове. У WT588 слово управления 8 бит и первым надо передавать младший бит, а у WT2003M2 и M3 – слово 16 битное и первым надо передавать старший бит.
Также отличаются времена задержки выдачи звука и реакции вывода BUSY – у WT588 задержка относительно последнего бита команды около 30 мС (в мануале ошибочно указано 5 мС), у WT2003M2 и M3 – около 200 мС. Эти задержки надо учитывать, если программа конструирует составные фразы, например, «температура за бортом» + «два» + «пять» + «градусов». Чтобы фразы не наезжали друг на друга надо запустить воспроизведение первой фразы, дождаться ее окончания анализируя появление и пропадание сигнала BUSY, запустить следующую фразу и т.д. В моем случае анализ BUSY и ожидание окончания воспроизведения заложены в подпрограмме воспроизведения.
Запустить по однопроводному каналу платы WT2003M2 и M3 удалось, поменяв порядок выдачи бит команды. По мануалу надо выводить младшим битом вперед. На самом деле – старшим битом вперед. Архивы с тестовыми программами для модулей – тут: yadi.sk/d/I46yR7JvzpZGV. В тестовой программе предусмотрена выдача импульса запуска для логического анализатора, чтобы посмотреть, что реально формируется на выводе управления и когда реально появляется и исчезает сигнал BUSY.
Модули WT2003M2 и M3 оказались довольно капризными к параметрам MP3 файлов. Сконвертированные из wav произносятся замедленно. Полученные от text-to-speech on-line конвертора произносятся со «сглатыванием» последнего слога. Естественно, все файлы нормально проигрываются на компьютере. Явление «сглатывания» имеет место и при команде от МК и при запуске воспроизведения кнопкой. Впрочем, это неточности второго порядка и наверняка можно подобрать такие параметры mp3, с которыми все будет хорошо, добавить тишины до иили после фрагмента. Проблема очевидно связана с невысоким быстродействием mp3 декодера и может рассматриваться как особенности реализации: «это не баг, это фича».
Последняя особенность этих модулей, о которой следует упомянуть, это то, что сигнал от PWM (т.е. прямо с динамика) подавать на вход сотового модуля не следует. Результат будет ужасным. На вход сотового модуля следует подавать сигнал с ЦАПа после соответствующих цепей фильтрации. В моей схеме сигнал дополнительно ослабляется до уровня, соответствующего уровню стандартного микрофона, т.е. 20-30 мВ. На выходе ЦАПа сигнал имеет размах, близкий к уровню питания, т.е. 3 вольта. Упоминаю я об этом вот почему: поначалу я хотел сделать универсальный вариант, чтобы звук шел и в сотовый модуль и на динамик при надобности. Я сделал схему для подачи сигнала ШИМ на динамик или нагрузочный резистор через выключатель и этот же сигнал профильтровал для подачи на сотовый модуль. Практическая проверка показала, что простыми средствами отфильтровать ШИМ сигнал до приемлемого состояния не получается, сотовый модуль забивается по входу и результат ужасен. Причины понятны – динамик, являясь медленной механической системой, эффективно интегрирует ШИМ сигнал, никак не реагируя на высшие гармоники. А вот система обработки звукового сигнала сотового модуля оказалась напротив очень чувствительна к импульсным помехам. Приемлемое качество звука достигается только при использовании ЦАП выхода и изготовлении последующей фильтрующей цепи в соответствии с мануалом. К уровню сигнала сотовый модуль мало чувствителен, качество и уровень сигнала на динамике сотового телефона практически не зависит от уровня сигнал на входе сотового модуля. При регулировке уровня резистором R9 надо учитывать большую задержку сотового тракта – примерно 200-300 мС по моей оценке. В сотовой связи очень эффективная система АРУ, изменение уровня сигнал на входе сотового модуля на громкости сигнала на выходе сотового телефона приемника не отражается вовсе. Однако регулировка уровня переменным резистором оказалась полезной — несмотря на великолепную работу системы АРУ можно найти такой уровень сигнала на входе сотового модуля, при котором качество звука на выходе (т.е. на динамике телефона-приемника) наилучшее. Хочу отметить, что диапазон, в котором сигнал на выходе всего тракта наилучший, достаточно невелик, буквально несколько оборотов подстроечного многооборотного резистора СП5-3.
Поскольку не удалось сделать универсального варианта озвучивания, я остановился на варианте с ЦАП, а для отладки ставил в панельку модуль в режиме PWM. В принципе можно подать сигнал на динамик через дополнительный усилитель, но на практике это оказалось ненужным. Всё интересное отображается на экране, а проверить работу тракта можно и просто позвонив.
Сопряжение с RS232
Для сопряжения МК и канала RS232 я купил готовую плату в Чипе и Дипе (позиция 1 на рис. 1). Название платы: «RS232 Board, Коммуникационная плата RS232, на базе SP3232, 3-5.5В, ESD защита, аппаратное управление потоком». Плата представляет собой законченное устройство, имеющее с одной стороны разъем DB9 и с другой разъем с выводами: питание (от 3 до 5 вольт), общий, вход, выход, линии аппаратного контроля потока. По спецификации плата в определенной степени устойчива к разрядам статического электричества. Плата дополнительно защищена от импульсных помех по приходящим проводам от счетчика диодами-поглотителями, размещенными в дополнительном внешнем корпусе.
Говорилка и CCU6225 смонтированы в одном корпусе G2113С, корпус для РЭА 240х120х60мм, пластик, с прозрачной крышкой. Основой послужила плата из двухстороннего фольгированного стеклотекстолита толщиной 0.8 мм. На плате методом фрезерования Дремелем вырезаны места для монтажа разъемов узлов. Также на плате размещены прямоугольные контактные площадки для подачи питания +3.3 и +5 вольт на все узлы системы. По периметру площадок подачи питания распаяны фильтрующие SMD конденсаторы номиналом 22 мкф на 16 вольт. Между собой узлы соединены проводами МГТФ 0.12. Разместить все узлы в одной плоскости в выбранном корпусе невозможно, поэтому часть узлов размещены вертикально (узел контроля питания и DAC), часть над другими (дисплей).
Кабель, соединяющий аудио разъем CCU6225LT и узел преобразования сигнала с ЦАП выхода WT588D-U, проведен под платой через два отверстия. Это решение позволило в определенной степени защитить аудио сигнал от импульсных наводок.
Питание системы
Модуль CCU6225LT обеспечивает питанием Говорилку. В CCU6225LT имеется токоограниченный выход +15 вольт 900 мА и еще остались пара незадействованных реле с перекидными контактами. Питание на Говорилку можно подавать через нормально замкнутые контакты реле. Реле управляется дистанционно, что можно использовать для перезапуска Говорилки в случае нештатной ситуации. Возможно также включать Говорилку только для считывания показаний. В этом случае сеанс связи будет выглядеть так: звонок на CCU6225LT, выключение реле (Говорилка питается через нормально замкнутые контакты), переключение на микрофон, прослушивание данных, отключение от микрофона и включение реле питания Говорилки до следующего сеанса связи. Я не вижу практического смысла в использовании такого сценария и упоминаю его только для общности. Включение обоих реле дает гальваническую развязку CCU6225LT, что можно использовать во время очень сильной грозы.
По расчетам Говорилка должна была потреблять около 100-150 мА. На готовом устройстве измеренный ток составил 110 мА. Для понижения напряжения с 15 до 5 вольт разумно использовать импульсный преобразователь. Преобразовывать линейным стабилизатором (15-5) вольт *0.2 А = 2 ватта в тепло сильно не хотелось. Я выбрал недорогой модуль (Super mini 3A DC-DC 3V 5V 16V Converter Step Down buck Power Supply Module) на базе step-down преобразователя с синхронным выпрямителем (похоже на базе MP2307), способный (по утверждению продавца) выдать ток до 3-х ампер. Обзоры этого модуля на MYSKY показывают, что 3 ампера – только в мечтах, реально без перегрева можно рассчитывать на 1А, плюс защита от КЗ на выходе и перегрева у него отсутствует. Видимо в модуле использован китайский клон микросхемы и в нем выкинуто лишнее, т.е. защита. Несмотря на указанные недостатки цена модуля и его размер исключительно привлекательны.
Однако при отсутствии защиты от перегрева и КЗ модуль при отказе, т.е. выгорании проходного транзистора, выдаст все 15 вольт на выход. Это опасно, слишком много для МК и датчиков. Поэтому я принял решение применить защиту от превышения напряжения питания при выходе понижающего преобразователя из строя. Защита состоит из двух независимых механизмов, каждый предотвращает попадание напряжения более 5.6 вольт на питание МК.
Первый механизм выполнен на половине компаратора LM2903 (OP3-1) и мощном полевом ключе VT1. Он включает питание на МК если напряжение питания на выходе преобразователя не более 5.6 вольта и выключает, если напряжение более 5.6В.
Второй механизм состоит из мощного стабилитрона советского производства Д815А, включенного параллельно на выходе преобразователя и многоразового термопредохранителя (MF-F050), включенного последовательно на входе преобразователя. В случае отказа преобразователя и повышения выходного напряжения более 5.6В откроется стабилитрон, через него потечет ток, который приведет к нагреву термопредохранителя и отключению питания на Говорилку. Напряжение стабилизации Д815А составляет 5.6 вольта, допустимый ток – 1400 мА, что гарантирует непревышение уровня 5.6 вольта. Допустимый ток для стабилитрона существенно превышает пороговый ток в 900 мА от источника питания (CCU6225). Термопредохранитель отключится заметно раньше, чем нагреется стабилитрон.
Второй механизм защиты одноразовый и отключает напряжение необратимо. Для восстановления нормальной работы потребуется скорее всего заменить плату импульсного преобразователя. Плата смонтирована на разъеме и при наличии запасной достаточно вынуть неисправную и вставить новую.
В качестве компаратора применен сдвоенный LM2903 c рабочим диапазоном по температуре –40 +125 С. Ключевой транзистор типа FDS6679AZ, P-канал, -30В, -13А, 9мОм в корпусе SO8. Один канал компаратора выполняет сравнение опорного напряжения 5.6 вольт со стабилитрона и управление ключом. Если напряжение на стабилитроне больше напряжения на выходе импульсного преобразователя – то выход компаратора переходит в состояние 0, что открывает силовой полевой ключ.
Второй канал компаратора задействован в схеме индикации аварии по питанию. Если напряжение на выходе платы защиты менее 3-x вольт – включается светодиод HL2 красного цвета, индицируя отказ по питанию. Светодиоды HL1 и HL3 зеленого цвета индицируют присутствие +15 и +5 вольт.
В CCU6225LT осталось два свободных входа, которые ранее, до переделки системы питания в дачном доме на три фазы, использовались для считывания показаний текущего тока и напряжения в сети. Для измерения тока использовался бесконтактный датчик на эффекте Холла CSLA1CD от Honeywell. Этот датчик выдает напряжение, пропорциональное мгновенному значению тока, протекающего по проводу, на котором этот датчик размещен и может измерять как постоянный, так и переменный ток. При отсутствии протекающего тока на выходе датчика имеется половина питающего напряжения. Соответственно при токе в одну сторону напряжение уменьшается, а в другую – увеличивается. При протекании переменного тока на выходе имеется синусоида, амплитуда которой пропорциональна силе тока, сдвинутая на половину напряжения питания. Для преобразования действующего значения этой синусоиды в постоянное напряжение была использована микросхема AD736, после которой сигнал усиливался ОУ для получения размаха 0 +15 В, на который рассчитан вход CCU6225LT. Второй аналоговый вход был использован для измерения напряжения в сети. Некогда мне удалось купить датчик тока на 57А, который для контроля тока в диапазоне единиц ампер (до 16) грубоват. Но это не проблема – достаточно увеличить число витков токонесущего провода в отверстии датчика и чувствительность датчика увеличится пропорционально числу витков. Иначе говоря, два витка дадут датчик на 57/2 = 28,5А, четыре на 57/4 = 14,25А. Конструкция оказалась вполне удачной, стабильно проработала много лет и имела единственный недостаток – большое смещение нуля на выходе, около 0.5 В. Использованный ОУ не мог выдать 0 на выходе. Наверно тогда я не знал о существовании ОУ RAIL-TO-RAIL :). С напряжением решение было проще – маленький трансформатор с выходом на 10-12 вольт и пиковый выпрямитель на германиевых диодах Д9 дали достаточно точный измеритель напряжения. Практическая польза дистанционного знания о токе и напряжении – контроль реального потребления, все ли выключено?
При переходе на три фазы оба этих датчика оказались неактуальны. Но счетчик является источником довольно полной информации о текущем состоянии энергосистемы, в нем формируется даже такие экзотические данные, как реактивная мощность по каждой фазе. На экран Говорилки (рис. 12) я вывел данные не только о текущем значении потребления по каждому тарифу, но и текущие значения тока, напряжения, мощности по каждой фазе, частоте сети, что позволило сэкономить на щитовых вольтметрах и амперметрах, даже расширив спектр отображаемой информации по сравнению с устройствами на рынке. Для контроля суммарной потребляемой мощности достаточно выдать на CCU6225 сигнал, пропорциональный текущей потребляемой мощности.
Рис. 12 Дисплей Говорилки
Для формирования аналогового сигнала, пропорционального текущей потребляемой активной мощности и температуре в помещении я использовал готовые модули DAC на основе микросхемы MCP4725. Модули обошлись по 75 р за штуку с Ебея и это наверно самый дешевый способ получить достаточно точное преобразование цифры в аналог. Модули управляются по каналу I2C, имеют возможность изменить адрес (т.е. два модуля могут работать на одной шине I2C). Модуль DAC имеет выходное напряжение в диапазоне 0 + 5 в. Подпрограмма для вывода значения выделена в файл. Использована возможность Arduino IDE размещать отдельные подпрограммы в файлы в той же директории. При открытии проекта эти файлы размещаются по табам и компилируются, как если бы они были размещены в тексте основного модуля программы. Это еще не библиотека, но уже удобно.
CCU6225 имеет диапазон АЦП 0 +15 вольт. Программно можно задавать различные коэффициенты преобразования входного напряжения и включать среднюю точку – если входной сигнал отображает параметр с отрицательными значениями. Для мощности достаточно было подобрать коэффициент преобразования, такой, что напряжение 5 вольт стало соответствовать 15 квт мощности. А вот для температуры это простое решение не подошло. Температура может быть меньше нуля. Я принял решение, что буду выводить температуру в диапазоне -30 +30 градусов. Т.е. температуре -30 градусов будет соответствовать напряжение 0 вольт на выходе ЦАП, а +30 – 5 вольт. К сожалению, режим с включенной средней точкой в CCU6225LT предполагает, что средняя точка находится посередине диапазона – т.е. соответствует значению 7.5 вольт (=15/2) и это невозможно изменить. Следовательно, нужно сместить сигнал от ЦАПа так, чтобы половина шкалы (2.5 вольта) соответствовала половине шкалы АЦП (7.5 вольт). Обдумав и оценив разные способы это сделать, я выбрал использование Rail-to-rail операционника. Требования к такому ОУ: rail-to-rail по входу и выходу, питание не менее 15 вольт, частотные характеристики не важны, минимальная цена. По этим требованиям я нашел LMC7101BIM5X/NOPB от Texas Instruments. В ЧИпеИДипе – 40 рублей, дешевле не нашел.
Для преобразования диапазона 0 +5 в диапазон 0 +15 требуется коэффициент усиления 3 (15/5=3). Для стандартной неинвертирующей схемы включения коэффициент усиления определяется по формуле Ku=1+R1/R2. Я выбрал значения резисторов в цепи обратной связи 100 к и 200 к.
Есть и более простой способ подвинуть диапазон на 7.5-2.5= 5 вольт – использовать стабилитрон на 5 вольт, включенный последовательно с выходом ЦАП. Недостаток этого способа – диапазон изменения сигнала на входе CCU6225LT останется изначальным, всего 5 вольт, что втрое уменьшает точность перевода аналогового сигнала в цифровой.
Есть и еще один вариант решения вопроса. Диапазон АЦП в CCU6225LT нестандартен: 0 +15 вольт получены наиболее вероятно через делитель на входе, поскольку стандартные значения питания МК систем +5 и +3.3 и эти же напряжения являются максимумом для АЦП. Следовательно, можно изменить номиналы резисторов делителя для получения диапазона на входе 0 +5в. В простейшем случае для этого можно замкнуть верхний резистор предполагаемого делителя. Но как говорится «гладко было на бумаге». На запрос фирме-производителю о схеме электрической принципиальной я получил ответ, что эти схемы утеряны, так как устройство давно снято с производства, но известно, что напряжение питания ядра системы +5 вольт. Конечно можно по монтажу найти нужный резистор. Но интуиция была против: «Не стоит лезть в работающее устройство и что-то там перепаивать». Я прислушался к внутреннему голосу и пошел путем подстройки к обстоятельствам.
Подключение внешних датчиков
К Говорилке подключен ряд внешних датчиков. Температура измеряется датчиками Dallas 18B20, подключенными по трехпроводной схеме. Для подключения использована стандартная витая пара. Общая длина шлейфа составляет примерно 15 м. Программно на каждом цикле выполнения определяется количество подключенных датчиков, значения температуры считывается с каждого обнаруженного и в дальнейшем эти данные проговариваются. Программа озвучивает количество найденных датчиков температуры и температуру по каждому из них. На сегодня использовано 3 датчика, размещенных по дальней стене равномерно по вертикали для мониторинга температур по высоте помещения. При отладке Говорилки я подключал 10 датчиков в разных местах шлейфа. Все 10 уверенно определялись.
По каналу I2C подключены три датчика: BME280, BH1750 и SHT11. Датчик BME280 производства BOSH дает три параметра – атмосферное давление, влажность и температуру внутри помещения. Датчик освещенности BH1750 присоединен к этому же шлейфу и служит для контроля включения ламп освещения. Датчик SHT11 размещен вне помещения в пластиковой трубе. Труба вставлена в просверленное отверстие в деревянной стене дома и отстоит на примерно 1 метр снаружи дома. Внешний конец трубы загнут вниз, чтобы избежать попадания дождя. Датчик в наружном изогнутом конце трубы предоставляет данные о температуре и влажности за бортом.
Напряжение питания датчиков +5 вольт, подтягивающие резисторы R1 и R2 также подключены к +5 вольт, так как по мануалу входы PB6, PB7 (I2C) могут работать с напряжением +5 вольт.
Все эти датчики подключены по одному шлейфу. Как я уже писал ранее, запустить второй канал I2C мне удалось после установки Говорилки в отдельно проведенном исследовании и поэтому на момент установки и запуска системы пришлось остановиться на использовании только одного канала I2C. Возможно, следующим летом я проведу доработки системы.
Заключение
На сегодня Говорилка работает у меня на даче. Запись звонка на нее можно послушать тут yadi.sk/d/LeXWNH8bzp8PZ (формат amr) или тут yadi.sk/d/7WXKv_rgzp8jK (формат wav). Качество звука невысокое, но речь вполне разборчива и свою основную задачу – произнести цифры текущего потребления устройство выполняет вполне уверенно. Полный цикл прослушивания занимает 1 минуту 45 секунд. Оплата за эти две минуты составляет несколько рублей в месяц.
На момент опубликования статьи (30 ноября 2016) температура в помещении составляла -8 С, устройство работало штатно, в соответствии с поставленной задачей.
Программа для Ардуино в этом архиве: yadi.sk/d/uqogGm7bzpB7A.
Автор: Winnie_The_Pooh