아두이노 프로 마이크로로 구현한 HID UPS: 더미 전원장치를 USB 호환 스마트 UPS로 업그레이드
부품 및 소모품
부품
수량
비고
아두이노 프로 마이크로(Pro Micro)
1
브레드보드(일반)
1
점퍼 와이어(일반)
1
프로젝트 소개
최근 아두이노로 무엇을 할 수 있는지 실험해 보았습니다. USB 포트가 없어 호스트 컴퓨터에 상태를 보고할 수 없는 오래된 '더미(Dummy) UPS'가 하나 있습니다. 아두이노 보드로 이 더미 UPS에 '두뇌'를 만들어 주는 프로젝트를 구상했습니다. 목적은 UPS 내부 상태(잔여 배터리 용량, 충전/방전 상태, 배터리 전류, 전압 등)를 읽어 USB 인터페이스를 통해 호스트 컴퓨터의 운영체제가 상용 스마트 UPS(예: APC)와 똑같이 인식하게 하는 것입니다.
커스텀 UPS용 하드웨어 드라이버를 개발하고 싶지 않았고 '플러그 앤 플레이(Plug-and-play)' 방식을 원했습니다. 조사 끝에 HID(Human Interface Device) 규격에 맞춘 인터페이스를 구현하기로 했습니다. HID는 본래 키보드, 마우스, 조이스틱 등 사람 입력 장치를 위해 설계되었으나, 최근 UPS, 배터리, 충전기 같은 전원 장치도 지원하도록 확장되어 호스트 컴퓨터와 지능적으로 통신할 수 있게 되었습니다.
레오나르도(Leonardo), 프로 마이크로(Pro Micro) 및 그 클론 보드들이 호스트에 HID 키보드나 마우스로 인식될 수 있다는 사실을 알았습니다. 아두이노 HID 라이브러리, 키보드 라이브러리 등을 분석하고 검색한 끝에 나만의 HIDPowerDevice 라이브러리를 작성했습니다. 설정 및 사용법은 깃허브 README에 자세히 적혀 있습니다.
테스트 환경은 매우 간단합니다: 노트북, USB로 연결된 아두이노 프로 마이크로(맥북 사용했지만 윈도우 10, 우분투에서도 작동), 브레드보드, 스위치 하나(실제로는 점퍼 와이어 사용). 진단용 LED 두 개와 충전 레벨 시뮬레이션용 포텐셔미터도 추가했습니다. 회로도는 아래와 같습니다:
스위치 S1은 아두이노 프로 마이크로의 4번 핀을 그라운드에 연결해 UPS가 배터리 모드로 전환된 상황을 시뮬레이션합니다. S1이 OFF면 아두이노는 PC에 '충전 중'이라고 보고합니다.
이 'UPS'는 HID 규격을 준수하므로 윈도우 10에서도 아두이노를 HID 배터리로 인식하며, 남은 용량 백분율이 올바르게 표시됩니다.
중요한 제한사항 하나: 윈도우 10은 시스템에 여러 배터리를 허용하고 트레이에 모두 표시할 수 있습니다. 하지만 모든 배터리가 같은 모드(HID 규격은 mAh, mWh, 백분율 지원)로 상태를 보고해야 합니다. 대부분의 UPS는 충전 백분율만 보고합니다. 이미 ACPI 배터리(노트북 내장 배터리 등)가 시스템에 있다면 백분율이 올바르게 반영되지 않을 수 있습니다.
리눅스에서도 비슷하게 작동하지만 추가 설정이 필요할 수 있습니다. README를 참조하세요.
업데이트 (2021-06-12) 시놀로지(Synology) 지원 문의가 여러 건 들어와 조사해 보았습니다. 문제는 시놀로지 배포판에서 사용하는 NUT(Network UPS Tools)에 있었습니다. NUT는 모든 HID 준수 UPS 모델이 기본적으로 USB 인터페이스 0을 사용한다고 가정하지만, 아두이노 레오나르도/프로 마이크로는 복합 장치로 인식되어 UPS 기능이 인터페이스 2에 있습니다. 인터럽트 엔드포인트 관련 문제도 비슷합니다. 기술적 세부사항은 여기에서 확인할 수 있습니다.
아두이노 지원이 추가된 수정된 NUT 라이브러리는 여기에 있습니다. 소스에서 빌드해 대상 플랫폼(시놀로지 또는 호환 리눅스 배포판)에 설치하면 됩니다. 아직 실험적이므로 현재 NUT 파일을 백업한 후 적용하시길 강력 권장합니다.