Управление компьютером при помощи Arduino через USB

Для одного проекта необходимо было сделать управление компьютером при помощи ардуинки. Почитав информацию в интернете нашел, что такое возможно только при помощи Ардуинок с atmega 32u4 или Due. Мне такой вариант не подошел, так как у меня уже была готовая разведенная плата с atmega328, поэтому пришлось искать другой вариант, которым я и хочу с вами поделиться.


Берем любую ардуинку, например Uno и подключаем к ней кнопку (в моем случае один контакт к pin 2, другой к GND

Управление компьютером при помощи Arduino через USB Arduino, USB, Controller, Autoit, Длиннопост

Заливаем прошивку


bool buttonClicked = false;


void setup() {

Serial.begin(9600);

pinMode(2, INPUT_PULLUP);

}


void loop() {

if ((digitalRead(2) == LOW) && (buttonClicked == false)) {

Serial.println("KEY_UP");

buttonClicked = true;

}

if (digitalRead(2) == HIGH) buttonClicked = false;

delay(10);

}


Теперь перейдем к компьютеру.


Качаем и устанавливаем AutoIt https://www.autoitscript.com/site/autoit/


И библиотеку для работы с COM портом http://www.mosaiccgl.co.uk/AutoItDownloads/confirm.php?get=C...


Создаем примитивное фоновое приложение


#include <CommMG.au3>

$err = 1

_CommSetPort(5, $err)

_CommPortConnection()

While 1

$key = _CommGetLine()

$key = StringReplace($key, @LF, "")

$key = StringReplace($key, @CR, "")

if ($key = "KEY_UP") then Send("{UP}")

WEnd


В строке _CommSetPort(5, $err) 5 - заменить на номер соответствующего COM порта, на котором висит ардуинка


Теперь по нажатию кнопки подключенной к Arduino у нас на компьютере будет эмулироваться нажатие кнопки ВВЕРХ в любом окне, даже в играх.


Таким образом эмулировать можно нажатие любой кнопки, комбинации кнопок, движение мышки и все, что вам будет угодно.

Arduino & Pi

1.4K поста20.6K подписчика

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

Вы смотрите срез комментариев. Показать все
Автор поста оценил этот комментарий

Хм.. А это точно будет работать ? Разве на ардуино есть преобразоватьель уровней из TTL -> RS-232 ? Да и дребезг контактов не мешало бы устранить. Хотя бы простой RC цепочкой, хотя это и не совсем корректно. А то вместо одного нажатия вполне реально и несколько получить (зависит от скорости RS-232).

раскрыть ветку (6)
Автор поста оценил этот комментарий

На Uno есть, на Pro Mini для этого можно использовать дополнительный конвертер CP2102. Подтяжка есть программная pinMode(2, INPUT_PULLUP);

раскрыть ветку (5)
Автор поста оценил этот комментарий

Если вы про подтяжку сказали в ответ на мой вопрос про дребезг, то к сожалению без схемы данный ответ не информативен. При скорости 9600 бод думаю дребезг не так страшен, вернее совсем не страшен.... Просто я когда UART запускал на скорости 12_000_000 бод (через виртуальный COM на микросхеме FDTI) столкнулся с дребезгом.

раскрыть ветку (4)
Автор поста оценил этот комментарий

ардуинщеки почему-то любят дребезг программно убирать. а преобразователь на большинстве есть, нету промини, мб еще на каких-то

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Да я и на FPGA то-же убираю дребезг при помощи кода. При 10к логических ячеек, 33 ячейки не страшно потратить на это дело. И никаких резисторов с конденсатами ставить не надо. Я вообще не очень уважаю Arduino, хотя это и хорошая платформа с крайне низким порогом вхождения, идеально подходящая  для школьников. Но для обучения штука очень коварная, поскольку привыкнув к сторонним библиотекам, часто сложно перейти на что-то серьезное, где требуется знание матчасти.

Вот к примеру у меня была недавно задачка: управление платой с FPGA через UART. При этом принятый байт по UART в одном случае должен восприниматься как рабочие данные,  и плата должна была обработать этот байт. А  в другом случае, такой-же байт мог означать команду, при получении которой плата начала выполнять что-то не связанное с приёмом данных.

Например байт "1111_0000" - это команда , что надо зажечь светодиод.

В то-же время "1111_0000" мог быть и рабочими данными, и плата должна была определенным образом их обработать. При этом линии RTS и CTS физически отсутствовали на плате.

раскрыть ветку (1)
DELETED
Автор поста оценил этот комментарий

Мне очень интересно, как же отделить 0xF0 данных от 0xF0 командного, если конечно это единственное, что передавалось за сеанс без дополнительных инструкций.

Автор поста оценил этот комментарий

есть библиотека устранения дребезга.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку