Можно ли подключить кнопки с помощью сдвигового регистра?
- Войдите на сайт для отправки комментариев
Ср, 17/05/2017 - 17:56
В ардуине после подключения всего обвеса остаётся мало свободных пинов, а требуется добавить ещё пару десятков сенсорных кнопок. Будут ли полезны сдвиговые регистры?
И в догонку. У сенсорных кнопок такие же паразитные токи, как и у обычных? То есть, нужно ли их прижимать резисторами?
pcf8574 вам в помощь
Будут ли полезны сдвиговые регистры?
А чё? Гугл тоже заблокировали? Я думал только яндекс.
Вот как раз про кнопки на сдвиговом регистре - http://robocraft.ru/blog/arduino/520.html
Вроде бы человек про сенсорки спрашивал - боюсь, что сдвиговый регистр ему не поможет, хотя кто знает.
Или Вы под сенсорками понимаете не емкостные кнопки?
А, да, виноват, был невнимателен.
Уважаемый avex формулируйте ваш запрос более конкретно, а то тут возникают разночтения в понимании того что вы хотели спросить. Итак, как я понял возможно 2 варианта:
1. Вам необходимо повесить очень много обычных тактовых кнопок, тогда вам в помощь регистры 74HC165, 74HC166, расширители портов ввода-вывода: TCA9XXX, PCA9XXX. Например 16-ти битный расширитель портов ввода-вывода PCA9555.
2. Вам нужно именно подключить большое количество сенсорных кнопок, ну тогда можно использовать специализированные микросхемы, типа AT42QT2160 или построить контроллер сенсорных кнопок например на ATTINY2313A, в принципе можно реализовать на нем контроллер на 8 кнопок (понятно 20 выводов минус 2 питания, минус 2 кварц, минус 1 резет, минус как минимум 2 для интерфейса связи, минус 3-4 для задания адреса (если данный контроллер будет не один)). Можно использовать другие контроллеры, с большим количеством выводов, например в ATMEGA328 - 23 пина PCINT, из них минус 1 на резет, минус 2 на кварц, минус 2 на интерфейс связи, минус 2 на задания адреса - итого контроллер на 16 сенсорных кнопок.
Спасибо за ответы.
Уважаемый, Alex_Ferrum, я имел в виду именно сенсорные кнопки и надеялся, что обычные сдиговые регистры 74hc565 или подобные им смогут оказаться полезными. Судя по ответам, нет, поэтому, видимо, придется пересмотреть планы, потому что цена отдельной микросхемы для кнопок, а также контроллера, повысит себестоимость проекта.
я делал так на hc165 регистрах кнопки
#define NUMBER_OF_SHIFT_CHIPS 1 // количество регистров #define DATA_WIDTH NUMBER_OF_SHIFT_CHIPS * 8 // количество входов #define PULSE_WIDTH_USEC 5 // задержка при считывании данных // для хранения считаных байт // если регистров больше двух, то int меняется на long #define BYTES_VAL_T unsigned int // пины для подключения регистра int ploadPin = 8;//shift load selector int clockEnablePin = 9; int dataPin = 11;//data GREEN int clockPin = 12;//clock BYTES_VAL_T pinValues; // текущее значение пинов BYTES_VAL_T oldPinValues; // предыдущее значение пинов // функция для считывания пинов BYTES_VAL_T read_shift_regs() { long bitVal; BYTES_VAL_T bytesVal = 0; // опрашиваем регистр о состоянии пинов digitalWrite(clockEnablePin, HIGH); digitalWrite(ploadPin, LOW); delayMicroseconds(PULSE_WIDTH_USEC); digitalWrite(ploadPin, HIGH); digitalWrite(clockEnablePin, LOW); // считываем полученные данные о пинах for(int i = 0; i < DATA_WIDTH; i++){ bitVal = digitalRead(dataPin); bytesVal |= (bitVal << ((DATA_WIDTH-1) - i)); digitalWrite(clockPin, HIGH); delayMicroseconds(PULSE_WIDTH_USEC); digitalWrite(clockPin, LOW); } // возвращяем результат опроса регистра return(bytesVal); } // функция для вывода состояния пинов void display_pin_values(){ // перебор всех пинов for(int i = 0; i < DATA_WIDTH; i++){ Serial.print(" Button-"); Serial.print(i); Serial.print(": "); if((pinValues >> i) & 1){ Serial.print("ON"); }else{ Serial.print("OFF"); } Serial.println(); } Serial.println(); } void setup(){ // для вывода данных в монитор порта Serial.begin(115200); // установка режима работа пинов pinMode(ploadPin, OUTPUT); pinMode(clockEnablePin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, INPUT); digitalWrite(clockPin, LOW); digitalWrite(ploadPin, HIGH); // ***************************************************************** // считываем значения с пинов pinValues = read_shift_regs(); // выводим результат display_pin_values(); // сохраняем текущее значение oldPinValues = pinValues; } void loop(){ // считываем значения с пинов pinValues = read_shift_regs(); // если значения изменились, то выводим их if(pinValues != oldPinValues){ // выводим результат в монитор порта display_pin_values(); // сохраняем текущее значение oldPinValues = pinValues; } delay(5); }результат выйдет так
Button-0: OFF
Button-1: OFF
Так уберите вывод тех которые выключены. Сдается мне , что не вы этоткод "сделали"
я делал так
Делал или копипастил? У того, кто делал такого вопроса возникнуть не должно.