В жизни ардуинофила однажды случается синдром дефицита ног. Это вовсе не болезнь какая-то. С ардуинщиком, как раз, может быть всё в порядке. Как правило, он имеет две ноги, которых вполне достаточно для функций, определенных для нижних конечностей матерью-эволюцией. А вот с контроллером… Ног (портов) у него конечно много. У моей любимой Ардуинки про-мини, их больше двадцати. Но, однажды, захотелось странного. Нет, вовсе не карманный электроорганчик собрать с клавишами в семь октав (хотя, тоже тема), а другая блаж посетила – собрать навороченный плавающий ракетодром на радиоуправлении. Да, чтобы, и управлялся, и мачта поднималась, и ракета взлетала, и кран подъемный… А, для управления этого бестиария нужно много управляющих кнопок и потенциометров (переменных резисторов). Каждый/ая из них норовит отхватить себе ногу у Ардуино. Наконец, ноги кончились.
Тут для тех, кто не в танке, поясню, что для управления с кнопок контроллер использует цифровые входы (0-кнопка отжата, 1-нажата), а крутилки-потенциометры вешаются на аналоговые входы, с которых снимается сигнал в диапазоне 0-1023. Ног обоих типов по восемь штук.
Так вот, в моем случае, были заняты все цифровые входы, но оставались аналоговые. Как приспособить аналог для кнопок, идея пришла довольно быстро. Страшно был рад своей догадливости (немного расстроился, когда узнал, что этот способ уже известен Интернету). Я сделал подключение кнопок, используя схему резистивного делителя напряжения. Благодаря этой схеме можно было подключить даже не одну, а несколько кнопок на одну аналоговую ногу. Практически, схема из школьной физики. Итак, на один аналоговый вход, были подключены две кнопки настройки прямого хода корабля, на другой еще две. Они управляли сервомотором поворота подъемного крана влево-вправо. По такой же схеме были подключены концевики подъёмника мачты ракеты.
В следующем проекте я уже использовал управление кнопками через аналоговые входы гораздо смелее. На одной из ног назначил аж семь кнопок.
Все бы ничего, жить – да не тужить. Но есть один недостаток в такой схеме подключения. Одномоментно можно нажать только одну кнопку, иначе контроллер сработает неправильно. Поэтому клавиатуру органа на аналоговый вход не прицепишь и аккорд не сыграешь, а если попытаешься, то не музыка будет, а сплошная постмодернистская фигня, да ещё одноголосная. Впрочем, о вкусах не спорят.
Пришлось для аналогичного случая освоить выходной регистр. Это микросхема такая. К ней можно подключить восемь кнопок, например. А если один выход и еще две управляющие ноги подключить к цифровым ногам контроллера, то он (контроллер) сможет различать эти кнопки. Хоть все нажми, хоть две – он их различит и поймет, что с ними делать. То, что нужно для подключения аж три ноги, конечно, не приятно, но это компенсируется возможностью, подключить последовательно несколько регистров, и таким образом, навесить всю клавиатуру пианино в семь октав на три входа процессора. В моём случае было достаточно одной микросхемы, потому что, кнопок было восемь.
Схему и код нашел в сети (https://3d-diy.ru/wiki/components/sdvigovye-registry/), но код оказался с браком. Терялся один бит (одну из кнопок контроллер не видел). Уж я и схему проверил, и плату промыл, поменял микросхему – нет бита. Стал копать код, мануал… Разобрался, что он - не теряется на самом деле. Просто чтобы его считать не нужно использовать функцию shiftIn(), а сразу, после дергания заглушки брать бит непосредственно. Затем, можно брать остальные семь битов. А уж после этого полученные биты свести в правильный корректный байт.
Вряд-ли автор сделал код с багом из злого умысла. Скорее всего просто не проверил его на всём диапазоне.