Arduino в экономном режиме потребления батарейки (Часть I)

Если Вы задумались над возможностью длительной работой arduino от автономного источника питания (батареек), то отличной отправной темой может являться Power consumption (arduino и пр. не лучший вариант, т.к. изначально это всё-таки макетная конфигурация).
Итак, существенными потребителями являются:
* регулятор напряжения
* usb модуль
* процессор
* светодиоды

Что можно сделать с процессором?
Использовать спящий режим — экономия энергопотребления: ArduinoSleepCode, jeelib (одна из библиотек).

Регулятор напряжения?
На готовой плате с ним уже сложно что-либо сделать.

Светодиоды?
Выпаять или сбить.

USB модуль?
Достаточно интересная, на самом деле, вещь — можно перепрограммировать, тем самым Ваш arduino будет определятся как клавиатура, мышь, джойстик и пр. Но нас сейчас интересует энергопотребление. Можно выбрать плату без модуля или переводить модуль в спящий режим.
Чтоб модуль уходил в спящий режим, необходимо сменить прошивку: dfu-programmer. В оригинальной версии arduino присутствует универсальный загрузчик. Но если Вам не повезло (как и мне), то прошивка через ISP + firmware 16U2.
Процесс смены прошивки подробно представлен тут: Tutorial — How to change firmware on 8u2. Осталось взять прошивку atmegaxxu2, внести исправления в код и дескриптор, собрать и радоваться.

После всех этих манипуляций, для AdruinoUNO v3 минимальный ток потребления 8мА.

Изменения в прошивке для автоматического перехода USB модуля в спящий режим по истечению некоторого таймаута выложу чуть позже. Если-же модуль прошивается через isp, то его можно сразу загонять в спящий режим — так проще (не надо поднимать таймер для подсчёта таймаута).

2 комментария

avatar
Итак,
1) обязательно берём конкретную версию LUFA (100807)
2) проверяем значение ARDUINO_MODEL_PID в makefile
3) добавляем поддержку таймера в arduino-usbserial.c
volatile unsigned long Clock = 0;
//Overflow interrupt
ISR(TIMER1_COMPA_vect)
{ Clock += 1; }
//Initialise the clock
void Clock_init()
{
	OCR1A  = ((F_CPU / 1024) / 100);
	TCCR1B = ((1 << WGM12) | (1 << CS12) | (1 << CS10));
	TIMSK1 = (1 << OCIE1A);
}
//Return time
unsigned long Clock_time()
{
	unsigned long T;
	ATOMIC_BLOCK(ATOMIC_FORCEON)
	{
		T = Clock;
	}
	return T;
}

4) в main добавляем инициализацию: Clock_init();
5) в бесконечный цикл main добавляем переход в спящий режим через 3 минуты
if( Clock_time() > 100*60*3 )
		{
			LEDs_TurnOffLEDs(LEDMASK_TX);
			LEDs_TurnOffLEDs(LEDMASK_RX);
			
			set_sleep_mode(SLEEP_MODE_PWR_DOWN);
			cli();
			sleep_enable();
			sleep_cpu();
		}

6) в descriptors.c меняем VID и PID на актуальные
.VendorID               = 0x2341,//0x03EB, // Atmel

	.ProductID          	= 0x0043,//0x204B, // LUFA USB to Serial Demo Application


всё
avatar
готовая прошивка для atmegaxxu2 в ArduinoUNO v3 — переход в спящий режим через три минуты после подачи питания

Оставить комментарий