Пульт ДУ с малым током покоя на ATmega328P

Автор оригинала: sjm4306
  • Перевод
  • Tutorial

По КДПВ видно, что автор неравнодушен к винтажной аудиотехнике Sony. Тут и MD Walkman, и недавнее приобретение — малогабаритный музыкальный центр с вертикальным CD-«транспортом». Продавался он без пульта, к самодельному аналогу которого автор предъявил требование: такой же малый ток покоя, как у готовых пультов на специализированных микросхемах.

Поначалу автор хотел написать прошивку с нуля, поскольку ранее он уже реализовывал программно протокол, применяемый в пультах ДУ Sony. Но затем решил воспользоваться существующей библиотекой. Она поддерживает различные протоколы, устройства, а также имеет доп. функции, облегчающие разработку и отладку.

С этой библиотекой достаточно подключить ИК-диод к ножке микроконтроллера и приступить к поиску кодов ДУ Sony. Заставить самодельный пульт заработать удалось очень быстро. Но что толку, если батарейка в нём разрядится за один-два дня, даже если им совсем не пользоваться?

В общем, задача состояла в переводе ATmega328P в спящий режим, чтобы он практически не потреблял ток, пока не будет нажата какая-нибудь клавиша. Библиотеки для управления спящим режимом тоже существуют, но автор решил, что раз он взял готовую библиотеку для передачи команд, то пусть хотя бы эта часть прошивки будет написана самостоятельно. Согласно даташиту, перевод микроконтроллера в спящий режим оказался многоступенчатым процессом.

Поэтому в скетче всё достаточно подробно прокомментировано, чтобы читая одновременно код и даташит, можно было понять, что происходит при выполнении каждой строки. Микроконтроллер «спит» практически всё время, а при изменении состояния одного из входов «просыпается», определяет, какая кнопка нажата, передаёт команду и снова «засыпает».

С кварцем на 16 МГц микроконтроллер, когда он не «спит», будет потреблять больший ток, чем при работе от встроенного тактового генератора на 8 МГц. Чтобы перенастроить соответствующие «фьюзы», пришлось воспользоваться внутрисхемным программатором. Спящий режим выбран такой, при котором отключается всё, кроме прерываний. Автор не сразу понял, что нужно отключить АЦП, отчего долго не мог найти причину, по которнй в спящем режиме микроконтроллер потреблял почти один миллиампер. Сторожевой таймер тоже пришлось отключить, и вот результат: около 2 мкА в спящем режиме и 3,5 мА при передаче команды. Этот калькулятор показал, что в идеальных условиях, если нажимать кнопки 5 раз в час, элемента в таком режиме хватит на 4,82 года. Даже один-два года — уже здорово, а так — тем более.

Плату автор разработал в Eagle. Файлы для повторения: скетч, схема, «герберы», исходник платы.





Видео, где показано в т.ч. измерение тока:



Процесс совершенствования конструкции продолжается, прежде всего необходимо заставить заработать пару кнопок, для которых найденные в сети коды оказались неправильными. Далее автор приводит упрощённый аналог CC-BY из одной фразы: «Если хотите, используйте код и плату в других самоделках, только не забудьте указать, кто всё это для вас разработал». Поскольку исходная библиотека не под GPL, а под LGPL, так делать можно.
Поддержать автора
Поделиться публикацией

Комментарии 54

    +3

    Хаха, интересно, а что мешало автору сделать пульт с нулевым током покоя? Я когда пытался сделать свою авто сигналку делал так: нажатие на кнопку — подавало питание на контроллер, который защелкивал оптопару удерживающую питание. Затем МК грузился, посылал сигнал и после — отщелкивал оптопару — полностью вырубая себе питание. Время загрузки МК и посылки сигнала — настолько мало, что разницы между моим вариантом и классикой — не было видно никакой.

      +2
      Ха, Вы коммент написали после того, как я открыл статью :) Я прям уверен был, что первый напишу. Бутерброд во всем виноват, надо было сразу пилить коммент, а не на кухню идти. Но мне не жалко :)
      Я бы попробовал без оптопары, если код из флеша сразу выполняется и написано все на голом железе, без монструозных библиотек и операционных систем, то времени нажатия на кнопку вполне хватит чтобы инициализировать железо, считать сигнал и выполнить действие. ИМХО, конечно.
        +1
        Решение было воплощено в железе, так что оно рабочее 100%
        +1

        Особого смысла так усложнять нет. Можно взять контроллер попроще (ATTiny), и ток в режиме сна будет меньше 1 мкА. Ток саморазряда батареи больше.

          +1
          Про пальчиковые батарейки пишут, что ток саморазряда 4,7 мкА. Т.е. 5,7 мкА тока простоя до экономии против 4,7 мкА. Экономия в 17,5% — довольно существенная вещь. Кроме того, если использовать батарейки типа Button («таблетки»), то у них ток саморазряда вроде бы еще меньше. И емкость меньше. Т.е. срок работы от комплекта батареек можно повысить существенно, даже экономя 1 мкА.
            +1
            Мне кажется, 17% при таких временных масштабах уже не так важно. И 17% это без учета собственно работы пульта.
            Если срок работы пульта от одного комплекта батареек 4 года, то увеличив его до 5 лет мы никакого нового качества не получим.
            А батарейки типа «таблетки» могут не потянуть ток (десятки миллиампер), необходимый для работы светодиода. Точнее могут в таком режиме терять заряд значительно быстрее, чем ожидается.
            И двухконтактные кнопки — это дороже и менее надежно. Их сложно заменить контактами на плате, которые замыкаются токопроводящей площадкой резиновой кнопки и т.п.

            Я бы сказал, что подобное решение приносит проблем гораздо больше, чем способно дать положительного результата. Может быть поэтому я ни разу не видел пульта с двухконтактными кнопками, который бы полностью обесточивал себя, а не засыпал бы.
              +1
              Таблеточные батарейки заманчивы уже тем, что они меньше, можно сделать пульт размером с банковскую карту. Это удобно и клево. Это конкурентное преимущество.
              Для «дрыгания» светодиодом можно сделать буфер из конденсатора, который будет с некотрой задержкой заряжаться, а затем «выстреливать» пакет данных. С другой стороны, проще просто посмотреть характеристики батарейки. В любом случае, конденсатор не помешает, он позволит сохранять работоспособность при низком заряде батареи.
              Двухконтактные кнопки можно заменить на одноконтактные, но придется делать небольшую схему с диодами и включать подтяжку. Тогда можно заменить решение на резиновые кнопки.

              Думать нужно в первую очередь о потребителе. Потребителю будет по нраву маленький пульт. А в маленький пульт не впихнешь большую батарейку. ИМХО.
                +1
                Для «дрыгания» светодиодом можно сделать буфер из конденсатора, который будет с некотрой задержкой заряжаться, а затем «выстреливать» пакет данных


                Я думал об этом. Конденсатор нужно будет довольно большой. Там ток может быть и 50 мА, а скорость выпихивания посылки 1-2 бита в миллисекунду, если не ошибаюсь. Если 16 бит, то, грубо говоря 10 мс, из которых светодиод светит четверть времени.

                Двухконтактные кнопки можно заменить на одноконтактные, но придется делать небольшую схему с диодами и включать подтяжку. Тогда можно заменить решение на резиновые кнопки.


                Ну да. Диоды, транзистор, который все это будет открывать, токи утечки…

                Думать нужно в первую очередь о потребителе. Потребителю будет по нраву маленький пульт. А в маленький пульт не впихнешь большую батарейку. ИМХО.


                Все имеет разумные пределы. Я покупал китайские универсальные пульты плоские и маленькие. Включить телек удобно. Но кнопки для полноценного управления там просто не разместятся. Если вы когда-нибудь разбирали пульт, то, наверное, заметили, что он внутри вообще пустой и батарейки занимают 10% объема. Остальное — пустота, чтобы обеспечить большую площадь для размещения кнопок.
                  +1

                  Утечек не будет. Диоды поставить после кнопок.

                    +1
                    Я об утечках в том месте, которым диоды управляют.
                      +1
                      5 вольт подаете на один контакт кнопки. Снимаете с другого. Отправляете его на принимающий контакт микроконтроллера. Через диод Шоттки отправляете на вывод питания микроконтроллера. И так со всеми кнопками. При включении МК нужно будет сделать подтяжку выводов к земле. Тогда токи утечки диодов не приведут к появлению высоких уровней на всех выводах МК. Питание будет порядка 4,5 Вольта. Это режим работы кратковременный, в выключенном режиме ток потребления будет нулевой (все цепи разомкнуты).
                      Кажется, это называется «монтажная операция ИЛИ». Вроде ничего не пропустил.
                        +1
                        Я понимаю идею, но немного сомневаюсь.
                        В схемотехнике я ничего не понимаю, и поэтому не уверен, что питание схемы через резиновую кнопку — хорошая идея. И что дребезг контактов не надо подавлять.
                        Если все это будет работать без схем подавления дребезга, без дополнительных транзисторов, которые только управляются сигналом от кнопки, то отлично. Если же не будет, то вот в этой части после диодов и возможны всякие неучтенные расходы электричества.
                          +1
                          Не только лишь все это знают, но дребезг замечательно подавляется установкой после кнопки конденсатора.

                          Но более того, в этой схеме можно и без него — если при нажатии дребезг настолько значительный, что контроллер пройдёт несколько циклов вкл/выкл — то да и чёрт бы с ним, когда кнопка стабилизируется, он запустится и отработает.
                    +1

                    С остальным, в принципе, согласен. Хотя ик-порт на сотнях килобит в секунду работает, кажется. Никак не 10 мс получается.

                      +1
                      У пультов дистанционного управления другие протоколы. Там импульсы несущей с частотой порядка 36 КГц. то есть о сотнях килобит речь даже не идет.
                      Я ковырял протокол по имени RC-5, там манчестерский код и ширина импульсов 800 и 1600 мкс. Так что 10мс — это даже оптимистичная оценка. Скорее 20. :-)
                      +1

                      Ну попробовать ведь всегда стоит :)

                        +1
                        Конечно! Пробовать стоит!
                        Если это интересно и не тянет на премию Дарвина, то я только за! :-)
                      +2
                      … пульт размером с банковскую карту. Это удобно и клево. Это конкурентное преимущество.

                      Маленький пульт легче теряется. И — это неудобно, пульт должен БЫТЬ в руках, а не удерживаться с мыслью «я эту бздюрю ща сломаю, йоц...»
                        +1
                        Маленький пульт легче теряется.

                        Привязать его проводком к управляемому устройству :)
                    +1
                    не совсем корректно ток саморазряда складывать с током потребления
                      +1
                      Сильно отличается от реальности? Поясните, заинтриговали :)
                        +1
                        Ток саморазряда это скорее оценочная (сравнительная характеристика). Саморазряд в принципе не постоянен и зависит от многих факторов. Методы его измерения тока саморазряда тоже не идеальны. Оценивается или как эквивалент от тока, который приведет к аналогичному разряду (через время и энергию), или методом измерения тока ЗАРЯДА полностью заряженного элемента (сколько полностью заряженный элемент потребляет от источника постоянного напряжения того же номинала, что и полностью заряженный элемент). Логично что микроамперы тут точно измерить крайне сложно.
                        Наличие же нагрузки имеющей ток потребления ниже тока саморазряда не всегда приводит к уменьшению времени жизни, по крайней мере линейной зависимости как при суммировании тока потребления и тока саморазряда тут нет. Более того разброс в качестве элементов питания будет играть большую роль, чем такая нагрузка.
                          +1
                          Это Вы написали комментом выше (кстати, я не пойму, как можно отредактировать комментарий, на который уже ответили, ну и не важно) :)
                          Ясно, что ток саморазряда — оценочная характеристика. Статистическая. А ток разряда — это более-менее постоянная величина.
                          Не ясно только, на какие теоретические и экспериментальные данные опирается утверждение «наличие нагрузки, имеющей ток потребления ниже тока саморазряда не всегда приводит к уменьшению времени жизни». Мне это кажется сильно неочевидным.
                          Насчет нелинейности согласен. Насчет «не всегда» — сильно сомневаюсь. Но, опять же, хотелось бы просветиться на этот счет.
                            +1
                            Ток саморазряда может иметь и реальный физический смысл, перенос заряженных ионов между электродами внутри элемента и есть тот же электрический ток, который можно измерять в микроамперах.
                            Кажется вполне логичным, что внешний и внутренний ток можно суммировать.
                            Другое дело, например, коррозия корпуса, которая ни как не зависит от тока потребления, но ограничивает срок жизни батарейки.
                              +1

                              Как раз таки экспериментальные данные и позволяют это утверждать. Но все же добавлю что там есть "нюанс" в виде того, что потребление бралось среднее (условно — импульсы 10мА в течении 20мкс с периодичностью в. 1с на фоне 2мкА постоянного), что может сделать меня неправым в общем случае. Объясняется тем что процессы протекающие в батарее зависят в том числе от того, есть потребление или нет. При наличии хотя бы небольшого потребления саморазряд может меняться.

                  +1
                  Можно использовать кнопки с двумя нормально разомкнутыми контактами. Через один контакт передавать питание для микроконтроллера, а через другой — сигнал на ногу микроконтроллера. Ток покоя будет равен нулю. При нажатии любой кнопки запитывается МК и на одну из ног подается напряжение высокого уровня. Главное, чтобы допустимый ток через контакт не был превышен.
                    +1
                    А вы уверены что микроконтроллер на 8 МГц будет достаточно быстро загружаться? Как минимум будет лаг в несколько мс, и, чем больше будет кода, тем дольше будет грузиться МК. Т.е. вам на пульте надо будет нажать и держать кнопку — пока не произойдет действие. А еще есть дребезг контактов на кнопках (вот тут я не уверен. Возможно конденсатора по питанию мк будет достаточно). Да и 2мкА — это не большой ток.
                      +1
                      А сейчас, по-вашему, из power-down mode он не загружается?..

                      5 мс у него это примерно занимает, считая раскочегаривание и выход на режим RC-генератора.
                        +2
                        проце никуда не грузится… это атмега. она просто включается и работает. есть настраиваемая задержка на стабилизацию питания и на выход генератора на рабочую частоту. в данном конкретном случае атмега от внутреннего генератора может стартануть или от 14 тактов или от 14 тактов + доп 6 тактов + 6 милисекунд или 14 тактов + 6 тактов + 65 милисекунд. все выставляется фузами.
                        от кол-ва кода скорость запуска не зависит НИКАК! это AVR и в этом его прелесть.
                          +1
                          Главное туда ардуиновсий загрузчик не лепить )))
                            +1
                            Эт да… но судя по плате — разьема для isp нет так что с огромной долей вероятности — он таки есть там :)

                            но это не недостаток атмеги — это недостаток програмиста и трассировщика.
                            За код как уже было замечено ниже — вообще умолчим… никакого сохранения предыдущего состояния, никакого засыпания по таймауту залипшей кнопки и прочего… ад просто.
                      +2
                      Как обычно, код заставляет плакать кровавыми слезами.

                      void loop() { //MUST set BOD to <3V so this can all run off a single CR2032 (write 0x05 to extended fuse for 2.7V BOD, 0x07 to disable BOD)
                        if(digitalRead(pwr)==0){tmp=power_cmd;  //BUG, if button is held, sends additional press on button release!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        }else if(digitalRead(play)==0){tmp=play_cmd;
                        }else if(digitalRead(pause)==0){tmp=pause_cmd;
                        +1

                        Это было понятно еще по фразе "тут не все кнопки работают, но не забывайте сказать кто вам это придумал"

                          +4
                          Я бы сказал, напротив — они у него работают даже несколько избыточно.

                          Знакомство с понятием «дребезг контактов» автору только предстоит, пока что он считает это странным багом (интересно, багом чего?).
                        +1
                        Так Ардуино ж, чем удивляться. Низкий порог вхождения — такое же низкое среднее качество исполнителей.
                          +1
                          таки не код, а комменты к нему :)
                            +1
                            Был бы код вменяемый, не пришлось бы такие комменты писать.
                            +1
                            Если это написать правильно, то девайс будет еще экономичней процентов на 20 ))
                            +1
                            Двухсторонка для самоделок?
                              +2
                              2$ за десять плат 100х100. Если не требуется «прям через два часа чтоб запаять», то зачем заморачиваться и делать перемычки?
                                +1
                                Доставка же кусается и невилирует эти 2 бакса. Вот если надо делать серию побольше — да, уже стоит того.
                                LAutour вполне себе, берем двусторонний текстолит, канцелярским ножом его расщепляем, травми. сверлим. сопоставляем отверстия клеим. Да. чуть трудозатратнее, но более чем реализуемо :) и совмещение слоев очевидно проще)
                                  +1
                                  Даже так, тот кошмар разводки, что у автора пульта, самоделом не осилить. Проще переделать плату, оптимизировав под односторонку.
                                    +1
                                    а что с доставкой? ну выйдет в десятку баксов и пару недель ожидания. в наших реалиях самодельная плата не сильно дешевле обходится без учета потраченного времени и нервов
                                      +1
                                      а что с доставкой? ну выйдет в десятку баксов и пару недель ожидания. в наших реалиях самодельная плата не сильно дешевле обходится без учета потраченного времени и нервов

                                      Заказывать есть смысл когда нужны эти 10 штук. Единичное быстрее проще и дешевле самому сделать
                                      Заголовок спойлера
                                      текстолит 100х100мм — 50руб
                                      перекись водорода в аптеке — копейки
                                      лимонная кислота еще копейки.
                                      (хлорное железо покупал за 70р когда то банку, с учетом что оно восстанавливается — почти вечное)
                                      Глянцевая бумага — бесплатно журналы раздают.(певый раз был еще веселее, напечатал на струйнике на обычной бумаге, а чтоб возможно было перевести, сходил на почту сделал копию на ксероксе на страницу журнала, давно же это было)
                                      Нервы — не знаю, у меня с первого раза получались дорожки 0.2 с шагом 0.2 (первый раз когда трассировку делал не посомтрел на толщину, а на экране все выглядело достаточно крупно). А сейчас есть вариант и без утюга переносить тонер.
                                      Время — 10-20 минут против 2 недель. Если взять SMD то еще и сверлить ничего не нужно.


                                      LAutour ну с этим я и спорить не буду, я высказался только по поводу изготовление двусторонних плат:)
                                        +1
                                        в последний раз я делал фоторезистом двухсторонку с маской (но без металлизации) и сравнивать считаю правильным хотя бы похожие вещи, а не полноценную двухстороннюю плату с маской, лужением и шелкографией с односторонней голой платой.
                                          +1
                                          Для единичного экземпляра для себя который никогда не увидишь после сборки это избыточно. И еще 9 плат которые будут валяться как хлам — Все это слишком избыточно. Если надо несколько то согласен без вопросов — китай вне конкуренции. Там еще и тесты на кз и тд. (на доставке можно еще сыкономить если толщину плат убавить хД)
                                            +1

                                            Я привык к тому что все должно в первую очередь красиво выглядеть. Шучу. Склоняюсь к тому что плата прототипа должна быть максимально приближена к рабочей версии. В плане разводки

                                              +1
                                              Красиво это тоже так то довод :) Мне сильно сложных плат не доводится делать, так легкое хобби иногда. Потому лут более чем достаточно, редко когда на 2 стороны, стараюсь на одной. А еще мне нравится сам процесс от и до.
                                      +1
                                      Ну я обычно ещё и компоненты у партнёра заказываю, магазин вроде особо адового кЕтая(перепиленых, пустышек и перемычек) не толкает, а после налёта на презент в виде подделки в ЧиД(да, я знаю, что есть и другие нормальные магазины на буквы C и К, но оный мне был удобен местоположением), то разница исчезла. Как результат цена доставки компенсируется ценой компонентов. Плюс бывает «о, а что это у тебя? о, а я тоже такую хочу», и благодаря этим оставшимся девяти платам хотелка выполняется.
                                  +1
                                  А зачем надо было привязываться к меге? Есть же STM8L и STM32L, они ещё и дешевле порой выходят
                                    +1
                                    Под них программировать надо.

                                    А тут дёрнул одну либу, примотал скотчем ко второй — ну и вроде уже как-то, через раз, но работает.
                                      +2
                                      А в STM32 разве сложно не программировать? Скачал куб, потыкал мышкой, оно сделало проект, скачал либ кое-как, слегка наговнокодил и готово.

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое