Модернизация вашего старого блока питания для управления с помощью смартфона

Ari Mahpour
|  Создано: 12 Февраля, 2024  |  Обновлено: 15 Февраля, 2024
Блок питания с поддержкой Wi-Fi

Недавно я нашел в гараже у моего отца старый источник питания BK Precision 1787 и, будучи немного склонным к накопительству, не смог упустить возможность забрать его домой и поиграть с ним. Как с заброшенной игрушкой, более года этот источник питания стоял у меня в шкафу, собирая пыль, в ожидании, когда же с ним поиграют. Недавно я достал его и обнаружил, что на задней панели есть порт RS-232:

Рисунок 1

Рисунок 1: 

Я задался вопросом: "а не мог бы я управлять им с помощью кабеля RS-232?" Первоначальное исследование на сайте BK Precision показало, что оригинальная документация (более чем 20-летней давности) указывала на необходимость специального комплекта для использования ПК-интерфейса:

Рисунок 2

Рисунок 2: 

Я был довольно разочарован, когда увидел это уведомление и подумал о том, чтобы выбросить весь аппарат, но решил провести небольшой эксперимент. В этой статье мы рассмотрим, как я разобрал источник питания и превратил его в устройство, управляемое через IoT, где напряжение и ток можно устанавливать или считывать через телефон или любое устройство, подключенное к интернету. Мы рассмотрим команды UART, анализ шины для подтверждения серийной связи и создание сервера REST API на Raspberry Pi Pico W для обеспечения возможностей IoT этого оборудования.

Проект

Вместо того, чтобы превратить источник питания в электронные отходы, я решил немного поэкспериментировать с ним. Большинство современных источников питания можно управлять через последовательный порт (например, UART), USB (обычно как устройство COM или USBTMC) и/или Ethernet (в основном управление через VISA). Однако я не видел много оборудования, поддерживающего возможности Wi-Fi. Предполагаю, что это связано с некоторыми неудобствами настройки, и большинство разработчиков или инженеров по испытаниям не особо обеспокоены наличием проводного соединения. Мой источник питания был оснащен портом RS-232, но больше ничем. Мне показалось, что было бы довольно интересно добавить ему возможность Wi-Fi с REST API интерфейсом, чтобы я мог управлять им из любой точки мира с помощью устройства, подключенного к интернету.

Одна из основных проблем, с которыми я столкнулся, заключалась в том, что я не мог общаться с источником питания. Как вы видели выше, в руководстве указывалось, что для использования ПК-интерфейса необходим специальный комплект и программное обеспечение. Моя первая попытка «взломать» источник питания закончилась полным провалом. Я подключил кабель RS-232 UART к порту на задней панели и начал вводить случайные символы. Я снял крышку и проследил сигналы через порт RS-232 к чипу приемопередатчика MAX202C и исследовал сигналы TX и RX с обеих сторон чипа. Все, что я получил, было лишь мусором:

Рисунок 3

Рисунок 3:

К счастью, ребята из BK Precision были очень отзывчивы и предоставили мне необходимый набор команд для управления блоком питания. Они даже смогли предоставить мне скриншоты с программным обеспечением, которое они использовали, и все настройки UART, чтобы я мог подтвердить, что все настроено правильно. С их помощью я смог протестировать мои команды и увидеть, как они корректно обрабатываются на моем осциллографе:

Рисунок 4

Рисунок 4: 

Хотя это может показаться лишним шагом, это помогло мне установить базовый уровень для сравнения, когда я подключил свой Raspberry Pi Pico W напрямую к линиям UART. На этом этапе я смог установить правильное общение и был готов к модернизации моего блока питания для включения его в состав IoT-устройств.

Установление связи

Теперь, когда у меня была рабочая конфигурация с использованием USB RS-232 UART кабеля, я хотел воспроизвести ту же конфигурацию с использованием Raspberry Pi Pico W. Большинство моих проектов для Raspberry Pi Pico написаны на MicroPython (меньшая, более компактная версия Python, предназначенная для микроконтроллеров), поэтому я решил использовать библиотеку machine.uart. Для этого мне нужно было подключить мои линии UART/RS-232 к специфическим аппаратным контактам UART. В данном случае я использовал GPIO 16 и 17. После отправки серийных команд через UART в моем коде MicroPython я обнаружил, что все отправляемые и возвращаемые данные были бессмысленны. Код постоянно сообщал, что возвращаемые байт-коды даже не были символами ASCII. Ясно было, что что-то не так. По этой конкретной причине было критически важно получить захват сигнала с рабочей конфигурации. Сразу же я смог определить, что сигналы стали инвертированными к тому времени, как они дошли до устройства Raspberry Pi Pico. После установки инверсии TX и RX (при создании объекта библиотеки UART) возвращаемые серийные данные стали идеальными.

Важно отметить, что устройство Raspberry Pi Pico работает на уровне напряжения 3.3 В, а BK Precision 1787 (в частности, используемая им микросхема MAX202C) работает на 5 В. Подача сигналов 5 В на контакты GPIO устройства Raspberry Pi Pico на длительные периоды может повредить буферы ввода микросхемы. Для долгосрочного использования настоятельно рекомендуется использовать преобразователь уровней напряжения для правильного преобразования уровней напряжения с 3.3 В на 5 В между устройствами.

Создание сервера REST API

На этом этапе я наладил связь и написал библиотеку драйверов, которая обеспечивала полный контроль над моим блоком питания через последовательное соединение. Следующим шагом было настроить базовый веб-сервер и проверить, смогу ли я управлять моим устройством через Интернет. Благодаря microdot мне удалось упростить моё REST API и создать очень быстрый прототип "Hello World", чтобы подтвердить, что устройство Raspberry Pi Pico H может работать как веб-сервер для меня. Помимо простого возвращения строки "Hello World", я также подтвердил, что могу переключать светодиоды, используя POST-функции. На этом этапе я был готов к интеграции всего.

Собираем всё вместе

Чтобы сделать финальный код более читаемым и масштабируемым, я использовал классы в своём коде. Объектно-ориентированный код не является чем-то новым в мире программирования, но часто упускается из виду во встроенных системах. Когда вы пишете веб-сервисы, особенно те, которые управляют различными устройствами, важно красиво абстрагировать ваш код, чтобы детальный код устройства находился вне основного приложения. В моём случае вы заметите в main.py, что кода, ссылающегося на блок питания, очень мало, за исключением вызова конкретных функций, таких как установка или чтение тока/напряжения (в отличие от обработки собственно команд UART внутри main.py). Это позволяет чище видеть, что происходит на уровне веб-приложения, и абстрагирует детали того, что происходит на уровне коммуникации с устройством.

В main.py я создаю два разных типа конечных точек для управления моим блоком питания. Один тип использует метод POST, который обычно используется в REST API для обновления полей на сервере (например, вставка строки в базу данных). Я мог бы легко использовать метод PUT, поскольку это было всего лишь одно значение, которое я редактировал, но без особой на то причины я остановился на POST. На самом деле, выбор метода зависит от вас в этом конкретном сценарии.

Я также создал маршрут под названием "controller", который выводит очень простую форму отправки, где пользователь может установить напряжение/ток и нажать "отправить", что, в свою очередь, выполнит действие POST и заставит веб-сервис обновить настройки напряжения/тока на блоке питания. Вот где в игру вступает аспект IoT, управляемый со смартфона. Выполнение метода POST не так просто сделать с вашего смартфона или обычного браузера. Вы могли бы использовать метод GET, но тогда у вас получилась бы и длинная строка URL. Очень простой способ достичь аспекта "умности" вашего проекта - это добавить базовую веб-форму, к которой может обратиться любой с любого устройства. Как только вы поддерживаете базовую веб-форму в вашем веб-приложении (и правильно настроили маршрутизацию входящего трафика через брандмауэр вашего маршрутизатора), вы, по сути, продемонстрировали, что ваш код "поддерживает IoT".

Рисунок 5

Рисунок 5:

Некоторые другие функции мониторинга здоровья/отладки, которые я добавил в этот проект, включают:

  1. Включение встроенного светодиода после инициализации всех компонентов
  2. Страница «статуса», показывающая, что веб-сервер работает
  3. Возвращение ответов через HTTP от блока питания после отправки ему команд
Рисунок 6

Рисунок 6:

Наличие таких мелочей действительно помогает превратить хобби-проект в что-то более зрелое, что можно диагностировать при возникновении проблем.

На этом этапе я успешно собрал все вместе и теперь у меня был старый блок питания с передовыми технологиями. «Какова же цель этого супер ретро блока питания?» - задавал я себе вопрос. Ну, этот момент я все еще пытаюсь понять.


Чтобы просмотреть полный репозиторий кода, посетите https://gitlab.com/embedded-designs/rest-api-controlled-power-supply-using-micropython.

Об авторе

Об авторе

Ари — инженер с большим опытом работы в сфере проектирования, производства, тестирования и интеграции электрических, механических и программных систем. Он стремится к созданию дружного сообщества специалистов по разработке, верификации и тестированию решений.

Связанные ресурсы

Связанная техническая документация

Вернуться на главную
Thank you, you are now subscribed to updates.