최근에 아버지의 차고에서 오래된 BK Precision 1787 전원 공급 장치를 발견했고, 약간의 수집가 기질이 있는 저로서는 집으로 가져가 가지고 놀 기회를 놓칠 수 없었습니다. 버려진 장난감처럼, 이 전원 공급 장치는 1년 이상 제 캐비닛에 먼지를 쌓으며 가지고 놀기를 기다렸습니다. 최근에 꺼내어 보니 뒷면 패널에 RS-232 포트가 있다는 것을 발견했습니다:
그림 1:
저는 혼자 생각했습니다, "실제로 RS-232 케이블을 사용해서 이것을 제어할 수 있을까?" BK Precision의 웹사이트에서 초기 조사를 해보니, 20년 이상 전의 원본 문서에는 PC 인터페이스를 사용하기 위해 특별한 키트가 필요하다고 명시되어 있었습니다:
그림 2:
그 공지를 보고 실망했고 전체 장치를 버릴까 생각했지만, 작은 실험을 해보기로 결정했습니다. 이 글에서는 전원 공급 장치를 분해하고 전압과 전류를 휴대폰이나 인터넷에 연결된 장치를 통해 설정하거나 읽을 수 있는 IoT 제어 장치로 변환하는 과정을 살펴볼 것입니다. UART 명령어, 직렬 통신을 검증하기 위한 버스 스니핑, 그리고 이 장비의 IoT 기능을 제공하기 위해 Raspberry Pi Pico W에 REST API 서버를 구축하는 과정을 살펴보겠습니다.
전원 공급 장치를 전자 폐기물로 처리하기보다는 조금 더 가지고 놀고 싶었습니다. 오늘날 대부분의 전원 공급 장치는 시리얼(예: UART), USB(일반적으로 COM 또는 USBTMC 장치로 사용됨), 및/또는 이더넷(VISA를 통해 일반적으로 제어됨)을 통해 제어될 수 있습니다. 그러나 Wi-Fi 기능을 지원하는 장비를 많이 보지 못했습니다. 이는 설정이 약간 귀찮고 대부분의 설계자나 테스트 엔지니어는 유선 연결에 크게 신경 쓰지 않기 때문일 것입니다. 제 전원 공급 장치에는 RS-232 포트가 있었지만 그 외에는 아무것도 없었습니다. 인터넷에 연결된 장치를 사용하여 어디서나 제어할 수 있는 Wi-Fi 기능과 REST API 프론트 엔드를 제공하는 것이 꽤 멋질 것 같았습니다.
제가 겪은 주요 문제는 전원 공급 장치와 통신할 수 없었다는 것이었습니다. 위에서 보셨듯이, 매뉴얼에는 PC 인터페이스를 사용하기 위해 독점적인 키트와 소프트웨어가 필요하다고 명시되어 있었습니다. 전원 공급 장치를 "해킹"하려는 첫 시도는 완전한 실패로 끝났습니다. RS-232 UART 케이블을 뒷면 포트에 연결하고 무작위 문자를 입력하기 시작했습니다. 뚜껑을 열고 RS-232 포트를 통해 신호를 추적하여 MAX202C 송수신기 칩의 TX 및 RX 신호를 두 쪽 모두에서 측정했습니다. 받은 것은 쓰레기뿐이었습니다:
그림 3:
BK Precision의 직원들은 매우 도움이 되었고, 공급 장치를 제어하는 데 필요한 명령 세트를 제공해 주었습니다. 그들은 심지어 사용하고 있는 소프트웨어의 스크린샷과 모든 UART 설정을 제공하여 모든 것이 올바르게 설정되었는지 확인할 수 있도록 도와주었습니다. 그들의 도움으로 명령을 테스트하고 오실로스코프에서 명령이 올바르게 처리되는 것을 볼 수 있었습니다:
그림 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을 사용했습니다. MicroPython 코드 내에서 UART를 통해 직렬 명령을 보낸 후, 보내고 받은 모든 데이터가 쓰레기로 나타났습니다. 코드는 돌아오는 바이트 코드가 심지어 ASCII 문자조차 아니라고 계속 보고했습니다. 분명히 무언가 잘못되었습니다. 이 특정한 이유로 작동하는 설정의 스코프 캡처를 얻는 것이 중요했습니다. 즉시 Raspberry Pi Pico 장치에 도달할 때까지 신호가 반전되었다는 것을 알 수 있었습니다. UART 라이브러리 객체를 인스턴스화할 때 TX와 RX를 반전시킨 후 돌아온 직렬 데이터는 깨끗했습니다.
Raspberry Pi Pico 장치가 3.3V 전압 수준에 있고 BK Precision 1787(특히 사용하는 MAX202C 칩)이 5V에 있다는 점을 주목하는 것이 중요합니다. 장기간 동안 5V 신호를 Raspberry Pi Pico 장치의 GPIO 핀에 보내면 칩의 입력 버퍼가 손상될 수 있습니다. 장기 사용을 위해서는 장치 간의 전압 수준을 3.3V에서 5V로 적절하게 변환하기 위해 레벨 시프터를 사용하는 것이 매우 권장됩니다.
이 시점에서 저는 시리얼 통신을 통해 전원 공급 장치를 완전히 제어할 수 있는 드라이버 라이브러리를 작성하여 통신을 확립했습니다. 다음 단계는 기본 웹 서버를 구성하고 웹을 통해 장치를 제어할 수 있는지 확인하는 것이었습니다. microdot 덕분에 REST API를 단축하고 Raspberry Pi Pico H 장치가 웹 서버를 호스팅할 수 있는지 확인하는 매우 빠른 "Hello World" 프로토타입을 만들 수 있었습니다. 간단한 "Hello World" 반환 문장 외에도 POST 함수를 사용하여 LED를 토글할 수 있다는 것도 확인했습니다. 이 시점에서 모든 것을 통합할 준비가 되었습니다.
최종 코드를 더 읽기 쉽고 확장 가능하게 만들기 위해 코드에서 클래스를 사용했습니다. 객체 지향 코드는 소프트웨어 세계에 새로운 것이 아니지만 임베디드 시스템에서는 종종 간과됩니다. 하드웨어의 다른 부분을 제어하는 웹 서비스를 작성할 때, 주요 애플리케이션 외부에 자세한 하드웨어 코드가 위치하도록 코드를 잘 추상화하는 것이 중요합니다. 제 경우에는 main.py에서 전원 공급 장치를 참조하는 코드가 거의 없으며, 특정 함수(예: 전류/전압 설정 또는 읽기)를 호출하는 것 외에는 실제 UART 명령을 main.py 내에서 처리하지 않습니다. 이를 통해 웹 애플리케이션 수준에서 무슨 일이 일어나고 있는지 더 깨끗한 뷰를 제공하고 장치 통신 수준에서 무슨 일이 일어나고 있는지의 세부 사항을 추상화합니다.
main.py에서 전원 공급 장치를 제어하기 위해 두 가지 유형의 엔드포인트를 생성했습니다. 하나는 일반적으로 서버의 백엔드에 필드를 업데이트하기 위해 REST API 내에서 사용되는 POST 방법입니다(예: 데이터베이스의 행 삽입). 단일 값만 편집했기 때문에 PUT 방법을 사용할 수도 있었지만, 별다른 이유 없이 POST를 고수했습니다. 사실 이 특정 시나리오에서 어떤 유형의 방법을 구현하고 싶은지는 여러분에게 달려 있습니다.
또한 사용자가 전압/전류를 설정하고 "제출"을 누르면 POST 작업을 수행하고 웹서비스가 전원 공급 장치의 전압/전류 설정을 업데이트하도록 트리거하는 매우 간단한 제출 양식을 출력하는 "controller"라는 경로를 생성했습니다. 이것이 IoT, 스마트폰 활성화 측면이 등장하는 곳입니다. POST 방법을 수행하는 것은 스마트폰이나 일반 브라우저에서 매우 간단하지 않습니다. GET 방법을 사용할 수 있지만 긴 URL 문자열도 얻게 됩니다. 프로젝트의 "스마트폰성" 측면을 달성하는 매우 간단한 방법은 누구나 어떤 장치에서든 접근할 수 있는 기본 웹폼을 드롭하는 것입니다. 웹 애플리케이션 내에 기본 웹 폼을 지원하고(그리고 라우터의 방화벽을 통해 들어오는 트래픽을 적절히 라우팅하면), 귀하의 코드가 "IoT 활성화"되었음을 사실상 보여줍니다.
그림 5:
이 프로젝트에 추가한 몇 가지 다른 건강 모니터링/디버그 기능은 다음과 같습니다:
그림 6:
이런 작은 추가 기능들이 취미 프로젝트를 조금 더 성숙하게 만들어 주며 문제가 발생했을 때 진단할 수 있게 도와줍니다.
이 시점에서 나는 모든 부품을 성공적으로 조립했으며 이제 구식 전원 공급 장치에 최첨단 기술을 탑재했습니다. "이 초고전적인 전원 공급 장치가 어떤 목적으로 사용될까?"라고 스스로에게 물었습니다. 글쎄, 그 부분은 아직도 파악 중입니다.
전체 코드 저장소를 보려면 https://gitlab.com/embedded-designs/rest-api-controlled-power-supply-using-micropython을 방문하세요.