Проверьте, подключен ли Arduino Uno к ПК

Я использую контроллер Arduino Uno

Как можно узнать, подключен ли контроллер к ПК через USB, определить, подключен ли провод, и получить условие для переменной в скетче.

Я попробовал Serial.available(), но не уверен, смогу ли я сделать это следующим образом:

if (Serial.available()) 
{ 
   val = true; 
} 
else 
{ 
   val = false; 
}

Я хочу использовать это условие, чтобы избежать команд setup() по какой-то неожиданной причине в случае, если контроллер питается только от адаптера

, 👍0

Обсуждение

Я не знаю ответа на проблему, но ваш код можно переписать на более короткий и не менее функциональный val = Serial.available();, @Michel Keijzers

вы можете сделать еще одну вещь, например, постоянно отправлять случайные данные через серийный номер. когда arduino подключен к ПК, он получит те же данные от arduino, что указывает на то, что arduino подключен к вашему ПК. С точки зрения приема вы также можете написать скрипт на Python., @Vaibhav


1 ответ


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

1

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

  1. Если вы хотите определить, подключены ли вы через разъем USB или бочонок, вы можете подключить аналоговый контакт к контакту Vin через делитель напряжения (вы должны рассчитать значения так, чтобы вы не превышали 5В на аналоговый пин). Таким образом, если вы обнаружите напряжение выше 6,6 В, вы будете знать, что питаетесь от штекера.

  2. Если вы хотите обнаружить конкретный ПК, вы можете написать на нем ПО, которое сканирует новые порты, затем открывает их и отправляет определенную строку. Если вы получите это сообщение в течение X секунд, значит, вы подключены к ПК.

  3. Если вы хотите определить, подключены ли вы к какому-либо действующему ПК, то, я думаю, вам потребуется изменить программу в Atmega16u2, которая используется в качестве последовательного моста между ними. Я не уверен, возможно это или нет, но я думаю, что Atmega16u2 знает, когда начинается действительный сеанс USB, и поэтому может сообщить Atmega328 эту информацию (через последовательный интерфейс)

,

Это ATMega16u2, а не ATMega32u4, на Arduino UNO. В остальном возможен вариант 3., @Gerben

@ Гербен Я был полностью уверен, что это то же самое, что и на Леонардо .. Отлично, я исправил это в ответе. Спасибо, @frarugi87

А более старые версии использовали ATMega8u2. Начались подделки 8u2 или FTDI, закончились более дешевым CH340G, @KIIV