Получение сигнала с матричной клавиатуры для управление серводвигателем

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Борис144, 28 мар 2016.

  1. Борис144

    Борис144 Нуб

    Друзья, нашел скетч для опрашивания матричной клавиатуры 3*4. Вопрос вот в чем: не получается получить сигнал, который формируется при нажатии какой то клавиши, для управления серводвигателем. Иными словами, при нажатии клавиши и ее удержания вал серводвигателя поворачивается на определенный угол. Вот как этот сигнал с клавиатуры связать с поворотом сервы?
    [​IMG]
    int PinOut[4] {5, 4, 3, 2}; // пины выходы

    int PinIn[4] {9, 8, 7, 6}; // пины входа
    int val = 0;
    const char value[4][4]


    { {'1', '4', '7', '*'},
    {'2', '5', '8', '0' },
    {'3', '6', '9', '#'},
    {'A', 'B', 'C', 'D'}
    };
    // двойной массив, обозначающий кнопку

    int b = 0; // переменная, куда кладется число из массива(номер кнопки)

    void setup()
    {
    pinMode (2, OUTPUT); // инициализируем порты на выход (подают нули на столбцы)
    pinMode (3, OUTPUT);
    pinMode (4, OUTPUT);
    pinMode (5, OUTPUT);

    pinMode (6, INPUT); // инициализируем порты на вход с подтяжкой к плюсу (принимают нули на строках)
    digitalWrite(6, HIGH);
    pinMode (7, INPUT);
    digitalWrite(7, HIGH);
    pinMode (8, INPUT);
    digitalWrite(8, HIGH);
    pinMode (9, INPUT);
    digitalWrite(9, HIGH);

    Serial.begin(9600); // открываем Serial порт
    }

    void matrix () // создаем функцию для чтения кнопок
    {
    for (int i = 1; i <= 4; i++) // цикл, передающий 0 по всем столбцам
    {
    digitalWrite(PinOut[i - 1], LOW); // если i меньше 4 , то отправляем 0 на ножку
    for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам
    {
    if (digitalRead(PinIn[j - 1]) == LOW) // если один из указанных портов входа равен 0, то..
    {
    Serial.println( value[i - 1][j - 1]); // то b равно значению из двойного массива
    delay(175);
    }
    }
    digitalWrite(PinOut[i - 1], HIGH); // подаём обратно высокий уровень
    }
    }

    void loop()
    {
    matrix(); // используем функцию опроса матричной клавиатуры

    }

    Ссылка: http://robots4life.ru/arduino-keypad
     
  2. Прежде чем это дальше пробовать ответьте на вопрос, что произойдет при одновременном нажатии двух кнопок в одном ряду?
     
  3. Борис144

    Борис144 Нуб

    При использовании данного скетча ничего не произойдет. Опрос кнопок происходит путем подачи напряжения на один из входов и поиска напряжения на трех выходах. upload_2016-3-28_19-53-22.png
     
  4. Произойдет. Четыре пина - выходы, на трех высокий уровень, на одном - низкий и нажимая кнопки их можно соединить.
     
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    Да пофиг, пусть развлекаются... ;)
    1.jpg
     
  6. Борис144

    Борис144 Нуб

    Друзья, начал использовать библиотеку Keypad. Стандартная функция считывания данных getKey()
    показывает была ли нажата та или иная клавиша, поэтому удержание клавиши ни к чему не приводят. Подскажите, какую функцию использовать, чтобы можно было фиксировать удержание клавиши. На сайте с этой библиотекой приводятся разные функции, но как их записывать в код не понятно. В результате попыток одни ошибки.

    http://playground.arduino.cc/code/Keypad
     
  7. Limoney

    Limoney Гик

    Считываете код нажатой клавиши.
    Отсчитываете нужное время удержания клавиши.
    Снова считываете код нажатой клавиши,
    если предыдущий код клавиши равняется коду нажатой клавиши - значит клавиша еще нажата.
     
  8. Борис144

    Борис144 Нуб

    смотрите в чем дело:

    #include <Keypad.h>
    const byte ROWS = 4;
    const byte COLS = 3;
    char keys[ROWS][COLS] = {
    {'1','2','3'},

    {'4','5','6'},

    {'7','8','9'},

    {'#','0','*'}
    };

    byte rowPins[ROWS] = {19, 18, 17, 16};
    byte colPins[COLS] = {15, 14, 13};
    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

    void setup()

    {
    Serial.begin(9600);
    }


    void loop()

    {

    char key = keypad.getKey();


    if (key != NO_KEY){

    Serial.println(key);

    }

    Выделенным цветом показана функция, которая считывает значения. Грубо говоря в единичном порядке, т.е. если один раз нажал на клавишу, то на экране будет только одно значение. Как раз требуется получение непрерывных сигналов при удержании клавиш.
     

    Вложения:

  9. Борис144

    Борис144 Нуб

    По всей видимости за постоянное получение сигналов при удержании отвечает функция
    KeyState getState().
     
  10. Борис144

    Борис144 Нуб

    Не могу понять синтаксис, т.е. как прописать ее в скетч.
     
  11. Борис144

    Борис144 Нуб

    Для управления серводвигателем нужен непрерывный сигнал. На мой взгляд отчет времени ничего не даст ,так как сигнал единичный при использовании функции getKey().