Arduino Leonardo/Pro Micro сон и USB
Я использую Arduino Pro Micro (в основном Leonardo в меньшем форм-факторе) в мобильном приложении, где действительно важно энергопотребление.
Чтобы снизить энергопотребление, я перевожу Arduino в спящий режим, но это отключает USB. Это не совсем приемлемо в данном приложении, поскольку повторное подключение USB после пробуждения Arduino занимает довольно много времени (секунда или две).
Есть ли какой-нибудь способ поддерживать USB-соединение в рабочем состоянии, сохраняя при этом энергию? Например, часто пробуждая ATmega32U4, чтобы поддерживать соединение в рабочем состоянии? Или есть какой-то не такой глубокий режим сна, при котором USB-соединение остается в рабочем состоянии?
Правки для уточнения:
Устройство представляет собой устройство USB HID. Если устройство переходит в спящий режим после нескольких минут бездействия, необходимость повторного подключения после нажатия пользователем кнопки вызывает довольно длительную задержку между нажатием кнопки и реакцией устройства.
Я использую собственную реализацию USB ATmega32U4, поэтому нет V-USB или чего-либо подобного.
Я перевожу устройство в спящий режим следующим образом:
Keyboard.end();
USBCON = 0;
LowPower.powerDown(SLEEP_120MS, ADC_OFF, BOD_OFF);
Вот как я снова его пробуждаю:
USBDevice.attach();
delay(50);
Keyboard.begin(KeyboardLayout_en_US);
@Dakkaron, 👍0
Обсуждение2 ответа
Лучший ответ:
Arduino имеет несколько режимов ожидания. Они отличаются в основном включенными часами , включенными периферийными устройствами и возможными источниками пробуждения. Все эти режимы описаны в техническом описании микроконтроллера ATmega32U4, раздел 7: Управление питанием и спящие режимы.
Здесь вы можете увидеть, что “Отключение питания” является одним из самых глубоких режимов сна: все тактовые частоты отключены, главный генератор выключен, и доступны только асинхронные источники пробуждения. Как вы уже испытали, USB-порт в этом режиме не работает.
Напротив, “Бездействие” - это несколько поверхностный сон: процессор остановлен, но
периферийные устройства остаются включенными. Любое включенное прерывание может быть использовано в качестве
источника пробуждения. Это хороший вариант, если вы хотите, чтобы USB-канал оставался
подключенным во время сна, и вы можете получить его с помощью функции LowPower.idle ()
функция.
Если вы беспокоитесь о том, что спящий режим будет слишком “поверхностным” и не будет экономить
достаточно энергии, обратите внимание, что параметры if LowPower.idle()
позволяют
указать, какие периферийные устройства вы хотите продолжать работать во время сна. Если вы
продолжаете запускать только те, которые необходимы, это должно ограничить
энергопотребление тем, что строго необходимо.
Большое спасибо, это решило мою проблему! Спасибо также за действительно хороший отзыв!, @Dakkaron
Это лучше послужило бы комментарием, но я не могу публиковать комментарии (пока) ...
- Что делает ваше приложение? Предполагается ли, что он должен быть асинхронным? Почему 1-2 секунды - это слишком долго?
- Под подключением "USB" вы имеете в виду периферийное устройство UART / Serial?
- Как вы усыпляете плату? Используете ли вы спящие режимы Arduino? Если да, то какой из них вы используете?
Я немного порассуждаю: если вы используете ASP, то вам, возможно, придется изменить исходный код для функций, которые вы используете, чтобы приспособить это периферийное устройство к бодрствованию. Обратите внимание, что это может сделать приложение более энергозатратным, чем вы хотели бы.
Можно было бы просыпаться чаще, но в идеале вам понадобится механизм синхронизации, потому что, по крайней мере, в конечном итоге вы столкнетесь с проблемой, из-за которой вы можете пропустить данные или будете так часто будить устройство, что потеряете экономию электроэнергии.
ATmega32U4 на микро имеет встроенное периферийное устройство USB, @Juraj
Я добавил запрошенную информацию к вопросу., @Dakkaron
@Dakkaron спасибо! Я должен буду рассмотреть это подробнее, это не обязательно тривиальная проблема. Я бы посоветовал попробовать режим ожидания и посмотреть, работает ли USB более отзывчиво. Требуется ли вашему приложению режим отключения питания? Кроме того, почему вы делаете "USBCON = 0" против "UsbDevice.detach()"?, @Nick S.
Спасибо за отзыв, я попробую это сделать. Главная причина, по которой я этого не делал, заключается в том, что мое решение - это то, что нашел Google. Спасибо за информацию!, @Dakkaron
- Библиотека джойстиков Arduino не распознается играми (Steam)
- Как повторно включить USB-контроллер 32u4 после спящего режима?
- Atmega32u4: снижение энергопотребления при сохранении активности USB
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Распиновка аналога Arduino Pro Micro
- Keyboard.h: Нет такого файла или каталога - Arduino pro micro (leonardo)
- Может ли Arduino Leonardo одновременно использовать USB-порт и последовательные контакты RX TX?
- Arduino Pro Micro не распознается ПК
Вы пробовали
LowPower.idle(...);
?, @Edgar BonetНет, пока нет, я попробую это сделать, спасибо!, @Dakkaron
@EdgarBonet Это именно то, что мне было нужно, все работает отлично, спасибо! Вы хотите опубликовать это как ответ, чтобы я мог принять его?, @Dakkaron
Удаление индикатора питания также может снизить энергопотребление., @sa_leinad
@sa_leinad Спасибо за информацию, я планировал это сделать!, @Dakkaron