Позабыты хлопоты,
Остановлен бег,
Вкалывают роботы,
Счастлив человек
Как известно, человеку сложно тягаться с роботом.
Впрочем, несложная программируемая сенсорная клавиатура SrachMaster позволит Вам успешно сдерживать натиск превосходящих информационных сил.
Теперь и с USB-C!
Плат Arduino на рынке сейчас есть много и разных:
От пришиваемой на одежду Lilypad до монструозной Mega 2560, на микроконтроллерах от AVR ATMega8 до ARM Cortex-M3 SAM3U4E, ESP8266 и ATSAMD21E18.
Несколько выделяются из этого ряда Arduino Leonardo.
Они не могут похвастаться необъятной памятью или количеством линий расширения, но отличительная особенность их микроконтроллера ATMega32U4 — аппаратная реализация USB-HID, позволяющая без лишних сложностей
изобретать велосипеды строить клавиатуры, мышки и что Вам там ещё из устройств ввода придёт в голову.
Итак, плата пришла в запаянном антистатическом пакете:
Внутри плата и пара контактных гребёнок с шагом 2,54 мм.
Размер платы 37х18 мм без учёта выступающего разъёма USB-C.
На верхней стороне текстолита распаяны микроконтроллер с базовой обвязкой, стабилизатор на 5В и кварцевый резонатор на 16 МГц.
На нижней стороне текстолита деталей нет:
Принципиальная схема платы:
Функции выводов:
Ну а теперь переходим к практической части.
В своих запасах я нашёл вот такой сенсорный дисплей от панели управления МФУ:
Непосредственно дисплейная часть практической пользы уже не представляет — разрешение матрицы хоть и 640х480, но это CSTN с адовым временем отклика, под который найти готовую плату управления практически нереально, а делать самому на основе ПЛИС бессмысленно. Поэтому ограничимся тем, что отклеим от неё тачскрин:
Он тут резистивный с 4-проводным подключением, представляет собой стекло, на которое наложен многослойный пакет плёнок:
При нажатии они превращаются в набор из четырех резисторов, абсолютные величины которых зависят от расположения точки нажатия:
Обработку нажатий можно выполнять любым микроконтроллером, в котором есть входной АЦП.
Схема программируемой клавиатуры несложна и состоит буквально из 3-4 деталей:
Кроме Arduino и тачскрина нам понадобятся пьезодинамик-пищалка для озвучивания нажатий и желательно разъём для подключения тачскрина — его шлейф обычно плохо переносит пайку. Разъём можно добыть, например, на плате от струйного принтера:
Выпаиваем его из платы:
И припаиваем к Arduino:
Как узнать распиновку тачскрина по расположению электродов:
Прототип программируемой сенсорной клавиатуры в сборе:
Осталось прошить.
Скетч для Arduino и дополнительные библиотеки
// Резистивная сенсорная панель в качестве USB Macro Keypad
// программируемая клавиатура для горячих клавиш
// Свободно программируемая USB-клавиатура для макросов
// Arduino Leonardo Micro + сенсорная панель
// Поддержка английского и русского языков
// Страница проекта: http://esp8266-server.de/keypadRU.html
// Автор: Михаил Дворкин
// формат команд: "§"- Начало команды, Команда, Партаметр, пробел -Конец команды (Пример "слово1§t1000 цслово2" эта команда означает жди 1 секунду )
// §p - Press "§p0x80 " нажать Strg
// §r - Release "§r0x80 " отпустить Strg
// §a - Release All "§a " отпустить все нажатые клавиши
// §w - Write "§w0xB0 " напечатать ввод (enter)
// §t - Timer "§t3000 " 3 секунды ждать
// §l - Sprache "§l0 " переключит на 0-английский 1-русский
// Скан-коды смотрите здесь
// https://github.com/MichaelDworkin/KeyboardMultiLanguage/blob/master/src/KeyboardMultiLanguage.h
#include <stdint.h>
#include <EEPROM.h>
#include "TouchScreen.h"
#include <KeyboardMultiLanguage.h>
#include "KeyboardMappingRU.h" // Таблица русской раскладки
// ------------------- Распиновка тачскрина ----------------
#define X1 A1
#define X2 A3
#define Y1 A0
#define Y2 A2
/*
#define Y1 A1
#define Y2 A3
#define X1 A0
#define X2 A2
*/
#define PIEZO_PIN 3 // номер ножки с Пьезо
int kalibriere = 0;
boolean losgelassen = 1;
int KalibrWert[4];
// ----------------- Здесь задаётся количество столбцов и строк -----------------
#define Reihen 3 // строк
#define Spalten 4 // столбцов
// ----------------- Команды и тексты, присвоенны соответствующей ячейке -------------------
// ----------------- Двумерный массив соответствует таблице клавиш ----------------------
// открытие скайпа, поиск абонента, видеовызов
//#define skype "§p0x87 r§r0x87 §t100 \"C:\\Program Files (x86)\\Microsoft\\Skype for Desktop\\Skype.exe\"\n§t3000 §p0x80 §p0x81 s§t500 §a §t500 echo§t3000 §w0xD9 \n§p0x80 §p0x81 k§a "
// открытие ардуино, открытие пследнего проекта, закрытие пустого окна
//#define arduino "§p0x87 r§r0x87 §t100 \"C:\\arduino-1.8.8\\arduino.exe\"\n§t12000 §w0x82 §t100 §w0xD9 §t100 §w0xD9 §t100 §w0xD9 §t100 §w0xD7 §t100 §w0xB0 §t500 §p0x82 §t100 §w0xb3 §t100 §r0x82 §p0x82 §p0xc5 §a "
const String data[Reihen][Spalten] =
{
{ "String1\n", "String2\n", "String3\n", "String4\n"},
{ "String5\n", "String6\n", "String7\n", "String8\n" },
{ "String9\n", "String10\n", "String11\n", "String12\n"},
};
/*
const String data[Reihen][Spalten]
{
{ "1", "2", "3", "A" },
{ "4", "5", "6", "B" },
{ "7", "8", "9", "C"},
};
*/
// Для лучшей точности нам нужно знать сопротивление тачскрина
// между электродами Х1 и Х2. Замерьте его мультиметром.
// У использованного - примерно 700 Ом.
TouchScreen ts = TouchScreen(X1, Y1, X2, Y2, 700);
// ---------------- преобразование HEX String в Integer -----------------------
unsigned int hexToDec(String hexString)
{
unsigned int decValue = 0;
int nextInt;
hexString.toUpperCase();
for (int i = 0; i < hexString.length(); i++)
{
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
// ---------------- Setup ------------------------------------------
void setup(void)
{
Serial.begin(115200);
pinMode(PIEZO_PIN, OUTPUT);
Keyboard.language(Russian); // выбор языка /раскладки
delay(1000);
EEPROM.get( 0 , KalibrWert ); // считываем из памяти значения калибровки сенсорной панельи
if (KalibrWert[0] >= KalibrWert[1] || KalibrWert[2] >= KalibrWert[3]) // если дурацкие значения
{
KalibrWert[0] = 0; // то загружаем значения по умолчанию
KalibrWert[1] = 1000;
KalibrWert[2] = 0;
KalibrWert[3] = 1000;
}
}
// ---------- Вывод текста через HID-клавиатуру и выполнение команд -----
void KeyOutput(const String str)
{
int pos = str.indexOf('§'); // находим начало первой команды
while (pos >= 0)
{
if (pos > 0) Keyboard.print(str.substring(0, pos - 1)); // выводим текст до команды и между командами
str.remove(0, pos + 1);
char kode = str.charAt(0); // выделяем команды
pos = str.indexOf(' ');
String Daten = str.substring(1, pos); // выделяем параметр
byte z;
switch (kode) // команды
{
case 'w':
z = hexToDec(Daten);
Keyboard.write(z);
break;
case 't':
delay(Daten.toInt());
break;
case 'p':
z = hexToDec(Daten);
Keyboard.press(z);
break;
case 'r':
z = hexToDec(Daten);
Keyboard.release(z);
break;
case 'a':
Keyboard.releaseAll();
break;
case 'l':
if (Daten == "1") Keyboard.language(Russian);
else Keyboard.language();
break;
}
str.remove(0, pos + 1);
pos = str.indexOf('§'); // находим начало следующей команды
}
if (str.length() > 0)Keyboard.print(str); // выводим текст после команды
}
void loop(void) {
TSPoint p = ts.getPoint(); // a point object holds x y and z coordinates
// we have some minimum pressure we consider 'valid'
if (p.z < ts.pressureThreshhold) losgelassen = 1; // запоминаем отпускание сенсора
if (p.z > ts.pressureThreshhold && losgelassen) // если нажато а раньше было отпущено то
{
int x = map( p.x, KalibrWert[0], KalibrWert[1], 0, Spalten); // вычесляем столбец
int y = map( p.y, KalibrWert[2], KalibrWert[3], 0, Reihen); // вычесляем строку
if (y < Reihen && x < Spalten)
{
digitalWrite(PIEZO_PIN, !digitalRead(PIEZO_PIN)); // издаём щелчок
if (!kalibriere) KeyOutput(data[y][x]); // если не в модусе отладки то печатаем данные
}
else Serial.print(F("номер строки или столбца вне массива данных!"));
losgelassen = 0; // сенсор до сих пор нажат
delay(300);
switch (kalibriere) // контроль выбора калибровки и отладки
{
case 1:
kalibriere = 2;
KalibrWert[0] = p.x; // x min
KalibrWert[2] = p.y; // y min
delay(1000);
Serial.println(F("А теперь в нижнем правом углу\n"));
break;
case 2:
kalibriere = 0;
Serial.println("");
KalibrWert[1] = p.x; // x max
KalibrWert[3] = p.y; // y max
delay(1000);
Serial.println(F("калибровка окончина"));
EEPROM.put( 0, KalibrWert);
Serial.println(F("X Min \tX Max \tY Min \tY Max"));
Serial.print(String(KalibrWert[0]) + "\t");
Serial.print(String(KalibrWert[1]) + "\t");
Serial.print(String(KalibrWert[2]) + "\t");
Serial.println(String(KalibrWert[3]) + "\t");
delay(1000);
break;
case 3:
Serial.println(F("значения аналого-цифрового преобразователя:"));
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.println(F(" "));
Serial.println(F("откалиброванные и пересчитанные в таблицу значения:"));
Serial.print("X = ");
Serial.print(x);
Serial.print("\tY = ");
Serial.println(y);
Serial.println(" ");
break;
}
}
// 2 команды через последовательный терминал
// символ "k" - калибровка
// символ "r" - показывает абсолютные значения положения и значения сетки
if (Serial.available()) // Когда ввод сделан
{
char Wahl = Serial.read(); // Получить введенный знак
Serial.flush();
Serial.println(Wahl);
switch (Wahl) // контроль выбора
{
case 'k': // старт калибровки
kalibriere = 1;
Serial.println(F("калибровка"));
Serial.println(F("Нажмите:"));
Serial.println(F("В верхнем левом углу\n"));
break;
case 'r': // старт вывода отладочной информации
if (!kalibriere)
{
kalibriere = 3;
Serial.println(F("Значения положения и значения сетки"));
Serial.println(F("чтобы вернутся нажмите \"r\""));
}
else
{
kalibriere = 0;
Serial.println(F("USB-Клавиатура снова включина"));
}
break;
}
}
}
Для прошивки нам понадобятся также
эта и
эта библиотеки.
В приведённом виде скетч использует 14144 байт из всего доступных 28672 байт. Ещё 14528 байт остаются свободными для подлежащих отправке строк и команд. По умолчанию количество строк и столбцов тап-зон составляет 3 и 4 соответственно, но может быть скорректировано.
После прошивки устройство требует калибровки. В Arduino IDE запускаем монитор порта, к которому подключена плата, и отправляем ей символ «k».
Нас попросят нажать в левый верхний угол тачскрина, потом в правый нижний, после чего полученные значения будут сохранены в EEPROM и на этом калибровка будет завершена.
Расположение тап-зон по умолчанию:
А если серьёзно, то помимо автоматизации постинга сообщений в чатах и на форумах устройство может, к примеру хранить логины, пароли и любые клавиатурные макросы для их ввода одним нажатием.
А ещё экран с адовым временем отклика можно было использовать для вывода надписей на кнопках и их смены во время работы.
А ещё емкостный тачскрин можно поставить, будет ещё лучше.
У емкостного линий больше, но все они также идут к контроллеру. Он часто распаян прямо на шлейфе. А дальше те же spi/i2c.
Так что да, также.
Резистивный тач, это может быть так же отдельная микросхема тоже обычно SPI и прерывание, но можно и совсем дешево, подключая через аналоговые входы программно изменять координаты.
Поэтому как итог, емкостной тач подключается как и резистивный если это не программная реализация через АЦП у резистивного.
Минимальный размер — чуть больше пальца (из опыта — 3,2'' четко делятся на 3х4, на 4х5 уже ложные срабатывания появляются
Особенно пригодится там, где пароль нельзя ctrl+v, например в камерах Hikvision.
Вот можно было бы через комп быстренько кнопки переназначать, вообще цены небыло бы.
Ну или держать на компе Arduino IDE и пачку скетчей с разными командами и зашивать нужную.
Или использовать microSD, вставил в комп, переписал пресеты, вставил в esp32/arduino и используеш.
Если когда-нибудь мне будет прям вообще нефиг делать и я выполню предыдущие 27 пунктов из списка «сделать, когда совсем будет нефиг делать», то займусь реализацией этого проекта.
Если есть USB сканер штрихкодов — то штрихкода с нужным содержимым и сканируй на здоровье.
Всё на бумаге :)
Либо идете на али и ищете Macro pad, +-1к рублей, никакого колхоза, и у вас на руках удобный и рабочий пад с кучей кнопок. Бонусом идут сьемные кейкапы, можете сделать гравировку со своими макросами, купить кейкапы с отсеком для бумажек ( напечатаете туда красивые картинки), или пойти во все тяжкие и покупать кастомные кнопки, либо печатать на 3д принтере.
Если денег не жалко то есть elgato stream deck, советую сразу идти на авито, мамкины стримеры любят набрать девайсов, и потом ничего не сделав, продавать все за копейки, девайс со скрина на авито от 10к но предлагают торг.
Каждая кнопка имеет маленький экран, можно выводить что угодно, хоть картинку, хоть гифку, хоть мониторинг температуры процессора.
github.com/imchipwood/dumbpad/tree/master/combo
получается что пароль вроде и на виду, но не так то и просто подобрать.
А с фиксированным набором String1, String2… — проще и надёжнее поставить 12 кнопок. Или больше. Любой конструкции. И расположить их удобнее чем сетка 3х4 (если надо).
Хотя тач с бумажкой под ним — конечно «стильно, модно, молодёжно».
Вот пример реализации управления CSTN матрицей на FPGA. Стоимость решения выходит порядка 450 долларов — извините, за эти деньги можно 5К дисплей 27" собрать. Было. Дополнительная клавиатура падонка
www.buydisplay.com/tft-display/arduino-tft-display?diagonal_size=287
Сложно да, это не типичный для ардуино уровень. Вот и вся проблема.
«resistive touch screen 8 inch» на aliexpress. Сразу находится.
Или на том же buydisplay, правда, ёмкостные, но контроллер на шлейфе уже есть.
И сборки дисплейные тоже там есть.
Хочу купить 7 дюймовый экран для Андуина на пробу.
Написал сегодня им запрос, посмотрим, что ответят…
Помимо PayPal там есть Western Union и Wire (как я понял, это SWIFT).
Судя по поиску, есть банки, выполняющие эти переводы к Китай.
Реквизиты для оплаты показываются при выборе способа Wire Transfer на сайте BuyDisplay.
RMB — Renminbi — официальное название китайской валюты.
1 Жэньминьби равно == 8,81 Российский рубль.
Спасибо за помощь.
Но согласен, тогда результат вывалится из зоны «поделка выходного дня из спичек и желудей за три копейки»…
Но у вас был ненужный тач, если его покупать то тоже поделка становится нецелесообразной.
За три копейки — блок кнопок (или плёночная клавиатура, 4х4 40 руб).
https://aliexpress.ru/item/item/32576928627.html
https://aliexpress.ru/item/item/1005002283752470.html
https://aliexpress.ru/item/item/4001252034370.html
Но они работают с PayPal. PayPal в России не работает.
ЧИП феррит + супрессор (NUP4201MR6, например). Иначе это будет работать до первого шерстяного свитера, увы.
про софтовый усб уже сказано. Если оно заработало — это исключение, а не правило.
У attiny вроде тоже такое есть.
Нужно 4 незанятых аналоговых входа.
На attiny88 вроде можно сделать.
esp8266-server.de/keypadRU.html
Она не сложнее.
Если сравнивать написание кода самостоятельно, то с ёмкостным проще, там контроллер берёт на себя больше работы. Настроил, ждёшь прерывания, пришло — считал координаты.
Если же «уметь» пользоваться лишь готовым кодом, то от везения зависит.
нет, др… о ради того, чтобы показать всем- «могу!»- это да.
чем это лучше мышки или обычной клавиатуры?
опять же, выше уже сказали за макросы, есть программульки для ОС, которым назначаешь на клавиши соответствующие функции.
Можно же и зубилом выбить… ;)
Комбинации ОС помнятся в голове.
Также помнится что навешано на дополнительные клавиши.
зы. Потуги на юмор я вижу- юмора не вижу.
кстати, были исследования многолетние- те, кто не только получал физическую нагрузку (умеренную) в течении жизни, но и имел хорошую умственную нагрузку- жили дольше, а так же меньше были подвержены старческим болезням типа деменции.
И только желудок лучше почаще держать в праздности. ;) :))
Главное достоинство такого девайса в том, что он работает без установки каких бы то ни было программ на ПК. Ну и не требует бэкапа того, что там на кнопки понавешено перед переустановкой ОС.
Вопрос появился, если кто в курсе, разъём этот на плате разведён как обычный USB на GND, VCC и D±, или там что хитрее?
Я хочу на базе такой Type C ардуины собрать клавиатуру с подсветкой, и пока детали едут, прикидвваю, от чего подсветку питать. Была мысль просто к GND и VCC припаяться на разъёме и в ус не дуть, но судя по фото, у разъёма куча контактов с волос толщиной и припаяться, не закоротив остальные у меня может не хватить сноровки.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.