Компактный программируемый карманный источник питания с OLED — совместим с Arduino
Компоненты и материалы
| Arduino UNO (для прототипирования) | 1 |
| Arduino Nano R3 (в финальном устройстве) | 1 |
| XL6009 DC-DC Boost модуль | 1 |
| Тактильная кнопка 12 мм (SparkFun) | 1 |
| Кварц 16 МГц | 1 |
| Клеммник | 1 |
| Линейный стабилизатор с регулируемым выходом (LM317) | 1 |
| Линейный стабилизатор 7805 (5В) | 1 |
| Диод 1N4007 | 1 |
| USB A-B кабель | 1 |
| Многооборотный потенциометр 10 кОм (25 оборотов) | 1 |
| Операционный усилитель OP07 (прецизионный) | 1 |
| Корпус розетки (generic socket box) | 1 |
| FR4 макетная плата | 1 |
| Перемычки | 1 набор |
| Pin header 40 pin (0.1") | 1 |
| Резистор 10 кОм | 1 |
| Резистор 22.1 кОм | 1 |
| Резистор 1 кОм | 1 |
| Защелковое реле 5В 2А | 1 |
| Цифровой потенциометр MCP4131 10к (SparkFun) | 1 |
| Медная фольга/лента | 1 |
| Операционный усилитель LM358 | 1 |
| OLED 1306 (SSD1306) | 1 |
Инструменты
- Паяльник
- Клеевой пистолет
- Мини-дрель
Приложения и сервисы
- Arduino IDE
О проекте
Идея
Хоббистам часто нужен истоник питания для прототипов, проверки компонентов, тестирования лимитов. Лабораторные блоки питания дорогие и громоздкие. Я хотел программируемый, портативный, перезаряжаемый блок питания низкой стоимости. И сделал его.
Особенности:
- Программируемый (шаговое напряжение)
- Перезаряжаемый (Li-Po)
- Портативный
- Измерение напряжения/тока/мощности
- Защита защелковым реле
- Настраиваемый, компактный, с классным OLED-интерфейсом
- Управление кнопками, менюшная навигация
- Обновляемая прошивка для новых фич
Наиболее универсальный блок питания для низковольтной электроники.
Видео-демонстрация
Смотрите видео работы устройства (ссылка в оригинале).
Спецификации
- Макс. ток нагрузки: 400 мА
- Диапазон напряжения: 2.0 – 12.0 В
- Шаг напряжения: ~0.1 В
- Лучший КПД: 75%
- Точность тока: ±1 мА
- Точность напряжения: ±0.02 В
Это быстрый прототип. Можно сделать 0–30 В, отрицательное питание и больший ток, используя более емкие батареи, доп. электронику и улучшенный дизайн.
Принцип работы
Блок-схема системы:
- Источник: 3.7В Li-Po, заряжается по USB. XL6009 поднимает до 15.6В. 7805 дает 5В для MCU.
- MCU модуль: Arduino-клон (ATmega328P) + 2 прерывания от кнопок + OLED 1306 + UART для прошивки (модуль 1).
- Генератор опорного напряжения: MCP4131 (Digipot) + LM358 → ступенчатое управляющее напряжение для LM317 (модуль 2).
- Регулятор LM317: Vout = Vadj + 1.25В (при Vin ≥ 15.6В). Управляющее напряжение на Adjust пине задает выходное (модуль 3).
- ADC измерения: Внутренний референс 1.1В. Делители напряжения для измерения Vbat, Vboost, Vcharge, Vout. Ток: нагрузка через 1 Ом шунт → OP07 (gain 2.5x) → ADC. 1 мА = 1 мВ на шунте → 2.5 мВ на OP07 → ADC (1.1В/1023 ≈ 1 мВ/шаг) → лимит 400 мА. Меняя gain OP07 — меняем лимит тока. Меняя boost и gain LM358 — диапазон напряжения.
- Зарядка Li-Po: 5В USB → 1N4007 → 5 Ом → баттерия. Простая схема, не идеальная для Li-Po.
- Защелковое реле: 2 катушки. Короткий импульс на катушку переключает контакты. Удерживает положение без питания.
Резюме работы: MCP4131 выдает 0–5В (129 шагов, ~40 мВ/шаг). LM358 усиливает ×2.5 → 0–12.5В шагом 0.1В. Это на Adjust пин LM317. Выход LM317 = Vstep + 1.25В. Ток измеряется через шунт 1 Ом + OP07.
Сборка проекта
- Корпус: одноразовый коробок от розетки, вырезы под батарею, USB, выключатель.
- Радиатор для XL6009 из медной ленты и монетки.
- Установка boost-модуля в корпус.
- Сборка 3 модулей: Arduino+I/O, Digipot+LM317, Current Sense.
- Паяем «паутину» связей между платами.
- Заполняем термоклеем, готово.
Прошивка и процедура работы
Прошивка v1.0.2 Beta. Не все фичи готовы, но основные: управление напряжением, реле, инфо на экране — работают.
- Ввод: 2 кнопки на INT0/INT1 (D2/D3) — falling edge interrupt. Конденсаторы для дебаунса. Код в прерываниях: вкл/выкл реле, инкремент/декремент напряжения.
- Вывод: OLED 1306 (U8glib) показывает напряжение, ток, мощность, аптайм, статус реле. Планируется графический (аналоговый) вид. Пины OLED: CLK=10, DIN=9, CS=11, D/C=13, RES=12. В loop() вызывается
update_display(). - Таймер: Timer1 ATmega328P настроен на 1 сек для отсчета времени.
- Управление Digipot: MCP4131 через soft-SPI на пинах 6 (CS), 7 (CLK), 8 (DATA) — аппаратный SPI занят. Функции
increment_digipot(),decrement_digipot(). - Реле: Пины 4 и 5 управляют транзисторами катушек. Короткий импульс переключает реле. Срабатывает авто (перегрузка/КЗ) или ручно.
- ADC:
calc_VI()в loop() делает 20-кратное усреднение analogRead для V и I, обновляет переменные для дисплея.
Код разбит на вкладки: ADC, Digipot, Display_Fn, Interrupt, Relay, Timer — по функциям.
Ограничения
- Напряжение не опускается ниже 2.0 В
- Выход ступенчатый, не непрерывный
- Измерение тока смещает землю при больших токах
- Низкое разрешение ADC
- Худший КПД в классе при низком напряжении и высоком токе
- Нестандартная, немного небезопасная зарядка Li-Po
Ссылки
- Урок по потенциометру
- Урок по кнопке
Заключение
Этот программируемый источник питания помогает быстрее делать прототипы. Измерение В/А/Вт без мультиметра.
Код
Arduino Programmable Portable Power Supply (v1.0.1 с распиновкой в комментариях)
// Pin Reset, D0 & D1 for uploading Sketch
// Pin D9,D10,D11,D12,D13 for controlling OLED Display
// ADC A0 Pin for Sensing V_boost
// ADC A2 Pin for Sensing V_batt (LiPo)
// ADC A3 Pin for Sensing I_Output (Load)
// ADC A4 Pin for Sensing V_USB (Charging)
// ADC A5 Pin for Sensing V_Output (Load)
// Latch Relay's 2 Coils Driving Pin D4 & D5
#define RC1 4
#define RC2 5
// User Input Switchs connected to Pin D2 & D3
#define SW1 2
#define SW2 3
// Pin D6,D7,D8 for Digital Pot Control Pins
#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"
// SSD1306 oled waveshare(clk,din,cs,d/c,res); // THIS FOR WAVESHARE
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
No preview (download only).
Code Ver 1.0.2 Beta
Bug Fix для выравнивания текста/боксов
Bug Fix для перегрузки
Еще несколько багфиксов в следующем релизе.
No preview (download only).
Code ver 1.0.3
Bug fix: отключение реле на выходе при включении питания
Bug fix: автоустановка выходного напряжения 5.00 В после включения
No preview (download only).
Схемы
https://circuits.io/circuits/4762970-arduino-based-programmable-power-supply
Производственный процесс
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Умная копилка: управление монетоприёмником на Arduino Nano
- Arduino Power Control Center: N-FET, P-FET, реле и RTC
- Монитор температуры и реальные часы на Arduino Due с TFT-дисплеем 3.2"
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Оптимизированные решения питания для проектов на Arduino
- Интерактивный HMI-проект на Nextion с Arduino Mega и датчиками
- Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
- Учебный стенд Arduino Mega 2560: сенсоры, моторы, дисплеи и собственная PCB
- Создание приложения Fridgeye с дисплеем Nextion: пошаговое руководство