Здравствуйте, гость ( Вход | Регистрация )

8 страниц V  1 2 3 > »   
Ответить в эту темуОткрыть новую тему
> Pilot + Arduino (Hardware clicker)
yamenko
сообщение 7.3.2020, 19:21
Сообщение #1


***

Novice
Сообщений: 79
Регистрация: 19.8.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 16.974
Возраст: 29



Добрый день.
Хочу представить вам аппаратный кликер на базе UOpilot.
Для начала вам необходима будет плата Arduino micro (Arduino Leonardo) обязательно с чипом Atmega 32u4. Другие не подойдут, так как не определяются системой как HID устройство, и придется долго настраивать аппаратную и программную составляющую.
Можете выбрать следующие:
(IMG:https://i.ibb.co/5GRGCDW/2020-03-07-18-38-55.png)(IMG:https://i.ibb.co/P1DgmDt/2020-03-07-18-40-05.png)
Как только вы заполучили свою новую плату, скачиваем и устанавливаем последнюю версию Arduino IDE с офф. сайта Arduino.cc
(IMG:https://i.ibb.co/HVM0nBK/2020-03-07-18-37-38.png)
Пробуем подключить, она должна у вас определится в устройствах как Mikro или Leonardo.
(IMG:https://i.ibb.co/SRnMV1S/2020-03-07-18-44-57.png)
Если не появляется, тогда устанавливаем драйвера, для не оригинальных плат с алиэкспресс нужен спец драйвер CH340 (ch341ser), пробуйте с разных сайтов, даже с одинаковым названием, они почему-то разные.
Вот тут можно посмотреть драйвер
Запоминаем СОМ порт!
Открываем Arduino IDE
Настраиваем нашу плату:
(IMG:https://i.ibb.co/4dj9RvK/2020-03-07-18-47-26.png)(IMG:https://i.ibb.co/YbXd4MS/2020-03-07-18-48-38.png)
Закидываем скретч отсюда: https://forum.uokit.com/index.php?s=&sh...st&p=436373
устаревший скетч с ошибкой. Используйте скетч из ссылки выше.
Код
#include <Keyboard.h>
int i = 0;
int trigerKey = 0;
int lengthStr = 0;
int key[20];
int tmDelayValue;
String tmDelayStr;

void setup() {
  Serial.begin(9600);
  Keyboard.begin();
}

void loop() {
  // Собираем информацию из порта
  while (Serial.available()) {
    key[i++] = Serial.read();
    delay(5);
  }
  // Триггер, что данные пришли
  if (i != 0 && lengthStr == 0){
    lengthStr = i;
    i = 0;
  }
  
  if (lengthStr != 0){
    
    for (i = 0; i <= lengthStr; i++){
      delay(5);
//Находим задержку с которой необходимо нажимать кнопки
      if (trigerKey == 0){
        if (key[i] == 124){
          tmDelayValue = tmDelayStr.toInt();
          trigerKey = 1;
          i++;
        }
        else {
          tmDelayStr += char (key[i]);
        }
      }

//Находим и нажимаем спец кнопки если необходимо
      if (trigerKey == 1){
        if (key[i] == 94){Keyboard.press(KEY_LEFT_CTRL);}    //94 - символ "^"
        if (key[i] == 64){Keyboard.press(KEY_LEFT_ALT);}     //64 - символ "@"
        if (key[i] == 126){Keyboard.press(KEY_LEFT_SHIFT);}  //126 - символ "~"
        if (key[i] == 124){trigerKey = 2; i++;}              //124 - символ "|"
      }

//Нажимаем по очереди остальные кнопки с задержкой
      if (trigerKey == 2){
        delay(tmDelayValue);
        Keyboard.print(char (key[i]));
      }
    }
// Сбрасываем все
    Keyboard.releaseAll();
    i = 0;
    trigerKey = 0;
    lengthStr = 0;
    tmDelayStr = "";
  }
}

заливаем его в плату.
(IMG:https://i.ibb.co/W50GRnL/2020-03-07-18-50-19.png)
Должно написать «Загрузка завершена»

Теперь переходим в Пилот
Добавляем функцию
Код
--lua
local function sendKey (symbol)
    file = io.open("COM7","w")  --меняем только номер COM порта, остальное не трогаем
    file:write(symbol)
    file:close()
end

Пользоваться так: sendKey ("1000|^|axv")
пишем в кавычках
1. До первой вертикальной черты это задержка между каждым нажатием кнопок в мс.
2. После первой черты и до второй это спец символы (~@^, такие как настроены в Пилоте, другие не используйте так как ничего все равно работать не будет), если символы не нужны просто удалите их, 2 вертикальные черты обязательны!!!
3. Набор символов которые необходимо нажать (каждая кнопка будет нажиматься через заданный интервал), русские символы не работают!!!
PS в данном примере CTRL+a, CTRL+x, CTRL+v, это чтобы вы могли проверить правильно ли работает или нет.

Сообщение отредактировал DarkMaster - 9.12.2020, 15:34
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 8.3.2020, 11:50
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Прикрепленный файл  arduino.zip ( 7,07 килобайт ) Кол-во скачиваний: 800

Начало

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

Пилот версии 2.41 или выше. Запускать от администратора.
Извлечь архив, файл arduino.lua закинуть в папку, где находится exe пилота. Скетч загрузить в ардуино.
Для работы функций мыши нужно в настройках мыши снять галочку 'Включить повышенную точность установки указателя'.
В функцию get_port (2341, 8036) нужно передавать vid и pid ардуино. Узнать их можно в Arduino IDE, пункт меню 'Инструменты', 'Получить информацию о плате'.
При переполнении буфера, хотя такого не должно быть, 3 секунды будет гореть встроенный светодиод L. В этом случае нужно увеличить паузы между нажатиями клавиш мыши/клавиатуры.
Все координаты в командах мыши указывать абсолютные, т. е. относительно левого верхнего угла экрана.

Список функций

get_port (vid, pid) -- узнать в каком com порте находится ардуино

set_delay_key (ms) -- установить задержку нажатий клавиатуры
set_delay_mouse (ms) -- установить задержку нажатий мыши
set_delay_mousemove(ms) -- установить паузу в мсек между каждым шагом перемещения курсора, чем меньше, тем быстрее перемещается курсор
set_offset_mousemove(step) -- шаг перемещения курсора от 1 до 127, чем больше, тем быстрее перемещается курсор.
set_random_delay_key(random) -- рандом от 0 до 9 мсек между нажатием и отпусканием клавиш клавиатуры
set_random_delay_mouse(random) -- рандом от 0 до 4 мсек между нажатием и отпусканием клавиш

key (code) -- нажать клавишу клавиатуры
text (text) -- отослать текст, в том числе русские символы
key_down (code) -- зажать (не отжимая) клавишу клавиатуры
key_up (code) -- отжать клавишу клавиатуры

mouse.move (x, y) -- переместить мышь
mouse.click (x, y, button) -- кликнуть мышью, button должен содержать код клавиши мыши
mouse.left (x, y) -- клик левой кнопкой
mouse.right (x, y) -- клик правой кнопкой
mouse.middle (x, y) -- клик средней кнопкой
mouse.dbl (x, y, button) -- двойной клик, button должен содержать код клавиши мыши
mouse.left_dbl (x, y) -- двойной клик левой кнопкой мыши
mouse.right_dbl (x, y) -- двойной клик правой кнопкой мыши
mouse.middle_dbl (x, y) -- двойной клик средней кнопкой мыши
mouse.down (x, y, button) -- зажать (не отжимая) кнопку мыши, button должен содержать код клавиши мыши
mouse.left_down (x, y) -- зажать (не отжимая) левую кнопку мыши
mouse.right_down (x, y) -- зажать (не отжимая) правую кнопку мыши
mouse.middle_down (x, y) -- зажать (не отжимая) среднюю кнопку мыши
mouse.up (x, y, button) -- отжать кнопку мыши, button должен содержать код клавиши мыши
mouse.left_up (x, y) -- отжать левую кнопку мыши
mouse.right_up (x, y) -- отжать правую кнопку мыши
mouse.middle_up (x, y) -- отжать среднюю кнопку мыши
mouse.drag (x, y, x2, y2) -- зажать левую кнопку мыши в точке x y, переместить в точку x2 y2
mouse.wheel_up (x, y, count) -- прокручивание колёсика мыши вверх, count - насколько щелчков прокрутить
mouse.wheel_down (x, y, count) -- прокручивание колёсика мыши вниз, count - насколько щелчков прокрутить

Список многосимвольных клавиш

mouse_left_button = 1
mouse_right_button = 2
mouse_middle_button = 4

left_ctrl = 0x80
left_shift = 0x81
left_alt = 0x82
left_gui = 0x83
right_ctrl = 0x84
right_shift = 0x85
right_alt = 0x86
right_gui = 0x87
up_arrow = 0xDA
down_arrow = 0xD9
left_arrow = 0xD8
right_arrow = 0xD7
backspace = 0xB2
tab = 0xB3
enter = 0xB0
esc = 0xB1
insert = 0xD1
delete = 0xD4
page_up = 0xD3
page_down = 0xD6
home = 0xD2
["end"] = 0xD5
caps_lock = 0xC1
f1 = 0xC2
f2 = 0xC3
f3 = 0xC4
f4 = 0xC5
f5 = 0xC6
f6 = 0xC7
f7 = 0xC8
f8 = 0xC9
f9 = 0xCA
f10 = 0xCB
f11 = 0xCC
f12 = 0xCD
F1 = 0xC2
F2 = 0xC3
F3 = 0xC4
F4 = 0xC5
F5 = 0xC6
F6 = 0xC7
F7 = 0xC8
F8 = 0xC9
F9 = 0xCA
F10 = 0xCB
F11 = 0xCC
F12 = 0xCD

Пример использования клавиатуры

Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
     end_script ()
end
hw.set_delay_key (20)     -- установить паузу между нажатиями клавиш клавиатуры
hw.set_random_delay_key(10)  -- установить рандом между нажатием и отпускание клавиш
-- т. е. между нажатием и отпусканием клавиши будет пауза от 20 до 29 мсек

wait (3000)    -- пауза 3 секунды чтобы переключиться на нужное окно
hw.key ('k')    -- нажать клавишу 'k'
hw.key (hw.enter)  -- нажать 'Enter'

wait (1000)   -- пауза 1 сек.

hw.key_down ('s')   -- зажать клавишу 's'
wait (3000)         -- пауза 3 сек., при этом клавиша будет зажата
hw.key_up ('s')     -- отпустить клавишу 's'
hw.key (hw.enter)   -- нажать 'Enter'

hw.text ('Hello Привет')  -- напечатать текст
hw.key ('V')    -- нажать Shift+'v'


Пример использования мыши
Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки
     end_script ()
end
hw.set_delay_mouse (20)   -- установить паузу между нажатиями клавиш мыши
hw.set_offset_mousemove(4)  -- шаг перемещения курсора
hw.set_random_delay_mouse(10)  -- установить рандом между нажатиями клавиш мыши
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.

hw.mouse.left (200, 100)      -- клик левой кнопкой мыши в координатах 200, 100
hw.mouse.right (200, 100)     -- клик правой кнопкой мыши
wait (3000)                   -- пауза 3 секунды
hw.mouse.left_dbl (35, 35)    -- двойной клик левой кнопкой мыши
wait (2000)
hw.mouse.left_down (200, 200) -- зажать левую кнопку мыши
wait(500)
hw.mouse.left_up (900, 300)   -- отпустить левую кнопку мыши

Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
yamenko
сообщение 8.3.2020, 19:26
Сообщение #3


***

Novice
Сообщений: 79
Регистрация: 19.8.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 16.974
Возраст: 29



Цитата(cirus @ 8.3.2020, 11:50) *

С этой штукой будет нажимать клавиши в обход gameguard, frost и прочих?

Надо так:
Код
file:close()



я не пробовал, по-идее нажимать будет не программа, а аппаратное устройство типа доп клавиатуры и других манипуляторов.
Было бы хорошо если бы кто то мог испытать (IMG:style_emoticons/default/smile.gif)

PS отредактировал...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
AK_sata
сообщение 30.8.2020, 20:13
Сообщение #4


*

Registred
Сообщений: 8
Регистрация: 14.10.2017
Группа: Пользователи
Наличность: 0
Из: GB
Пользователь №: 18.645
Возраст: GB



Прива
вопрос по поводу этого
Как только вы заполучили свою новую плату, скачиваем и устанавливаем последнюю версию Arduino IDE с офф. сайта Arduino.cc
это как делать програматором ?


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.8.2020, 22:02
Сообщение #5


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
это как делать?

Перейти по ссылке https://www.arduino.cc/en/Main/Software и скачать софт.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 19.9.2020, 5:24
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27707
Пользователь №: 11.279



yamenko, памятник вам надо.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Crocotea
сообщение 10.11.2020, 15:32
Сообщение #7


***

Novice
Сообщений: 51
Регистрация: 30.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.787



Купил приблуду, но клики не проходили
Благодаря DarkMaster'у все получилось
В самом компиляторе добавили key[i] и кликер заработал
//Находим задержку с которой необходимо нажимать кнопки
if (trigerKey == 0){
if (key[i] == 124){

Таким образом
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.11.2020, 15:34
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27707
Пользователь №: 11.279



Цитата
В самом компиляторе добавили key[i] и кликер заработал

Ирония в том, что код оказался изначально рабочим, но codebox форума его убил. Сейчас хотел поправить пост, но если я открываю через модерку редактирование поста, то исходник до сих пор корректный без моих правок.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Crocotea
сообщение 10.11.2020, 15:48
Сообщение #9


***

Novice
Сообщений: 51
Регистрация: 30.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.787



при запуске скрипта пилота, после нескольких запусков, начинает вписывать лишние символы. Либо с предыдущей редакции, либо рандомные

Запустил в пилоте sendKey ("11||r")
вывело r

поменял на sendKey ("11||rrr")
вывело rrrr

опять поменял на sendKey ("11||r")
вывело r0r

Также есть один момент. непосредственно в игру sendKey ("11||r") не реагирует. sendKey ("11||rrr") - реагирует, кнопка нажимается

так видео сделал. работает совсем некорректно
[+]
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Crocotea
сообщение 16.11.2020, 9:35
Сообщение #10


***

Novice
Сообщений: 51
Регистрация: 30.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.787



Эх тема совсем никому не интересна((
Подскажите пж, кто может написать корректный код для работоспособности данной программы через аппаратный кликер
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.11.2020, 10:24
Сообщение #11


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27707
Пользователь №: 11.279



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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 16.11.2020, 11:48
Сообщение #12


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20894
Пользователь №: 16.156



Накидал вариант. Насколько рабочий не знаю, не могу собрать за неимением устройства и инструментария.

Развернуть

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[(*curPos)++])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}


// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[(*curPos)++] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
    }
    // пропускаем разделитель
    ++*curPos;
}

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.11.2020, 15:53
Сообщение #13


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27707
Пользователь №: 11.279



Cockney, не будет ли правильным использовать какой-то символ для флага окончания передаваемых данных? Я понимаю, что тут 20 байт(хотя я бы увеличил пока памяти бы хватало, но тут железка нужна), но не может ли получиться ситуация, когда мы получим в буфер только кусок сообщения за попытку сбора данных из порта? Ту да же вопрос о слишком длинных (больше буфера) передачах. По сути это приведет к непредсказуемым последствиям, до выставления задержки диких размеров и переподключения устройства.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 16.11.2020, 16:20
Сообщение #14


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20894
Пользователь №: 16.156



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


А вообще ответ есть в самом вопросе

Цитата
По сути это приведет к непредсказуемым последствиям, до выставления задержки диких размеров и переподключения устройства.


Может тогда и не надо ? Не думаю что строки больше 64 символов часто отправляются в защищенные приложения.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Crocotea
сообщение 17.11.2020, 15:04
Сообщение #15


***

Novice
Сообщений: 51
Регистрация: 30.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.787



Цитата(Cockney @ 16.11.2020, 11:48) *

Накидал вариант. Насколько рабочий не знаю, не могу собрать за неимением устройства и инструментария.

Развернуть

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.release();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[*curPos++])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}
// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[*curPos++] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
    }
    // пропускаем разделитель
    ++curPos;
}




Так результат по парсингу
Пишет ошибку в строчке Keyboard.release(); (скрин приложил)



Эскизы прикрепленных изображений
Прикрепленное изображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 17.11.2020, 15:14
Сообщение #16


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20894
Пользователь №: 16.156



Цитата(Crocotea @ 17.11.2020, 15:04) *

Так результат по парсингу
Пишет ошибку в строчке Keyboard.release(); (скрин приложил)



поправил
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Crocotea
сообщение 17.11.2020, 17:36
Сообщение #17


***

Novice
Сообщений: 51
Регистрация: 30.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.787



Цитата(Cockney @ 17.11.2020, 15:14) *

поправил


Так попробовал и записал видосик
[+]
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 17.11.2020, 18:37
Сообщение #18


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20894
Пользователь №: 16.156



Очередная правка, выношу код сюда, ибо старый пост сломался и не отображает правленый код

Версия №3

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[(*curPos)++])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}


// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[(*curPos)++] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
    }
    // пропускаем разделитель
    ++*curPos;
}

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Crocotea
сообщение 17.11.2020, 18:45
Сообщение #19


***

Novice
Сообщений: 51
Регистрация: 30.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.787



Цитата(Cockney @ 17.11.2020, 18:37) *

Очередная правка, выношу код сюда, ибо старый пост сломался и не отображает правленый код

Версия №3

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[(*curPos)++])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}
// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[(*curPos)++] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
    }
    // пропускаем разделитель
    ++*curPos;
}





кликер реагирует, индикаторы моргают, но реакции ноль. ничего не вводится из скрипта в предыдущем видео
Спустя некоторое время пилот перестает отвечать и вылетает(
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 18.11.2020, 12:50
Сообщение #20


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20894
Пользователь №: 16.156



Версия №4

Код

#include <Keyboard.h>
#include <stdlib.h>

// Максимальный размер буффера
#define MAX_BUFFER_SIZE 20
// Порт
#define SERIAL_PORT 9600
// Задержка считывания с порта
#define SERIAL_READ_DELAY 5
// Задержка нажатия клавиш по умолчанию
#define DEFAULT_SEND_DELAY 0

void setup() {
    Serial.begin(SERIAL_PORT);
    Keyboard.begin();
}

void loop() {
    // буффер под коммандную строку
    char buffer[MAX_BUFFER_SIZE];
    // размер полученного буфера
    int buffSize = 0;
    // текущая позиция в буффере
    int buffPos = 0;
    // задержка нажатия клавиш
    int send_delay_value = DEFAULT_SEND_DELAY;

    // Собираем информацию из порта
    while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {
        buffer[buffSize++] = Serial.read();
        delay(SERIAL_READ_DELAY);
    }

    // если данные пришли
    if (buffSize > 0) {
        // пытаемся сначала выбрать задержку
        send_delay_value = parseSendDelay(&buffPos, buffer, buffSize);
        // разбор и нажатие контрольных клавиш
        sendControlKeys(&buffPos, buffer, buffSize);
        // нажатие клавиш
        while (buffPos < buffSize) {
            delay(send_delay_value);
            Keyboard.print(buffer[buffPos++]);
        };

        // очистка
        Keyboard.releaseAll();
        buffPos = 0;
        buffSize = 0;
    }
}

// парсинг задержки отправки клавиш
int parseSendDelay(int* curPos, char* buff, int buffSize) {
    // идем по полученным данным пока не встретим разделитель
    while (buff[*curPos] != '|') {
        ++*curPos;
    }
    // далее получаем задержку в числовом виде
    // не очень красиво, но должно работать.

    // заменяем | на символ конца строки
    buff[*curPos] = '\0';
    // получаем задержку
    int parsedDelay = atoi(buff);
    // возвращаем если нужно
    //data[*curPos] = '\|';
    
    // пропуск разделителя
    ++*curPos;

    //возврат
    return parsedDelay;
}

// парсинг клавиши
int parseKey(int *curPos, const char *buff, int buffSize) {
    switch (buff[*curPos])
    {
    case '^':
        return KEY_LEFT_CTRL;
    case '@':
        return KEY_LEFT_ALT;
    case '~':
        return KEY_LEFT_SHIFT;
    default:
        return -1;
    }
}


// нажатие контрольных клавиш
void sendControlKeys(int *curPos, const char* buff, int buffSize) {
    // пока не встретили разделитель
    while (buff[*curPos] != '|') {
        // попытка распарсить управляющую клавишу
        int key = parseKey(curPos, buff, buffSize);
        // если успешно
        if (key > 0) {
            Keyboard.press(key);
        }
        // следующий байт
        ++*curPos;
    }
    // пропускаем разделитель
    ++*curPos;
}

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

8 страниц V  1 2 3 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 29.3.2024, 4:22
Designed by Nickostyle