Часть 2. Железо и реверс-инжиниринг
В предыдущей части:
Часть 1. День, когда из стиралки пошел синий дымок
Важное предупреждение!
Всё, что описано в этой статье, делалось с риском для жизни. Работа с напряжением 220 вольт, коммутация силовых цепей, тестирование на работающем оборудовании - всё это требует не только знаний, но и строгого соблюдения техники безопасности.
Если вы не уверены в своих силах, не имеете опыта работы с высоким напряжением или не понимаете, как работает оборудование - не повторяйте это дома. Любая ошибка может стоить жизни.
В моём случае каждый шаг сопровождался проверкой изоляции, контролем нагрева и многократной перепроверкой схемы перед включением и двойным контролем отключения питания. И даже с этим - нервы у меня были на пределе. Родные тоже за меня сильно переживали.
Статья написана не как инструкция к повторению, а как история с подробным разбором технических решений. Если вы решитесь на подобный проект - делайте это осознанно и безопасно.
Прежде чем начать
Прежде чем браться за паяльник и ковыряться в проводах, я для себя решил, что с начала нужно научиться управлять мотором. Это было самое сложное и самое важное.
Задача стояла такая:
-
Научиться подавать на мотор нужную мощность (чтобы он крутил с разной скоростью, стирка отжим и т.д)
-
Научиться менять направление вращения (вперёд/назад)
-
Получать текущие обороты от таходатчика
-
Передавать эти данные в контроллер, чтобы он понимал, что происходит.
Без этого - никуда. Мотор - это сердце стиральной машины. Если я не смогу им управлять, весь проект теряет смысл.
Поэтому начал я с мотора. А всё остальное - панель, датчики, управление, клапаны - уже прикручивалось по мере готовности.

На фото пытаюсь понять и прозвонить, как управлять мотором
Первый контакт с мотором. На разъемах 220 Вольт. Перемычки, провода, мультиметр и желание понять, что к чему. Без этого этапа никакая схема не родилась бы.
После того как у меня получилось управлять мотором с помощью перемычек, я понял, как вращать им в разные стороны, приступил к реализации блока управления на Arduino. Теперь нужно было повторить то же самое, спаять драйвер, написать программу, с плавной регулировкой скорости и обратной связью по таходатчику.
Первые тесты: лампа вместо мотора
Прежде чем подключать настоящий мотор к Arduino, я собрал макетную плату для проверки принципа фазо-импульсного регулирования. В качестве подопытного - обычная настольная лампа накаливания. На лампе отлично видно, как меняется яркость при изменении задержки Dimmer. Включил - загорелась, выключил - погасла, убавил мощность - лампа стала светить меньше. Управление работало. Мотор можно было подключать.

Первые шаги к управлению мотором. Лампа накаливания послушно меняет яркость по моей команде - значит, фазо-импульсный метод работает. Если что-то пойдёт не так - лампа хотя бы не взорвётся.
Как управлять мотором переменного тока: теория
Казалось, что управлять мотором - это просто: подал напряжение - крутится, убрал - остановился. Но для стиральной машины нужна плавная регулировка скорости, поддержка нужных оборотов в зависимости от загрузки барабана и возможность менять направление вращения. Мотор в LG WD80187 асинхронный, переменного тока. Это сильно усложняет задачу.
Чем AC отличается от DC
Для двигателя постоянного тока достаточно изменить амплитуду напряжения - ШИМом. Для переменного тока такой номер не пройдёт: синусоида 50 Гц, большие токи, резкие включения вызывают броски и помехи. Нужен другой подход.
Фазо-импульсное регулирование
В моем проекте я реализовал фазо-импульсный метод с контролем перехода через ноль.

Вот как это работает:
-
INT0 (внешнее прерывание arduino) детектирует каждый переход сетевого напряжения 220V через ноль (50 раз в секунду)
-
При каждом таком переходе запускается счётчик задержки.
-
Открытие симмистора происходит не в момент перехода через ноль, а с задержкой, определяемой значением переменной в коде Dimmer (0–255).
-
Каждый шаг счётчика - 40 микросекунд. Максимальная задержка - около 10 мс (длительность полупериода).
-
Чем меньше задержка, тем большая часть полуволны поступает на мотор - тем выше мощность. Чем больше задержка - тем меньше мощность.
Симмистор закрывается автоматически при следующем переходе напряжения через ноль.
Обратная связь по таходатчику
Чтобы мотор крутил с заданной скоростью, а не просто "в полную силу", нужен замкнутый контур. Таходатчик (подключённый к прерыванию INT1 arduino) измеряет фактические обороты в реальном времени. Микроконтроллер сравнивает их с целевым значением и динамически корректирует Dimmer: если оборотов мало - уменьшает задержку, тем самым увеличивает мощность, а если много - увеличивает задержку.
Что это даёт
| Мягкий старт | Коммутация происходит вблизи нулевой точки, нет ударов |
| Минимум помех | Отсутствие бросков тока при включении |
| Плавная регулировка | 256 уровней мощности (0-255) |
| Стабильность скорости | Обратная связь по таходатчику |
Готовый блок управления мотором
После успешных тестов, с третье попытки, это был третий вариант схемы, все прошлые были не удачные, с сожженными деталями, я наконец-то собрал полноценный драйвер двигателя. Симисторы, радиаторы, опторазвязка (которой не было в оригинале). Всё, чтобы можно было управлять мотором из Arduino плавно и безопасно.

Финальная версия драйвера двигателя. Радиатор - потому что симисторы греются при активной работе. Опторазвязка - для безопасности, нет общей шины между 220 и 5 вольтами, в отличии от оригинальной платы
От блокирующего кода к прерываниям
На первых этапах, когда я только начал экспериментировать с мотором, всё было просто и топорно. Я написал процедуру, которая полностью блокировала выполнение остального кода: задал скорость, включил мотор, подождал нужное время, выключил. Пока мотор крутился - контроллер ничего больше не делал, исполнение кода крутиться в цикле. Это работало в тестах, но для реальной стиральной машины такой подход не годился: нужно одновременно следить за уровнем воды, опрашивать кнопки, обновлять индикацию, контролировать температуру (хотя в последствии все это я тоже повесил на прерывание, все кроме опроса кнопок).
Поэтому я переписал управление мотором на прерываниях. Теперь вся логика поддержания оборотов вынесена в обработчик прерывания, который вызывается 100 раз в секунду (таймер _timer_MAIN). В коде достаточно просто вызвать процедуру MotorStart() или MotorStop(), которая устанавливает значение переменной Dimmer и включает флаг MOTOR_ON. А дальше - всё автоматически:
-
Прерывание INT0 (детектор нуля) управляет открытием симистора с задержкой Dimmer
-
Прерывание INT1 (таходатчик) считает обороты
-
Главный таймер сравнивает текущие обороты с заданными и корректирует Dimmer
Весь контроль вращения мотора происходит асинхронно, не блокируя основной код. Это позволило совмещать работу мотора с остальным управлением работы стиральной машины.
В третьей части я покажу, как это реализовано в коде - с обработчиками прерываний, таймерами и структурами данных.
Силовая часть: распредкоробки и реле
Чтобы не устраивать пожар в ванной и отделить контроллер от высокого напряжения, я вынес всю коммутацию 220V в отдельные распредкоробки. Реле, предохранители, разъёмы со старой платы - всё аккуратно упаковано и подписано. Arduino только подаёт 5V сигнал, через опторазвязку внутри распредкоробки, всю коммуникацию на 220 Вольт работу делают реле.

На плате видны разъемы, выпаянные из сгоревшей платы, чтобы подключать силовые устройства машины

Две распредкоробки - управление насосом, клапанами, двигателем и блокировка двери. Внутри - реле, предохранители, заводские разъёмы, выпаянные из родной платы. Никакого 220V рядом с Arduino, все гальванически развязано.
Да-да, и та самая синяя изолента, без нее точно ничего бы не получилось!

Рукописная схема, собственной разработки, которая потом легла в основу силовой части.
Door Lock - получает сигнал от микроконтроллера и блокирует дверь
Door Look? - сигнал для микроконтроллера закрыта ли дверь?
PUMP - получает сигнал от микроконтроллера и включает насос
Схема работы с тэном, не сохранилась, но там все аналогично управлению насосом
Реверс-инжиниринг панели индикации
Эта была, пожалуй, самая кропотливая работа. Я вызванивал кнопки, светодиоды, семисегментные индикаторы, энкодер и рисовал схемы, выяснял, какие пины за что отвечают. Так появились рукописные схемы распиновки панели индикации.

Рукописная расшифровка кнопок, панель подключалась двумя шлейфами 10 и 12 проводов

Та самая восьмёрка с сегментами A-B-C-D-E-F-G. По ней я потом написал массив segCode[24][7] - который позволял выводить цифры и некоторые буквы

Один из двух моих разъёмов (от COM порта) для подключения силовой нагрузки (для сопряжения платы arduino и силовых распредкоробок). Каждый контакт подписан, чтобы ничего не перепутать

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

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

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

Первое включение. Панель проходит тест: огни светодиодов бегут по кругу, затем устанавливается программа по умолчанию. Это тот самый момент, когда мёртвое железо начинает оживать, в третьей части я покажу этот код инициализации
С мотором и панелью индикации разобрались. Теперь нужно было понять, сколько воды в баке. И тут меня ждал сюрприз…
Прессостат: как вода говорит частотой
Отдельная история - это датчик уровня воды. В этой машине он устроен хитро: сердечник внутри катушки двигается от уровня воды, меняя индуктивность и соответственно, частоту мультивибратора. Я нашёл схему в интернете и собрал ее.

Внизу подписано, какая частота соответствует какому уровню воды в баке. В последствии эти параметры стали константами в коде программы

Прессостат, для контроля уровня воды в баке
Самодельная шина
Чтобы соединить всё воедино, я паял шины из проводов, каждый провод в термоусадке, все вместе в синей изоленте.

Вот она, нервная система прототипа. Без этой шины я бы утонул в проводах, да и подключать каждый провод по отдельности к Arduino было не очень надежно
Полевые испытания: ванная комната как лаборатория
Когда все модули были готовы, настал момент истины - запустить всё вместе. Ноутбук на крышке унитаза (потому что больше негде), макетные платы на стиралке, пена в баке, на экране - консоль отладки. В этот момент машина впервые стирала под управлением моего кода.

Технологический стенд. На крышке бачка, рукописная схема подключения, ноутбук на унитазе, на крышке машины - Arduino и макетная плата, распредкоробки, которые управляют двигателем, насосом, клапанами. В бак наливается вода, значит, пока все идет по плану. В консоли - строки логов. Этот момент я запомню навсегда.

Видео демонстрация работы прототипа
Финальные тесты перед сборкой
Панель собрана, всё подключено, машина работает, но пока панель лежит на крышке - последние тесты перед ее установкой на свое место.

Машина стирает, панель показывает оставшееся время стирки, текущую программу стирки. Пока она лежит на крышке - финальные тесты перед установкой.
Справа те самые COM разъемы для подключения распредкоробок к Arduino, где один провод отмечен синей изолентой

Тот же момент, но вид с другой стороны панели
Вместо заключения
На этом этапе у меня было всё, чтобы машина заработала:
-
Полностью готовая и отлаженная панель индикации (на последнем фото она уже в сборе)
-
Силовой блок с заводскими разъёмами, сохранивший родную проводку машины
-
Драйвер двигателя, прошедший три итерации и наконец заработавший так, как было нужно
-
Схемы подключения всех датчиков и исполнительных устройств
-
Понимание, как работает пресостат и как с ним "подружиться"
Панель теперь не просто "ожила" - она научилась красиво приветствовать пользователя бегущими огнями, запоминать настройки и выполнять команды. Весь этот путь - от выпаянных разъёмов до работающего прототипа занял несколько месяцев, но результат стоил каждого потраченного вечера.
Но главное, что я получил - это не просто работающую стиральную машину. Я впервые за долгое время сознательно вышел за пределы своей привычной области.
Из мира 1С, где всё ограничено конфигурацией и бизнес-логикой - в мир, где есть реальное железо, опасное для жизни напряжение, ошибки и последствия. И оказалось, что принципы те же самые: состояние, события, обратная связь. Просто цена ошибки - уже не уровня "документ не проводится", а сгоревший дорогой полевой транзистор. И именно поэтому этот проект запомнился мне гораздо сильнее, чем многие коммерческие задачи.
Оставалось самое интересное - код. Тот самый, который превращает разрозненные модули в единый, слаженно работающий организм. В третьей части я покажу, как устроена логика программы: обработка прерываний (аппаратных и таймерных), принцип регулирования мощности мотора, динамическая индикация и опрос кнопок, определение дисбаланса барабана при выходе на режим отжима.
И пожалуй, самое любопытное: я попросил современный ИИ проанализировать мой код, написанный в 2018 году. Интересно, что он скажет? Где я ошибался, а где, наоборот, сделал нестандартно, но эффективно? Но об этом - в финальной части.
Часть 1. День, когда из стиралки пошел синий дымок
Введение, драма с "синим дымком", вскрытие блока управления и идеологическое противостояние с производителем
Часть 2. Железо и реверс-инжиниринг
Как я вручную прозванивал плату индикации, реверс-инжиниринг и R&D, подключение Arduino к реле, датчиками, мотору, клапанами и т.д. еще больше фото и видео самого процесса разработки
Часть 3. Софт
Логика программы, обработка прерываний (аппаратные, таймеры), принцип регулирования мощности мотора, ссылка на GitHub.
Что в итоге получилось и оценка проекта на сегодняшний день с помощью ИИ
Другие статьи автора:
Вступайте в нашу телеграмм-группу Инфостарт