Форум по Роботика

Технически форум => Електроника => Темата е започната от: Borislav в Април 11, 2011, 04:42:56 pm

Титла: Свързване на много бутони към МК
Публикувано от: Borislav в Април 11, 2011, 04:42:56 pm
Здравейте!
За един проект, който възникна наскоро се чудя как мога да съединя голям брой бутони към МК (AVR и/или PIC) (С точност бутоните са 45 на брой). Някой може ли да даде малко идеи по въпроса? :)
Мислех по варианта с матрица от бутони, но май ще ми трябва малко помощ.
Поздрави!
Титла: Свързване на много бутони към МК
Публикувано от: spookyboy в Април 11, 2011, 05:42:06 pm
Едновременно ли трябва да работят бутоните :)
Титла: Свързване на много бутони към МК
Публикувано от: Borislav в Април 11, 2011, 05:45:04 pm
Цитат на: "spookyboy"
Едновременно ли трябва да работят бутоните :)


Поне не всичките... Най-много 5-6 едновременно. :)
Титла: Свързване на много бутони към МК
Публикувано от: Аматьор в Април 11, 2011, 09:11:21 pm
Точно с матрица става - 6 изхода и 8 входа на процесора , или обратно.  Аз слагам последователно на изходите по едно диодче - в слуай, че се включат два бутона едновременно да не става колизия с изходите .  Сега като се замислих, могат и те да се избегнат , ако неактивните изходи се преконфигурират временно като входове.  Не е трудна задачката.
Титла: Свързване на много бутони към МК
Публикувано от: bateAz в Април 11, 2011, 09:46:52 pm
Най-лесно става с клавиатура, ако разбира се има място за нея. Иначе се прави с матрица и ти софтуерно ще трябва да си я обработваш. Ако ще трябва коректно да чете и едновременното натискане на повече от един клавиш, последователно на ключето на бутона се слага и диод. Написването на процедура за четене на клавиатурата е "фасулска работа" с малко оцет: 1. Ще трябва да отчиташ, че механичните контакти при включване вибрират и вместо един дават по няколко импулса, все едно, че си натиснал бутона няколко пъти. 2. Вероятно клавиатурния ти драйвер ще трябва да реагира на комбинация от клавиши, като връща различен код при комбинация и при единично натискане.
Писал съм такива процедури, не е сложно, но е дълго за обяснение. ако ти е интересно, все пак бих прежалил 10-15 минути да разкажа някоя приказка.
Титла: Свързване на много бутони към МК
Публикувано от: spookyboy в Април 11, 2011, 10:20:38 pm
Аз понеже не знам какво е матрица за бутони ще предложа това което ми дойде на необразования ум: да кажем, че имаш 8 порта, които ще ползваш. Ако използваш по 1 бит за бутон имаш 8 варианта, ако използваш по 2 - 28, ако използваш 3 - 56. Т.е. твоите 45 бутона можеш да ги събереш в тези 8+28+56=92 избора (даже остават).

Връзваш най-честно използваните бутони за по един порт, следващите с по 2 и най-рядко използваните с по 3. Да кажем, че си именувал бутоните по честота на използването, т.е. бутон 0 е най-често използван, бутон 44 - най-рядко. Задаваш им следните стойности: 0 - 0000 0001
 1 - 0000 0010
 .
 .
 .
 7 - 1000 0000

 8 - 0000 0011
 9 - 0000 0101
10 - 0000 1001
.
.
.
14 - 1000 0001

15 - 0000 0110
16 - 0000 1010
.
.
.
35 - 1100 0000

36 - 0000 0111
37 - 0000 1110
.
.
.
41 - 1110 0000
42 - 0000 1011
43 - 0001 0110
44 - 0010 1100


Така повечето комбинации няма да работят, понеже ще ги разпознаваш като по-рядко натискан бутон, например 0+1 ще се разпознава като 8, но при 35+36 имаме 1100 0111, което е уникална комбинация от входове, така че ще ги разпознаеш като два бутона едновременно. При внимателно нареждане (на бутоните с по 3 входа) може да се повиши малко броя на комбинации, но като цяло ще може да се натиска само по 1 бутон май :)

Поздрави
Титла: Свързване на много бутони към МК
Публикувано от: Borislav в Април 12, 2011, 02:06:53 pm
Заформи се интересна дискусия по проблема, което ме радва много. Благодаря за помощта на отзовалите се!
Успях да намеря интересно четиво по въпроса, което е точно тук (http://easyelectronics.ru/matrichnaya-klaviatura.html) (На руски език).

Ще преведа само последната графа, тъй като там се засяга именно проблемът с "вибрирането" на механичните бутони...

Цитат

"Вибриране" на контактите и борба с това.
При работа с механически бутони, възниква следния проблем - "вибрирането" на контактите. Идеята е в това, че при затваряне на контакта, той сработва не веднъж, а в момента на затварянето и отварянето, сработването се извършва няколко пъти. Това е така поради факта, че идеалният контакт не сработва веднага, а след някакво време, т.е. искри, дори това да не е забележимо с просто око. В резултат, вместо един пад, получаваме серия от пикове в началото и само след това възниква устойчиво състояние.

Но МК работи с такава скорост, че успява да отчете тези пикове като устойчиво състояние. Този проблем може да се реши апаратно, с помощта на RS тригер или програмно - като се внася малко задържане преди последващото състояние на копчето. Задържането се подбира такова, че "вибрирането" да може да утихне до края на това задържане.


Поздрави! :)
Титла: Свързване на много бутони към МК
Публикувано от: Аматьор в Април 12, 2011, 03:02:39 pm
Механичното трептене е повсеместен проблем при повечето механични контакти. Трябва да се има предвид, че честотата на трптения е типично няколко десетки херца - приемаме около 50.  Решения много, но при наличието на процесор е редно да се наблегне на софтуера.
Аз как го правя.  Първо сканирам клавиатурата през 10-20mS.  При натиснат бутон  вдигам флаг, забраняващ повторното му четене за определено време. Броячът на това време се тактува в главата на подпрограмта за клавиатурата.  
Малко по-интересен е проблемът с автоматичното повторение на действието на непрекъснато натиснат клавиш. Пак трябва да има брояч, но е желателно да бъде с променлив коефициент на броене - за първия повторен символ времето да е по-голямо, а за следващите - по-малко.
Титла: Свързване на много бутони към МК
Публикувано от: bateAz в Април 12, 2011, 09:42:06 pm
Цитат на: "Аматьор"
...  При натиснат бутон  вдигам флаг, забраняващ повторното му четене за определено време. Броячът на това време се тактува в главата на подпрограмта за клавиатурата....


Не много добра идея. за да работи коректно, трябва да е не флаг, а брояч. И ще трябва всеки бутон да си има индивидуален таймер. Ще рече по байт на копче. доста по-читаво е да се чете по-нарядко. И най-разбитите бутини се успокояват за 100 мс. Ако сканираш на 100 мс, всичко ще е на 6 - по-малки врмена може да дадат лъжливи двойни сработвания. по-големите правят реакжията на системата по-тромава и това донякъде е изнервящо.

Цитат на: "Аматьор"
...  Малко по-интересен е проблемът с автоматичното повторение на действието на непрекъснато натиснат клавиш. Пак трябва да има брояч, но е желателно да бъде с променлив коефициент на броене - за първия повторен символ времето да е по-голямо, а за следващите - по-малко.


Това да. Ама в много системи го няма по една елементарна причина: пречи.
Титла: Свързване на много бутони към МК
Публикувано от: emil74 в Април 13, 2011, 10:11:38 am
Приложимо ли е да включиш стандартна PS-2 компютърна клавиатура? Тогава ще ти трябват само 2 пина на контролера.
Титла: Свързване на много бутони към МК
Публикувано от: Аматьор в Април 13, 2011, 07:35:32 pm
Цитат на: "bateAz"
... И ще трябва всеки бутон да си има индивидуален таймер. Ще рече по байт на копче. доста по-читаво е да се чете по-нарядко. И най-разбитите бутини се успокояват за 100 мс. Ако сканираш на 100 мс, всичко ще е на 6 - по-малки врмена може да дадат лъжливи двойни сработвания. по-големите правят реакжията на системата по-тромава и това донякъде е изнервящо....


За едно и също нещо говорим, но реализацията е различна.  В интерес на истината програмката за клавиатурата съм я направил преди двайсет и няколко години и я ползвам без много да я мисля - работи си.
 Това, че всеки бутон има възможност да генерира различно време за пауза (броячът ми е един за всички бутони), както и по-честото обслужване на клавиатурата,  го считам за предимство.  Особено това се отнася за автоматичното повторение.  Функцията съвсем не е излишна, а е просто задължителна при малките клавиатури, където има бутони за  инкрементиране на стойности.
Клавиатура с 45 бутона бих направил с отделен процесор, който да се свързва с главния по някакъв сериен интерфейс.  Предполам, че иде реч за клавиатура от табло на някаква машина.
Титла: Свързване на много бутони към МК
Публикувано от: Borislav в Април 13, 2011, 08:35:27 pm
Цитат на: "Аматьор"
За едно и също нещо говорим, но реализацията е различна.  В интерес на истината програмката за клавиатурата съм я направил преди двайсет и няколко години и я ползвам без много да я мисля - работи си.
 Това, че всеки бутон има възможност да генерира различно време за пауза (броячът ми е един за всички бутони), както и по-честото обслужване на клавиатурата,  го считам за предимство.  Особено това се отнася за автоматичното повторение.  Функцията съвсем не е излишна, а е просто задължителна при малките клавиатури, където има бутони за  инкрементиране на стойности.
Клавиатура с 45 бутона бих направил с отделен процесор, който да се свързва с главния по някакъв сериен интерфейс.  Предполам, че иде реч за клавиатура от табло на някаква машина.


Да, в общи линии за машина (а също така и за комплекс, но там бутоните са значително по-малко). Това със серийния интерфейс е много добра идея, но проблемът е, че още не съм управлявал такова нещо. Ще потърся информация по въпроса. Мерси. :)
Титла: Свързване на много бутони към МК
Публикувано от: Vexorian в Април 17, 2011, 09:22:55 pm
Ако контролера ти има A/D пинове, можеш да използваш това решение - http://www.piclist.com/techref/microchip/4x4key1ad7r.htm

Тогава ползваш само 1 пин и сканираш цялата клавиатура за няколко us.. Проблема е настройката и можеш да отчетеш само един натиснат бутон. Може всъщност и повече но е страшно трудно да го настройш или трябва да използваш друга конфигурация. Аз например използвам 2х R2R резисторна мрежа за сканиране на колоните и редовете, и 2х 74HC245 двупосочни буфера за разделяне на мрежите. По-късно ще пост-на схема. Де-факто могат да се сканират 256 бутона натиснати едновремменно за по малко от 30 us и при използване на 4-5 пин-а.
Титла: Свързване на много бутони към МК
Публикувано от: westsiderz в Април 27, 2011, 03:47:30 pm
За избягване на трептенията ползвах следния код:


line0:    {
      if (RB0_bit==0)
        {
         Delay_ms(80);
   if (RB0_bit==1)
      goto line0;

-------------------------


Първо проверявам дали някой бутон е натиснат или дали се е получил сигнал. После изчаквам 80мс. Ако се е получил сигнал на входа и този сигнал е от трептене трябва да изчезне за това време(или може да се избере друг интервал от време). Ако за това време изчезне, тоест входа пак стане логическа 1, значи че е било трептене. В този случай пак се връщаме в началото на сканирането. Ако бутона е бил натиснат, след 80мс пак трябва да бъде натиснат и да бъде логическа 0. В този случай останалата част от програмата ще се изпълни, тоест това което се изисква при натискане на бутона.

ПП: При отпуснат бутон нивото на входа е логическа 1 а при натиснат - логическа 0
Титла: Свързване на много бутони към МК
Публикувано от: anio в Април 27, 2011, 05:02:59 pm
Ето ти едно решение за 10 бутона на 1 порт http://digital-diy.com/General-Electronics/10-keys-on-one-port-pin.html
Титла: Свързване на много бутони към МК
Публикувано от: tupan в Май 05, 2011, 11:05:22 pm
Може да пробваш с '597. 8 битов преместващ регистър с паралелен вход последователен изход. Връзваш 6 такива последователно. Информацията за състоянието на бутоните я въвеждаш паралелно и на 6 цикъла по 8 такта четеш информацията от регистрите. Ще ти трябват 3 извода ако не се лъжа. Честно казано не ми се е налагало да включвам повече от 4, 5 бутона и не съм го пробвал този вариант(или който и да било от горните).