Давно заприметил у Адафрута адаптированную библу V-USB под дижиспарк с довольно широкими возможностями. Захотелось такое-же, но для УНО. Сегодня перенастроил их библу, подойдёт для любых 16Мгц ардуин на м.к. мега328.
Что она даёт: можно эмулировать мультимедия клавиатуру, регулировать аппаратно (без драйверов) громкость, плей-пауза-муте, и ещё с десяток спец. клавиш. Можно эмулировать обычную клавиатуру. Эмулировать нажатие до 5 клавиш одновременно, печатать одиночные символы, печатать текст как командой print/println. Так-же можно эмулировать мышь, -двигать курсор, нажимать любую из 3х клавиш.
Аппаратные требования: отъедает одно прерывание (в библе настроено на INT0) + ещё пару пинов. Один из которых служит для внешнего PULL_UP, за счёт этого драйвер программно может включать/отключать USB. Нельзя тормозить loop, там есть функция, которую нужно запускать не реже 1 раза в 10 мс. Для согласования уровней USB и 5v TTL можно применить такую схему:

Либо можно просто запитать Vcc ардуино от напряжения 3,3 ..3,6 вольта и подключить напрямую. Библа. Скетч с примерами работы разных функций:
01 | #include "TrinketHidCombo.h" |
06 | TrinketHidCombo.begin(); |
08 | pinMode(12, INPUT_PULLUP); |
09 | pinMode(11, INPUT_PULLUP); |
10 | pinMode(10, INPUT_PULLUP); |
11 | pinMode(9, INPUT_PULLUP); |
12 | pinMode(8, INPUT_PULLUP); |
16 | TrinketHidCombo.poll(); |
19 | if (digitalRead(12) == LOW) { while (digitalRead(12) == LOW); |
20 | TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP); |
24 | if (digitalRead(11) == LOW) { while (digitalRead(11) == LOW); |
25 | TrinketHidCombo.mouseMove(5,5,0); |
29 | if (digitalRead(10) == LOW) { while (digitalRead(10) == LOW); |
30 | TrinketHidCombo.pressKey(0, KEYCODE_H,KEYCODE_E,KEYCODE_L,KEYCODE_O); |
31 | TrinketHidCombo.pressKey(0, 0); |
35 | if (digitalRead(9) == LOW) { while (digitalRead(9) == LOW); |
36 | TrinketHidCombo.typeChar(0x41); |
40 | if (digitalRead(8) == LOW) { while (digitalRead(8) == LOW); |
41 | TrinketHidCombo.print( "Hello, World!" ); |
Если цикл while(digitalRead(12) == LOW) будет крутиться до отпускания клавиши, то как TrinketHidCombo.poll(); не реже 1 раза в 10мс будет выполняться.
нужно воткнуть DigiUSB.delay(1); в цикл - иначе клава отвалится.
но, как нажимать более одной кнопки - не понятно.
dimax, а это точно нужно, если это задано в usbconfig.h ?
тем более, что как минимум один из них всегда не INPUT ?
03
pinMode(4,INPUT);
//USB d- (белый) PORT D4 задан в usbconfig.h
04
pinMode(2,INPUT);
// USB d+ (зелёный) PORT D2 задан в usbconfig.h
Если цикл while(digitalRead(12) == LOW) будет крутиться до отпускания клавиши, то как TrinketHidCombo.poll(); не реже 1 раза в 10мс будет выполняться.
Да, самому не понравилось. Я осознанно нарушил, не хотелось городить огород в примере синтаксиса совсем другой функции. Пробовал держать кнопку долго - USB как ни странно не отваливается. В моём случае никаких кнопок в дальнейшем не предпологалось, поэтому так и оставил.
Клапауций 322, нет конечно, просто как описание используемых ног :) А DigiUSB.delay() в этой библе по моему нет..
Пробовал держать кнопку долго - USB как ни странно не отваливается.
т.е. печатает, пока не отпустишь кнопку
TrinketHidCombo.print(
"Hello, World!"
);
// напечатать Hello, World!
или один раз?
DigiUSB.delay() в этой библе по моему нет..
зато, есть
delay(1);
//паузу можно убрать
если можно убрать, то должно быть где-то в библиотеке - иначе протокол VUSB сожрёт всё время МК и он не будет иметь ресурсов отвечать хосту компьютера.
в библиотеке клавы Дижиспарка есть DigiKeyboard.delay();
Клапауций 322, с while выполнится один раз, ведь кнопку нужно отпустить для выхода из цикла. А когда loop останавливался из-за цикла while при удерживании нажатой кнопки, то почему-то USB не отваливался, хотя по идее должен был.
Клапауций 322, с while выполнится один раз, ведь кнопку нужно отпустить для выхода из цикла.
спасибо, разобрался.
А когда loop останавливался из-за цикла while при удерживании нажатой кнопки, то почему-то USB не отваливался, хотя по идее должен был.
аналогично - проверил: не отваливается, но забраковал конструкцию - не должно нажатие кнопки останавливать работу всего. разве, что использовать как СТОП-КРАН именно для остановки всего.
01
#include <DigiUSB.h>
02
03
void
setup
() {
04
DigiUSB.begin();
05
pinMode(3, INPUT);
06
digitalWrite(3, HIGH);
07
}
08
09
void
loop
() {
10
if
(digitalRead(3) == 0) {
11
while
(digitalRead(3) == 0);
// подождать пока кнопку отпустят
12
DigiUSB.print(
"0"
);
13
}
14
DigiUSB.delay(1);
15
}
То что искал ! Спасибо топикстартеру !
Вот если-бы добавить пару-тройку крутилок-енкодеров, то это-бы для меня был новогодний подарок ! :)
Друзья, помогите чайнику ))
Вот если-бы добавить пару-тройку крутилок-енкодеров, то это-бы для меня был новогодний подарок ! :)
http://www.pjrc.com/teensy/td_libs_Encoder.html
очень полезный пост. добавлю и свои 3 копейки:
1. переход с регистра B на D посредством редактирования хедера произошел не полностью - в TrinketHidComboC.c:49 сохранился захардкоденный B:
1
void
usbBegin()
2
{
3
cli();
4
5
// run at full speed, because Trinket defaults to 8MHz for low voltage compatibility reasons
6
clock_prescale_set(clock_div_1);
7
8
// fake a disconnect to force the computer to re-enumerate
9
PORTB &= ~(_BV(USB_CFG_DMINUS_BIT) | _BV(USB_CFG_DPLUS_BIT));
// bug
2. по причине отсутствия стабилитронов 3.6 в использовал альтернативную схему подключения с 2-мя понижающими диодами в цепи питания. оказалось что усб работает и с одним, а то UNO с двумя диодами не работал. вместо стабилитронов использовал также синии светодиодики - у них падение напряжения 3.5в - очень прикольно моргают во время сеанса. горят ярко - поэтому вообщето надо пожалеть дуню и включать их через резистор 200 ом хотя бы.
3. нашел более устойчивую и профессиональную реализацию библиотеки HID на той же основе v-usb:
http://rayshobby.net/hid-class-usb-serial-communication-for-avrs-using-v...
после подкручивания значений пинов работала очень надежно - правда потом я что-то испортил в процессе "улучшения".
4. усб запускается с 3-го а иногда и с 10-го раза. поэтому очень помогает применить ватч-дога wdt чтобы дуня сама через 8 секунд перегружалась.
А подскажите, как заставить ардуину вводить в комп великие и могучие русские буквы? У русских букв коды начинаются от 192.
SeregaSher, если вопрос в свете обсуждаемого эмулятора -то клавиатура в принципе не может отличить на каком языке вы печатаете. Для перехода на русский нужно предварительно включить соответсвующий хоткей, определённый операционной системой.
dimax, спасибо за проделанную работу. На компьютере всё отлично работает. К сожалению, собранное устройство не определяется на Андроиде, ради которого я собственно и начал этим заниматься. Есть соображения, с чем это может быть связано?
webprog, на андроиде работает 100% - самолично проверял и на смартфоне и на планшете.
dimax, действительно, сейчас начал проверять на SGS6 - работает, а на Note никак. Реальные устройства, в том числе мышка с клавиатурой с одним адаптером работают нормально. Буду разбираться...
я хотел бы узнать , можноли использовать стабитроны на 3.3 В вместо 3.6 В
mr.robot, не желательно. Уровни там конечно 3,3вольта, но стабилитрон на 3,6 что бы не подрезать уровень входящих сигналов от хоста. В самом крайнем случае можно взять стабилитроны на 3,3.
спасибо большое
а то у меня при подключении комп выписывает ошибку
Всё подключил по схеме, запитал VCC Arduino pro mini 3,6В с БП. Стабилизаторы не подключал. Скетч залил, при подключении к компьютеру никакой реакции. Может есть ещё какие подводные камни? На что стоит обратить внимание?
Здравствуйте, подскажите варианты схем, если нет стабилитронов, а то три резистора, не пойму как с ними быть. Да вопрос тупой понимаю, вот ниже парень говорит про диоды понижающие, а потмом речь идет про светодиоды, путает(запутал, те он использовал и диоды и светодиоды). Из всего написанного я так понял, можно либо взять источник питания сразу на 3,3, тогда что значит подключить на прямую(резистор хоть один останется? как их там между собой соединять )? Другой вариант - использовать только резисторы со светодиодом, чтобы понизить выходной сигнал 5V до 3.6 - может ктонить показать примитивную схему последнего варианта?
На руках имеется Arduino Pro Mini 3.3V, 8MHz, какую схему реализовывать на ней. Путает меня соединение с 4 и 5 цифрового порта .
очень полезный пост. добавлю и свои 3 копейки:
1. переход с регистра B на D посредством редактирования хедера произошел не полностью - в TrinketHidComboC.c:49 сохранился захардкоденный B:
1
void
usbBegin()
2
{
3
cli();
4
5
// run at full speed, because Trinket defaults to 8MHz for low voltage compatibility reasons
6
clock_prescale_set(clock_div_1);
7
8
// fake a disconnect to force the computer to re-enumerate
9
PORTB &= ~(_BV(USB_CFG_DMINUS_BIT) | _BV(USB_CFG_DPLUS_BIT));
// bug
2. по причине отсутствия стабилитронов 3.6 в использовал альтернативную схему подключения с 2-мя понижающими диодами в цепи питания. оказалось что усб работает и с одним, а то UNO с двумя диодами не работал. вместо стабилитронов использовал также синии светодиодики - у них падение напряжения 3.5в - очень прикольно моргают во время сеанса. горят ярко - поэтому вообщето надо пожалеть дуню и включать их через резистор 200 ом хотя бы.
3. нашел более устойчивую и профессиональную реализацию библиотеки HID на той же основе v-usb:
http://rayshobby.net/hid-class-usb-serial-communication-for-avrs-using-v...
после подкручивания значений пинов работала очень надежно - правда потом я что-то испортил в процессе "улучшения".
4. усб запускается с 3-го а иногда и с 10-го раза. поэтому очень помогает применить ватч-дога wdt чтобы дуня сама через 8 секунд перегружалась.
На руках имеется Arduino Pro Mini 3.3V, 8MHz, какую схему реализовывать на ней.
Максимально внимательно перечитайте 2 строчку топика.
Спасибо, я видел ее, думал, может уже, что изменилось
Хотел бы спросить , если можно стабилитроны заменить на связку светодиод-резистор для получения 3,6 В, подскажите пожалуйста, как должна выглядеть схема в конечном виде, мне просто абсолютно не понятна развяка 3х цифровых портов Ардуины и 2x каналов usb D+ и D-
На руках имеется Arduino Pro Mini 3.3V, 8MHz, какую схему реализовывать на ней.
Максимально внимательно перечитайте 2 строчку топика.
zert, про светодиоды это было личное мнение товарища az3749. Я это не одобряю, во избежание глюков не стоит ничего менять в схеме подключения. Стабилитроны есть в любом радиомагазине.
zert, про светодиоды это было личное мнение товарища az3749. Я это не одобряю, во избежание глюков не стоит ничего менять в схеме подключения. Стабилитроны есть в любом радиомагазине.
Спасибо, за столь оперативный ответ, очень важное для меня замечание(не буду городить сарай). Я знаю, что это ходовой товар, уже заказал с Алиэкспресса, но руки чешутся уже сейчас, плохо, что радио магазинов и в помине нет, там где я живу.
Простите, быть может за глупый вопрос, будет ли данная библиотека работать на atmega8 с внешним кварцем 16Mzh?
Здравствуйте. Подскажите пожалуйста можно ли как нибуть переместить курсор указав абсолютные координаты а не относительные? Тоесть не на сколько пикселей сдвинутся курсору а на какие именно перейти.
Можно.
Нужно взять текущие координаты, вычесть их из требуемых абсолютных и полученные значения указать в качестве смещения курсора.
В данный момент так и делаю. Но в таком случае нужно знать начальные координаты перед подключением ардуинки к ПК.
Естественно.
Будет если кое-что подправить.
Здравствуйте, подскажите варианты схем, если нет стабилитронов, а то три резистора, не пойму как с ними быть. Да вопрос тупой понимаю, вот ниже парень говорит про диоды понижающие, а потмом речь идет про светодиоды, путает(запутал, те он использовал и диоды и светодиоды). Из всего написанного я так понял, можно либо взять источник питания сразу на 3,3, тогда что значит подключить на прямую(резистор хоть один останется? как их там между собой соединять )? Другой вариант - использовать только резисторы со светодиодом, чтобы понизить выходной сигнал 5V до 3.6 - может ктонить показать примитивную схему последнего варианта?
На руках имеется Arduino Pro Mini 3.3V, 8MHz, какую схему реализовывать на ней. Путает меня соединение с 4 и 5 цифрового порта .
Походу, при выкидывании стабилитронов, резисторы нужно оставить все.
Нашел на просторах интернета такую схему:
Источник:https://www.obdev.at/products/vusb/index.html
Тоже интересует вопрос - реально ли завести библиотеку на atmega8a? Хочется сделать пульт для станочка, а голые МК только atmega8а и atmega128. Хотелось бы еще и без кварца завести, но можно поставить если без него никак (есть и на 12МГц и на 16МГц).
можно без кварца, от внутреннего генератора на 8 МГц. (AtMega8)
можно без кварца, от внутреннего генератора на 8 МГц. (AtMega8)
Атмега конечно будет и без кварца работать, а вместе со скетчем проверяли? если нет, то не пишите коментариев, вводящих в заблуждение. Если пробовали, то напишите как адаптировали скетч
nevkon, библиотеку можно переделать почти под любые м.к. AVR, но она не ардуино-френдли, со всеми вытекающими последствиями. Так что проще купить мегу328, чем тратить многие часы(а то и дни) в тщетных попытках разобраться:)
Ок. Конкретно эта биб-ка на 8 Мгц без кварца не работает. Уйню-с сморозил-с. Прошу простить.
ок, коллеги, а для чего вообще это надо - клаву эмулировать? Что-то у меня фантазии не хватает. Поделитесь примерами, а то может и мне надо, а я сижу...
b707, дисташка для компа, внешние мультимедия регуляторы, перебиратели паролей, автоматические кликеры для заработка в инете, итп :)
Ну я планирую сделать девайс, нажимающий клавишу "B" на клавиатуре при открытии дверей в каптерку. Клавиша "B" (BOSS) в некоторых видеоплеерах останавливает воспроизведение и сворачивает плеер). Но можно например сделать девайс вводящий сложные пароли при нажатии соответствующих кнопок на ардуине, своеобразный хранитель паролей. Видел видео, там чел эмулировал движение мыши на 2 пикселя туда-сюда, чтоб экран не блокировался на работе. Можео макросы загнать. Можно над колегами подшутить, написать беспорядочное движении мыши по таймеру, да куча всяких вариантов. Проект полезный.
b707, дисташка для компа, внешние мультимедия регуляторы, перебиратели паролей, автоматические кликеры для заработка в инете, итп :)
Для перебирателя паролей нужно обратную связь придумать, чтоб знать когда угадал а когда нет.
Тоже интересует вопрос - реально ли завести библиотеку на atmega8a? Хочется сделать пульт для станочка, а голые МК только atmega8а и atmega128. Хотелось бы еще и без кварца завести, но можно поставить если без него никак (есть и на 12МГц и на 16МГц).
Цитата со статьи:"Для USB-совместимого низкоскоростного устройства необходимо декодировать бит потока 1,5 Мбит / с. Для процессора с тактовой частотой 12 МГц это означает, что у нас есть 8 циклов процессора для каждого бита. Будучи RISC-процессором, AVR выполняет большинство инструкций за один такт. Это дает нам примерно 8 инструкций для выполнения следующих операций над каждым битом:"
Источник:https://www.obdev.at/articles/implementing-usb-1.1-in-firmware.html
Я думаю 8 МГц маловато будет.
ок, коллеги, а для чего вообще это надо - клаву эмулировать? Что-то у меня фантазии не хватает. Поделитесь примерами, а то может и мне надо, а я сижу...
Проекты на основе V-USB
reodos, на дижиспарке эта библа как известно работает без кварца, но там тактовую 16МГц поддерживает встроенный RC-генератор, плюс при старте запускается специальная функция, которая подстраивает регистр osccal синхронизируясь от клоков USB. Собссно из-за этого дижиспарк и глюкавый :)
PS: Вообще эта тема создавалась в 2015 году, когда не было дешевых плат на чипах mega32U4, сейчас нет смысла городить на меге328, гораздо удобнее взять промикро или прочие леонардо-образные платы. Благо под них есть шикарная библиотека, которая может вообще всё. Ссылка на всякий случай.
dimax, полностью согласен, но дело в том что мне китайцы по ошибке прислали 10 штук промини на меге 328, поэтому мне эта тема актуальна ). Ну и мало ли еще есть люди у которых есть запасы мег328 и лень покупать чтото другое )
Приветствую завсегдатаев!
Неожиданно возникла нужда сделать эмулятор нажатия ЛКМ, нагуглилась эта тема.
Ардуины лежат в ящике года 2, заниматься некогда, опыт на задворках.
Потому прошу подсказать на два вопроса:
1. Можно ли питание +5 юсб подать через кренку 1117, а дата-линии шунтировать светодиодами, дабы стабилитроны не разыскивать?
2. Если я повешу на кнопку ардуины кнопку мыши и стану удерживать на ардуине кнопку нажатой - будет ли это создавать многочисленные нажатия мышки?
Спасибо!
UPD: увидел что кренка вообще не нужна... =) остальные вопросы актуальны, особенно второй =)
Ну так нажатие и удержание кнопки и многочисленные нажатия это разные вещи.
Лучше купить стабилитроны и не париться с вопросом. Благо стоит копеек даже в местных магазинах.
Ок. Переформулирую вопрос:
Мне нужно, чтобы пока я держу нажатой кнопку ардуины, она отправляла многократные нажатия мышью.
Эта библиотека мне пригодится для моих целей?
Про стабилитроны согласен. Только я бы перенёс резисторы 68 ом вправо от точек подключения стабилитронов (по схеме в стартовом сообщении).
Помогите пожалуйста, не могу скомпилировать скетч. Скачал "Библу" по ссылке вверху. Создал новый скетч и вставил код из примера вверху. Распаковал содержимое TrinketHidCombo_MEGA328 в папку со скетчем. Но при попытки компиляции выдает ошибку:
In file included from sketch/TrinketHidComboC.c:26:0:
sketch/usbdrv/usbdrv.h:12:23: fatal error: usbconfig.h: No such file or directory
compilation terminated.
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
Помогите пожалуйста, не могу скомпилировать скетч. Скачал "Библу" по ссылке вверху. Создал новый скетч и вставил код из примера вверху. Распаковал содержимое TrinketHidCombo_MEGA328 в папку со скетчем. Но при попытки компиляции выдает ошибку:
In file included from sketch/TrinketHidComboC.c:26:0:
sketch/usbdrv/usbdrv.h:12:23: fatal error: usbconfig.h: No such file or directory
compilation terminated.
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
В папке usbdrv нет файла usbconfig.h, но он есть выше, припопытке скопировать его в папку usbdrv и повторной компиляции выдает:
In file included from /home/vladimir/.arduino15/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2/avr/include/avr/io.h:99:0,
from sketch/usbdrv/usbportability.h:120,
from sketch/usbdrv/usbdrvasm.S:18,
from sketch/usbdrvasm_includer.S:24:
sketch/usbdrv/usbdrv.h:615:33: error: operator '*' has no left operand
# define USB_INTR_PENDING EIFR
^
sketch/usbdrv/usbdrvasm.S:73:5: note: in expansion of macro 'USB_INTR_PENDING'
#if USB_INTR_PENDING < 0x40 /* This is an I/O address, use in and out */
^
In file included from sketch/usbdrvasm_includer.S:24:0:
sketch/usbdrv/usbdrvasm.S:384:34: fatal error: usbdrvasm16.inc: No such file or directory
compilation terminated.
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
[quote=Vladi-mir
[/quote]