можно ли на один пин повесить и LED и кнопку?
- Войдите на сайт для отправки комментариев
Ср, 23/04/2014 - 22:44
Знаю, что есть расширители портов или I2C.
Можно ли обойтись без них? К примеру, параллельно светодиоду включить кнопку. Как можно отследить нажатие кнопки, если пин в состоянии output? 2 раза в секунду переключать в режим input, а параллельно LED еще конденсатор (чтобы он не гас)? Но тогда все равно на пине будет больше 2.5 Вольт, т.е. HIGH.
Зачем мне это надо? А вот свободных пинов не хватает ;)
Tomasina, по моему это обычная практика. Конденсатор не нужен, если вы будите опрашивать кнопку раз в скажем 100мс, и переводить выход на вход на одну команду digitalRead , то глазу заметно не будет. Кнопку паралелльно светодиоду, резистор светодиода будет служить ограничителем тока кз. В момент нажатия кнопки конечно светодиод будет гаснуть.
лучше конечно применить сдвиговый регистр 74HC595
но можно и так извратиться)
кстати как вариант. использовать аналоговый выход (PWM) и настроить выход на нужную яркость, но не 100%. Настроить прерывания по нужному таймеру так, чтобы таймер срабатывал в момент сброса состояния порта (когда на порт выводится LOW). В этот момент отключать пин от PWM (в даташите описано как, могу подсказать), меняем режим на вход, опрашиваем состояние и снова включаем выход и PWM
А что еще подключено к ардуино ? Может можнт с другими выводами поиграться ? C LCD например
74HC595 вроде только как расширение выходов можно использовать. Или нет?
В будущем планирую это использовать:http://arduino.ru/forum/obshchii/eshche-raz-ob-uvelicheni-kolichestva-portov-io
Но сейчас я далеко от магазинов электроники, в наличии только светодиоды и резисторы разных номиналов.
Есть 10 свободных цифровых пинов, надо бюджетно подключить 8 кнопок и 8 LED (отображают состояние кнопки).
LED и кнопку?
Когда несколько лет назад я увидел ЭТО - то просто выпал в осадок.
ATtiny13, ОДИН килобайт Flash , 64 байта RAM , всего 6 ног для сигналов
вольтметр, амперметр, датчик температуры и LCD , вот это настоящее совместное использование ног
http://www.rlocman.ru/shem/schematics.html?di=106946
А авторы вроде поляки, http://www.elektroda.pl/
8 светодиодов и 8 кнопок можно еще подключить как матрица 3х3 светодиодов и 3х3 кнопок, с 3 общими линиями переключения.
получится 9 пинов. Три линии динамически переключаем чтобы в один момент времени HIGH был только на одном из них, динамически считываем одну лирию матрицы кнопок и динамически зажигаем одну линию светодиодов
можно подключить 9 кнопок и 9 светодиодов на 9 пинах, нажатие кнопок гасить светодиоды не будет
кроме параллельного подключения кнопки:
Google выдал еще вариант:
Что предпочтительнее?
axill, можно схемку? Непонятно именно подключение элементов.
Ближе к вечеру могу, если не поздно
вторая картинка из гугла не вариант, вы не избежите так короткого замыкания на выход МК. В этой картинке наверняка МК работает только на вход. Можно использовать, но последовательно с кнопкой нужен резистор
вторая картинка из гугла не вариант, вы не избежите так короткого замыкания на выход МК. В этой картинке наверняка МК работает только на вход. Можно использовать, но последовательно с кнопкой нужен резистор
Да, схемка странная, чтобы светодиод не горел, на 5-м пине должно быть HIGH, т.е. 5 Вольт. При LOW пин коммутирует землю на катод. В момент, когда пин в состоянии output+HIGH, нажатие кнопки сжигает порт :)
Upd: хотя тут обсуждается именно такая схема, но сам пин подключен через внутренний подтягивающий резистор. Тогда, по идее, все нормально, КЗ нет.
axill прав. получается самый простой вариант в случае использования кнопок и светодиодов. Дополнительно, можно расмотреть встречное включение свевтодиодов на 4 пинах (получим 4 * 3 = 12 светодиодов). А можно используя 1 аналоговый вход, подключить 8 кнопок через резистивный делитель. (есть возможность использовать аналоговый вход ?)
Остается 6, на них можно матричную клавиатуру 2*4 или 3*3 повесить.
Использую схема из Гугла, получим коротыш, в случае если на ножке лог 1 и ножка сконфигурирована как выход (светодиод потушен) и кнопка нажата . Можно избежать, поставив резистор между ногой и кнопкой (номинал = 5В / 40 мА = 125 Ом, лучше 1 кОм) (написано на 2 поста выше, просто перефразировал :))
Но, возникло следующее предположение. На схеме, нога МК сконфигурирована как вход. Подтягивающий резистор подключен к 5В, ток не течет => светодиод не горит. Но если включить подтягивающий резистор на GND на этой ноге, то ток потечет через этот резистор и светодиод загориться(управляем подтягивающим резистором, digitalWrite(PIN, LOW) - включить светодиод, digitalWrite(PIN, HIGH) - выключить светодиод,). Чтение кнопки, как обычно digitalRead(PIN).
надо проверить... Кто проверит ?
Главное его как выход случайно не сконфигурить (при включении он сконфигурирован как вход), иначе ...
Тогда не пойдет, нужна дуракоустойчивая схема.
Но если включить подтягивающий резистор на GND
у AVR нет внутренней подтяжки на GND
А если сделать такую схему, от пяти вольт на диод, от диода на нормально-замкнутую кнопку и далее на вход, через подтяжку к земле, параллельно диоду кондей, достаточной емкости. Когда нажимаем кнопку, она размыкает контакты, мк получает лог. ноль. Кондей питает диод. Кнопку отпустили, диод загорелся кондей заря дился.
согласен, с подтяжки на минус действительно нет...
Тогда поставить резистор между ногой и кнопкой и смирится что во время нажатия светодиод будет тухнуть.
Ну или использовать матричную схему включения кнопок и диодов.
Я бы изменил нижнюю схему так: параллельно диоду LED1 включить резистор на 10 кОм. Вывод 1 кнопки S1 подключить к аноду LED1. Т.о. не будет к.з. вывода микроконтроллера и есть подтяжка к +5 В когда вывод работает на вход.
Все говорят про какое-то КЗ в схеме из 7 поста. Откуда? Нога контроллера пребывает в 2х состояниях либо output-LOW либо в input. Эта-же схема в обучалке от ДиХалта была с примером на ассемблере. Ссылки не нашёл, но точно было :)
если по той схеме светодиод надо погасить, то на ногу (катод) подаем HIGH, так? Если в это время нажать кнопку, будет КЗ.
Tomasina, гасим светик переводом пина в input.
опа, не дошло :) А текущее состояние пина при этом сбрасывается?
Tomasina, ну да, выход "отсоединиться" :) , по сути переключение на вход можно рассматривать не как работу с входом, а как программное отключение пина. Так что схема хорошая, а я вот изначально во 2 посте что-то не то замыслил.
Tomasina, гасим светик переводом пина в input.
вы правы в том, что в этой схеме можно избежать КЗ, но новичку легко ошибиться
Вот вы тоже внесли ошибку :) Ошибка в последовательности "гасим, светик, переводим в инпут". Чтобы погасить светик надо на выход подать HIGH. Вот тут, пока мы не успели перевести вывод на инпут КЗ и случится. Правильно "переводим на инпут, светик и погаснет, перед тем как снова переводим на аутпут - записываем в порт LOW"
Набил от нефик делать скетч, работающий со схемой из 7 сообщения. Мож кому понадобится как заготовка. Нажатие кнопки циклически включает или отключает светодиод на пине "in" , сканирование кнопки раз в 15 мс. Проверил -срабатывает чётко, без проблем.
/* проверка работы светодиода и кнопки на одном выводе. Скетч зажигает или гасит светодиод от нажатия на кнопку*/ #define in 7 //пин ардуино unsigned long prevmillis = 0; boolean state=0; // state 1 - светодиод светится, пин=выход // state 0 светодиод не светится, пин=вход void setup() { pinMode(in, INPUT); } void loop() { if (millis()-prevmillis >=15) { // если светодиод светился и нажали кнопку if (state==1) { pinMode(in, INPUT); // временно отключим светик if (digitalRead (in)==LOW) { // тут нажали кнопку while (digitalRead (in)==LOW); //антидребезговое.. delay(100); //антидребезговое.. state= 0; // меняем режим. А пин оставим как есть (пин=вход) } else pinMode(in, OUTPUT); //если кнопку не нажимали -обратно включим } //если светодиод не светился и нажали кнопку if (state==0 && digitalRead (in)==LOW ) { while (digitalRead (in)==LOW); //антидребезговое.. pinMode (in, OUTPUT); //включим светик state=1; } //сбросить таймер проверки состояния prevmillis=millis(); } }