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

7 страниц V « < 5 6 7  
Ответить в эту темуОткрыть новую тему
> Pilot + Arduino (Hardware clicker)
Crocotea
сообщение Вчера, 0:41
Сообщение #121


**

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



Цитата(cirus @ 29.11.2020, 23:12) *

Crocotea, проверьте этот код:
Узнать номер com порта, в котором arduino
Код
--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)

vid и pid можно узнать в Arduino IDE, в меню 'Инструменты', 'Получить информацию о плате'.


Нашел vid и pid скорректировал под свой. Выдал ошибку. результат:
https://ibb.co/QXttczp
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение Вчера, 0:53
Сообщение #122


**********

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



Цитата
Выдал ошибку.

Вообще-то это скрипт луа, а не скетч.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Crocotea
сообщение Вчера, 1:39
Сообщение #123


**

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



Цитата(cirus @ 30.11.2020, 0:53) *

Вообще-то это скрипт луа, а не скетч.

оуу, так через пилот это запустить?
если через пилот то:
Код
1:40:55 14 (autosaved_14.txt, 0): 8
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение Вчера, 1:44
Сообщение #124


**********

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



Цитата
1:40:55 14 (autosaved_14.txt, 0): 8

Это нужный порт?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Crocotea
сообщение Вчера, 2:52
Сообщение #125


**

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



Цитата(cirus @ 30.11.2020, 1:44) *

Это нужный порт?

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


**********

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



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

Добавил функцию в модуль. Теперь можно не указывать порт.
Код
--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_key(20)     -- установка пауз
hw.set_delay_mouse(20)

hw.mouse.left(400, 300)

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


**

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



Цитата(cirus @ 30.11.2020, 3:10) *

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

Добавил функцию в модуль. Теперь можно не указывать порт.
Код
--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_key(20)     -- установка пауз
hw.set_delay_mouse(20)

hw.mouse.left(400, 300)


Работает

Очень бы хотелось запускать все таки 2 и более скриптов паралельно
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение Сегодня, 13:17
Сообщение #128


**********

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



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

Убрал не нужные паузы из скетча.
При переполнении буфера, хотя такого не должно быть, 3 секунды будет гореть встроенный светодиод L. В этом случае нужно увеличить паузы.
Изменил функцию text(), теперь может вводить русские символы.

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

7 страниц V « < 5 6 7
Ответить в эту темуОткрыть новую тему
4 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 2 Cockney, Crocotea

 

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