Arduino Micro + clickermann.

Статья 1

Авторdramster

http://crapware.aidf.org/forum/index.php?topic=5215.msg34294#msg34294

Внимание, требуется доп. оборудование!!!

До недавнего времени ни разу не сталкивался с защитами от кликеров. И вот этот день наступил. Мне даже интересно стало - как вся эта защита выглядит, и неужели ее никак не обойти. Первое что испробовал, это режим пс2, благо на пк такой порт еще есть, хоть и комбинированный. Мышки на пс2 не нашел, а клавиатура как раз туда и втыкнута. Клавиатурные нажатия + #ps2_keyboard работают отлично. Даже и не подозревал какая это полезная штука оказывается "режим PS/2".

Но идем дальше. На ноуте, которым пользуюсь чаще, пс2 уже нет  >:(. И как тут быть? И пришла мне тут идея, а неужели нельзя аппаратно жать на нужные кнопки? К счастью для экспериментов под рукой завалялась плата "ардуино". Описание девайса тут.

Идея заключается в том, чтобы данный контроллер жал на те кнопки, которые я ему скажу жать. Гдето в интернети встречал какието доп. модули для ардуино, но в данный момент мне это было не интересно (заказывать, ждать, ... интереснее сделать самому).

Для начала нашел ненужную усб мышку. Как мне кажется с мышкой соединить ардуино куда проще чем с клавиатурой. С клавитурой пока не пробовал, нет у меня лишней усб клавы, да и еще не уверен что чтото с ней получится. Немного почитал, вспомнил как там программируется ардуино, этот закрученный язык си  >:(. Сразу понял, что на две кнопки мышки он нажмет. Благо там контак просто на массу замыкает, а digitalWrite как раз так и делает - либо 5в, либо "масса".

Идем дальше, нужно как то сообщить контроллеру что я хочу нажать, и в кокой момент. Ардуина подключена к пк через усб к виртуальному ком порту, и без проблем передает сообщени и принимает их. Тут пришлось немного поламать голову. Ни как не мог разобраться как послать ту инфу, что я хочу. Идея была посылать байт информации, 256 значений хватило бы для любых прихотей. Принцип передачи так и работает, но передача идет символов ASCI. И получается, что я могу отправить только те символы, которые могу напечатать, а всякие там шифты, контралы, управляющий символ и прочее отправить уже не получится. Речь идет о передаче через командную строку, мы же не привыкли носить кучу доп. утилит и приложений (кстати они вроде как могут передавать все что захочешь). Ну да ладно, немного усложним работу, и будем отправлять число строкой, тем более что полюбому консоль в добавок после символа отправляет "переход на след. строку" и "возврат коретки" 13 и 10 если не ошибаюсь, которые в любом случае придется отсортировывать.

Ну чтож, с передачей информации разобрался. Переходим к нашему любимому "кликерману". Жаль что он не может послать в ком на прямую  :(. требуется создание батника каждый раз  :(. Создаю строку - десятичный код клавиши + символ обозначающий зажатие и отпускание кнопки (U или D). Вышло как то так:

Код: Clickermann

1. SUB(key, $char)
2.    STRWRITELN("file.bat", STRCONCAT("Mode com",$comport," baud=9600 parity=n data=8 stop=1"), 1)
3.    STRWRITELN("file.bat", STRCONCAT("echo ",$char,"> com",$comport), 0)
4.    EXECUTE("file.bat")
5. END_SUB
6.  
7. key(STRCONCAT($key,"D"))  // $key - десятичный код клавиши
8. WAITMS(100)
9. key(STRCONCAT($key,"U"))

Ардуино в свою очередь мониторит нужный порт на наличие сообщения. Как только появляются байты для считывания Serial.available(), пишет цифры в массив, а мой управляющий символ в переменную.

Код: sketch Arduino

1.  while (Serial.available() > 0) {
2.  
3.     int inchar = Serial.read();
4.     if (inchar == 'U') {
5.       presskey = false;
6.     }
7.     if (inchar == 'D') {
8.       presskey = true;
9.     }
10.    if (isDigit(inchar)) {
11.      instring += (char)inchar;
12.    }
13.    if (inchar == '\n') {
14.      val = instring.toInt();
15.      instring = "";
16.    }
17.  }

А потом, имея код кнопки, выбираем на какой контакт подать "минус" digitalWrite(pin, LOW). К этому контакту заранее был подведен и припаян провод от нужной кнопки мышки.

Для отладки и настройки использовал LCD дисплей, хотя можно было обойтись и без него.

В этоге - код для "ардуино" для левой и правой кнопки мыши:

Код: sketch Arduino

1. String instring = "";
2. int val = 0;
3. boolean presskey = false;
4. int lmouse = 52;
5. int rmouse = 53;
6.  
7. int getPress(int key) {
8.   if (presskey == true) {
9.     digitalWrite(key, LOW);
10.  }
11.  else {
12.    digitalWrite(key, HIGH );
13.  }
14.}
15. 
16.void setup() {
17.  Serial.begin(9600);
18.  lcd.begin(16, 2);
19. 
20.  pinMode(lmouse, OUTPUT);
21.  digitalWrite(lmouse, HIGH);
22.  pinMode(rmouse, OUTPUT);
23.  digitalWrite(rmouse, HIGH);
24.}
25. 
26.void loop() {
27.  while (Serial.available() > 0) {
28. 
29.    lcd.clear();
30.    int inchar = Serial.read();
31.    if (inchar == 'U') {
32.      presskey = false;
33.    }
34.    if (inchar == 'D') {
35.      presskey = true;
36.    }
37.    if (isDigit(inchar)) {
38.      instring += (char)inchar;
39.    }
40.    if (inchar == '\n') {
41.      val = instring.toInt();
42.      lcd.print("key: ");
43.      lcd.print(val);
44.      lcd.setCursor(0, 1);
45.      lcd.print("press: ");
46.      lcd.print(presskey);
47.      instring = "";
48. 
49. 
50.      switch (val) {
51.        case 1:
52.          getPress(lmouse);
53.          break;
54.        case 2:
55.          getPress(rmouse);
56.          break;
57.      }
58.    }
59.  }
60.}

Код для "кликермана" - press, dbpress, down и up :

Код: Clickermann

1. #name "arduino mouse"
2.  
3. $comport = 6
4.  
5. SUB(key, $char)
6.    STRWRITELN("file.bat", STRCONCAT("Mode com",$comport," baud=9600 parity=n data=8 stop=1"), 1)
7.    STRWRITELN("file.bat", STRCONCAT("echo ",$char,"> com",$comport), 0)
8.    EXECUTE("file.bat")
9. END_SUB
10. 
11.SUB(press, $keypress)
12.   key(STRCONCAT($keypress,"D"))
13.   WAITMS(100)
14.   key(STRCONCAT($keypress,"U"))
15.END_SUB
16. 
17.SUB(dbpress, $dbpresskey)
18.   press($dbpresskey)
19.   WAITMS(100)
20.   press($dbpresskey)
21.END_SUB
22. 
23.SUB(down, $keydown)
24.   key(STRCONCAT($keydown,"D"))
25.END_SUB
26. 
27.SUB(up, $keyup)
28.   key(STRCONCAT($keyup,"U"))
29.END_SUB
30.///////////////////////////////////////////////////////////////////////////////
31. 
32.WAIT(1)
33.MOVE(2040,940)
34.WAITMS(100)
35.dbpress(1)
36. 
37.WAIT(1)
38.press(2)
39. 
40.WAIT(1)
41.MOVE(2010,930)
42.WAITMS(100)
43.down(1)
44.WAITMS(500)
45.move(2010,880)
46. 
47.WAIT(1)
48.up(1)
49. 
50.HALT

Есть продолжение этой статьи https://vintets.ru/cm_arduino_2