Придумаем однопроводную клавиатуру ?

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Ariadna-on-Line, 18 фев 2024.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Тема для самодельщиков (но не любителей добывать огонь трением - это уже перебор). Придумать "штатную" клавиатурку для Ардуины. Главное чтобы занимало мало информационных пинов. 1-2 пина, в идеале - один. В русском языке 32 буквы. Больше 32 кнопок не надо. На базе АлиЭкспресовских "мембранок" представляется самое то. Две по 4х4 - достаточно. Кто что предложит ? С уважением.
    ПС. Конечно же "примочка" к Ардуине не должна стоить намного дороже самой Ардуины. ))))))
     
    Последнее редактирование: 18 фев 2024
  2. Airbus

    Airbus Радиохулиган Модератор

    Резистивную?
    Код (Text):
    unsigned const short int KEYPAD_PIN = 0;//аналоговый порт для клавиатуры

    void setup() {
      Serial.begin(9600);
      analogReadResolution(10);//все аналоговые значение будут в диапазоне 0...1023
    }

    void loop() {
      Serial.println(getPressedKeypadButton());//выводим номер нажатой кнопки в монитор порта
    }

    short int getPressedKeypadButton(){//считывает нажатия keypad`a
    //возвращает значение от 1 до 16 в зависимости нажатой кнопки или 0 если ничего не нажато
      const int OCCURACY = 5;//ошибка в точности определения значений
      int sensorValue = analogRead(KEYPAD_PIN);//читаем значение с датчика
      int keys[] = {1016, 937, 860, 794, 683, 641, 604, 571, 509, 485, 464, 444, 407, 328, 275, 236};//массив примерных значений для клавиш(0-15, где 0=1, 1=2 и т.д.)
      if(sensorValue > -OCCURACY && sensorValue < OCCURACY){return 0;}//если ничего не нажато, то сразу возвращаем 0
      for(short int i = 0; i < 16; i++){//проверяем в цыкле с каким по номеру элементом массива совпадает значение с датчика
        if(sensorValue > (keys[i] - OCCURACY) && sensorValue < (keys[i] + OCCURACY)){
          return i+1;//возвращаем на один больше, т.к. при проверке у нас 0 считается первой кнопкой, но для удобства 0 будет отсутсвием сигнала
        }
      }
    }
     
  3. parovoZZ

    parovoZZ Гуру

    А зачем? К любому МК с USB подключай клаву и погнали.
     
  4. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не обязательно резистивную. Можно любые элементы. Главное чтоб шаг на выходе был примерно постоянным (для 32-х кнопок !!!), и цена не выпячивалась. Такое сделать на "координатной" матрице - пока не знаю как. Схему не предложите (с номиналами компонентов ессно) ? ))))))
    Вы правы. Но. Очень не любые Ардуины имеют процессоры с USB хост-способностями.
    ПС. Я примерно по вашему маршруту шел, когда подключал стандартные мышь, клаву и принтер к планшету. Работать намного приятнее чем на сенсорном экране.
     
    Последнее редактирование: 18 фев 2024
  5. parovoZZ

    parovoZZ Гуру

    какая-то сила заставляет использовать с USB девайсами МК без USB?

    резистивную и не получится. как только мы заговорим про одновременное нажатие клавиш. Например, шифт, сонтрол и прочее. А нажатый caps или num на такой клаве в принципе не реализуем.
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Всем пардон. Самому смешно как раньше не допёр. Вот простейшее решение. Причем можно организовать генерацию сигнала прерывания, чтоб не опрашивать ее постоянно.
    2. Надо подумать как сделать подобие того что вы написали. Надо выбрать пространство уровней напряжения сигнала, идентифицирующее эти клавиши. Думаю это возможно. Приношу извинения. Тема исчерпана.
    ПС. Если плохо видно - там LM317, включенная в режиме генератора тока (1 мА). Исходное напряжение сигнала (отсутствие нажатий) +5V. Конечно LM317-я - монстр для этой схемы. В реале нужен её маломощный аналог.
     

    Вложения:

    • Клава.png
      Клава.png
      Размер файла:
      10,4 КБ
      Просмотров:
      56
    Последнее редактирование: 19 фев 2024
  7. DetSimen

    DetSimen Гуру

    резистивная с более чем 8 кнопок - полный геморрой. Проще и быстрее 2 PCF8574, одну на столбцы, другую на строки. Ну не 1 провод будет, а два, I2C, некритично (для меня), зато надёжность распознавания будет 146%. В простейшей конфигурации - 64 кнопки, решение масштабируемо.
     
    Asper Daffy и Ariadna-on-Line нравится это.
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Согласен на 147%. Ваша идея- стандартное решение для матричных (координатных) контактов (клавиатур). Тем более что на те же пины можно посадить и I2C LCD модуль. В репозитории Ардуины есть библиотеки клавиатур на PCF. А насчет гемороя - не согласен. Постоянный интервал - упрощает "вычисление" кнопки до 5 тактов. И совершенно не нужно "железо".
    К телеге реактивный двигатель ? ))))))
     
    Последнее редактирование: 19 фев 2024
    DetSimen нравится это.
  9. DetSimen

    DetSimen Гуру

    Нууу... Ты попробуй подать питание от USB, отладить, а потом подать питание, например, от внешнего БП. Все значения кнопок, собранные непосильным трудом, все уедут.
     
    Ariadna-on-Line нравится это.
  10. parovoZZ

    parovoZZ Гуру

    Для таких случаев у АЦП опорник делают с выводом наружу. Как только ты нормируешься через него, эта проблема уйдёт.
     
    Ariadna-on-Line нравится это.
  11. DetSimen

    DetSimen Гуру

    Это если кнопок мало. А если 32, то ХЗ, я не пробовал, у меня и на шести кнопках проблема была (в 1602 KeyShield)
     
    Последнее редактирование: 21 фев 2024
  12. Airbus

    Airbus Радиохулиган Модератор

    Я 10 делал. Но питание хорошее нужно и чтоб не проседало а то начнет клава жить своей жизнью. А вообще не люблю я резистивку. Лучше расширитель портов
     
    DetSimen нравится это.
  13. DetSimen

    DetSimen Гуру

    Дык а я про шо ж.
     
  14. Bott

    Bott Гик

    Дело говоришь!
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ну с гвоздями-то кто угодно храм построит. А ты построй без единого гвоздя !!!
     
    Последнее редактирование: 21 фев 2024
  16. a1000

    a1000 Гуру

    Хочется без гвоздей, переходи на assembler. Там всё ручками......
     
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Речь не о софте, а о харде.
    ПС - Ассемблерить имеет смысл только профессионально. Когда годами выбирать не приходится за зар-плату. Зачем ассемблер самодельщику, который может "играться" с десятком разных МК ? Чтоб поиметь "распухание головы" ?)))
     
    Последнее редактирование: 22 фев 2024
  18. Airbus

    Airbus Радиохулиган Модератор

    Ну видими чтоб впихнуть невпихуемое? В Тини13 например. Или заставить работать МК как нужно кодеру. Но я в этом вопросе сторонник более мощного железа.
     
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Это называется - ситуация, когда "охота пуще неволи". Имеет право быть и никаких возражений.
     
  20. a1000

    a1000 Гуру

    Позволю себе не согласиться. Профессиона́льно и за деньги лучше писать на языках высокого уровня, ибо это быстро и без вникания в нюансы.А вот если "играться" - то это на низком уровне. Как писал DI HALT
    Для поиграться самое оно. А то что вас пугают, якобы программа будет привязана к одному единственному камню, не верьте. Не всё так мрачно. У AVR ядно единое. Меняется только периферия. А так как в адресации I/O регистров давно используются не реальные адреса а мнемонические имена, портация с одного камня на другой не такая уж сложная. Да, надо разобраться с регистрами периферийных устройств. Но тут важно на чём учиться. Мне очень сильно помогли лекции на ютубе. Есть канал "Электротехника и электроника для программистов". Не знаю, как можно не понять после его объяснения.
    И после этого всего вы получите полнейшую свободу. У вас соберётся и запустится любой код, лиш-бы не было синтаксических ошибок в мнемониках команд и правильно указанны аргументы. Играй в полную силу.