- PVSM.RU - https://www.pvsm.ru -
Я человек ленивый и люблю комфорт, поэтому люблю всяческого рода автоматизацию. В машине у меня есть видеорегистратор, иногда использую навигатор, часто нужно зарядить телефон или планшет себе или семье/знакомым. Как результат указанных потребностей — вся машина окутана проводами и зарядками, при этом всегда надо думать, что выдернуть из тройника прикуривателя и не потеряла ли контакт в прикуривателе очередная зарядка. Конечно, потихоньку в машине образовался клубок проводов и зарядок, а это мало того, что не эстетично, так еще и может привлечь наркоманов.
В один прекрасный момент это всё достало и было принято решение сделать что-то универсальное.
Решение вполне очевидное. Микроконтроллер для автоматизации и какой-нибудь преобразователь напряжения, но у преобразователя должна быть возможность включения/выключения работы логическими уровнями.
С размещением в машине было немного сложнее, сначала хотел вставить USB в подстаканник, но потом откинул эту идею, т.к. не эстетично плюс стакан будет не поставить да и очередные мотки проводов не радовали. Потом я обратил внимание на подлокотник и ящичек находящий в нём. Это было то, что нужно! Сам ящичек вытаскивается — значит можно легко обслуживать, в самом подлокотнике много места — значит спокойно влезет электроника. USB разъемы легко врезать в боковину ящичка и не нужные провода зарядок можно не вытаскивая из разъемов прятать в ящик.
Помимо USB разъемов для зарядок, требовалось питание для видеорегистратора. Для этого был протянут провод от подлокотника до зеркала заднего вида, на зеркале был наклеен еще один USB-разъем [1] и выведен разъем для видеорегистратора.
Если с размещением разъемов, всё было довольно понятно, то с электроникой возникли небольшие проблемы.
Чуть ранее я заказал на eBay несколько платок регулируемых блоков питания, собранных на микросхеме LM2596. Мне нужно было сделать зарядку для iPad, чтобы заряжала большим током (как родная — 10W). Зарядку я сделал, всё прекрасно работало, зарядка выдавала что-то около 2.1A на 5.1V (при входном напряжении около 12-13V — аккумулятор ИБП), но был один минус — она жутко грелась! Вся плата грелась так, что расплавила пластиковую коробочку, в которой была и сама плата потемнела (несмотря на то, что туда был приколхожен радиатор [2]). После замеров КПД выяснилось, что при большом токе КПД около 60%, что нам совершенно не подходило.
Дополнительным нехорошим моментом было то, что у таких китайских платок не выведена отдельно ножка управления и пришлось бы отпаивать одну ножку микросхемы от платы и подпаивать к ней проводки.
Шерстя eBay, я часто встречал некие модули KIS-3R33S, в описании которых указывалось, что они выдают 3A. Стоимость модулей тоже внушала — при покупке 10 штук, каждый модуль обходится около 50-90 центов с бесплатной доставкой. Почитав Яндекс [3] стало ясно, что это довольно хороший модуль на микросхеме MP2307, который можно переделать в регулируемый преобразователь, а из навесных элементов нужно только два конденсатора — на вход и на выход.
И что важно — даже при нагрузке 2A он совершенно не греется!
Все продающиеся модули — паянные. Откуда они их берут в таком количестве совершенно непонятно ;)
Вообщем за какие-то пять копеек кучка модулей была приобретена и работа закипела.
По умолчанию модуль KIS-3R33S настрое на 3.3V, поэтому надо модуль немного адаптировать. Есть разные варианты переделки этого модуля (например [4]), но я решил обойтись минимальными переделками. Вооружившись даташитом [5] и схемой KIS-3R33S [6] я составил такой список переделок:
Я не хотел, чтобы преобразователь работал на полную нагрузку, поэтому решил использовать 2 преобразователя, на одном будет 2 USB + USB и питание видеорегистратора, а на втором только 2 USB.
В принципе, уже всё работает и может заряжать, если не нужна автоматика, то можно закончить читать :)
Блок питания это самое простое, дальше нужно реализовать логику работы. Как мне показалось, контролировать заведен ли двигатель проще всего по напряжению в бортовой сети авто. Посидев с тестером в машине, получил такие данные:
Можно было контроль напряжения сделать на дискретных элементах, но мне хотелось хардкора легкости изготовления, малых размеров и функционала. Так же и свистелки-перделки свето-звуковые эффекты были в списке задач, поэтому решил использовать МК Attiny13A.
Схема вроде простая. Резистор RV2, обычный подстроечный, чтобы легче было задать нужное напряжение на входе МК. Биппер LS1 обычный компьютерный, светодиод и кнопка тоже компьютерные. Вся схема питается от КРЕНки (78L05). Выход МК подключается к управлению модулями KIS-3R33S — высокий уровень включает, а низкий выключает модули.
Программа оказалась самой трудной задачей. В ассемблере я не силён, да и Си знаю в основном по примерам. Программу несколько раз переписывал, чтобы добиться нужного функционала и влезть в доступную память, в итоге память МК занята на 100%.
Логика работы такая:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
Chip type : ATtiny13a
AVR Core Clock frequency: 4,800000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/
#include <tiny13a.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
unsigned char iter3=10;
unsigned char i,POFF, sec, nobeep;
//POFF - запрещает включать БП при заведенном двигателе;
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
//пищалка
void beep(unsigned char on)
{
//включим светодиод
PORTB.2=1;
//включим пищалку, если не запрещено
if(!nobeep)DDRB.0=1;
//пищим on*100 милисекунд
while(on){on--; delay_ms(100);}
//выключим светодиод и пищалку
PORTB.2=0;
DDRB.0=0;
}
//процедура включения БП
void on()
{
if(POFF!=0)return;
//включаем БП
PORTB.4=1;
iter3=10;
beep(5);
POFF=1;
}
//процедуры выключения БП
void off()
{
//выключение не из-за времени, а из-за напряжения
if(iter3 > 1)
{
//подождем пол минуты и если напряжение всё еще низкое будет, то выключится
delay_ms(30000);
iter3=1;
return;
}
//пикнем о выключении
if(PORTB.4)beep(30);
//отключаем БП
PORTB.4=0;
if(POFF)
POFF--;
iter3=1;
}
// External Interrupt 0 service routine
//Отрабатываем нажатие на кнопки
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
//нажатие кнопки сопровождается пиканьем
beep(1);
//если БП был выключен, то включим на час
if(!PINB.4)
{
on();
POFF=0;
}
//а если БП включен, то с каждым нажатием будем прибавлять +1 час к ожиданию до выключения
//длинное нажатие (больше 2-х сек, выключит БП)
else
{
//прибавляем +1 час к ожиданию
iter3=iter3+20;
//считаем сколько времени нажата кнопка
i=8;
while(!PINB.1){
i--;
delay_ms(250);
//кнопка нажата больше 2-х сек.? Вырубаем!
if(i==0)
{
//пикнем, чтобы было понятно, что дальше нажимать на кнопку смысла нет и всё готово к выключению
beep(1);
iter3=0;
//здесь стоит 2, чтобы даже при высоком напряжении БП заново не включился.
//включится он после того, как двигатель будет заглушен и заново заведен.
POFF=2;
}
}
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=In Func2=Out Func1=In Func0=Out
// State5=T State4=1 State3=T State2=0 State1=T State0=0
PORTB=0x10;
DDRB=0x15;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1,172 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
//TCCR0A=0x40;
//TCCR0B=0x02;//x05; выключаем таймер
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4,688 kHz
// Mode: CTC top=OCR0A
// OC0A output: Toggle on compare match
// OC0B output: Disconnected
TCCR0A=0x42;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x40;
MCUCR=0x00;
GIFR=0x40;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: Off
DIDR0&=0x03;
DIDR0|=0x08;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;
#asm("sei")
//выключим пищалку
DDRB.0=0;
while (1){
delay_ms(1000);
//напряжение больше 13.8 - завелись
if( (0.0048828125*read_adc(3)) >=3.42)
on();
//напряжение меньше 11.8 или время работы с заглушенным двигателем истекло
if ( (0.0048828125*read_adc(3)) <3.23 || !iter3 )
off();
//напряжение ниже 13.3 - выключили двигатель
else if( (0.0048828125*read_adc(3)) < 3.38)
{
//БП включен? включим таймер
if(PINB.4)
{
nobeep=1;
beep(1);
nobeep--;
//осталось полчаса
if(iter3 == 10)
{
if(sec==1)
//пикнем 3 раза коротко
for(; sec<4; sec++)
{
beep(2);
delay_ms(200);
}
}
if(sec>=180)
{
iter3--;
sec=0;
}
sec++;
}
//если выключили с заведенным двигателем, чтобы после повторной заводки БП включился
POFF=0;
}
//при заведенном двигателе светодиод постоянно горит
else if(iter3 > 1)
PORTB.2=1;
}//end while
}
Для программатора PonyProg фьюзы ставить так
USB используются двойные, при том у каждой пары у одного USB-выхода средние контакты закорочены (чтобы большинство устройств понимали, что они воткнуты не в USB, а в зарядку), а у второго поставлены резисторы подтяжки, чтобы Apple-устройства считали, что подключены к родной зарядке и заряжались быстро.
Для Samsung-устройств тоже существует "своя схема [8]" зарядки, но даже с закороченными средними контактами, мой телефон SGS2 кушал 600mA, что считаю вполне достаточным для заряда.
Схематично всё выглядит так:
Плату я делал под имеющуюся коробочку, делал ЛУТом.
4 USB хорошо разместились в ящике, рядом был выведен светодиод и проделана дырочка (1мм), чтобы лучше слышать биппер.
И обратная сторона «медали». В алюминиевой коробочке находится плата управления и 2 преобразователя. Коробочка приклеивается скотчем к днищу ящика, который вставляется в подлокотник.
А в машине всё выглядит культурно (кнопку ещё нормально не приделал :).
На зеркале чуть хуже.
Питание брал от прикуривателя, размещенного в подлокотнике. Все подключения на разъемах, чтобы можно было всю систему легко вытащить и унести домой на апгрейд.
Сейчас понимаю, что можно было всё сделать красивее, взяв провода потоньше. Наверно весной переделаю.
Архив со схемой, исходник программы, прошивка, поделки платы можно скачать в ZIP [9].
ПС. Уже две недели собирался написать этот пост и только появившиеся аналогичная статья [10] мотивировала начать :)
Автор: hostadmin
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy-ili-sdelaj-sam/20412
Ссылки в тексте:
[1] USB-разъем: http://www.everbuying.com/product147773.html?lkid=9508
[2] приколхожен радиатор: http://habrastorage.org/storage2/7f9/70e/24a/7f970e24ae89b3185b89e5deb6b46b62.jpg
[3] Яндекс: http://yandex.ru/yandsearch?text=kis-3r33s&lr=2
[4] например: http://we.easyelectronics.ru/part/preobrazovatel-napryazheniya-kis-3r33s-mp2307.html
[5] даташитом: http://www.monolithicpower.com/Page/DownLoad.aspx?ListID=1a4312a6-2709-4b7d-af52-9f1cedbfd415&&ItemID=35
[6] схемой KIS-3R33S: http://habrastorage.org/storage2/7b1/574/358/7b1574358be1c4e4a66b5cce3c83e1e7.jpg
[7] калькулятор в помощь: http://allcalc.ru/node/440
[8] своя схема: http://drusakov.ru/index.php/about-joomla/34--sgt/46-samsung-galaxy-tab-2-usb-charge
[9] можно скачать в ZIP: https://www.dropbox.com/s/ow450w0mtj6y2u4/habra-avtoBP.zip
[10] появившиеся аналогичная статья: http://habrahabr.ru/post/155125/
[11] Источник: http://habrahabr.ru/post/159121/
Нажмите здесь для печати.