Добрый день!
Можно ли определять при помощи ардуинки наличие USB соединения с ПК? Т.е. подключили к usb ардуину и, если usb соединение установлено, зажигать светодиод.
Сейчас для этого используем мышь - человек подключает её к хабу и смотрит на экран движется ли курсор, что говорит ему об успешном usb-соединении. Следующее что пришло в голову - подключать ардуино на AT32U4 чтобы ардуина сама двигала курсор. Это я уже реализовал.
Теперь же хочется обойтись совсем без экрана. Можно, конечно, запустить на ПК скрипт на python, который будет срать во все com-порты какие-то сообщения, которые ардуинка распознает, но хочется обойтись чисто хардварным решением без выполнения скриптов на ПК. Я ведь понимаю что если уж мышь на ардуине работает, то микроконтроллер уже договорился с устройством. Вот эту договорённость было бы неплохо подсветить.
В Ардуине для решения подобной задачи служит конструкция
if(Serial)
но она работает только на Ардуинках с нативным USB.
кто должен определять?
ардуино, что ее подключили к порту?
или комп что к нему подключили ардуино?
или вообще человек?
С такой конструкцией светодиод загорается только если запущена arduino ide. Возможно это как то обойти?
const int stopButton = 4;
const int led = 2;
void setup() {
pinMode(stopButton, INPUT_PULLUP);
pinMode(led, OUTPUT);
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
}
void loop() {
if(Serial){
digitalWrite(led, HIGH);
}
//digitalWrite(led, LOW);
}
Есть устройство - монитор, у которого есть usb-хаб. Инспектор должен понять функционирует ли шина usb на этом устройстве.
Для этого предполагаю смастерить свисток, который будет явно отображать наличие установленного usb соединения
че тут обходить, порт открыт в IDE, откроете любыми другими прогами тоже будет светится.
А Ардуино то тут при чем?
Разбирайтесь, как работает диспетчер устройств.
соединение, оно как согласие - есть продукт при полном непротивлении сторон!
Понятно.
if(Serial) не будет работать т.к. нужно обязательно открывать соединение - подключаем другой хаб к ПК, com порт сменился и всё сломалось.
Другого пути получить информацию об успешном соединении в arduino нет?
Еще раз: зачем в этой задаче вообще Ардуино?
Задача решается программно внутри ПК.
Вы определитесь, что такое успешное соединение.
На мой взгляд, это возможность принимать/передавать данные. Если так - ничего не сломалось. Если к порту ничего не подключено, соответственно, нет и “успешного соединения” т.к. не с кем.
Надо прочитать состояние configured()
на стороне МК …
Микроконтроллер тут чтобы избавиться от ПК в том числе. Если микроконтроллер установил соединение по usb, то не важно что за устройство подключено с другой стороны - ПК, ТВ приставка, смартфон, блютус колонка.
Дело не в ардуине как таковой, а в желании сделать самостоятельное устройство при помощи которого можно без костылей проверить usb-разъём на любом устройстве.
Ардуина - начало пути.
Успешное соединение на мой взгляд это то что происходит задолго до того как инициализируется ком порт - сам протокол USB.
Вот например та же эмуляция мыши посредством arduino pro micro на 32U4. 32U4 сказала устройству что она - мышь, устройство сказало OK, “пожали руки” и начали обмениваться пакетами.
Вот уже на этапе “рукопожатия” понятно что дата линии usb рабочие. Это ровно то что мне и нужно
Ну так кто мешает взять исходник и вставить фрагмент в нужном конкретно Вам месте?
class USBDevice_
{
public:
USBDevice_();
bool configured();
void attach();
void detach(); // Serial port goes down too...
void poll();
bool wakeupHost(); // returns false, when wakeup cannot be processed
};
extern USBDevice_ USBDevice;
Ваше гугл-фу лучше моего!
В целом это устройство, да еще и за 200р, которые просит автор - отличная штука. Однако я почитал дальше и увидел что там, по сути, проверяется caps-lock, что позволяет делать библиотека HID-Project, что, на текущий момент, закрывает мои потребности.
Народ, спасибо за помощь! Вопрос закрыт
А вот эта ваша мышь - с лампочкой на пузе? Она загорается, когда её в USB тыкаешь?
Хорошая мысля. Часть моих мышей ведут себя именно так как нужно. По сути, даже дешевле чем ардуинка обходится, только съёмный кабель приколхозить.
Ниже итоговый код моего устройства. Осталось корпуса замоделить и напечатать
#include "HID-Project.h"
const int pinLed = 2;
void setup() {
pinMode(pinLed, OUTPUT);
// Sends a clean report to the host. This is important on any Arduino type.
BootKeyboard.begin();
}
void loop() {
if (BootKeyboard.getLeds() & LED_CAPS_LOCK) {
digitalWrite(pinLed, HIGH);
BootKeyboard.write(KEY_CAPS_LOCK);
delay(1500);}
else {
digitalWrite(pinLed, LOW);
BootKeyboard.write(KEY_CAPS_LOCK);
delay(10);
}
// Simple debounce
delay(30);
}