Эмулятор мыши, клавиатуры, мультимедия клавиатуры на обычных Adruino UNO/NANO/MINIPRO

reodos
Offline
Зарегистрирован: 24.07.2016

Щяс скину архив с ардуиной и библами.

reodos
Offline
Зарегистрирован: 24.07.2016

88,4 Мбайта

USB-HID.rar Папка с ардуино иде в которую включены нужные библиотеки и папка с проектом - пример с этого сайта. Проверено на Windows XP - плату выбирал Arduino Nano. Компиляция проходит успешно.

Vladi-mir
Offline
Зарегистрирован: 19.10.2018

Большое спасибо! Всё заработало.

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Здравствуйте! Хочу использовать вашу библиотеку для Arduino Nano. Но я так и не понял, как нужно подключиться к USB, чтобы все это работало?

reodos
Offline
Зарегистрирован: 24.07.2016

А схема в шапке не помогает? Что именно не понятно?

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Вот у меня есть Arduino Nano. Что мне нужно для того чтобы вся эта схема работала, а во вторых, как физически это выглядит. Я также подключаться через microUSB должен? Или мне наужен USB-USB, к которому я буду паяться? Мне бы посмотреть как это на практике это выглядит. Также вы написали, что можно подать на vcc 3.3v, но я не нашел vcc на NANO. Он там вообще есть? И если есть, то я бы хотел попросить схему. Заранее спасибо!

reodos
Offline
Зарегистрирован: 24.07.2016

Micro USB подключать только для заливеи скетча. Я отрезал от USB удокнителякусок кабеля с "папой" и подпаивал к ардуино согласно схемы. После заливки скетча через микроUSB девайс отключаем от микроUSB и втыкаем обрезок провода с "папой USB" в "маму USB на компьютере". И еще, для работы USB необходимо напряжение 3,6в. У меня при стабилитронах 3.3в. ничего не работало.
У наготове vaccine микроконтроллера соеденено с пинком +5в. Также у нано есть пин "vn" на который можно подавать напряжение от 6 до 9(12) вольт. На платком нанки стоит линейный пркобразователь напряжения который из 6...9(12)в делает 5в. И они же, эти 5в появятся на пинка +5в. Вообще для питания микроконтроолера от 3.3(3.6)в необходим и кварц меньшей частоты. Почитайте даташит на микроконтроллеры.

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Хорошо, про подключение usb я понял. А вот насчёт питания не очень. Могу ли я питать ардуинку от литиионного аккума на 3.7в? И если да, то на какой пин мне подавать сигнал? Или может вообще можно от ПК питать через microUSB?

reodos
Offline
Зарегистрирован: 24.07.2016

Питать можно от USB ПК, в этом случае красный провод подключаеш к +5в, черный к GND. Но логические уровни общения ардуинки с USB портом нужно привести к уровню 3.6в с помощью стабилитронов. Можно и от лития питать. В этом случае тоже + подавать на пин "+5в". НО в этом случае ардуинка должна работать на более низкой частоте. Вообще есть версии ардуино про мини с питанием от 3.3в. там и частота кварца ниже. Но производительности врятли хватит. Купите лучше другой контроллер с аппаратной поддержкой USB например ардуино леонардо или другую на базе микроконтроллера ATmega32u4. В данном примере куча подводных камней. Здесь критично напряжение которое стабилизируют стабилитроны, напряжение самого USB порта на компьютере. Вы как новичок просто убьете в пустую кучу времени.

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Просто в том и смысл, чтобы не покупать леонардо. Но тем не менее, я все понял. Я вчера очень сильно тупил, только сейчас уже все дошло. Огромное спасибо!

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Ещё хочу уточнить. VCC пин, на ардуино нано, в схеме каким пином заменяется? Я так понял, что на +5v Питаюсь от через microUSB.

reodos
Offline
Зарегистрирован: 24.07.2016

Вы правильно поняли.

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Вообще не было стабилитронов на 3.6v, были на 3.3 и 3.9. взял 3.3. Также резисторы не на 68, а на 75 ом. Подойдут?

reodos
Offline
Зарегистрирован: 24.07.2016

Резисторы думаю подойдут. У меня не заработало со стабилитронами на 3.3в. Но даже взяв пачку на 3.6в и заменив у 6их разбросаны был от 2.9 до 3.5в. Очень сложно было из кучи подобрать чтоб 3.5в были. На этих кое как заработало. Любой забыл может компенсировать эти разбросы. У меня например хорошо работало если вставлял в USB монитора, а он как забыл уже работал и наоборот, когда вставлял в саму материнку(3.3в стабилитроны были) то с материнкой глючило. Я до сих пор не собрал полностью рабочую схему. Еще заметил что на виндовс 10 работает стабильнее чем на виндовс хp.

reodos
Offline
Зарегистрирован: 24.07.2016

*замерив у них.

karupoiss00
Offline
Зарегистрирован: 18.11.2018

https://imgur.com/a/MQWXssh

Что делать, если не определяет устройство?

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Проблема решена методом перевтыка

reodos
Offline
Зарегистрирован: 24.07.2016

Несколько вариантов:
1.Подобрать стабилитроны максимально близкие к 3.6в.
2.Подключить через USB HUB.
3.Попробовать отдельное питание на ардуину, возможно нет 5-ти вольт в USB(необходимы замеры).
4.Попробовать подключить в виндовс 10.
5.Попробовать как можно подробнее описывать свои действия когда задаешь вопрос.

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Все собрал, работает, но только от материнки. Но есть проблема. При приближении пальца к кнопке, клавиша на компьютере зажимается, а когда отдаляю отжимается. С чем это связано? Может слабый резистор для кнопки? (220 Ом)

reodos
Offline
Зарегистрирован: 24.07.2016

1. Самопроизвольное срабатывание пина происходит когда на нем не явный логический уровень(нога висит в воздухе).
2. 220 Ом это крайне мало, это для светодиодов. Для кнопки от 1 КОм до 20 КОм.
3. Можно подключить подтягивающий резистор встроенный в саму ардуино, помоему команда INPUT_PULLUP вместо INPUT при объявлении пина как вход.
4. С такими вопросами в другую тему.

karupoiss00
Offline
Зарегистрирован: 18.11.2018

Блин, винда не может определить устройство. То есть подключаю, появляется уведомлении о том, что устройство не определено, и драйвера не ставятся по причине "Отказ". Что делать?

ua4lcn
Offline
Зарегистрирован: 27.02.2016

Это эмуляция  клавиатуры PS/2 ? По крайней мере можно ли  эмулировать хотя бы несколько клавиш(ну насколько хватает ног у Arduino )?  Или это как обычные HID (уже современные) коавиатуры?

reodos
Offline
Зарегистрирован: 24.07.2016

USB вам ничего не говорит? Шапку тяжело почитать?
Приходят флудят... зла не хватает.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Привет. Буду использовать библиотеку, но вопрос по:

dimax пишет:
Один из которых служит для внешнего  PULL_UP, за счёт этого драйвер программно может включать/отключать USB.

а тажке в usbconfig

/* ----------------------- Optional Hardware Config ------------------------ */

#define USB_CFG_PULLUP_IOPORTNAME   D 
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
 * V+, you can connect and disconnect the device from firmware by calling
 * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
 * This constant defines the port on which the pullup resistor is connected.
 */
#define USB_CFG_PULLUP_BIT          5 
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
 * above) where the 1.5k pullup resistor is connected. See description
 * above for details.
 */

Что это дает? Если не использовать подает сигнал на комп что клавиатура отключена?

Я просто уже спаял плату по примеру Vusb с резистром 1.5К и только сегодня нашел вашу либу. Есть ли смысл переделывать?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jeka_tm, когда дрова инитятся в функции *begin  то  как-бы передёргивается USB, что позволяет винде корректно определить устройство в нужный момент времени. Если тупо притянуть резистором к питанию, то возможно система не будет видеть usb-девайc после каких нибудь простоев МК или компьютера . Например после перезагрузки или спячки. Но это просто догадки, я никогда не пробывал отрубать программную подтяжку.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Спасибо. Пробую будут проблемы добавлю

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

У меня заработало, точнее комп увидел клаву, энкодер захотел прописать в коде, но тут ошибки посыпались, меня конфликт векторов прерываний похоже с библиотекой Encoder.h


WInterrupts.c.o (symbol from plugin): In function `attachInterrupt':

(.text+0x0): multiple definition of `__vector_1'

libraries\TrinketHidCombo_MEGA328\usbdrvasm_includer.S.o:C:\YandexDisk\arduino-1.8.1\libraries\TrinketHidCombo_MEGA328\usbdrv/usbdrvasm16.inc:35: first defined here

C:\Users\Set\AppData\Local\Temp\ccNtjLBD.ltrans0.ltrans.o: In function `__vector_1':

C:\Users\Set\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.23\cores\arduino/WInterrupts.c:309: multiple definition of `__vector_1'

libraries\TrinketHidCombo_MEGA328\usbdrvasm_includer.S.o:C:\YandexDisk\arduino-1.8.1\libraries\TrinketHidCombo_MEGA328\usbdrv/usbdrvasm16.inc:35: first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.

Вот думаю попробовать твой код отсюда

Или может посоветуешь безконфликтный код энкодера

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Все получилось как хотелось: управление громкостью, Mute, а также включение колонок

#include "TrinketHidCombo.h"

#define button       7  // кнопка энкодера
#define led          11 // подсветка
#define power_pin    10 // выход на реле
volatile int enc = 0;
byte pwm = 128;

unsigned long time = 0;
bool button_flag = 0;
bool mute_flag =  0;
bool power_flag = 0;
#define time_mute   150
#define time_power 2000

void setup() {
  pinMode(3, INPUT);   // USB d- (белый) PORT D4 задан в usbconfig.h
  pinMode(2, INPUT);   // USB d+ (зелёный) PORT D2 задан в usbconfig.h
  pinMode (4, OUTPUT); //программное включение юсб порта PORT D5  задан в usbconfig.h. Я не использую
  TrinketHidCombo.begin(); // start the USB device engine and enumerate
  PCICR = 1 << PCIE2; //разрешить пренрывание
  PCMSK2 = 1 << PCINT21; //выбрать вход на котором сработает прерывание // энкодер на 5 и 6 пинах

  pinMode(led,         OUTPUT);
  pinMode(button,      INPUT);
  pinMode(power_pin,   OUTPUT);
  analogWrite(led,     100);
  digitalWrite(power_pin, power_flag);
}

void loop() {
  TrinketHidCombo.poll(); // функция должна выполняется не реже 1 раза в 10мс !!!
  if (power_flag) {
    if (enc == -2) {
      TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
      enc = 0;
    }
    if (enc == 2) {
      TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
      enc = 0;
    }
  }
  else enc = 0;
  if (!digitalRead(7) && !button_flag) { // Если нажата кнопка, но до этого не нажата
    button_flag = 1;
    time = millis();
  }
  if (digitalRead(7)  && button_flag) { // Если кнопку отпустили
    button_flag = 0;
  }
  if (button_flag && (millis() - time) > time_mute) {//если кнопка была нажата и время прошло больше чем для mute
    mute_flag = 1;
  }

  if (!button_flag &&  mute_flag) { // если кнпоку отпустили, но флаг mute уже изменился
    if (power_flag && (millis() - time) < time_power) {
      mute_flag = 0;
      TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE);
    }
    if ((millis() - time) > time_power) {
      mute_flag = 0;
      power_flag = !power_flag;
      digitalWrite(power_pin, power_flag);
    }
  }
}



//=============================================Обработка энкодера
ISR (PCINT2_vect) {
  ((PIND & 0x20) >> 4)^((PIND & 0x40) >> 5) ? enc++ : enc--;
}

 

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

dimax, возникла потребность в одновременном нажатии двух кнопок одновременно (нужно поменять раскладку клавиатуры) ну вообщем код

if (keydata == 0xF609FF00) {
      TrinketHidCombo.pressKey(0, KEYCODE_LEFT_SHIFT, KEYCODE_LEFT_ALT);
      TrinketHidCombo.pressKey(0, 0);
    }

не работает. Что можно сделать ?7

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vvgnovanet, использовать дефайн клавиши-модификатора. Подробности в TrinketHidCombo.h

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

TrinketHidCombo.pressKey(0, KEYCODE_MOD_LEFT_SHIFT, KEYCODE_MOD_LEFT_ALT);

Тоже не работает

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vvgnovanet,  естессно, и не должно работать. Вы вставляете дефайны не понимая синтаксиса аргументов функции.  Там же написано всё, void pressKey(uint8_t modifiers, uint8_t keycode1);     Стало быть строчка должна быть (KEYCODE_MOD_LEFT_SHIFT, KEYCODE_LEFT_ALT).

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

Залил if (keydata == 0xF609FF00) {
      TrinketHidCombo.pressKey(KEYCODE_MOD_LEFT_SHIFT, KEYCODE_LEFT_ALT);
      TrinketHidCombo.pressKey(0, 0);

TrinketHidCombo.h читал, всяко разно делал не работает.

Спаял сей девайс для хранения паролей и управления плеером (tsop4838 под контроллером)

Всё работает уже полгода, а вот сегодня захотел дополнить ещё одной функцией и не получается ))))

 

Вот строчка  TrinketHidCombo.pressKey(KEYCODE_MOD_LEFT_CONTROL, KEYCODE_LEFT_ALT, KEYCODE_T);

CTRL+ALT+T должна открывать терминал (linux) тоже не работает, получается только CTRL + T ( открывает новый документ в текстовом редакторе)KEYCODE_LEFT_ALT пропускается. ХЗ Получается ALT не нажиматся.

Вобщем переделал переключение раскладки на CTRL + Z всё работает с SHIFT+ALT Ни как )))

TrinketHidCombo.pressKey(KEYCODE_MOD_LEFT_CONTROL, KEYCODE_Z);

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vvgnovanet, строчки

TrinketHidCombo.pressKey(KEYCODE_MOD_LEFT_SHIFT, KEYCODE_LEFT_ALT);
TrinketHidCombo.pressKey(0, 0);

Точно должны работать, ищите косяк в чём-то ещё.

А вот строчка

TrinketHidCombo.pressKey(KEYCODE_MOD_LEFT_CONTROL, KEYCODE_LEFT_ALT, KEYCODE_T);

работать не должна, т.к. тут два модификатора подряд, а функция не умеет их обрабатывать. В таких случаях суммируется вес каждого модификатора, смотрим в доку:

#define KEYCODE_MOD_LEFT_CONTROL    0x01
#define KEYCODE_MOD_LEFT_ALT        0x04
 

и пишем так:

 TrinketHidCombo.pressKey(0x5, KEYCODE_R);
 TrinketHidCombo.pressKey(0,0); 

Вуаля.

 

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

dimax, огромное спасибо. Будем искать.

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

Не знаю на что подумать но TrinketHidCombo.pressKey(KEYCODE_MOD_LEFT_SHIFT, KEYCODE_LEFT_ALT);

Так и не работает.

Зато сработал код

TrinketHidCombo.pressKey(0x6, 0);

#define KEYCODE_MOD_LEFT_SHIFT        0x02

+

#define KEYCODE_MOD_LEFT_ALT        0x04

dimax, огромное спасибо ещё раз, про сложение модификаторов не знал )))

JuraPal
Offline
Зарегистрирован: 06.07.2019

Я тоже хочу подобный гаджет - "гаджет быстрого ввода пароля".

Может кто-то из умельцев за деньги реализует мой проект?

Я написал ТЗ тут.

http://bit.ly/2XoDfMG

 

reodos
Offline
Зарегистрирован: 24.07.2016

Я думаю питания будет достаточно от управляемого уст-ва по USB. Минимальность размеров будет ограничена самой клавиатурой. Делал себе подобную штуку, реализовал меню выводом в любое текстовое поле на экране управляемого устройства. Пока паролей мало, все управление происходит 1 кнопкой. Есть варианты поставить малкнький олед дисплей для меню и управление энкодером. Где вы прживаете, и какие сроки исполнения? На данный момент нет необходимых компонентов для сборки.

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

JuraPal, я использую вот такой пульт

самодельный Digispark + tsop4838 на скриншоте выше.

Данное устройство работает даже на смартфонах с поддержкой OTG.

JuraPal
Offline
Зарегистрирован: 06.07.2019

Прикольно. У меня такие пульты где то валяются.

И как это у вас работает ?

Как Вы в пульт записыватете пароли ? Как их передаете на ПК по USB ?

JuraPal
Offline
Зарегистрирован: 06.07.2019

Подскажите сложно ли сделать гаджет на базе ардуины который вставляется в разрыв клавиатуры USB принимает все нажатия и передает их на ПК ?

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

В пульт ничего не записывается.

В принципе нужны 3 вещи - данный пульт Digispark tsop4838

tsop4838 припаивается к Digispark вот так

и туда прошивается программа которая и будет отслеживать сигналы с пульта

Работает всё по образу беспроводной клавиатуры.

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

Если руки у Вас дойдут до сборки, то скечем поделиться могу.

Digispark прошивается тем же Arduino IDE

Как запихать скетч в Digispark  - инструкций полно на просторах интернета.

reodos
Offline
Зарегистрирован: 24.07.2016

vvgnovanet пишет:

Если руки у Вас дойдут до сборки, то скечем поделиться могу.

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

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

Ссылочка на архив https://yadi.sk/d/xX1VWHbvgAVBUw

Там вложена библиотека TrinketHidCombo

**************** в скетче нужно заменить на пароли

ну и по остальному там можно разобраться и самому.

Ps: и не забываем сказать спасибо dimax !!

JuraPal
Offline
Зарегистрирован: 06.07.2019
Круто. Правельно ли я понял.
 
1. Digispark - это микро контролер на который можно залить скетч также просто как и на ардуину ?
2. tsop4838 - приемник инфрокрасного сигнала от многоих дистанционок ?
3. данный пульт - вместо клавиатуры передает нужную команду гаджету (набазе Digispark + tsop4838)
4. Сам гаджет "Digispark+tsop4838" может выстапать аналогично USB клавиатура ?
5. В скетче записано соответсвие некого номера некой строки запроса.
Например так:
- 1="y7dfh&E#u"
- 2="7hgG2627"
- ...
- 999="hN(7wY6%"
 
 
И какой свободный обем памяти под пароли остаеться ?
vvgnovanet
Offline
Зарегистрирован: 28.04.2019

Скетч использует 5494 байт (91%) памяти устройства. Всего доступно 6012 байт.
Глобальные переменные используют 130 байт динамической памяти.

JuraPal, всё верно поняли. + там я ещё управляю просмотром видео  ,музыка,  перемотка, громкость (работает и на youtube)  меняется раскладка клавиатуры

Там под себя можно всё изменить.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

JuraPal пишет:

Подскажите сложно ли сделать гаджет на базе ардуины который вставляется в разрыв клавиатуры USB принимает все нажатия и передает их на ПК ?

Можно сниффить USB шину, и когда будет получен нужный код "напечатать" пароль. Я делал нечто близкое.

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

JuraPal
Offline
Зарегистрирован: 06.07.2019

518 байт остаеться  (6012 - 5494 )

Маловато даже на хранение паролей.

если на пароль 20 байт в среднем (номер пароля и пароль на 8 символов по 2 байта)

т.е. всего получиться записать 25 паролей кроме тех которые уже в скейче просипаны.

vvgnovanet
Offline
Зарегистрирован: 28.04.2019

dimax, можете считать меня параноиком но доверять свои пароли современным програмным менеджерам я как-то не хочу. ))

Да и предприятие у нас действительно ещё то ))