이전 글인 슈퍼 커패시터로 라즈베리파이용 무정전 전원장치 만들기에서 사용했던 step down 컨버터이다. 이 컨버터는 단순히 현재 전압과 전류를 표시할 뿐만 아니라 UART 통신을 통해 가져올 수 있다. 하지만 상품 설명을 보면 통신 방법이 매우 빈약하게 설명되어 있다.
IC 칩을 검색해서 알아내려 했지만 칩 마킹 자체가 없어서 찾을 수도 없었다. 결국 여러번 삽질하고 때려맞추기로 사용 방법을 알아내었다.
맨 첫 줄에 적혀있는 baud rate는 9600은 바로 이해했다. 그런데 그 밑의 BB, CC frame header 라고 적혀있길래 BB, CC라는 이름의 무언가가 있는줄 알았다. 하지만 그냥 단순히 0xBB, 0xCC를 의미하는 것이었다. 또한 맨 앞에 0xBBCC가 앞에 붙은 6 바이트 이상의 데이터를 전송하면 컨버터 또한 0xBBCC로 시작하는 6 바이트의 데이터를 전송한다는 것을 알아냈다.
ADDR module address는 지금도 어떤 용도로 쓰이는지 모르겠지만 1바이트를 차지한다. 0x00 부터 0xFF 중 어떤 값을 넣어도 응답에 동일한 부분의 값이 바뀌는 것 빼고 변함이 없었다. 이것만 맨 끝에 (? bytes)라는 설명이 붙지 않아서 필요없는 줄 알고 시간을 많이 낭비했다.
이 다음의 데이터는 설명이 그나마 이해하기 쉽게 되어있다. 0x00이면 전류, 0x01이면 전압을 나타낸다.
XX XX: any value (2 bytes) 라는걸 보고 그냥 0x0000로 넣었다. 응답에서는 요청한 값이 들어있다. 디스플레이에 표시되는 값과 들어온 데이터를 비교해보니 리틀 엔디안 2 바이트 정수이고, 값의 단위는 mV, mA이다.
CRC는 1 byte 라고 적혀있으니 CRC-8을 의미할 것이다. 그런데 계속 테스트해보니 CRC 값을 보내지 않아도 아무런 문제가 없었다. 심지어 응답으로 오는 6 바이트의 데이터도 CRC가 없다.
위에서 알아낸 정보를 종합하면 요청과 응답은 동일한 포맷이며 아래와 같다:
0xBB 0xCC {ADDR module address(1 byte)} {0x00|0x01 current, voltage (1 byte)} {result little endian integer (2 bytes)}
전류와 전압을 가져오는 요청 데이터는 각각 아래와 같다:
0xBB 0xCC 0x00 0x00 0x00 0x00 0xBB 0xCC 0x00 0x01 0x00 0x00
맨 마지막 두 바이트를 리틀 엔디안 정수로 가져오면 된다.
참고로 UART 통신을 위해 라즈베리파이의 GPIO를 활용했다. 라즈베리파이만 있으면 따로 UART - USB 컨버터를 사지 않아도 되고 활용도도 높으니 하나 정도는 장만해두는 것도 좋다고 생각한다. 아래는 실험으로 연결해둔 모습과 전압과 전류를 읽어들이는 프로그램을 실행한 모습이다.
UART 통신으로 지속적으로 전류와 전압을 읽어서 현재 전원이 연결되어 있는지, 커패시터의 전압 상태는 어떤지 알아내고 이에따라 안전하게 종료하거나 신호를 보내는 용도로 사용할 수 있을 것이다.