컴팩트 프로그래머블 포켓 파워 서플라이 - OLED 디스플레이, 아두이노 호환
부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 우노 |
1 |
|
| 아두이노 나노 R3 |
1 |
|
| XL6009 DC-DC 부스트 모듈 |
1 |
|
| 스파크펀 푸시버튼 스위치 12mm |
1 |
|
| 16 MHz 크리스탈 |
1 |
|
| 터미널 블록 커넥터 |
1 |
|
| 가변 출력 리니어 레귤레이터 (LM317) |
1 |
|
| 리니어 레귤레이터 7805 |
1 |
|
| 1N4007 고전압 대용량 다이오드 |
1 |
|
| USB-A to B 케이블 |
1 |
|
| 멀티턴 정밀 포텐셔미터 10kΩ (25턴) |
1 |
|
| OP07 계측용 오피앰프 |
1 |
|
| 범용 소켓 박스 |
1 |
|
| FR4 프로토 보드 |
1 |
|
| 점퍼 와이어 |
1 |
|
| 수 헤더 40핀 1열 (0.1") |
1 |
|
| 저항 10kΩ |
1 |
|
| 저항 22.1kΩ |
1 |
|
| 저항 1kΩ |
1 |
|
| 아두이노 래칭 릴레이 5V 2A |
1 |
|
| 스파크펀 MCP4131 디지털 포텐셔미터 10k |
1 |
|
| 아두이노 구리 테이프 |
1 |
|
| 아두이노 LM358 오피앰프 |
1 |
|
| 아두이노 1306 OLED |
1 |
|
필수 도구 및 장비
앱 및 온라인 서비스
프로젝트 소개
아이디어
취미 개발자로서 프로토타입 전원 공급, 전압/전류/전력 한계 확인, 새 부품 테스트 등 가변 전원 공급 장치가 항상 필요합니다. 하지만 벤치/랩 파워 서플라이는 비싸고 휴대하기 부피가 큽니다. 저렴하면서 휴대 가능하고 프로토타입 전원 공급과 부품 테스트에 생산적인 프로그래머블 파워 서플라이를 찾아 직접 만들기로 했습니다.
주요 특징:
- 프로그래머블
- 충전식 (리튬 폴리머 배터리)
- 휴대 가능
- 스텝 가변 전압
- 전압/전류/전력 미터 내장
- 보호 릴레이 내장
- 커스터마이징 가능, 컴팩트하고 귀여운 디자인
- 멋진 OLED 사용자 인터페이스
- 푸시 버튼 사용자 제어 및 메뉴 기반 내비게이션
- 펌웨어 업그레이드로 기능 확장 가능!
저전력 전자 프로젝트용으로 가장 다재다능한 파워 서플라이입니다.
실제 동작
동작 시연 영상: 영상 링크
장치 사양
- 최대 출력 DC 부하 전류: 400 mA
- 전압 범위: 2.0V ~ 12.0V
- 전압 스텝: 약 0.1V
- 최고 효율: 75%
- 전류 측정 정확도: ±1 mA
- 전압 측정 정확도: ±0.02V


참고: 이 장치는 퀵 프로토타입입니다. 고용량 배터리, 추가 전자 회로, 설계 업그레이드로 0-30V, 음전원, 더 높은 출력 전류도 가능합니다.
작동 원리
설계는 하드웨어 집약적입니다. 조잡한 블록 다이어그램:

- 전원: 3.7V 리튬 폴리머 배터리 (USB 충전식). XL6009 DC-DC 부스트 모듈로 15.6V 생성. 7805 레귤레이터로 MCU용 5V 생성.
- MCU 모듈: 아두이노 우노 클론 ATmega328P, 인터럽트 기반 사용자 입력 스위치 2개, OLED 디스플레이, PC에서 USB/시리얼로 펌웨어 업로드용 Rx/Tx/DTR 포트.
- 핵심 - 스텝 전압 발생기: MCP4131 디지털 포텐셔미터 (Digipot) + LM358 오피앰프 기반. 아두이노에서 유사 SPI 명령으로 제어. LM317 가변 레귤레이터의 제어 전압으로 사용. LM317은 조정 핀 전압보다 출력 핀 전압이 항상 1.25V 높게 유지 (입력 전압이 충분히 높을 때, 여기선 15.6V).
- 가변 레귤레이터: 스텝 전압을 조정 핀에 입력해 사용자 필요에 따른 가변 출력 생성.
- ADC 측정: 배터리 전압, 부스트 전압, 충전 감지 전압, 출력 전압을 분압 네트워크로 ADC 범위(0-1.1V)에 맞춤. 아두이노 내부 레퍼런스(1.1V) 사용.
- 전류 감지: 출력 부하 리턴(Load GND)을 1Ω 전류 감지 저항으로 시스템 GND와 직렬 연결. 부하 전류 흐름 시 감지 저항에 전압 강하 발생. OP07 정밀 오피앰프로 증폭해 ADC 핀에 입력.
- 배터리 충전: USB 5V를 1N4007 다이오드와 5Ω 전류 제한 저항 직렬로 리튬 폴리머 배터리에 연결. 리튬 폴리머 충전으로는 최적 방법이 아님.
동작 요약: MCP4131 디지털 포텐셔미터가 0-5V 범위에서 약 40mV 스텝(7비트 10K 디지팟 129스텝, 5V/128 = 39mV)으로 스텝 전압 생성 → LM358이 2.5배 증폭해 0-12.5V 제어 전압 범위, 0.1V 스텝 생성 → LM317 조정 핀에 입력 → LM317이 V_Step + 1.25V 출력 전압 생성 → 외부 부하에 공급. 외부 부하 리턴은 1Ω 전류 감지 저항을 거쳐 내부 그라운드 연결. x mA 전류 흐르면 옴의 법칙(V=I×R)으로 x mV 강하 발생. 이 미세 전압을 저옵셋(10µV) OP07로 2.5배 증폭해 2.5x mV 출력. 아두이노 ADC는 1.1V 내부 레퍼런스로 0-1100mV를 약 1mV 스텝(1100/1023)으로 감지. OP07 출력을 ADC에 연결해 전류 감지. 이로 인해 전류 한계 400mA. OP07 게인 변경으로 한계 조정 가능. 부스트 전압과 LM358 게인 변경으로 출력 전압 범위 변경 가능. 다른 전압들은 분압 네트워크로 ADC 범위에 맞춰 측정. 래칭 릴레이는 2개 코일로 순간 전원 인가 시 접점 전환, 이후 전원 차단해도 상태 유지.
프로젝트 제작
- 싱글 스위치 소켓 박스로 시작, 배터리, USB 충전 포트, 전원 스위치 장착용 컷팅 및 정렬
- 구리 테이프와 동전으로 DC-DC 부스트 모듈 방열판 제작
- 부스트 모듈 소켓 박스 내 장착
- 3개 모듈 제작:
- 아두이노 + I/O + 제어 모듈
- 스텝 전압 및 가변 레귤레이터 모듈
- 전류 감지 모듈
- 모든 보드 간 거미줄 같은 연결 납땜
- 핫글루로 빈 공간 채워 완성









펌웨어 개발 및 조작 절차
펌웨어(아두이노 스케치) 현재 버전 1.0.2 베타. 모든 기능은 아니지만 전압 제어, 릴레이 연결/해제, 정보 확인 등 핵심 기능 활성화.
void setup()에 외부 하드웨어 관련 아두이노 핀 초기화 함수들 포함.
입력: 출력 전압 증감, 메뉴 접근(이 버전 미지원)용 인터럽트 기반 입력 버튼 2개. 아두이노 핀 2, 3의 INT0, INT1을 폴링 에지 인터럽트로 코딩. 기계식 스위치와 병렬 커패시터 2개로 디바운싱. 사용자 버튼 누름 시 인터럽트 트리거로 릴레이 온/오프 또는 전압 증감 (베타).
출력: SSD1306 OLED가 ADC 데이터, 내부 타이머(디바이스 업타임), 플래그 변수로 출력 정보 표시. U8G 라이브러리 기반 텍스트/숫자 출력. 향후 그래픽(아날로그 타입) 표현 계획.
SSD1306 OLED(웨이브셰어) 5개 디지털 핀(clk, din, cs, d/c, res)을 아두이노 10, 9, 11, 13, 12핀에 연결. 메인 루프에서 update_display() 함수 매 호출마다 OLED 정보 업데이트.
내부 타이머 1을 1초마다 트리거되도록 설정해 시간 추적.
제어: MCP4131 디지털 포텐셔미터를 increment_digipot(), decrement_digipot() 함수로 제어. 핀 6, 7, 8을 CS, Clk, Data 핀으로 사용해 적절한 클로킹과 딜레이로 데이터 시프트 아웃. 하드웨어 SPI 핀을 다른 용도로 이미 사용해 소프트 SPI 방식 채택.
디지털 핀 4, 5로 래칭 릴레이 제어. 릴레이 구동 트랜지스터에 짧은 하이 펄스 인가해 2개 코일 에너자이즈로 릴레이 플립. 과부하/단락 시 자동 또는 사용자 수동으로 동작.
ADC: 메인 루프의 calc_VI() 함수에서 analogRead로 20회 평균 전압/전류 정보 획득해 변수 갱신 후 디스플레이 출력.
스케치는 ADC, Digipot, Display_Fn, Interrupt, Relay, Timer 탭으로 다중 탭 구성해 기능별 코드 정리. 주석 추가 예정이나 아두이노 기본 함수들로 구성돼 이해 어렵지 않을 것.
제한 사항
- 전압 2.0V 미만으로 내려갈 수 없음
- 출력 전압이 연속이 아닌 스텝 방식
- 대전류 시 전류 측정으로 그라운드 시프팅 발생
- ADC 측정 분해능 낮음
- 저전압 고부하에서 효율 최악
- 비표준, 다소 안전하지 않은 리튬 폴리머 충전 방식
참고 자료
결론
이 프로그래머블 파워 서플라이는 멀티미터 없이 전압/전류/전력 측정하며 프로젝트/프로토타입 제작을 더 효율적으로 도와줍니다.
코드
아두이노 프로그래머블 포터블 파워 서플라이 (Ver 1.0.1, 핀아웃 정보 주석 포함)
// 핀 리셋, D0, D1: 스케치 업로드용
// 핀 D9,D10,D11,D12,D13: OLED 디스플레이 제어용
// ADC A0: V_boost 감지
// ADC A2: V_batt (LiPo) 감지
// ADC A3: I_Output (부하) 감지
// ADC A4: V_USB (충전) 감지
// ADC A5: V_Output (부하) 감지
// 래칭 릴레이 2개 코일 드라이빙 핀 D4, D5
#define RC1 4
#define RC2 5
// 사용자 입력 스위치 핀 D2, D3
#define SW1 2
#define SW2 3
// 디지털 포트 제어 핀 D6, D7, D8
#define CS_PIN 6
#define CLK_PIN 7
#define DATA_PIN 8
volatile uint8_t Switch1 = 1;
volatile uint8_t Switch2 = 1;
float V_Out = 0.0;
float I_Out = 0.0;
float V_Bat = 0.0;
float V_Bst = 0.0;
float V_Chg = 0.0;
uint32_t time = 0;
#include "U8glib.h"
// OLED 디스플레이 제어 핀
// SSD1306 oled waveshare(clk,din,cs,d/c,res); // 웨이브셰어용
U8GLIB_SSD1306_128X64 u8g(10, 9, 11, 13, 12);
void setup(void) {
analogReference(INTERNAL);
u8g.setRot180();
button_init();
relay_init();
init_timer1();
digipot_init();
}
void loop(void) {
update_display();
calc_VI();
if (Switch1 == 0) {
rc1_latch();
Switch1 = 1;
increment_digipot();
}
if (Switch2 == 0) {
rc2_latch();
Switch2 = 1;
decrement_digipot();
}
delay(100);
}
Code Ver 1.0.1 Beta
미리보기 없음 (다운로드만 가능)
Code Ver 1.0.2 Beta
텍스트/박스 정렬 버그 수정
과부하 트립 버그 수정
다음 릴리스에서 추가 버그 수정 예정
미리보기 없음 (다운로드만 가능)
Code ver 1.0.3
전원 켤 때 출력 릴레이 비활성화 버그 수정
전원 켠 후 출력 전압 자동 5.00V 설정 버그 수정
미리보기 없음 (다운로드만 가능)
회로도
화이트보드에 그린 회로도

https://circuits.io/circuits/4762970-arduino-based-programmable-power-supply



