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

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

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

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

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

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

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





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



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

Комментарии (52)


  1. token
    16.05.2019 07:29
    +2

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


    1. RegisterWindowClassExA
      16.05.2019 07:54
      +1

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


      1. token
        16.05.2019 09:01

        Решение было воплощено в железе, так что оно рабочее 100%


    1. Chaa
      16.05.2019 08:36

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


      1. RegisterWindowClassExA
        16.05.2019 08:57

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


        1. ProstoUser
          16.05.2019 10:33

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

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


          1. RegisterWindowClassExA
            16.05.2019 17:42

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

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


            1. ProstoUser
              16.05.2019 18:42

              Для «дрыгания» светодиодом можно сделать буфер из конденсатора, который будет с некотрой задержкой заряжаться, а затем «выстреливать» пакет данных


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

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


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

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


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


              1. RegisterWindowClassExA
                16.05.2019 19:09

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


                1. ProstoUser
                  17.05.2019 09:36

                  Я об утечках в том месте, которым диоды управляют.


                  1. RegisterWindowClassExA
                    18.05.2019 01:53

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


                    1. ProstoUser
                      20.05.2019 13:21
                      +1

                      Я понимаю идею, но немного сомневаюсь.
                      В схемотехнике я ничего не понимаю, и поэтому не уверен, что питание схемы через резиновую кнопку — хорошая идея. И что дребезг контактов не надо подавлять.
                      Если все это будет работать без схем подавления дребезга, без дополнительных транзисторов, которые только управляются сигналом от кнопки, то отлично. Если же не будет, то вот в этой части после диодов и возможны всякие неучтенные расходы электричества.


                      1. olartamonov
                        20.05.2019 13:33
                        +1

                        Не только лишь все это знают, но дребезг замечательно подавляется установкой после кнопки конденсатора.

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


              1. RegisterWindowClassExA
                16.05.2019 19:11

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


                1. ProstoUser
                  17.05.2019 12:20

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


              1. RegisterWindowClassExA
                16.05.2019 19:11

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


                1. ProstoUser
                  17.05.2019 12:22

                  Конечно! Пробовать стоит!
                  Если это интересно и не тянет на премию Дарвина, то я только за! :-)


            1. katzen
              16.05.2019 20:06
              +2

              … пульт размером с банковскую карту. Это удобно и клево. Это конкурентное преимущество.

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


              1. LAutour
                16.05.2019 23:52
                +1

                Маленький пульт легче теряется.

                Привязать его проводком к управляемому устройству :)


        1. nafikovr
          16.05.2019 15:02

          не совсем корректно ток саморазряда складывать с током потребления


          1. RegisterWindowClassExA
            16.05.2019 15:54

            Сильно отличается от реальности? Поясните, заинтриговали :)


            1. nafikovr
              16.05.2019 16:19

              Ток саморазряда это скорее оценочная (сравнительная характеристика). Саморазряд в принципе не постоянен и зависит от многих факторов. Методы его измерения тока саморазряда тоже не идеальны. Оценивается или как эквивалент от тока, который приведет к аналогичному разряду (через время и энергию), или методом измерения тока ЗАРЯДА полностью заряженного элемента (сколько полностью заряженный элемент потребляет от источника постоянного напряжения того же номинала, что и полностью заряженный элемент). Логично что микроамперы тут точно измерить крайне сложно.
              Наличие же нагрузки имеющей ток потребления ниже тока саморазряда не всегда приводит к уменьшению времени жизни, по крайней мере линейной зависимости как при суммировании тока потребления и тока саморазряда тут нет. Более того разброс в качестве элементов питания будет играть большую роль, чем такая нагрузка.


              1. RegisterWindowClassExA
                16.05.2019 17:37

                Это Вы написали комментом выше (кстати, я не пойму, как можно отредактировать комментарий, на который уже ответили, ну и не важно) :)
                Ясно, что ток саморазряда — оценочная характеристика. Статистическая. А ток разряда — это более-менее постоянная величина.
                Не ясно только, на какие теоретические и экспериментальные данные опирается утверждение «наличие нагрузки, имеющей ток потребления ниже тока саморазряда не всегда приводит к уменьшению времени жизни». Мне это кажется сильно неочевидным.
                Насчет нелинейности согласен. Насчет «не всегда» — сильно сомневаюсь. Но, опять же, хотелось бы просветиться на этот счет.


                1. sim31r
                  16.05.2019 23:46
                  +1

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


                1. nafikovr
                  17.05.2019 00:17
                  +1

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


  1. RegisterWindowClassExA
    16.05.2019 07:43
    +1

    Можно использовать кнопки с двумя нормально разомкнутыми контактами. Через один контакт передавать питание для микроконтроллера, а через другой — сигнал на ногу микроконтроллера. Ток покоя будет равен нулю. При нажатии любой кнопки запитывается МК и на одну из ног подается напряжение высокого уровня. Главное, чтобы допустимый ток через контакт не был превышен.


    1. Impuls
      16.05.2019 09:02

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


      1. olartamonov
        16.05.2019 09:11

        А сейчас, по-вашему, из power-down mode он не загружается?..

        5 мс у него это примерно занимает, считая раскочегаривание и выход на режим RC-генератора.


      1. clawham
        16.05.2019 09:12

        проце никуда не грузится… это атмега. она просто включается и работает. есть настраиваемая задержка на стабилизацию питания и на выход генератора на рабочую частоту. в данном конкретном случае атмега от внутреннего генератора может стартануть или от 14 тактов или от 14 тактов + доп 6 тактов + 6 милисекунд или 14 тактов + 6 тактов + 65 милисекунд. все выставляется фузами.
        от кол-ва кода скорость запуска не зависит НИКАК! это AVR и в этом его прелесть.


        1. sav13
          17.05.2019 05:25
          +1

          Главное туда ардуиновсий загрузчик не лепить )))


          1. clawham
            17.05.2019 08:08
            +1

            Эт да… но судя по плате — разьема для isp нет так что с огромной долей вероятности — он таки есть там :)

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


  1. olartamonov
    16.05.2019 08:38
    -1

    Как обычно, код заставляет плакать кровавыми слезами.

    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. staticmain
      16.05.2019 09:39

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


      1. olartamonov
        16.05.2019 10:57

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

        Знакомство с понятием «дребезг контактов» автору только предстоит, пока что он считает это странным багом (интересно, багом чего?).


        1. token
          16.05.2019 11:09

          Это баг физики!



    1. Polaris99
      16.05.2019 14:07

      Так Ардуино ж, чем удивляться. Низкий порог вхождения — такое же низкое среднее качество исполнителей.


    1. safari2012
      16.05.2019 16:28

      таки не код, а комменты к нему :)


      1. olartamonov
        16.05.2019 18:16

        Был бы код вменяемый, не пришлось бы такие комменты писать.


    1. DolphinSoft
      16.05.2019 20:17
      +1

      Если это написать правильно, то девайс будет еще экономичней процентов на 20 ))


  1. LAutour
    16.05.2019 15:02

    Двухсторонка для самоделок?


    1. JerleShannara
      16.05.2019 17:35

      2$ за десять плат 100х100. Если не требуется «прям через два часа чтоб запаять», то зачем заморачиваться и делать перемычки?


      1. zartarn
        18.05.2019 12:59
        +1

        Доставка же кусается и невилирует эти 2 бакса. Вот если надо делать серию побольше — да, уже стоит того.
        LAutour вполне себе, берем двусторонний текстолит, канцелярским ножом его расщепляем, травми. сверлим. сопоставляем отверстия клеим. Да. чуть трудозатратнее, но более чем реализуемо :) и совмещение слоев очевидно проще)


        1. LAutour
          18.05.2019 13:28
          +1

          Даже так, тот кошмар разводки, что у автора пульта, самоделом не осилить. Проще переделать плату, оптимизировав под односторонку.


        1. nafikovr
          18.05.2019 13:37
          +1

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


          1. zartarn
            18.05.2019 13:59
            +1

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

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


            1. nafikovr
              20.05.2019 11:41
              +1

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


              1. zartarn
                20.05.2019 12:06
                +1

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


                1. nafikovr
                  20.05.2019 12:10
                  +1

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


  1. JerleShannara
    16.05.2019 17:31

    А зачем надо было привязываться к меге? Есть же STM8L и STM32L, они ещё и дешевле порой выходят


    1. olartamonov
      17.05.2019 08:21
      +1

      Под них программировать надо.

      А тут дёрнул одну либу, примотал скотчем ко второй — ну и вроде уже как-то, через раз, но работает.


      1. JerleShannara
        17.05.2019 14:10

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