Помощь - Поиск - Пользователи - Календарь
Полная версия: Arduino
UoKit.com Форумы > Кликер > UO Pilot > Плагины и доп. ПО
Страницы: 1, 2
cirus
Скетч и модуль lua:    Нажмите для просмотра прикрепленного файлаДрайвер для ардуино: Нажмите для просмотра прикрепленного файла
Arduino позволяет эмулировать нажатия клавиш клавиатуры и мыши, в том числе в приложениях, которые блокируют нажатия кликеров.
Может поворачивать камеру в шутерах и играх, в которых камера поворачивается с зажатой правой кнопкой мыши.
Дополнительная информация по обходу защиты в MMORPG.
Работает только с активным окном.


Необходимое устройство и установка ПО

1. Требуется плата Arduino micro или Arduino Leonardo. Заказать можно на Aliexpress.
2. Скачать и установить Arduino IDE. https://www.arduino.cc/en/software (Windows Win7 and newer)
3. Скачать и установить драйвер CH341SER (ссылка вначале темы).
4. Открыть Arduino IDE, пункт меню 'Инструменты', выбрать тип платы и порт.
5. Скачать архив arduino.zip (ссылка вначале темы) и извлечь его.
Файл arduino.lua закинуть в папку, в которой находится exe пилота.
Скетч загрузить в ардуино. Для этого скопировать содержимое файла Скетч.txt, вставить в Arduino IDE, нажать кнопку 'Загрузка'.

Требования

Пилот версии 2.41 или выше. Запускать от администратора.
Для работы функций мыши нужно в настройках мыши снять галочку 'Включить повышенную точность установки указателя'.
В функцию 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) -- рандом в мсек между нажатием и отпусканием клавиш клавиатуры
set_random_delay_mouse(random) -- рандом в мсек между нажатием и отпусканием клавиш

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)  -- установить рандом между нажатием и отпускание клавиш от 0 до 9 мсек
-- т. е. между нажатием и отпусканием клавиши будет пауза от 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_random_delay_mouse(10)  -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
hw.set_offset_mousemove(4)  -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(2)  -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

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)   -- отпустить левую кнопку мыши

DarkMaster
Описание требований к арудино/закидывание скетчей и т.д. рекомендую взять из старой темы. Без этого боюсь людям будет сложно, а по разным темам растаскивать тяжело ориентироваться, да и пост может человек почистить и получится нехорошо.
Fors1k
На случай если будет лень вбивать vid и pid:
--lua
require"luaposh";hw=require"arduino";log"clear"

hw.com = PScode('R',{[[$Return=Get-ArduinoPort]]})
if type(hw.com) ~= "number" then
log("ERROR\n"..hw.com)
end_script()
end

hw.mouse.move(400200)
KotMC
Скачал UO Pilot v2.41 (31.12.2018),Скетч и модуль lua.
Записал скетч в ардуино, положил модуль в папку с пилотом. Произвел рекомендуемые настройки.
Запускаю скрипт:

скрипт

--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) -- установить рандом между нажатием и отпускание клавиш от 0 до 9 мсек
-- т. е. между нажатием и отпусканием клавиши будет пауза от 20 до 29 мсек


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

goto me


Перехожу в блокнот и ничего не происходит в окне лога пилота только постоянно выводится
"0:13:59 0 (test.txt, 0): wait 1"

помогите найти ошибку.
cirus
Ардуино micro или leonardo?
Номер порта ардуино правильно определяется?
Код
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
log(hw.com)  -- в логе номер порта, в котором ардуино

Перезагрузите пк или перезапустите пилот.
Для теста уберите лишние строки начиная с конца и посмотрите какая именно строка не выполняется.
KotMC
pro micro.
Если использовать этот скрипт

скрипт
--lua
local ffi = require('ffi')
local setupapi = ffi.load('SetupAPI.dll')
local advapi32 = ffi.load('Advapi32.dll')

local DIGCF_ALLCLASSES = 4
local DIGCF_PRESENT = 2
local SPDRP_HARDWAREID = 1
local DICS_FLAG_GLOBAL = 1
local DIREG_DEV = 1
local KEY_READ = 131097
local BUFF_LEN = 20
local ERROR_SUCCESS = 0
local REG_SZ = 1

ffi.cdef[[
struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
struct HKEY__ { int unused; }; typedef struct HKEY__ *HKEY;
typedef HKEY *PHKEY;
typedef unsigned long ULONG;
typedef unsigned long DWORD;
typedef DWORD *LPDWORD;
typedef long LONG;
typedef DWORD *PDWORD;
typedef unsigned char BYTE;
typedef BYTE *PBYTE, *LPBYTE;
typedef wchar_t WCHAR;
typedef const char *LPCSTR, *PCSTR;
typedef unsigned long ULONG_PTR, *PULONG_PTR;
typedef void *PVOID;
typedef PVOID HDEVINFO;
typedef ULONG DEVPROPTYPE;
typedef LONG LSTATUS;
typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK REGSAM;

typedef struct _GUID {unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8];} GUID;
typedef struct _SP_DEVINFO_DATA {DWORD cbSize; GUID ClassGuid; DWORD DevInst; ULONG_PTR Reserved;} SP_DEVINFO_DATA, *PSP_DEVINFO_DATA;

HDEVINFO SetupDiGetClassDevsA(const GUID *ClassGuid, PCSTR Enumerator, HWND hwndParent, DWORD Flags);
bool SetupDiDestroyDeviceInfoList(HDEVINFO DeviceInfoSet);
bool SetupDiEnumDeviceInfo(HDEVINFO DeviceInfoSet, DWORD MemberIndex, PSP_DEVINFO_DATA DeviceInfoData);
bool SetupDiGetDeviceRegistryPropertyA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property,
PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize);
HKEY SetupDiOpenDevRegKey(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData,
DWORD Scope, DWORD HwProfile, DWORD KeyType, REGSAM samDesired);
LSTATUS RegCloseKey(HKEY hKey);
LSTATUS RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType,LPBYTE lpData, LPDWORD lpcbData);
]]
function get_port(vid, pid)
if vid == nil then return -1 end
if pid == nil then return -2 end

local com
local DeviceInfoSet = ffi.new('HDEVINFO')
local DeviceIndex = 0
local DeviceInfoData = ffi.new('SP_DEVINFO_DATA', 0)
local DevEnum = ffi.new('PCSTR', "USB")
local ExpectedDeviceId = 'VID_' .. tostring(vid) .. '&PID_' .. tostring(pid)
local szBuffer = ffi.new('unsigned char[1024]', 0)
local ulPropertyType = ffi.new('DEVPROPTYPE[1]')
local dwSize = ffi.new('PDWORD')
DeviceInfoSet = setupapi.SetupDiGetClassDevsA(nil, DevEnum, nil, bit.bor(DIGCF_ALLCLASSES, DIGCF_PRESENT))
DeviceInfoData.cbSize = ffi.sizeof(DeviceInfoData)

while setupapi.SetupDiEnumDeviceInfo(DeviceInfoSet, DeviceIndex, DeviceInfoData) do
DeviceIndex = DeviceIndex + 1
if (setupapi.SetupDiGetDeviceRegistryPropertyA(DeviceInfoSet, DeviceInfoData, SPDRP_HARDWAREID, ulPropertyType, szBuffer, ffi.sizeof(szBuffer), dwSize)) then
if ffi.string(szBuffer):match(ExpectedDeviceId) then
local hDeviceRegistryKey = ffi.new('HKEY')
hDeviceRegistryKey = setupapi.SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
local pszPortName = ffi.new('char[?]', BUFF_LEN)
local dwSize = ffi.new('DWORD[1]', ffi.sizeof(pszPortName))
local dwType = ffi.new('DWORD[1]')
if advapi32.RegQueryValueExA(hDeviceRegistryKey, "PortName", nil, dwType, pszPortName, dwSize) == ERROR_SUCCESS and dwType[0] == REG_SZ then
com = tonumber(ffi.string(pszPortName):match('%d+'))
end
end
advapi32.RegCloseKey(hDeviceRegistryKey)
end
end
setupapi.SetupDiDestroyDeviceInfoList(DeviceInfoSet)
if com then return com end
return 0
end

-- узнать номер порта, передавать vid, pid
local COM = get_port(2341, 8036) -- указать нужные vid и pid
log(COM)


Порт определятся верно.

Убрал строки до такого состояния отрабатывает только задержка.
скрипт
--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

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

В логе после его запуска это:
1:10:56 0 (test 210110 010231.txt, 0): wait 3000
1:10:59 0 (test 210110 010231.txt, 0): wait 1
1:10:59 0 (test 210110 010231.txt, 0): wait 1
1:10:59 0 (test 210110 010231.txt, 0): wait 1
1:10:59 0 (test 210110 010231.txt, 0): wait 1
cirus
Цитата
wait 1

Значит порт недоступен для открытия. Попробуйте скетч загрузить ещё раз, перезагрузить пк.
KotMC
Совершенно верно, все работает. Только не на этом компе, а на другом.
1пк Win 7 - не работает.
2пк Win 10 - работает.

Пока для меня это явные отличия между двумя компами. Буду разбираться почему не хочет работать на 1.
Спасибо за помощь!!!

Ещё такой момент, в место символа 'k' пишет символ 'л', а если сменить раскладку клавиатуры подключенной к компьютеру клавиатуры набирает правильный символ как это побороть?
cirus
Цитата
Ещё такой момент, в место символа 'k' пишет символ 'л', а если сменить раскладку клавиатуры подключенной к компьютеру клавиатуры набирает правильный символ как это побороть?

text вместо key.
kyja
Подскажите как Arduino работает для виртуалок то есть например включены 3 виртуалки vmware workstation и со всеми тремя Arduino сможет одновременно работать?

И например такая плата подойдет?
https://aliexpress.ru/item/1005001742819480.html
cirus
Цитата
Подскажите как Arduino работает для виртуалок

Без понятия. Команды Arduino получает через com порт так что его точно придётся включать.
Цитата
И например такая плата подойдет?
https://aliexpress.ru/item/1005001742819480.html

Подойдёт.
KotMC
Отрабатывает один раз, при повторном запуске UO Pilot зависает намертво при использовании этого скрипта:

скрипт

--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_mouse (20) -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

local startX, startY, endX, endY = 530, 180, 757, 254 -- координаты поиска
local path = [["C:\img\img1.bmp"]] -- путь к картинке, bmp 24 бита
local arr, a = findimage (startX, startY, endX, endY, {path}, 2) -- поиск картинки
hint (a) -- результат поиска, подсказка в правом нижнем углу
if arr then -- если найдена
log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
hw.mouse.move (651, 225) -- переместить мышь
end


А если использовать этот то все работает многократно

скрипт

--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_mouse (20) -- установить паузу между нажатиями клавиш мыши
--hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
--hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
--hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

local startX, startY, endX, endY = 530, 180, 757, 254 -- координаты поиска
local path = [["C:\img\img1.bmp"]] -- путь к картинке, bmp 24 бита
local arr, a = findimage (startX, startY, endX, endY, {path}, 2) -- поиск картинки
hint (a) -- результат поиска, подсказка в правом нижнем углу
if arr then -- если найдена
log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
--hw.mouse.move (651, 225) -- переместить мышь
end


Из за чего такое может происходить?
DarkMaster
Если во втором скрипте раскомментировать:
Цитата
--hw.mouse.move (651, 225) -- переместить мышь

Проблема появится?

Если нет, то подозреваю проблема вот в этих переменных:
--hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
--hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
--hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

Раскомментируйте строки по одной и смотрите результат. Проверять все варианты бессмыленно.
cirus
Цитата
Отрабатывает один раз
Из за чего такое может происходить?

По какой-то причине порт не закрывается. В результате при повтором запуске скрипта он просто ждёт когда порт будет доступен для открытия.
Такое может быть только если остановить скрипт во время выполнения команды ардуино. Других причин не знаю.
У меня работает этот скрипт.
DarkMaster
Цитата
В результате при повтором запуске скрипта он просто ждёт когда порт будет доступен для открытия.

Хм... А можно как-то закрыть порт без ребута железки? Так каждый раз при некорректном завершении скрипта дергать задолбаешься)
KotMC
Если во втором скрипте раскомментировать:

--hw.mouse.move (651, 225) -- переместить мышь

то все работает без зависаний.

Раскомментирование любой из этих строк:

--hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
--hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
--hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

приводит к полному зависанию пилота, которое лечится только через диспетчер задач.
cirus
Цитата
А можно как-то закрыть порт без ребута железки?

Пилот надо перезапускать в таких случаях. Порт открывается с помощью CreateFile, закрывать через CloseHandle. Тоже самое что с файлами, пока программа использует файл другая не может использовать его.

KotMC, этот файл в папку с пилотом закиньте Нажмите для просмотра прикрепленного файла
В лог будет выводить сообщение что порт открыт и закрыт.
код
Код
--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

log 'clear' log 'mode compact'
log('установить паузу между нажатиями клавиш мыши')
hw.set_delay_mouse (20) -- установить паузу между нажатиями клавиш мыши

log('\r\nустановить рандом между нажатиями клавиш мыши')
hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек

log('\r\nустановить шаг перемещения курсора')
hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается

log('\r\nустановить паузу между каждый шагом перемещения мыши')
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

log(hw.offset_mousemove)
log(hw.delay_mousemove)
log(hw.delay_mouse )
log(hw.random_delay_mouse)

log('\r\nперемещение курсора')
hw.mouse.move (651, 225) -- переместить мышь

После выполнения скрипта в логе должно быть это:
log
установить паузу между нажатиями клавиш мыши
Открытие порта
Порт открыт
Закрытие порта: true

установить рандом между нажатиями клавиш мыши
Открытие порта
Порт открыт
Закрытие порта: true

установить шаг перемещения курсора
Открытие порта
Порт открыт
Закрытие порта: true

установить паузу между каждый шагом перемещения мыши
Открытие порта
Порт открыт
Закрытие порта: true
4
2
20
10

перемещение курсора
Открытие порта
Порт открыт
Закрытие порта: true
KotMC
Цитата(cirus @ 18.1.2021, 13:16) *

Пилот надо перезапускать в таких случаях. Порт открывается с помощью CreateFile, закрывать через CloseHandle. Тоже самое что с файлами, пока программа использует файл другая не может использовать его.

KotMC, этот файл в папку с пилотом закиньте Нажмите для просмотра прикрепленного файла
В лог будет выводить сообщение что порт открыт и закрыт.
код
Код
--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

log 'clear' log 'mode compact'
log('установить паузу между нажатиями клавиш мыши')
hw.set_delay_mouse (20) -- установить паузу между нажатиями клавиш мыши

log('\r\nустановить рандом между нажатиями клавиш мыши')
hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек

log('\r\nустановить шаг перемещения курсора')
hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается

log('\r\nустановить паузу между каждый шагом перемещения мыши')
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

log(hw.offset_mousemove)
log(hw.delay_mousemove)
log(hw.delay_mouse )
log(hw.random_delay_mouse)

log('\r\nперемещение курсора')
hw.mouse.move (651, 225) -- переместить мышь

После выполнения скрипта в логе должно быть это:
log
установить паузу между нажатиями клавиш мыши
Открытие порта
Порт открыт
Закрытие порта: true

установить рандом между нажатиями клавиш мыши
Открытие порта
Порт открыт
Закрытие порта: true

установить шаг перемещения курсора
Открытие порта
Порт открыт
Закрытие порта: true

установить паузу между каждый шагом перемещения мыши
Открытие порта
Порт открыт
Закрытие порта: true
4
2
20
10

перемещение курсора
Открытие порта
Порт открыт
Закрытие порта: true



Всё сделал в точности, работает раз через раз. То выводит полный лог, то зависает. Если в момент зависания вытащить arduino и заново вставить, лог начнет двигаться и так за несколько раз вытаскивания вставления лог доходит до конца , после этого может несколько раз работать без зависаний.

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

Вешает пилот однозначно arduino.
cirus
Попробуйте другие драйвера, они могут отличаться.
KotMC
Перепробовал много разных драйверов результат один, либо сразу зависает либо на втором, третьем пуске.
Поставил win 7 с "родными" драйверами из ArduinoIDE работает более менее стабильно, если зациклить скрипт будет работать пока не отключишь. Драйвер из шапки не смог поставить.

А вот в ручную все же можно повесить порт или пилота - частым запуском, если не делать паузу в секунд 5, после посл вывода:

перемещение курсора
Открытие порта
Порт открыт
Закрытие порта: true



cirus
Цитата
А вот в ручную все же можно повесить порт или пилота - частым запуском

Тут и стараться не надо. Остановка скрипта при открытом порте и после этого потребуется перезапуск пилота.

Можно ещё длл попробовать, но в скорее всего ничего не изменится, т. к. в ней тот же самый код.
Нажмите для просмотра прикрепленного файла
Архив распаковать и закинуть в папку с пилотом. Тестил только на win10.
Пример использования:
код
Код
--lua
local ffi = require("ffi")
log 'clear' log 'mode compact'
local hw = ffi.load('Arduino.dll')

ffi.cdef[[
    int get_port(int VID, int PID);
    int set_port(int com);
    int set_delay_mouse(int ms);
    int set_delay_mousemove(int ms);
    int set_offset_mousemove(int step);
    int set_random_delay_mouse(int rand);
    int mouse_move(int x, int y);
]]

local com = hw.get_port(2341, 8036)
hint('Номер порта: ' .. tostring(com))
if com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

hw.set_port(com)
hw.set_delay_mouse (20) -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

hw.mouse_move (651, 225) -- переместить мышь
KotMC
Цитата(cirus @ 18.1.2021, 13:16) *

KotMC, этот файл в папку с пилотом закиньте Нажмите для просмотра прикрепленного файла


Этот модуль можно использовать вместо , модуля из шапки?
Список функций для него не меняется?

Зависания пилота происходили скорее всего из-за ноутбука. На двух из трех usb портов работает с рандомными завываниями, на одном более менее стабильно. Проверил на других компьютерах - пилот, модуль, ардуино, скрипт работаю нормально.

cirus
Цитата
Этот модуль можно использовать вместо , модуля из шапки?

Можно. И не только в пилоте, а любой другой программе, которая может подключать библиотеки.
Цитата
Список функций для него не меняется?

Вызов некоторых функций отличается.
Список функций Arduino.dll
Код
--lua
local ffi = require("ffi")
local hw = ffi.load('Arduino.dll')

ffi.cdef[[
    int get_port (int vid, int pid);
    int set_port (int COMport);
    int set_delay_key (int ms);
    int set_delay_mouse (int ms);
    int set_delay_mousemove(int ms);
    int set_offset_mousemove(int step);
    int set_random_delay_key(int rand);
    int set_random_delay_mouse(int rand);

    int key (int code);
    int key_down (int code);
    int key_up (int code);
    int text (const char* text);

    int mouse_move (int x, int y);
    int mouse_click (int button);
    int mouse_click_dbl (int button);
    int mouse_left (int x, int y);
    int mouse_right (int x, int y);
    int mouse_middle (int x, int y);

    int mouse_left_dbl (int x, int y);
    int mouse_right_dbl (int x, int y);
    int mouse_middle_dbl (int x, int y);

    int mouse_left_down (int x, int y);
    int mouse_right_down (int x, int y);
    int mouse_middle_down (int x, int y);

    int mouse_left_up (int x, int y);
    int mouse_right_up (int x, int y);
    int mouse_middle_up (int x, int y);

    int mouse_drag_left (int x, int y, int x2, int y2);
    int mouse_drag_right (int x, int y, int x2, int y2);

    int mouse_wheel_up (int x, int y, int count);
    int mouse_wheel_down (int x, int y, int count);
]]

Т. е. вместо hw.mouse.move (651, 225) надо hw.mouse_move (651, 225).
KotMC
Про Arduino.dll понятно, а модуль Arduino.lua из "сообщения 17", чем отличается от модуля из шапки?
Только выводом информации в лог об открытии закрытии порта или еще чем-то?
Его тоже можно использовать?
cirus
Цитата
а модуль Arduino.lua из "сообщения 17", чем отличается от модуля из шапки?

Только вывод в лог добавлен.
kyja
Подскажите пожалуйста как можно решить проблему крайне медленной работы на vmware workstation 16?
Фактически все работает но время выполнения просто огромное, на virtualbox такой проблемы нету вообще там все как на обычном пк все отрабатывает согласно задержкам
kyja
Цитата(kyja @ 28.1.2021, 1:32) *

Подскажите пожалуйста как можно решить проблему крайне медленной работы на vmware workstation 16?
Фактически все работает но время выполнения просто огромное, на virtualbox такой проблемы нету вообще там все как на обычном пк все отрабатывает согласно задержкам

Если кому то интересно то для vmware это решилось с помощью USB over Network офсайт но так же она есть на торентах (странно конечно что родное подключение от vmware работает хуже чем стороний софт при по сути одинаковой логике проброса юсб у обоих через tcp/ip если не ошибаюсь) возможно это глюк именно для arduino потому что если замерить скорость флешки через CrystalDiskMark то разница у хоста и виртаулки будет всего 5-15% но проброшенный arduino работает в ~500 раз медленней чем на хосте

И еще вопрос вомзожно ли подключатся не через
Код
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино

vid и pid а через например номер com порта?
у них ведь у всех он одинаков и если запустить несколько пилотов он ведь не поймет к какому именно устройству надо подсоединятся


Код
--lua
require"luaposh";hw=require"arduino";log"clear"

hw.com = PScode('R',{[[$Return=Get-ArduinoPort]]})
if type(hw.com) ~= "number" then
    log("ERROR\n"..hw.com)
    end_script()
end

hw.mouse.move(400, 200)

Или это и есть способ подключатся именно к определенному com порту? (у меня не получилось)
cirus
Цитата
вомзожно ли подключатся не через
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
vid и pid а через например номер com порта?

Код
hw.com = 3  -- 3й порт
kyja
Цитата(cirus @ 1.2.2021, 1:42) *

Код
hw.com = 3  -- 3й порт


Большое спасибо
kyja
Подскажите а как используя Arduino.dll
отправить нажатие кнопок
Код
hw.key (hw.enter)   -- нажать 'Enter'
hw.text ('Hello Привет')  -- напечатать текст
hw.key ('V')    -- нажать Shift+'v'

Enter получилось так
Код
hw.key (0xB0) 

а вот обычные буквы вообще не понял
Fors1k
Цитата(kyja @ 9.2.2021, 22:21) *

обычные буквы вообще не понял

Код
hw.key ('k')    -- нажать клавишу 'k'

Так не отправляется?
Выложите код, который запускаете, но не происходят нажатия клавиш.
kyja
скрипт
Код
 --lua
local ffi = require("ffi")
local hw = ffi.load('Arduino.dll')

ffi.cdef[[
int get_port (int vid, int pid);
    int get_port (int vid, int pid);
    int set_port (int COMport);
    int set_delay_key (int ms);
    int set_delay_mouse (int ms);
    int set_delay_mousemove(int ms);
    int set_offset_mousemove(int step);
    int set_random_delay_key(int rand);
    int set_random_delay_mouse(int rand);

    int key (int code);
    int key_down (int code);
    int key_up (int code);
    int text (int text);

    int mouse_move (int x, int y);
    int mouse_click (int button);
    int mouse_click_dbl (int button);
    int mouse_left (int x, int y);
    int mouse_right (int x, int y);
    int mouse_middle (int x, int y);

    int mouse_left_dbl (int x, int y);
    int mouse_right_dbl (int x, int y);
    int mouse_middle_dbl (int x, int y);

    int mouse_left_down (int x, int y);
    int mouse_right_down (int x, int y);
    int mouse_middle_down (int x, int y);

    int mouse_left_up (int x, int y);
    int mouse_right_up (int x, int y);
    int mouse_middle_up (int x, int y);

    int mouse_drag_left (int x, int y, int x2, int y2);
    int mouse_drag_right (int x, int y, int x2, int y2);

    int mouse_wheel_up (int x, int y, int count);
    int mouse_wheel_down (int x, int y, int count);
]]

local com = hw.get_port(2341, 8036)
--hint('Номер порта: ' .. tostring(com))
if com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

hw.set_port(com)
hw.set_delay_mouse (95)   -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(15)  -- установить рандом между нажатиями клавиш мыши от 0 до 15 мсек
hw.set_offset_mousemove(6)  -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(6)  -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается
hw.set_delay_key (325) -- установить задержку нажатий клавиатуры
hw.set_random_delay_key(95) -- рандом в мсек между нажатием и отпусканием клавиш клавиатуры

wait (3000 + math.random (20))


hw.key ('k')   -- нажать
wait (75 + math.random (30))
hw.key (0xB0)   -- нажать
wait (375 + math.random (30))


В таком виде тоже не работает
hw.key (k) -- нажать
но все что Hexadecimal значение отлично проходят
KotMC
Цитата

Вызов некоторых функций отличается.
Список функций Arduino.dll


Список функций Arduino.dll
Код
--lua
local ffi = require("ffi")
local hw = ffi.load('Arduino.dll')

ffi.cdef[[
int get_port (int vid, int pid);
int set_port (int COMport);
int set_delay_key (int ms);
int set_delay_mouse (int ms);
int set_delay_mousemove(int ms);
int set_offset_mousemove(int step);
int set_random_delay_key(int rand);
int set_random_delay_mouse(int rand);

int key (int code);
int key_down (int code);
int key_up (int code);
int text (int text);

int mouse_move (int x, int y);
int mouse_click (int button);
int mouse_click_dbl (int button);
int mouse_left (int x, int y);
int mouse_right (int x, int y);
int mouse_middle (int x, int y);

int mouse_left_dbl (int x, int y);
int mouse_right_dbl (int x, int y);
int mouse_middle_dbl (int x, int y);

int mouse_left_down (int x, int y);
int mouse_right_down (int x, int y);
int mouse_middle_down (int x, int y);

int mouse_left_up (int x, int y);
int mouse_right_up (int x, int y);
int mouse_middle_up (int x, int y);

int mouse_drag_left (int x, int y, int x2, int y2);
int mouse_drag_right (int x, int y, int x2, int y2);

int mouse_wheel_up (int x, int y, int count);
int mouse_wheel_down (int x, int y, int count);
]]

Т. е. вместо hw.mouse.move (651, 225) надо hw.mouse_move (651, 225).


Если не ошибаюсь здесь ответ.
kyja
Цитата(KotMC @ 10.2.2021, 0:44) *

Если не ошибаюсь здесь ответ.

Это мышка с ней проблем нет, и Hexadecimal значениями тоже все ок но вот именно просто кнопка k
(я бы и Hexadecimal заменил все клавиши но не смог найти на сайте ардуино список по всем символам)
KotMC
Сайт ардуино отправляет к этой табличке asciitable.com за доп кодами и их описанием.
Fors1k
Сейчас установлю arduino, попробую dll.
Fors1k
Пробуйте. cirus придёт, может что подправит.
--lua
log 'clear';log 'mode compact'
ffi = require("ffi")
hw  = ffi.load('Arduino.dll')

ffi.cdef[[
int get_port(int VIDint PID);
int set_port(int com);
int key(int code);
int text(const chartext);
]]

com = hw.get_port(23418036)
if com < 1 then
log ('error = ' .. tostring(com))
end_script ()
end
hw.set_port(com)
--//
exec ("notepad.exe")
wait(1000)
showwindow(findwindow ("Блокнот")[1][1])
wait(100)
hw.key(0x4B-- Нажать K
wait(500)
hw.text(' Hello Привет'-- напечатать текст
cirus
Цитата
hw.key(0x4B) -- Нажать K

Можно так сделать:
Код
local enter = 0xB0
function _key(symbol)
    hw.key(symbol:byte())
end

_key('k')   -- нажать k
_key('Z')   -- нажать Shift+z
hw.key(enter)    -- нажать enter
kyja
Спасибо да табличка с кодами решила проблемы а function _key(symbol) так вообще идеально.
kyja
Подскажите почему может не срабатывать рандом смешение у hw.mouse.move, пробовал такие варианты не срабатывает не один

Код
local x, y = 37, 533, 50, 50, -50, -52 
hw.mouse.move (x, y)


Код
hw.mouse.move (37, 533, 50, 50, -50, -52) 


Код
hw.mouse.move (39, 537, 5, 10, -7, -12) 
local x, y = mouse_pos ()
hw.mouse.left (x, y, 50, 50, -50, -50)
cirus
Цитата
пробовал такие варианты не срабатывает не один

Потому что они все неправильные.
Код
--lua
math.randomseed(os.clock())
function rand(x, y, x_plus, y_plus, x_minus, y_minus)
    return x+math.random(x_minus, x_plus), y+math.random(y_minus, y_plus)
end

local x, y = rand(37, 533, 50, 50, -50, -52)
log (x, y)

KotMC
Скажите, а такое написание:

hw.mouse.move (arr[1][1] + (1 + math.random (50), arr[1][2] + (1 + math.random (50))

допустимо, для "случайного" перемещения курсора?
Madeus
Код
hw.mouse.move (arr[1][1] + math.random (50), arr[1][2] + math.random (50))


В начале скрипта обязательно добавить один раз строку
Код
math.randomseed(os.clock())

Иначе рандом будет рандомным ровно 1 раз)
DarkMaster
Цитата
Иначе рандом будет рандомным ровно 1 раз)

И да и нет. Распределение будет близко к нормальному, но порядок выпадения чисел после каждого пререзапуска будет стабильным.
KotMC
"Вернулась" проблема с не закрытием порта, которая вешает пилот.

Один и тот же скрипт может работать часами, а может подвесить пилота уже через 10-15 минут работы, пробовал на разных компьютерах, плюс минус поведение одинаковое.

Ребят подскажите как поставить драйвер из шапки в замен, стандартного драйвера от Arduino IDE.

Ручную остановку скрипта при "открытом порте" - усвоил и избегаю, а какие факторы (команды) в скрипте могут влиять на, не возможность закрытия порта?

Другими словами может ли сам скрипт не давать закрыть порт, соответственно подвешивать пилота?
cirus
Нужен минимальный код, который приводит к зависанию.
Цитата
как поставить драйвер из шапки в замен

Запустить exe и нажать install.



KotMC
А зачем нам вообще этот драйвер из шапки, если у нас на плате нет преобразователей usb-uart, ведь он встроен в саму Atmega32u4?
kyja
Тоже периодически сталкивался с зависаниями но у меня не чистое подключение а проброс в виртуалки.
Из команд как по крайне мере мне показалось это все что связано с зажатиями hw.key_down ('h') отказался от них и вроде лучше
Так же не провереный на длинной дистанции но тоже непонятно почему дольще работает это покдлючение к порту а не hw.com = hw.get_port (2341, 8036) а hw.com = 6
И не dll а .lua через dll очень не долго работает
Пробовал и нам ram диск класть пилота но это вообще ничего не дало вроде
И конечно 10 винда сборок пробовал много разных остановился на 21h1 на 7 вообще печально все работает

Подскажите пожалуйста как сместить курсор в лево/право на 3 пикселя относительно позиции курсора, на просто lua работал такой вариант c ардуино не работает такое смешение влево/вправо всегда тянет вверх

скрипт

Код
wait (70 + math.random (100))
hw.mouse.move (1071, 472) -- было  move_smooth (1071, 472)
wait (125 + math.random (20))
local x, y = mouse_pos ()
hw.mouse.right_down (x, y)   -- было right_down (x, y)
wait (125 + math.random (20))

if color(1791, 610 ) == 3951049  then  
local x, y = mouse_pos ()
clickoffsetx (3 + math.random (2))
hw.mouse.move (x, y)           --было move_smooth (x, y)          
local x, y = mouse_pos ()
end

local x, y = mouse_pos ()
hw.mouse.right_up (x, y)   -- было right_up (x, y)
cirus
Цитата
как сместить курсор в лево/право на 3 пикселя относительно позиции курсора

Код
--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

local x, y = mouse_pos ()
hw.mouse.move (x+3, y)     -- вправо на 3 пикселя

KotMC
При работе через модуль луа такая конструкция работала
...
hw.mouse.move (arrP[1][1], arrP[1][2])
wait (300 + math.random (100))
hw.mouse.left_down () -- зажать левую кнопку мыши
wait (300 + math.random (100))
hw.mouse.move (arrP[1][1], arrP[1][2] + (2 + math.random (3)))
wait (300 + math.random (100))
hw.mouse.left_up () -- отжать левую кнопку мыши
...

клик (зажатие) проходил

При работе через dll уже, не работает
...
hw.mouse_move (arrP[1][1], arrP[1][2])
wait (300 + math.random (100))
hw.mouse_left_down () -- зажать левую кнопку мыши
wait (300 + math.random (100))
hw.mouse_move (arrP[1][1], arrP[1][2] + (2 + math.random (3)))
wait (300 + math.random (100))
hw.mouse_left_up () -- отжать левую кнопку мыши
...

Пилот ругается на не правильный аргумент в строке "hw.mouse_left_down () и hw.mouse_left_up ()", возможно ли сделать клик (зажатие, отпускание), в том месте где уже находится курсор?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2021 Invision Power Services, Inc.