Можно ли подключить кнопки с помощью сдвигового регистра?

avex
Offline
Зарегистрирован: 11.03.2017

В ардуине после подключения всего обвеса остаётся мало свободных пинов, а требуется добавить ещё пару десятков сенсорных кнопок. Будут ли полезны сдвиговые регистры? 

avex
Offline
Зарегистрирован: 11.03.2017

И в догонку. У сенсорных кнопок такие же паразитные токи, как и у обычных? То есть, нужно ли их прижимать резисторами?

JasKo
Offline
Зарегистрирован: 21.11.2015

pcf8574 вам в помощь

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

avex пишет:

Будут ли полезны сдвиговые регистры? 

А чё? Гугл тоже заблокировали? Я думал только яндекс.

Вот как раз про кнопки на сдвиговом регистре - http://robocraft.ru/blog/arduino/520.html

GarryC
Offline
Зарегистрирован: 08.08.2016

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

Или Вы под сенсорками понимаете не емкостные кнопки?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А, да, виноват, был невнимателен.

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

Уважаемый 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 сенсорных кнопок.

avex
Offline
Зарегистрирован: 11.03.2017

Спасибо за ответы.

Уважаемый, Alex_Ferrum, я имел в виду именно сенсорные кнопки и надеялся, что обычные сдиговые регистры 74hc565 или подобные им смогут оказаться полезными.  Судя по ответам, нет, поэтому, видимо, придется пересмотреть планы, потому что цена отдельной микросхемы для кнопок, а также контроллера, повысит себестоимость проекта. 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

я делал так на 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

  Button-2: OFF
  Button-3: OFF
  Button-4: OFF
  Button-5: OFF
  Button-6: OFF
  Button-7: OFF
 
  Button-0: ON
  Button-1: OFF
  Button-2: OFF
  Button-3: OFF
  Button-4: OFF
  Button-5: OFF
  Button-6: OFF
  Button-7: OFF
 
  Button-0: OFF
  Button-1: OFF
  Button-2: OFF
  Button-3: OFF
  Button-4: OFF
  Button-5: OFF
  Button-6: OFF
  Button-7: OFF
 

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Так уберите вывод тех которые выключены. Сдается мне , что не вы этоткод "сделали"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MYFRIEND пишет:

я делал так

Делал или копипастил? У того, кто делал такого вопроса возникнуть не должно.