Подключение кнопки

Lozhkin
Offline
Зарегистрирован: 10.04.2011

Не пинайте сильно, но возник новичковый вопрос. Я посмотрел схему подключения кнопки. А обязательно ли подключать выход помимо того, что через кнопку к +5В, еще и через резистор к земле? Я просто не очень понимаю в электронике, но проводя аналогии с подключение света в квартире, возникает вопрос зачем еще земля? Я понимаю, что это какой-то очень базовый вопрос, но я на него не смог найти внятного ответа.
кнопка к ардуино

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Термин "подтягивающий резистор" обычно используются в каких либо входных цепях, например, во входных цепях микроконтроллеров или жесткой логике. Их смысл использования прямо вытекает из определения логических уровней. Известно, что логический уровень характеризуется определенным диапазоном напряжений. Между логическими уровнями находится зона неопределенности. Свободный вход микросхемы, особенно высокоомный, может, под воздействием помех, в процессе работы устройства, оказазываться в различных состояниях. Так напряжение помехи может интерпретироваться как лог.1, лог.0, или попасть в зону неопределенности. Часто это приводит к сбоям в работе схемы. Этот факт обязывает подключать неиспользуемые входы м/сх с помощью сопротивлений к плюсу или минусу источника питания, или "подтягивать" их.
Выбор номиналов этих сопротивлений задача не столь тривиальная, как это может показаться. Но в любом случае, номинал сопротивления должен быть существенно меньше входного сопротивления м/сх, если осуществляется подтягивание свободных входов м/сх. Однако часто подтягивающие резисторы служат для задания тока во внешних, по отношению ко входу м/сх, цепях. В этом случае следует выбирать такое сопротивление, чтобы ток во внешней цепи, существенно превышал входной ток микросхемы, а также все возможные токи создаваемые помехами.
Часто указанный термин применяют не совсем корректно. Так, например, если выход м/сх выполнен по схеме с открытым коллектором (ОК), то само по себе подключение выхода через сопротивление к источнику питания не будет являтся "подтягиванием" как таковым. Здесь более уместен термин нагрузочное сопротивление, поскольку он точнее определяет физическую сущность явления, ведь именно с этого сопротивления снимается полезный сигнал. Однако, если таким образом реализована какая либо линия связи (объединены несколько выходов выполненные по схеме с ОК и подключены к одному сопротивлению), то можно говорить о том, что линия связи в пассивном (активном) состоянии подтянута к напряжению питания. 
 
Таким образом с помощью резистора в этой схеме, на входе дуины мы обеспечиваем жесткое положение 0, избегая таким образом помехи от всяких наводок и т.д.

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

вопрос по кнопкам...весь извелся уже

собрал примерно вот такую схему

Отличие моей схемы от этой в том, что у меня 3и кнопки и номиналы всех сопротивлений (4шт) - 2,7кОм

код

int analogPin = 4;     // номер порта к которому подключен потенциометр
int val = 0;           // переменная для хранения считываемого значения
 
void setup()
{
  Serial.begin(9600);              //  установка связи по serial
}
 
void loop()
{
  val = analogRead(analogPin);     // считываем значение
  Serial.println(val);             // выводим полученное значение
  delay (1000);
}

вывод идет набор цифр

55
90
97
104
111
113
123
131
136
153
156
не могу выловить нажатие кнопок...никакой системы не обнаруживаю...что нажал, что не нажалд ничего не меняется...

ранее использовал analogRead на фоторезисторе - там система четкая закрпыл/открыл фоторезистор - идет изменение показаний

leshak
Offline
Зарегистрирован: 29.09.2011

 На схеме вход A5, в коде A4

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

простите....схему привел как есть с робокрафта, как пример, читаю как в коде с А4

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну то что читаете вы в коде с A4, это и так видно. Подключенно-то куда, в реальности? На A4 или A5?

Какие данные идут если никаких кнопок не нажимать?

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

подключено на А4

данные идут

55
90
97
104
111
113
123
131
136
153
156

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

З.Ы. весь вывод данных не привожу, ибо валится много...

leshak
Offline
Зарегистрирован: 29.09.2011

 Постарались, но не вышло. :) Данные в первом своем посте вы указали, но не сказали какие кнопки при этом нажаты :)

Если это данные которые идут именно при не нажатых кнопках, то у вас либо порт угорел, либо резистор R7 потерялся/отвалился/плохой контакт.

 

Проверить порт - просто. Откключаем все. Берем проводок. Одним концом в A4 другим в  землю - в сериале должно быть "близко к нулю", потом одним концом в A4, а другим в 5v PIN - в сериале должено быть "близко к 1024"

leshak
Offline
Зарегистрирован: 29.09.2011

 Признаком что резистор R7 "нашелся" будет то, что в сериале, при не нажатых кнопках будут бежать цифры близкие к 1024

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

в первом посте указанны данные без нажатых кнопок, даже если бы нажимал кнопки и удерживал, то никакой системы в изменении данных не обнаружил...

порт проверил - все как вы говорите А4-gnd = 0, А4-5V = 1024

R7 - поменял проводки, проверил контакты (но не исключаю плохой контакт)

leshak
Offline
Зарегистрирован: 29.09.2011

 

vworld пишет:

в первом посте указанны данные без нажатых кнопок, даже если бы нажимал кнопки и удерживал, то никакой системы в изменении данных не обнаружил...

Вначале нужно добится четкой ловли "кнопки не нажаты", потом уже "нажимать" (они все производны от состояние "не нажато"). Пока не будет 1024 при отпущенных кнопках - можно даже не пытатся нажимать.

vworld пишет:

порт проверил - все как вы говорите А4-gnd = 0, А4-5V = 1024

Ну значит порт и АЦП - живы и бодры. Это хорошо.

vworld пишет:

R7 - поменял проводки, проверил контакты (но не исключаю плохой контакт)

Возмите вольтметр и промерте что после него получается. Должно быть что-то в районе 4.8V

Ну в крайнем случае можно вообще его выкинуть нафиг и заменить просто проводком (то есть взять R7=0 ом). 

Его предназначение - снижать потребляемый ток при нажатых кнопках (и даже при нулевом значении этот ток будет в допустимых пределах благодаря резисторам на 2.7K) плюс "защита от дурака" (если вы случайно где-то подключите кнопку напрямую на землю, без резистора в 2.7K).

Вообщем если у вас питание не от батареек (не нужно экономить ток)  и вы уверены на 100% что все остальные кнопки подключены "точно как на картинке" (не нужно делать "страховку") -  можно R7 заменить на простой проводок.

leshak
Offline
Зарегистрирован: 29.09.2011

Э... кажись прогнал я с "заменить проводком". Тогда нажатие кнопок отличить не получится. Делить напряжения расчитать не возможно будет.  Дробь 0 поделить на что-то (нажатая кнопка) - всегда будет возвращать ноль. То есть какая кнопка нажата - фиг поймешь.

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

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

в общем методом "научного" тыка удалось выяснить причину проблем...отвратная макетка.

вернее не так...не размечено, что шина питания на 2е части делится на макетке

З.Ы. резюмирую смысл схемы из первого поста....при нажатие на кнопку выдается значение - соответственно можно вылавливать нажатие кнопок в зависимости от значения...(извините если уже было на форуме)

leshak
Offline
Зарегистрирован: 29.09.2011

 >вернее не так...не размечено, что шина питания на 2е части делится на макетке

Это скорее всего было нарисованно на коробке-упаковке макетки. Хитрые люди вырезают эту схему и клеят на обратную сторону макетки. Прежде чем выбросить упаковку.

А разделенное питание - бывает очень нужно (так что макетка вполне правильная). например когда в схеме есть блоки и с 5v питанием и 3.3v

По поводу "смысл схемы из первого поста" - оно конечно "дешево и сердито", но "не надежно".

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

Да и с детектирование "одновременных нажатий" - проблема.

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

 

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

вы как всегда правы уважаемый...про не стабильность моего варианта, но мне пока для "баловства", в серьезном проекте конечно же побоялся бы использовать, НО у меня и проектов нет серьезных :)

leshak
Offline
Зарегистрирован: 29.09.2011

vworld пишет:

вы как всегда правы уважаемый...про не стабильность моего варианта, но мне пока для "баловства", в серьезном проекте конечно же побоялся бы использовать, НО у меня и проектов нет серьезных :)

Ну ваш вариант не менее "правильный".  Задача инженера именно и подобрать наиболее оптимальное для каждой ситуации. Если ваша задача решается такой схемой, на более дешовой рассыпухе. И ее "минусы" - не важны, то ваше решение будет "более подходящим". Я просто упомянул что может быть и альтернативный подход (и расписал минусы вашего). У которого есть свои плюсы, но тоже есть и минусы (больше ног займет, сложней скетч, микруху хоть за копейки но нужно найти-купить).

А для "баловства" - можно попробовать и так и этак ;) А если еще и "на деньги плевать" - попробовать расширители портов на I2C :)

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

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

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

схема преотличная - отражает именно то, что по крайней мере мне необходимо для проекта..

вот мой код

int a;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  a = akey();    // основная функция возврата номера нажатой кнопки
  if(a != 0)     // демонстрация: если одна кнопок нажата, то возвращается номер кнопки 
  {
    Serial.println(a);
    Serial.println("---=-=-=-=---");
    a = 0;    // обнуляем переменную, в которую записывали номер кнопки
  }
}



int keyp()
{
  int key;
  if(analogRead(4) > 770) key = 0;          // просто считываем показания и
  else if(analogRead(4) > 710) key = 1;     // сравниваем с показаниям каждой кнопки
  else if(analogRead(4) > 630) key = 2;
  else if(analogRead(4) > 470) key = 3;
  return key;
}



int akey()      // та самая "основная" функция
{
  int L = keyp();   // ссылка на подфункцию
  
  // подфункция даёт номер текущей кнопки 
  //( 0 - ни одна из кнопок не нажата)

  while(keyp() != 0) delay(20);   

  // далее происходит следущее: пока кнопка зажата, функция "ждёт" 
  // и возвращает номер "кликнутой" кнопки
  // это сделано для собственной безопасности,
  // для предотвращения зацикливаний и непонятных лагов
 
  return L;
}

как бы в коде все ровно, но нажатия кнопок в мониторе производятся не однозначно (нажал, а вывода нет, приходится или несколкьо раз нажимать или нажать и удерживать)

ПОдскажите, что не так с кодом?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Слишком много читаете аналоговый вход. Попробуйте:

int keyp()
{
  int key=analogRead(4); // просто считываем
  if(key > 770) key = 0;    //       показания и
  else if(key > 710) key = 1;     // сравниваем с показаниям каждой кнопки
  else if(key > 630) key = 2;
  else key = 3;
  return key;
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Эти схемы принципиально ничем не отличаются, хотите одинаковые номиналы, ставьте одинаковые. Схемы отличаются только тем, что по умолчанию в одной подтяжка к земле, а в другой к +5в. В коде только поменятся знаки сравнения на противоположные. И при использовании любой аналоговой клавиатуры всегда нужно указывать диапазон значений, а не ловить конкретное.
Если в схеме выше убрать подтягивающий резистор к +5в и включить внутреннию подтяжку, а номиналы резисторов взять около 5 кОм, то схема еще больше упростится:

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

AlexFisher пишет:

Слишком много читаете аналоговый вход. Попробуйте:

с вашим кодом стало почетче отрабатывать, но все равно наблюдаются "недосрабатывания" :(

maksim
Offline
Зарегистрирован: 12.02.2012

Что значит "недосрабатывания" ?

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

maksim пишет:

Что значит "недосрабатывания" ?

но нажатия кнопок в мониторе производятся не однозначно (нажал, а вывода нет, приходится или несколкьо раз нажимать или нажать и удерживать)

maksim
Offline
Зарегистрирован: 12.02.2012

Это или что то с кнопками или опять с макеткой... 

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

ну кнопки тестором звонятся нормально - нажатия точно уверенно отлавливают

будем считать, что макетка...