Сквозной порт для USB-мыши

В настоящее время я занимаюсь исследованием своего проекта. Моя цель проста: я хочу передать ввод от физической мыши на микрокомпьютер для обработки ввода и изменения, а также отправить ввод в виде USB HID на ПК.

Мышь ---> Микрокомпьютер (измененный ввод) ---> ПК

Микрокомпьютер предпочтительно должен иметь возможность как отправлять данные на ПК (в виде входов USB HID в качестве мыши), так и получать данные с ПК.

Я обнаружил, что Arduino Leonardo может работать как ведомое устройство USB и эмулировать движение мыши, что составляет половину того, что мне нужно. Мне нужен микрокомпьютер, способный работать как USB-хост, так и USB-ведомый. У меня нет опыта работы с микрокомпьютерами, и я не знаю, как найти что-то с этой функцией.

, 👍1

Обсуждение

Хотите иметь возможность изменять настройки мыши с компьютера? Можете ли вы объяснить, что вы хотите изменить? Скорость мыши? Можно ли это сделать на компьютере со специальным драйвером? Какая операционная система?, @Jot

Я хочу, чтобы компьютер посредника мог изменять входные данные для основного ПК на основе данных с основного ПК. Для того, что мне нужно, достаточно простого файлового канала или чего-то в этом роде. Я предполагаю, что это возможно с USB-контроллером в ведомом режиме, потому что я видел программные элементы управления RGB-клавиатурой и т. Д. Однако в этом случае мне не нужен доступ к мыши., @James Meas

Что вы хотите изменить? Скорость мыши? Кнопки? Автоповтор?, @Jot

Я хочу переместить физическую мышь, изменить движение в моем микрокомпьютере (например, умножить координаты на два), а затем отправить его на ПК (микрокомпьютер будет действовать как виртуальный HID)., @James Meas

Я не уверен, что это сработает. Мышь не знает координат. Если это возможно, то это можно сделать и на компьютере с Linux без Arduino. Я согласен с ответом @gdsports, прикрепите защитный экран USB-хоста., @Jot

Даже в инкрементальном режиме сообщаемые приращения могут быть умножены., @Chris Stratton


2 ответа


Лучший ответ:

-1

Наиболее простым решением этой проблемы было бы использование MCU с двумя интерфейсами USB, один из которых может быть USB-хостом. В линейке STM32F4 есть несколько таких деталей, а также, вероятно, других брендов, но не сразу ясно, есть ли какие-либо с существующей поддержкой Arduino. Что касается аппаратного обеспечения, я считаю, что вы можете сделать это с помощью недорогой платы STM32F446 "Nucleo", хотя контакты интерфейса USB доступны только на разъемах, которые вам нужно будет подключить к разъемам USB.

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

Одна из самых простых вещей, которые вы могли бы сделать, — это использовать мышь PS/2 вместо USB и подключить ее к простому последовательному интерфейсу. Затем вы можете использовать плату, такую как Leonardo или одну из серии Teensy, которая имеет настраиваемый интерфейс USB-устройства, для представления на хост-компьютере USB-мыши.

,

Я думал об использовании пи в качестве USB-хоста, а затем передавать координаты через GPIO на ведомое устройство Arduino. Но я чувствую, что будет задержка ввода., @James Meas

Мне нравится nucleo как вариант, я просто беспокоюсь, что это может быть слишком сложно для меня, чтобы понять, и я не думаю, что у меня есть надлежащие инструменты, чтобы припаять разъем для usb (я никогда не покупал маленький компьютер как это раньше)., @James Meas

Интеграция прошивки действительно будет сложной задачей — хотя примеры гораздо более функциональны, они также гораздо менее готовы к работе, чем код Arduino. Что касается подключения USB-порта, то я взял дешевый удлинительный кабель USB, разрезал его пополам и обжал штыри разъема, чтобы подключить его к разъемам расширения платы (хотя будьте осторожны, цветовой код в дешевом USB кабелей обычно совершенно неправильно!). Все эти навыки стоит освоить, но каждый требует времени. Если это первый раз, вы, вероятно, захотите использовать хост-шилд или мышь ps/2, где вы можете оставаться исключительно Arduino., @Chris Stratton

спасибо за голову. Во время просмотра Adafruit я нашел симпатичную маленькую плату, Trinket M0, которую я могу соединить с хост-контроллером USB. https://github.com/gdsports/usb-metamorph/blob/master/README.md Я нашел этот репозиторий github, в котором много информации о USB и прочем. Я даже не уверен, о чем репозиторий, я просто просмотрел его, но безделушка m0 с хост-шилдом USB выглядит многообещающе., @James Meas

Хм, хотя эта комбинация может сработать, я беспокоюсь, что это может привести к худшему из обоих миров; нетипичная, только платформа квази-Arduino M0 и непрямая защита хоста., @Chris Stratton

Ядро кажется моим лучшим выбором. Как мне исследовать это дальше? На что следует обратить внимание, чтобы определить, способен ли компьютер работать в качестве устройства и хоста? Мне непонятно, что я ищу в даташитах и т.д. Спасибо., @James Meas

У аппаратного обеспечения есть функциональность, проблема заключается в том, что вам нужно будет выполнить много нетривиальной программной работы, в лучшем случае вам придется объединить два полных примера проектов, выяснить семантику передачи между ними, спорить компилятор более непосредственно и т. д. Определенно стоит затраченных усилий, если вы создаете продукт, менее понятный для одноразового использования и, вероятно, нет, если вы не знакомы с такими задачами. Что бы вы ни выбрали, начните с того, что каждый из хост-мыши и эмуляции мыши будет работать независимо., @Chris Stratton

Хорошо спасибо. Похоже, мне нужно будет на самом деле заказать устройство и немного повозиться с ним. Мне просто интересно, как я могу определить, какой компьютер имеет какие функции USB. Как вы узнали, что у Nucleo есть этот функционал? Было ли это через техническое описание SoC или что-то еще? Я, вероятно, закажу leonardo или что-то еще с тем же SoC, просто чтобы начать эмуляцию устройства (т.е. ведомое устройство, работающее как USB HID)., @James Meas

Итак, я нашел это: http://www.st.com/en/microcontrollers/stm32f446.html?querycriteria=productId=LN1875 Мы видим, что в разделе USB есть две записи: «USB OTG FS и USB OTG FS/HS». , так что я предполагаю, что это говорит о том, что есть два usb-контроллера, способных работать в режиме OTG. Это верно?, @James Meas

Я знаю, что уже много спрашивал, но как мне отличить USB-порты от USB-контроллера? Насколько я понимаю, это правда, что один хост может иметь много портов, а несколько портов не обязательно означают несколько контроллеров., @James Meas

Я не помнил, чтобы оба были способны к хосту, но это может быть так. Данная функция USB может поддерживать только одно соединение, мультиплексирование возможно только путем вставки концентраторов, что не является усложнением, которое вы, вероятно, хотели бы здесь., @Chris Stratton


2

Подключите USB Host Shield к Leonardo.

USB-мышь --- USB Host Shield --- Leonardo --- ПК

Библиотека USB Host Shield

Проект Circuits@Home

/*
* Проход через USB-мышь. Работает на уровне отчета HID. Отчет HID не декодируется.
* Протестировано на Leonardo с хост-шилдом Arduino USB, IDE 1.8.5 и Logitech Marble.
* трекбол/мышь. Это доказательство концепции, поэтому не гарантируется работа с
* все USB-мыши/трекболы.
*/
// Хост-мышь USB из библиотеки USB Host Shield. Установить с помощью диспетчера библиотек
#include <hidboot.h>

// Библиотека мыши USB-устройства, включенная в Arduino IDE 1.8.5
#include <Mouse.h>

// Удовлетворить IDE, которая также должна видеть статус включения в ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

class MouseRptParser : public MouseReportParser
{
protected:
    void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};

void MouseRptParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
{
  Serial.print("MouseRptParser::Parse");
  // Показать отчет USB HID мыши
  for (uint8_t i = 0; i < len ; i++) {
    Serial.print(' '); Serial.print(buf[i], HEX);
  }
  Serial.println();

  // При ошибке - возврат
  if (buf[2] == 1)
    return;

  if (len > 2) {
    uint8_t mouseRpt[4];
    mouseRpt[0] = buf[0];
    mouseRpt[1] = buf[1];
    mouseRpt[2] = buf[2];
    mouseRpt[3] = 0;
    HID().SendReport(1,mouseRpt,sizeof(mouseRpt));
  }
}

USB     Usb;
HIDBoot<USB_HID_PROTOCOL_MOUSE>    HidMouse(&Usb);

MouseRptParser Prs;

void setup()
{
  Serial.begin( 115200 );
#if !defined(__MIPSEL__)
  while (!Serial) delay(1); // Дождитесь подключения последовательного порта — используется на платах Leonardo, Teensy и других со встроенным последовательным соединением USB CDC
#endif
  Serial.println("Start");

  if (Usb.Init() == -1) {
    Serial.println("USB host shield did not start.");
  }
  delay( 200 );

  HidMouse.SetReportParser(0, &Prs);

  Mouse.begin();
}

void loop()
{
  Usb.Task();
}
,