Modernizacja starego zasilacza do sterowania za pomocą smartfona

Ari Mahpour
|  Utworzono: luty 12, 2024  |  Zaktualizowano: luty 15, 2024
Zasilacz z obsługą Wi-Fi

Ostatnio znalazłem w garażu mojego taty stary zasilacz BK Precision 1787 i, będąc lekkim zbieraczem, nie mogłem przepuścić okazji, aby zabrać go do domu i się nim pobawić. Jak porzuconą zabawkę, przez ponad rok ten zasilacz leżał w mojej szafie, zbierając kurz, tylko czekając, aby się nim pobawić. Ostatnio wyciągnąłem go tylko po to, aby odkryć, że ma port RS-232 na tylnej ściance:

Rysunek 1

Rysunek 1: 

Zastanawiałem się, "czy faktycznie mogę nim sterować za pomocą kabla RS-232?" Początkowe śledztwo na stronie BK Precision, oryginalna dokumentacja (sprzed ponad 20 lat) stwierdzała, że potrzebuję specjalnego zestawu, aby móc korzystać z interfejsu PC:

Rysunek 2

Rysunek 2: 

Byłem dość rozczarowany, kiedy natknąłem się na to ogłoszenie i myślałem o wyrzuceniu całego urządzenia, ale zdecydowałem się na mały eksperyment. W tym artykule przyjrzymy się, jak rozebrałem zasilacz i przekształciłem go w urządzenie sterowane przez IoT, gdzie napięcie i prąd mogą być ustawiane lub odczytywane przez telefon lub dowolne urządzenie podłączone do internetu. Przyjrzymy się komendom UART, śledzeniu magistrali w celu walidacji komunikacji szeregowej oraz budowie serwera API REST na Raspberry Pi Pico W, aby zapewnić możliwości IoT tego sprzętu.

Projekt

Zamiast traktować zasilacz jako elektrośmieci, postanowiłem trochę się nim pobawić. Większość dzisiejszych zasilaczy można kontrolować przez Serial (np. UART), USB (zazwyczaj jako urządzenie COM lub USBTMC) i/lub Ethernet (zazwyczaj kontrolowane przez VISA). Jednak nie widziałem wielu urządzeń, które obsługiwałyby możliwości Wi-Fi. Wyobrażam sobie, że jest to trochę uciążliwe do ustawienia i większość projektantów lub inżynierów testowych nie przejmuje się zbytnio połączeniem przewodowym. Mój zasilacz przyszedł z portem RS-232, ale nic poza tym. Pomyślałem, że byłoby całkiem fajnie nadać mu możliwości Wi-Fi z interfejsem API REST, aby można było nim sterować z dowolnego miejsca za pomocą urządzenia podłączonego do internetu.

Jedyny poważny problem, jaki miałem, to moja niezdolność do komunikacji z zasilaczem. Jak widzieliście powyżej, instrukcja stwierdzała, że potrzebujesz własnościowego zestawu i oprogramowania, aby móc korzystać z interfejsu PC. Moja pierwsza próba "zhakowania" zasilacza zakończyła się całkowitą porażką. Podłączyłem kabel RS-232 UART do portu na tylnej ściance i zacząłem wpisywać losowe znaki. Odkręciłem pokrywę i śledziłem sygnały przez port RS-232 do układu nadawczo-odbiorczego MAX202C i zbadałem sygnały TX i RX po obu stronach układu. Wszystko, co dostałem, to sterta śmieci:

Rysunek 3

Rysunek 3:

Na szczęście ludzie z BK Precision byli bardzo pomocni i dostarczyli mi zestaw poleceń potrzebnych do sterowania zasilaczem. Byli nawet w stanie dostarczyć mi zrzuty ekranu z oprogramowania, którego używali oraz wszystkie ustawienia UART, abym mógł potwierdzić, że wszystko jest prawidłowo skonfigurowane. Dzięki ich pomocy mogłem przetestować moje polecenia i obserwować, jak są poprawnie przetwarzane na moim oscyloskopie:

Rysunek 4

Rysunek 4: 

Chociaż może się to wydawać zbędnym krokiem, pomogło mi to ustalić punkt odniesienia do porównania, gdy podłączyłem bezpośrednio moje Raspberry Pi Pico W do linii UART. W tym momencie udało mi się nawiązać właściwą komunikację i byłem gotowy do rozpoczęcia przerabiania mojego zasilacza na urządzenie z obsługą IoT.

Nawiązywanie komunikacji

Teraz, gdy miałem działający zestaw z kablem UART RS-232 USB, chciałem odtworzyć to samo ustawienie używając Raspberry Pi Pico W. Większość moich projektów dla Raspberry Pi Pico jest napisana w MicroPython (mniejsza, bardziej kompaktowa wersja Pythona przeznaczona dla mikrokontrolerów), więc zdecydowałem się wykorzystać bibliotekę machine.uart. Wymagało to podłączenia moich linii UART/RS-232 do specyficznych pinów sprzętowych UART. W tym przypadku użyłem GPIO 16 i 17. Po wysłaniu poleceń szeregowych przez UART w moim kodzie MicroPython odkryłem, że wszystkie wysyłane i odbierane dane były nieczytelne. Kod ciągle zgłaszał, że zwracane bajty nawet nie były znakami ASCII. Wyraźnie coś było nie tak. Z tego konkretnego powodu krytyczne było, abym uzyskał zrzut ekranu z działającego ustawienia. Natychmiast byłem w stanie stwierdzić, że sygnały stały się odwrócone, gdy dotarły do urządzenia Raspberry Pi Pico. Po ustawieniu inwersji TX i RX (przy tworzeniu obiektu biblioteki UART) zwracane dane szeregowe były czyste.

Ważne jest, aby zauważyć, że urządzenie Raspberry Pi Pico pracuje na poziomach napięcia 3,3V, a BK Precision 1787 (konkretnie chip MAX202C, którego używa) pracuje na 5V. Wysyłanie sygnałów 5V do pinów GPIO urządzenia Raspberry Pi Pico przez dłuższy czas może uszkodzić bufory wejściowe chipa. Dla długoterminowego użytkowania zaleca się stosowanie przesuwnika poziomów do prawidłowej konwersji poziomów napięcia z 3,3V na 5V między urządzeniami.

Budowanie serwera REST API

W tym momencie nawiązałem komunikację i napisałem bibliotekę sterowników, która zapewniała pełną kontrolę nad moim zasilaczem za pośrednictwem komunikacji szeregowej. Kolejnym krokiem było skonfigurowanie podstawowego serwera internetowego i sprawdzenie, czy będę mógł kontrolować moje urządzenie przez internet. Dzięki microdot udało mi się skrócić drogę do mojego REST API i stworzyć bardzo szybki prototyp "Hello World", aby zweryfikować, że urządzenie Raspberry Pi Pico H może dla mnie hostować serwer internetowy. Oprócz prostej instrukcji zwrotnej "Hello World" potwierdziłem również, że mogę przełączać diody LED za pomocą funkcji POST. W tym momencie byłem gotowy do zintegrowania wszystkiego.

Łączenie wszystkiego w całość

Aby uczynić ostateczny kod bardziej czytelnym i skalowalnym, użyłem w moim kodzie klas. Programowanie zorientowane obiektowo nie jest czymś nowym w świecie oprogramowania, ale często jest pomijane w systemach wbudowanych. Podczas pisania usług internetowych, zwłaszcza tych kontrolujących różne elementy sprzętu, ważne jest, aby ładnie abstrahować swój kod, tak aby szczegółowy kod sprzętowy znajdował się poza główną aplikacją. W moim przypadku zauważysz w main.py, że jest bardzo mało kodu odnoszącego się do zasilacza, poza wywoływaniem konkretnych funkcji, takich jak ustawianie lub odczytywanie prądu/napięcia (w przeciwieństwie do obsługi właściwego polecenia UART w main.py). Pozwala to na czystszy widok tego, co dzieje się na poziomie aplikacji internetowej i abstrahuje szczegóły tego, co dzieje się na poziomie komunikacji z urządzeniem.

W main.py tworzę dwa różne typy punktów końcowych do kontrolowania mojego zasilacza. Jeden typ używa metody POST, która jest typowo używana w REST API do aktualizowania pól na backendzie serwera (np. wstawienie wiersza bazy danych). Mogłem łatwo użyć metody PUT, ponieważ to tylko pojedyncza wartość, którą edytowałem, ale, bez żadnego konkretnego powodu, pozostałem przy POST. Prawdę mówiąc, to od Ciebie zależy, którą metodę chciałbyś zaimplementować w tym konkretnym scenariuszu.

Utworzyłem również trasę o nazwie "controller", która wypluwa bardzo prosty formularz zgłoszeniowy, gdzie użytkownik może ustawić napięcie/prąd i nacisnąć "submit", co z kolei spowoduje wykonanie akcji POST i wyzwolenie usługi internetowej do aktualizacji ustawień napięcia/prądu na zasilaczu. Tutaj pojawia się aspekt IoT, umożliwiający obsługę przez smartfon. Wykonanie metody POST nie jest bardzo proste z poziomu smartfona lub przeglądarki ogólnego użytku. Można wydać metodę GET, ale skończyłoby się to również długim ciągiem URL. Bardzo prostym sposobem na osiągnięcie aspektu "smartfonowości" twojego projektu jest umieszczenie podstawowego formularza internetowego, z którego każdy może skorzystać z dowolnego urządzenia. Gdy obsługujesz podstawowy formularz internetowy w swojej aplikacji internetowej (i odpowiednio kierujesz ruch przychodzący przez zaporę sieciową routera), praktycznie pokazałeś, że twój kod jest "włączony do IoT".

Rysunek 5

Rysunek 5:

Inne funkcje monitorowania stanu zdrowia/debugowania, które włączyłem do tego projektu, obejmują:

  1. Ustawienie wbudowanej diody LED, aby zapalała się po zainicjowaniu wszystkiego
  2. Strona „status”, która pokazuje, że serwer WWW działa
  3. Zwracanie komunikatów przez HTTP z zasilacza po wydaniu mu poleceń
Rysunek 6

Rysunek 6:

Dodanie tych małych dodatków naprawdę pomaga przekształcić projekt hobbystyczny w coś bardziej dojrzałego, co można zdiagnozować, gdy pojawią się problemy.

W tym momencie udało mi się złożyć wszystkie elementy razem i teraz posiadam stary zasilacz z najnowocześniejszą technologią. „W jakim celu miałby służyć ten super retro zasilacz?” zastanawiałem się. Cóż, tej części wciąż próbuję się dowiedzieć.


Aby zobaczyć pełne repozytorium kodu, odwiedź https://gitlab.com/embedded-designs/rest-api-controlled-power-supply-using-micropython.

About Author

About Author

Ari jest inżynierem z rozległym doświadczeniem w projektowaniu, produkcji, testowaniu i integracji systemów elektrycznych, mechanicznych i oprogramowania. Jego pasją jest łączenie inżynierów zajmujących się projektowaniem, weryfikacją i testowaniem, aby pracowali jako jeden zespół.

Powiązane zasoby

Powiązana dokumentacja techniczna

Powrót do strony głównej
Thank you, you are now subscribed to updates.