Всем привет! Предупреждаю заранее, данный проект не является сколь-либо экономически выгодным. За время, затраченное на эту работу, можно было заработать на несколько таких новых посудомоек. Целью данного поста является демонстрация примера разработки ПО для небольшой автоматики в кустарных условиях (аналогичных производственным). Если из этой идеи получится что-то стоящее, то исходные коды проекта я потом выложу. Писать код буду в реальном времени по мере возможности. Конкретно в данном посте мы изучим устройство этой машины, подготовим платформу, и загрузим первую тестовую программу.
Итак, попала ко мне в руки вышедшая из строя посудомоечная машина. Было выяснено, что её агрегаты (соленоиды, насосы и т.д.) находятся в исправном состоянии. Вышел из строя сам контроллер, где находится программа для управления этими приборами. Что, скажу я вам, весьма серьёзная ситуация - ведь без этого контроллера большая и дорогостоящая машина подлежит отправке на помойку. В интернете я уже видел подобные проекты, но они были сделаны как-то халтурно, не уверен, что они вообще работали. Для написания подобного ПО в производственных условиях программисту уже должны быть даны технические параметры всех приборов и назначение выводов. Но у нас нет ни оригинального контроллера, ни исходников. Поэтому нет никаких шансов восстановить заводское ПО. В таком случае, будем писать своё. Но для начала необходимо изучить, что собой представляет машина - ведь у нас нет практически никаких данных, все провода для нас отличаются только цветом. Первым делом, выпаиваем старый, вышедший из строя контроллер:
Далее, мы видим на плате микросхему ULN2003 (моя называется иначе, но 2003 в названии сути не меняет). Подпаяем к прибору специальную платку (состоит из резисторов и блока переключателей):
Итак, из даташита мы знаем, что микросхема ULN2003 имеет семь входов и семь выходов с инвертированием сигнала. Сделано это для удобства подключения к реле - при подаче логической единицы 5В на вход микросхемы, выход подтягивается к земле и в катушках реле начинает течь ток. Мощный прибор, подключенный к реле, включается в работу.
Для определения этих самых приборов плату устанавливаем на машину, после чего щелкаем переключателями по очереди. Методом проб переключателей было выяснено, что каждый из 7 выходных пинов выполняет свою функцию:
1. Запуск центробежного насоса (ЦН) на большой скорости
2. Запуск ЦН на малой скорости (половинная загрузка?)
3. Открытие входного клапана (залив воды)
4. Открытие дозатора моющего средства
5. Включение соленоида, находящегося в баке с солью
6. Включение сливной помпы
7. Включение ТЭНа для нагрева воды.
Теперь стала понятна суть выходного регистра. Далее, была очередь за входным - вот тут сложнее, ибо понять, какой провод за что отвечает было очень сложно. Но, как не зря кстати, совершенно случайным образом мне была ниспослана с неба монтажная схема на этот прибор. Она многое прояснила.
Выявленные опытным путём выводы соответствуют указанным на схеме (выходы - внизу прямоугольника). Однако, также полно внесистемных обозначений. Например, что такое FM? ISS? Это всё пришлось выяснять опытным путём. В результате, спустя некоторое время, схема выглядела уже так:
Входы расположены следующим образом:
1. RE - вход терморезистора (на 9,7КОм), установленного в баке с водой. Он контролирует температуру воды, нагреваемой ТЭНом. Константа зависимости сопротивления от нагрева для него неизвестна (утеряна в заводской прошивке), её предстоит выяснять опытным путём в следующих постах. Пока опустим его. Вход аналоговый.
2. FM - Fluid Meter. Датчик воды. Представляет собой геркон с магнитом, который размыкается при заполнении бака. Вход цифровой.
3. IAQS - датчик (микрик) аквастопа. При его активации включается режим аварии и отключаются все приборы. Вход цифровой. Его мы тоже пока опустим.
4. +5V и ISS. Питание датчика соли. Он выполнен на компраторе LM339, вход цифровой.
5. ISB - неизвестный переключатель, находящийся в дозаторе моющего средства. Его расположение выяснять не стал, для тестового запуска он пока не нужен. Вход также цифровой и опустим его.
6. DOOR - датчик двери (замок). Работает аналогично IAQS.
P1 - пресловутый прессостат, но он в данной машине к модулю не подключается, а работает независимо.
Итого, имеем 4 на данный момент важных входа:
1. RE - его реализуем позже через полумостовую схему измерения
2. FM - проверяется через подтяжку линии к 5В через резистор 10K на плюс питания и 2K к самой линии.
3. ISS - аналогичным образом
4. DOOR/IAQS (их пока можно объединить) - аналогичным образом.
От себя также добавлю 2 кнопки (питание и служебная кнопка), и 6 выводов для работы дисплея 1602 (включен в полубайтном параллельном режиме).
Таким образом, мы определили, что к выбираемому контроллеру для данной машинки предъявляются следующие требования:
1. Наличие 14 и более I/O портов для всех агрегатов (выходной регистр, входы, также для подключения дисплея 1602, которого не было в оригинальной схеме)
2. Наличие на борту таймеров (непосредственно для работы отсчёта времени)
3. Наличие АЦП (для обработки показаний термодатчика)
4. Возможность подключения кварцевого генератора для обеспечения стабильности схемы
Собственно, ничего серьёзного. Подойдёт контроллер ATMEGA8 (но т.к. он уже сильно устарел, заменим на любимый китайцами и ардуинщиками ATMEGA328, они полностью совместимы). Скажу сразу, Arduino в данном проекте мы не используем, пишем на чистом AVR.
Когда контроллер выбран, настало время подготовить плату и приборы для отладки. Начнём с того, что подготовим тестовый стенд для ИМС. Запаяем её и некоторые DuPont пины.
Было / стало:
Далее, подготовим аппаратные имитаторы агрегатов машинки. Кто-то скажет, что отладить можно было и в электронном виде, на что я скажу да, можно. Но часто бывает, что в симуляторе не выявляются некоторые косяки, такие как дребезг кнопок, наводки и т.д., т.к. условия там слишком приближены к идеальным. Плюс ко всему, прибор не очень громоздкий, так что можно изготовить "набор для отладки". Состоит он из платы с микросхемой ULN2003, имитирующей работу нашего модуля и агрегатов (но вместо них установлены светодиоды). Второй модуль состоит из 2 кнопок и 3 переключателей, имитирующих наши важные датчики, также, туда будет установлен терморезистор
Для оптимизации схемы некоторые доработки выполнялись "на соплях" прямо на дисплейном модуле:
Вот так вся эта отладочная установка смотрится после сборки. Выходной регистр назначен на порт D (используется 7 выводов из 8), дисплей - на порт B (6 выводов), входной регистр - на порт C (неполный, 6 выводов):
Подписаны светодиоды, имитирующие приборы и все кнопки с переключателями. В таком виде схему можно отлаживать. Предусмотрено внутрисхемное программирование, сразу накинут кварц на 6 МГц (какой нашел, потом, возможно, поменяю). Для испытания на машинке достаточно будет отпаять с модуля блок переключателей, и установить туда также DuPont штыри, к которым будем подключать макетную плату легко и просто без изменений в схеме. В дальнейшем по завершению испытаний отладочные платы убираются.
Теперь создадим проект под эту схему. Сразу же инициализирую git-репозиторий. Пока что лишь маленькая программка "бегущие огни" на задержках для проверки правильности проводки.
Тут уже вылезли косяки: как выяснилось, две абсолютно новые непаянные ATMEGA328P, лежавшие у меня несколько лет, тупо отказались прошиваться. Судя по всему, вышли из строя от лежания. Такой подлянки я от них не ожидал - ведь стоят сейчас достаточно крупных денег. Пришлось перепаивать три раза сам контроллер с переходника, в итоге выдрал из какой-то ардуины более-менее рабочий. После чего плата завелась. Судя по всему, для решения дефицита комплектующих придется где-то раздербанить немного ардуинов.
Программа запустилась, порты были подключены верно, все приборы успешно запитаны, но дисплей пока не инициализирован. Проверено питание модулей и работа переключателей. Видно, что светодиоды успешно горят, значит, мы на финишной прямой.
Дальнейшие задачи по этому устройству, в основном, программные и заключаются в следующем (будем выполнять во второй части поста):
1. Инициализировать аппаратный таймер, отмеряющий время работы конкретного агрегата
2. Инициализировать дисплей для вывода тестовой информации о состоянии машины
3. Написать тестовую программу, которая позволит залить воду в бак машинки, прогнать её насосом без нагревания в течение 5 минут, после чего слить воду.
В дальнейшем:
- Инициализировать АЦП для корректной работы термодатчика и ТЭНа (какое мытьё посуды без нагрева воды)
- Реализовать функцию паузы / аварийного слива
- Реализовать открытие отсека моющего средства в программе
- Индикация отсутствия соли (вывести с датчика на дисплей)
- Реализовать аквастоп/остановку по замку
Более сложные заморочки, такие как выбор программы под разную посуду, подгонка времени и напора воды под конкретное моющее средство пока реализовывать не планирую, ибо эти фичи, как правило, нужны уже конечному потребителю (да и то не всегда). Для минимальной же работоспособности прибора сойдут и ранее перечисленные функции. Подключение модуля и первые натурные испытания 7-минутной тестовой программы также в следующем посте. Пока что наше изделие ещё не переросло уровень "Ардуина щелкает, светодиодами мигает", но это всё в скором времени поправимо.
А пока всё, с вами был Kekovsky, спасибо всем кто дочитал (если кому-то это интересно). Своё мнение по поводу проекта пишите в комментариях.