Author Topic: Изменить способ обращения  (Read 27263 times)

0 Members and 5 Guests are viewing this topic.

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Изменить способ обращения
« Reply #90 on: November 30, 2019, 06:07:07 PM »
Убрал передвижение, клики тоже не работают
Code: (clickermann) [Select]
//Mouse_move(56,71) // координаты чуть что подправь, чтоб увидеть клики
waitms(100)
Mouse_click(1)
waitms(100)
//Mouse_move(200,200)
waitms(100)
Mouse_click(2)
wait(5)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Изменить способ обращения
« Reply #91 on: November 30, 2019, 06:13:56 PM »
Ком порт не сменился?

Если нет, то еще раз попробуй без кликермана - левый клик каждые 3 сек:
Code: (clickermann) [Select]
#include <Mouse.h>
#include <Keyboard.h>
 
String instring = "";
unsigned long val = 268435457; // создаем переменную в 4 байта
int kmfunct = 0;
int click_par = 0;
char x_cor = 0;
char y_cor = 0;
 
 
void setup() {
  Serial.begin(9600);
  Mouse.begin();
  Keyboard.begin();
}
 
void loop() {
////////////////////////////////////////////////////////////////////////
  //ожидание команды от кликермана в виде строоки
  while (Serial.available() > 0) {
    int inchar = Serial.read(); // принимаем по одному символу ASCI (по другому пока я незнаю как передавать)
    if (isDigit(inchar)) { //если это цифра,
      instring += (char)inchar;   //то соединяем ее с предыдущей цифрой
    }
    if (inchar == '\n') { //как только закончили прием. '\n' значит перенос строки, значит конец передачи.
    val = instring.toInt(); //строку instring переделываем в число val
    instring = ""; //обнуляем строку
   }
  } //все, с приемом окончили, получили число val
 
////////////////////////////////////////////////////////////////////////
  //ожидаем, пока переменная val станет больше нуля
  if (val > 0) {
  //далее разбиваем наше число на биты, и судя по ним, делаем нужные действия
   kmfunct =  int(val/268435456) ; //номер функции
   switch (kmfunct) {
 
    case 1:  //  Mouse.click

      click_par = int (val - kmfunct*268435456); // возможны 3 варианта - левая, правая, средняя
      switch (click_par) {
      case 1:
      Mouse.click(MOUSE_LEFT);
      break;
      case 2:
      Mouse.click(MOUSE_RIGHT);
      break;
      case 3:
      Mouse.click(MOUSE_MIDDLE);
      break;
     }     
     break;
 
    case 2: //  Mouse.move()
      Serial.println("Mouse_move");
      x_cor = char((val - kmfunct*268435456)/256);
      y_cor = char(val - x_cor*256 - kmfunct*268435456);

      Mouse.move(x_cor, y_cor, 0);
      break;
    }
   delay(3000)

  //val = 0; //в конце обнуляем нашу переменную
  }
}

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Изменить способ обращения
« Reply #92 on: November 30, 2019, 06:16:40 PM »
Перезагрузил комп, правый левый клик работает, передвижение нет, предполагаю что из за того что условие не срабатывает

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Изменить способ обращения
« Reply #93 on: November 30, 2019, 06:27:03 PM »
попробуй такой вариант, вынес все переменные в глобальные. Пробуй управлять кликерманом.
Code: (clickermann) [Select]
#include <Mouse.h>
#include <Keyboard.h>
 
String instring = "";
unsigned long val = 0; // создаем переменную в 4 байта
int kmfunct = 0;
int click_par = 0;
char x_cor = 0;
char y_cor = 0;
int inchar = 0;
 
void setup() {
  Serial.begin(9600);
  Mouse.begin();
  Keyboard.begin();
}
 
void loop() {
////////////////////////////////////////////////////////////////////////
  //ожидание команды от кликермана в виде строоки
  while (Serial.available() > 0) {
    inchar = Serial.read(); // принимаем по одному символу ASCI (по другому пока я незнаю как передавать)
    if (isDigit(inchar)) { //если это цифра,
      instring += (char)inchar;   //то соединяем ее с предыдущей цифрой
    }
    if (inchar == '\n') { //как только закончили прием. '\n' значит перенос строки, значит конец передачи.
    val = instring.toInt(); //строку instring переделываем в число val
    instring = ""; //обнуляем строку
    inchar = 0;
   }
  } //все, с приемом окончили, получили число val
 
////////////////////////////////////////////////////////////////////////
  //ожидаем, пока переменная val станет больше нуля
  if (val > 0) {
  //далее разбиваем наше число на биты, и судя по ним, делаем нужные действия
   kmfunct =  int(val/268435456) ; //номер функции
   switch (kmfunct) {
 
    case 1:  //  Mouse.click

      click_par = int (val - kmfunct*268435456); // возможны 3 варианта - левая, правая, средняя
      switch (click_par) {
      case 1:
      Mouse.click(MOUSE_LEFT);
      break;
      case 2:
      Mouse.click(MOUSE_RIGHT);
      break;
      case 3:
      Mouse.click(MOUSE_MIDDLE);
      break;
     }     
     break;
 
    case 2: //  Mouse.move()
      Serial.println("Mouse_move");
      x_cor = char((val - kmfunct*268435456)/256);
      y_cor = char(val - x_cor*256 - kmfunct*268435456);

      Mouse.move(x_cor, y_cor, 0);
      break;
    }

  val = 0; //в конце обнуляем нашу переменную
  }
}

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Изменить способ обращения
« Reply #94 on: November 30, 2019, 06:35:30 PM »
Не работает, я думаю проблема в цыкле или условии, он дальше подпрограммы Mouse_move не идет, когда комментирую //Mouse_move то клики пкм лкм срабатывают, движения нет

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Изменить способ обращения
« Reply #95 on: November 30, 2019, 06:54:27 PM »
Подпрограмма движения курсора такая?
Code: (clickermann) [Select]
SUB(Mouse_move, $x_cor, $y_cor)
   WHILE(($x_cor ! $_xmouse)&($y_cor ! $_ymouse))
      $x_temp = $_xmouse
      $y_temp = $_ymouse
      $x_dist = $x_cor - $_xmouse           // определяем расстояние до нуженой точки
      $y_dist = $y_cor - $_ymouse
     
      IF((-128 < $x_dist)&($x_dist < 127))   //проверяем, чтоб не заходило значение за пределы char
         IF($x_dist < 0)
            $x_dist = 127 - $x_dist     //переделываем в беззнаковый unsigned char
         END_IF
      END_IF
     
      IF((-128 < $y_dist)&($y_dist < 127))
         IF($y_dist < 0)
            $y_dist = 127 - $y_dist
         END_IF
      END_IF
      print($x_dist, "x", $y_dist)
      action(536870912 + $x_dist*256 + $y_dist) //в ардуино выйдет вторая функция и нужные сдвиги одним параметром
     
      wait(3) // задержку подберешь
   END_CYC
END_SUB

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Изменить способ обращения
« Reply #96 on: November 30, 2019, 07:00:27 PM »
Нет вот этот цыкл стоит после action
Code: (clickermann) [Select]
      action(536870912 + $x_dist*256 + $y_dist) //в ардуино выйдет вторая функция и нужные сдвиги одним параметром
      WHILE(($x_temp = $_xmouse)&($y_temp = $_ymouse))
         waitms(100)    //ждем перемещения курсора
      END_CY

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Изменить способ обращения
« Reply #97 on: November 30, 2019, 07:01:55 PM »
Попробуй вот такой скетч, управляй кликерманом:
Code: (clickermann) [Select]
#include <Mouse.h>
#include <Keyboard.h>
 
String instring = "";
unsigned long val = 0; // создаем переменную в 4 байта
int kmfunct = 0;
int click_par = 0;
int x_cor = 0;
int y_cor = 0;
String inchar = "";
 
void setup() {
  Serial.begin(9600);
  Mouse.begin();
  Keyboard.begin();
}
 
void loop() {
////////////////////////////////////////////////////////////////////////
  //ожидание команды от кликермана в виде строоки
  while (Serial.available() > 0) {
    inchar = Serial.read(); // принимаем по одному символу ASCI (по другому пока я незнаю как передавать)
    if ((inchar != String(10)) & (inchar != String(13))) {
    instring = String (instring + inchar); 
    }   
  }
    val = instring.toInt(); //строку instring переделываем в число val   
    instring = ""; //обнуляем строку
    inchar = "";
 
////////////////////////////////////////////////////////////////////////
  //ожидаем, пока переменная val станет больше нуля
  if (val > 0) {
  //далее разбиваем наше число на биты, и судя по ним, делаем нужные действия
   kmfunct =  int(val/268435456) ; //номер функции
   switch (kmfunct) {
 
    case 1:  //  Mouse.click

      click_par = int (val - kmfunct*268435456); // возможны 3 варианта - левая, правая, средняя
      switch (click_par) {
      case 1:
      Mouse.click(MOUSE_LEFT);
      break;
      case 2:
      Mouse.click(MOUSE_RIGHT);
      break;
      case 3:
      Mouse.click(MOUSE_MIDDLE);
      break;
     }     
     break;
 
    case 2: //  Mouse.move()
      x_cor = int((val - kmfunct*268435456)/256);
      y_cor = int(val - x_cor*256 - kmfunct*268435456);
      if (x_cor > 127) x_cor = 127 - x_cor;
      if (y_cor > 127) y_cor = 127 - y_cor;
      Mouse.move(x_cor, y_cor, 0);
      break;
    }

  val = 0; //в конце обнуляем нашу переменную
  }
}

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Изменить способ обращения
« Reply #98 on: November 30, 2019, 07:03:00 PM »
Нет вот этот цыкл стоит после action
Code: (clickermann) [Select]
      action(536870912 + $x_dist*256 + $y_dist) //в ардуино выйдет вторая функция и нужные сдвиги одним параметром
      WHILE(($x_temp = $_xmouse)&($y_temp = $_ymouse))
         waitms(100)    //ждем перемещения курсора
      END_CY

В место цикла поставь задержку в пару сек, пока для отладки.

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Изменить способ обращения
« Reply #99 on: November 30, 2019, 07:11:31 PM »
Движения нет, еще заметил когда Mouse_move активно, смд срабатывает 1 раз клики не происходят, если Mouse_move закоментировать , окно смд срабатывает 2 раза лкм срабатывает пкм нет а до этого пкм тоже срабатывало

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Изменить способ обращения
« Reply #100 on: November 30, 2019, 07:18:04 PM »
Вобщем я пока всё. В слепую трудно чтото делать, как приобрету ардуину, сам потестю. А ты пока помучай Vint-a, он быстро разберется  :D.

Когда у меня было про-микро, как-то затруднений не возникало, но мне нужно то было лклик и пару кнопок на клавиатуре нажать. MOVE работал из кликера.

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Изменить способ обращения
« Reply #101 on: November 30, 2019, 07:31:51 PM »
Эх жаль что не вышло(, но я все же думаю проблема в подпрограмме
Code: (clickermann) [Select]
SUB(Mouse_move, $x_cor, $y_cor)
   WHILE(($x_cor ! $_xmouse)&($y_cor ! $_ymouse))
      $x_temp = $_xmouse
      $y_temp = $_ymouse
      $x_dist = $x_cor - $_xmouse           // определяем расстояние до нуженой точки
      $y_dist = $y_cor - $_ymouse
     
      IF((-128 < $x_dist)&($x_dist < 127))   //проверяем, чтоб не заходило значение за пределы char
         IF($x_dist < 0)
            $x_dist = 127 - $x_dist     //переделываем в беззнаковый unsigned char
         END_IF
      END_IF
     
      IF((-128 < $y_dist)&($y_dist < 127))
         IF($y_dist < 0)
            $y_dist = 127 - $y_dist
         END_IF
      END_IF
     
      action(536870912 + $x_dist*256 + $y_dist) //в ардуино выйдет вторая функция и нужные сдвиги одним параметром
      //      WHILE(($x_temp = $_xmouse)&($y_temp = $_ymouse))
      //         waitms(100)    //ждем перемещения курсора
      //      END_CYC
      waitms(3000)
   END_CYC
END_SUB

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Изменить способ обращения
« Reply #102 on: November 30, 2019, 09:23:57 PM »
Попробовал первый вариант, клики мыши и написать букву, клики происходили а вот с буквой возникли проблемы, заменил зажатие отжатие на нажать. Но писать бувку не хотел, предположил что мешает окно смд, поменял подпрограмму отправки в порт как показывал Винт, теперь все кликает и пишет в блокноте.
Code: (javascript) [Select]
#include "Keyboard.h"
#include "Mouse.h"
 
String instring = "";
unsigned int val = 0;
 
 
void setup() {
  Serial.begin(9600);
  Mouse.begin();
  Keyboard.begin();
}
 
void loop() {
 
  //ожидание команды от кликермана в виде строоки
  while (Serial.available() > 0) {
    int inchar = Serial.read();
    if (isDigit(inchar)) {
      instring += (char)inchar;
    }
    if (inchar == '\n') { //как только закончили прием
    val = instring.toInt(); //собираем из текста число в переменную val
    instring = "";
 
 
 
      //далее, в зависимости от этого числа, даем команду ардуине делать дела
      switch (val) {
        case 1:  // если получим число 1 , делаем левый клик
          Mouse.click(MOUSE_LEFT);
          break;
        case 2: // если получим число 2 , делаем правый клик
          Mouse.click(MOUSE_RIGHT);
          break;
        case 87: //если получили 87, то жмем и держим на W
          Keyboard.write('w');
          break;
          //и так далее, если нужны другие команды, все в твоих руках
      }
    }
  }
}
Управление с кликмана
Code: (clickermann) [Select]
#name "arduino mouse/keybord"
 
$comport = 6  //порт твоей ардуины
 
SUB(action, $command)
   EXECUTE("shfile", STRCONCAT(" ", $comport, " ", $command))
END_SUB
 
 
wait(2)
MOVE(107,131)
 
waitms(500)
action(1) // Клик ЛКМ
 
wait(1)
action(87) //Пишет w
 
wait(1)
action(2) // Клик ПКМ
 
halt

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Изменить способ обращения
« Reply #103 on: November 30, 2019, 09:29:29 PM »
Осталось наладить перемещение мыши. Я представляю логику так, в кликере определяем текущие координаты мыши, запомнили, потом определяем координаты, куда надо перейти, вычисляем числа х у отправляем в ардуино в переменные х у и там уже происходит перемещение. но к сожалению я сам это не смог сделать, и пока не представляю как это можно сделать.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Изменить способ обращения
« Reply #104 on: November 30, 2019, 10:15:42 PM »
вобщем смотри, есть подпрограмма:
Code: (clickermann) [Select]
SUB(Mouse_move, $x_cor, $y_cor)
SUB(Mouse_move, $x_cor, $y_cor)
   WHILE(($x_cor ! $_xmouse)&($y_cor ! $_ymouse))

      $x_dist = $x_cor - $_xmouse           // определяем расстояние до нуженой точки
      $y_dist = $y_cor - $_ymouse
 
      IF((-128 < $x_dist)&($x_dist < 127))   //проверяем, чтоб не заходило значение за пределы char
         IF($x_dist < 0)
            $x_dist = 127 - $x_dist     //переделываем в беззнаковый unsigned char
         END_IF
      END_IF
 
      IF((-128 < $y_dist)&($y_dist < 127))
         IF($y_dist < 0)
            $y_dist = 127 - $y_dist
         END_IF
      END_IF
 
      print(536870912 + $x_dist*256 + $y_dist) //смотрим какой параметр отсылается в микросхему
     
      action(536870912 + $x_dist*256 + $y_dist) //в ардуино выйдет вторая функция и нужные сдвиги одним параметром

      waitms(3000)
   END_CYC
END_SUB

//вызыаем ее
Mouse_move(100,100) //хотим переместить в точку 100,100


//изначально перемещу специально курсор в координаты 0,0

halt
//изначально перемещу специально курсор в координаты 0,0 вызываю Mouse_move(100,100)

Там где print(536870912 + $x_dist*256 + $y_dist) смотрю число, отправляемое в ммикросхему, оно у меня показало 536896612

Что происходит с этим числом в программе ардуино:

делим его на 268435456 и отбрасываем дробную часть kmfunct =  int(val/268435456). Получаем   536896612/268435456 = 2,00009573996067 число 2 , - это вторая функция в свитче - case 2: //  Mouse.move()

далее в этом кейсе извлекаем из общего параметра наши координаты x_cor = int((val - kmfunct*268435456)/256); это (536896612-2*268435456)/256 = 100,390625 - целая часть = 100 - это смещение по оси Х, все верно

далее проверяем это число, чтоб оно было не больше 127     if (x_cor > 127).... оно не больше, значит первый параметр остается равным 100, все верно, этот параметр и отсылаем в Mouse.move()

Далее расчет координаты У.    y_cor = int(val - x_cor*256 - kmfunct*268435456);  536896612-100*256-2*268435456 = 536896612-25600-536870912= 100 , все верно, от нуля до 100 нам нужно сместить на 100 пикселей по У, также проверяем чтоб небыло число больше 127, так оно и есть, это второй параметр Mouse.move()

Получаем Mouse.move(100, 100, 0) , тоесть смещаем на 100 пикс вправо и на 100 пикс вниз

Для чего там проверка на if (x_cor > 127), потому, что если бы было больше, то знак параметра сменился бы на отрицательный

Пример с отрицательными параметрами, покажу только на Х. Допустим курсор стоит в координате 100,100 , нужно сместить в 0,0

вызываем  Mouse_move(0,0) в км и держим курсор в координате 100,100

print(536870912 + $x_dist*256 + $y_dist)  выдает число 536929251

Контроллер ардуино высчитывает номер функции kmfunct =  int(val/268435456) ;  536929251/268435456 = 2,000217329710722 , целая часть = 2, это вторая функция в свитче Mouse.move()

опять высчитываем x_cor = int((val - kmfunct*268435456)/256);    (536929251-2*268435456)/256 = 58339/256 = 227,88671875 целая часть 227

проверяем на if (x_cor > 127), 227 больше 127, значит пересчитываем x_cor = 127 - x_cor; 127-227 = -100 , все совпадает, нам нужно сместить курсор на 100 пикселей влево, это первый параметр для Mouse.move()

Почти тоже самое высчитывается для координаты У, и тоже получаем -100

Вызываем функцию с параметрами Mouse.move(-100, -100, 0), тоесть смещаем курсор влево на 100 пикс, и вверх на 100 пикс.

Вот так это работает, я ошибки не вижу!!!

Завтра вечером будет у меня ардуино про микро, проверю сам, так что не унывай  :) , все должно работать (должно будет работать, когда найду причину неработоспособности).