Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Программирование USB


Автор: Helmet 16.6.2009, 16:20
Добрый день. Даже не знаю как правильно описать возникшую проблему. Постараюсь =)
Необходимо каким-то образом программно отследить подачу напряжения на USB порт. ОС - Windows. Т.е. должна быть программа крутящаяся на винде, которая "слушает" USB порт, и как только на контакты пришло напряжение, произвести некое действие.
Подскажите пожалуйста, реально ли это? Какие есть варианты решения? Какие библиотеки могут помочь в этом?
Я очень далек от программирования на таком низком уровне и из предположений только есть мысль, что надо установить драйвер USB->COM и там уже что-то ловить. Спасибо заранее.

Автор: Mazzi 16.6.2009, 16:53
Без аппаратной части не обойтись. Просто так подавать напряжение на USB порт нельзя, там должны быть информационные посылки.

Автор: Helmet 16.6.2009, 18:34
Mazzi, спасибо за ответ.
А аппаратная часть - это контроллер, да? А есть ли какие-нибудь типовые готовые решения для следующего: самая простейшая кнопка, при нажатии на нее замыкаются 2 контакта. При этом нужно послать какой-нибудь информационный сигнал по USB.

Автор: mr_smit 16.6.2009, 20:16
Цитата

Необходимо каким-то образом программно отследить подачу напряжения на USB порт.


Мне кажется ты не понимаешь что пишешь.

Напряжение на USB разъёме есть всегда, даже при не подключенном устройстве. Возьми вольтметр и замерь, убедись (крайние контакты +/-). Там 5 вольт.

user posted image

Пиши конкретно что надо.

Цитата

...информационный сигнал...

 smile 

Тебе http://forum.vingrad.ru/forum/topic-233737.html как минимум.
Ну или сразу http://forum.vingrad.ru/index.php?showtopic=233737&view=findpost&p=1896660.

Автор: Helmet 17.6.2009, 11:36
mr_smit, правильно, я же сразу сказал, что не разбираюсь в этом, а перелопачивать гору литературы нет времени :(
Задача по сути простая: послать некоторые данные в USB порт, хотя бы 1 байт, чтобы потом программа смогла среагировать на это событие. Желательно обойтись без контроллера. Ведь наверняка можно установить драйвер USB->COM и как то сэмулировать подачу напряжения на одну из ножек порта. Что то я совсем запутался =)

Автор: Mazzi 17.6.2009, 12:00
Цитата(Helmet @ 16.6.2009,  18:34)
Mazzi, спасибо за ответ.
А аппаратная часть - это контроллер, да? А есть ли какие-нибудь типовые готовые решения для следующего: самая простейшая кнопка, при нажатии на нее замыкаются 2 контакта. При этом нужно послать какой-нибудь информационный сигнал по USB.

Простейшее решение для тебя это использовать микросхему CP2102, даташит на которую легко найти в интернете. Эта микросхема - преобразователь USB в UART. Затем подсоединяешь свою кнопку на её выводы RXD и TXD. Устанавливаешь драйвера, после чего у тебя появляется ещё один COM-порт. Затем в этот порт кидаешь байт, и если он через кнопку возвращается тебе назад, значит кнопка замкнута, если не возвращается, значит разомкнута.

Схема во вложении, только кнопку не нарисовал.

Удачи!

Автор: mr_smit 17.6.2009, 12:22
http://www.platan.ru/cgi-bin/qwery_i.pl?code=CP2102
99 руб схемка Mazzi стоит.

Можешь ещё тут почитать:
http://my-avr.at.ua/publ/1-1-0-27

Но для схемы Mazzi нужно драйвера устанавливать, а можно то же самое (для твоего случая) сделать без драйверов. Микросхема которая прикидывается HID устройством и выполняет те же задачи. Только можно: к любому компу подключил - и сразу работай.

http://www.firmwarefactory.com/USB-232.aspx

P.S. Правда насчет цены не уверен, может и дороже стоить.

Автор: cardinal 17.6.2009, 12:39
Цитата(mr_smit @  17.6.2009,  10:22 Найти цитируемый пост)
P.S. Правда насчет цены не уверен, может и дороже стоить.

судя по ценам на Digikey USB-232 будет стоить около 250 рублей. Но вещь прикольная! smile 

Автор: mr_smit 17.6.2009, 12:54
А вообще сейчас почитал про CP2102 классная вещь. Надо будет купить. И никаких тебе MAX232 не надо.

Кстати, Helmet, давай колись для чего тебе всё это нужно.

Автор: cardinal 17.6.2009, 13:07
mr_smit, есть еще http://www.ftdichip.com/Products/FT232R.htm...

Автор: Helmet 17.6.2009, 13:50
Ого, загрузили информацией  smile  Спасибо, буду разбираться, надеюсь больших трудностей не возникнет.

Цитата(mr_smit @  17.6.2009,  12:54 Найти цитируемый пост)
Кстати, Helmet, давай колись для чего тебе всё это нужно.

А хрен знает, на работе сказали "Для проекта нужно большую красную кнопку придумать чтоб жмякнул - и программа наша запустилась"
 smile 

Mazzimr_smitcardinal, еще раз спасибо!!!

Добавлено через 1 минуту и 1 секунду
Ребята с кол-вом постов больше 100, поставьте плюсы парням плиз от меня  smile 

Автор: mr_smit 18.6.2009, 12:11
Цитата(cardinal @ 17.6.2009,  13:07)
mr_smit, есть еще http://www.ftdichip.com/Products/FT232R.htm...

Он дороже. smile

Автор: mr_smit 18.6.2009, 12:36
А если без всяких драйверов, по принципу "Подключил и ЖМИ!", то тогда:

http://radikal.ru/F/s48.radikal.ru/i120/0906/c2/00dffcc0c1ac.png.html

Сегодня время если будет, попробую сделать, что то самому интересно стало. smile

Автор: Mazzi 18.6.2009, 13:33
Я на ATMege8 не делал устройств для USB, но слышал отзывы, что работает очень плохо, через раз и к томуже обмен очень медленный.( это не относится к текущей теме кнопки )

Автор: cardinal 18.6.2009, 14:06
Ну нельзя же программно решить эффективно то, что по сути должно решаться аппаратно. Тем более, что у USB 2.0 очень неплохие скорости обмена данными...

Автор: mr_smit 18.6.2009, 17:05
Helmet, тебе повезло что я болею и мне нечем дома заняться. По нажатию кнопки запускается Блокнот. Можно любое другое приложение. Грубо, на картонке, но зато работает. Если применить SMD детали размер получится ооочень маленький.

user posted image

Вот снял видео, всё выглядит/работает. Залил на 2 файлообменника.

http://depositfiles.com/files/f3bn4o4ot
http://narod.ru/disk/10012316000/hid.rar.html

Только кнопку подключил не к РС0 (как изначально нарисовал), а к РВ1.

Автор: mr_smit 18.6.2009, 17:06
Прошивка для контроллера:

Автор: cardinal 18.6.2009, 18:34
mr_smit, опиши пожалуйста в кратце принцип работы этого девайса.

Автор: mr_smit 18.6.2009, 22:45
Подключаем к ПК, устройство определилось как HID, установилось... и т.д. готово к работе. Далее устройство по запросу отсылает 0 или 1 в ПК в зависимости от состояния кнопки (0 или 1 на PINB.1). Потом просто раз в 100 мс (из Delphi) опрашивается контроллер на предмет нажатия кнопки. Уже в Delphi мы делаем то что нам надо, в данном случае открываем блокнот если пришла "единица". Может и криво, но я ставил целью результат. Работает. Доработать, что то улучшить всегда можно.

Можно таким же образом из МК температуру слать, данные АЦП и т.д., обрабатывать, строить графики и т.д.

P.S. Даже видео никто ни разу не посмотрел, а я старался.... для себя! smile

Автор: cardinal 18.6.2009, 23:44
Цитата(mr_smit @  18.6.2009,  20:45 Найти цитируемый пост)
P.S. Даже видео никто ни разу не посмотрел, а я старался.... для себя! smile

Потому что на рапиду надо заливать... smile Сейчас скачал с депозита и позыркал - прикольно smile 
Цитата(mr_smit @  18.6.2009,  20:45 Найти цитируемый пост)
Далее устройство по запросу отсылает 0 или 1 в ПК в зависимости от состояния кнопки (0 или 1 на PINB.1). Потом просто раз в 100 мс (из Delphi) опрашивается контроллер на предмет нажатия кнопки. Уже в Delphi мы делаем то что нам надо, в данном случае открываем блокнот если пришла "единица".

Ок, спасибо - принцип ясен. Я просто думал может там как-то хитро без отсылки данных сделано.

Автор: Helmet 20.6.2009, 18:07
mr_smit, ничего себе, спасибо! Я даже не рассчитывал больше чем на разъяснение. Круто!

Автор: mr_smit 22.6.2009, 17:24
Пришли календарик от лица фирмы  smile 

Автор: tyum 20.9.2009, 14:28
Проститите за может быть глупый вопрос, но я тока учусьsmile
Вот я хочу сделать так, чтобы данные с термометра отправлялись в пзу. А потом при подключении сего устройства к компу по ЮЗБ, передавало из пзу данные в какую-н. БД. 
Вопрос: я могу работать с этим устройством как hid?

Автор: Mazzi 21.9.2009, 09:46
Цитата(tyum @ 20.9.2009,  14:28)
....Вопрос: я могу работать с этим устройством как hid?

Да, можешь.

Автор: mr_smit 3.10.2009, 19:31
Например при подключении к компьютеру он (компьютер) отправляет условную команду что готов принять данные. Контроллер отправляет их. И опять же условная команда завершения передачи. И в программе хоста сообщение типа "данные получены, устройство можно отключить".

P.S. Хост - это компьютер

Автор: AlexART 2.11.2010, 18:48
mr_smit,  Посмотрел твой код firmware - подскажи, пожалуйста, как передавать компьютеру число, а не бит. Или можно просто один за другим передавать биты, а в хосте собирать из них число? 

Автор: mr_smit 3.11.2010, 10:15
Да. Ну придумай протокол smile Например, если приняли два нулевых байта -> значит следующие 1-2 байта это число (целая и дробная часть например). И с ними работай дальше.

Либо вот пример: USB HID термометр http://www.radiokot.ru/circuit/digital/pcmod/16/ в конце статьи есть исходник и для МК и для Delphi.

P.S. Байт это собственно и есть число smile  0хFF -> 255 -> 11111111, 0хFFFF -> 65535 -> 1111111111111111

Я тут себе http://radiokot.ru/forum/viewtopic.php?f=20&t=25898&start=0 делал... посмотри, может будет интересно как с 2-х байтовыми числами работать

Автор: AlexART 19.11.2010, 21:57
ОК, спасибо)
Вроде, разобрался. Пишу свой вариант HID-термометра. Когда доделаю, пришлю - вдруг кому-то понадобится...

Автор: JackA 29.11.2010, 00:45
Цитата(mr_smit @  17.6.2009,  12:54 Найти цитируемый пост)
CP2102 классная вещь. Надо будет купить. И никаких тебе MAX232 не надо.

  А взять FT232 - и никаких тебе  CP2102  не надо...


Автор: xvr 29.11.2010, 15:01
Цитата(JackA @  29.11.2010,  00:45 Найти цитируемый пост)
 А взять FT232 - и никаких тебе  CP2102  не надо...

Хрен редьки не слаще - практически идентичные чипы  smile 

Автор: darksilence 29.12.2010, 18:55
Вопрос можно решить подключением кнопки в микрофонному входу звуковой карты. по схеме с подтяжкой на ноль. при нажатии на кнопку идет замыкание на +U. 
Звуковая карта пропускает только переменную составляющую. Пример работы в  Дельфе есть с микрофонным входом (типа осциллографа) можно замутить. будет дешевле всего. Хотя я больше поддерживаю проект USB-HID.

Автор: KoTeKoT 22.3.2011, 19:43
У меня тут вопрос образовался... извините если не туда пишу...
вот есть:
Код

  LEDs:= 0;
  If CheckBox0.Checked then LEDs:= LEDs+1;
  If CheckBox1.Checked then LEDs:= LEDs+2;
  If CheckBox2.Checked then LEDs:= LEDs+4;
  If CheckBox3.Checked then LEDs:= LEDs+8;
  If CheckBox4.Checked then LEDs:= LEDs+16;
  If CheckBox5.Checked then LEDs:= LEDs+32;
  If CheckBox6.Checked then LEDs:= LEDs+64;
  If CheckBox7.Checked then LEDs:= LEDs+128;

а как сделать обратно? Мол получили допустим 6, значит это 01100000, ну и желательно что б это "01100000"куданить в переменную записывалось или в Edit.Text выводилось или CheckBox'ы заполнялись...

Автор: UniBomb 23.3.2011, 10:31
Цитата(KoTeKoT @  22.3.2011,  19:43 Найти цитируемый пост)
получили допустим 6, значит это 01100000

Наоборот, это будет равно 00000110

Цитата(KoTeKoT @  22.3.2011,  19:43 Найти цитируемый пост)
ну и желательно что б это "01100000"куданить в переменную записывалось

И в чём проблема?
Код

somevariable := 6;


Цитата(KoTeKoT @  22.3.2011,  19:43 Найти цитируемый пост)
или в Edit.Text выводилось

Код

SomeEdit.Text := IntToStr(6);

Хотя наверное можно и без IntToStr, не знаю как там в делфях с неявным преобразованием.

Цитата(KoTeKoT @  22.3.2011,  19:43 Найти цитируемый пост)
или CheckBox'ы заполнялись

Код

if (LEDs and 1) <> 0 then CheckBox0.Checked := true; else CheckBox0.Checked := false;
if (LEDs and 2) <> 0 then CheckBox1.Checked := true; else CheckBox1.Checked := false;
if (LEDs and 4) <> 0 then CheckBox2.Checked := true; else CheckBox2.Checked := false;
if (LEDs and 8) <> 0 then CheckBox3.Checked := true; else CheckBox3.Checked := false;
if (LEDs and 16) <> 0 then CheckBox4.Checked := true; else CheckBox4.Checked := false;
if (LEDs and 32) <> 0 then CheckBox5.Checked := true; else CheckBox5.Checked := false;
if (LEDs and 64) <> 0 then CheckBox6.Checked := true; else CheckBox6.Checked := false;
if (LEDs and 128) <> 0 then CheckBox7.Checked := true; else CheckBox7.Checked := false;

Автор: KoTeKoT 23.3.2011, 18:45
спасибо за ответ
Цитата

Наоборот, это будет равно 00000110

прошу прощения, именно так и будет... не доглядел
Цитата

Код

SomeEdit.Text := IntToStr(6);

Хотя наверное можно и без IntToStr, не знаю как там в делфях с неявным преобразованием.

так, да не так...  IntToStr(6)  в итоге в Edit.Text будет "6", а нужно именно "00000110", а без преобразования IntToStr ошибки вывалятся... 
С дальнейшим кодом (собственно с CheckBox'ами наиболее подходящий вариант для решения моей задачи)
Код

if (LEDs and 1) <> 0 then CheckBox0.Checked := true; else CheckBox0.Checked := false;

разбираюсь, попозжей отпишусь подошло иль нет ;)

Автор: UniBomb 23.3.2011, 19:24
Цитата(KoTeKoT @  23.3.2011,  18:45 Найти цитируемый пост)
нужно именно "00000110"

В делфи есть куча преобразовательных функций имеющий похожий вид. Например IntToStr, IntToHex, IntToBin, и наоборот. Вам будет полезно изучить их, найдя всю необходимую информацию в хелпе. Для преобразования в вид "00000110" надо воспользоваться функцией IntToBin.

Автор: KoTeKoT 24.3.2011, 01:35
Спасибо, за подсказку, но поскольку в Delphi отсутствует функция IntToBin , нашел ее реализацию. Мож кому понадобится:
Код

function IntToBin( Value: integer; Digits: integer ): string;
var
  i: integer;
begin
   Result := '';
   for i := 0 to Digits - 1 do
      Result := IntToStr( ( Value and ( 1 shl i ) shr i ) ) + Result;
end;

P.S. Вопрос снят 

Автор: UniBomb 24.3.2011, 13:57
Цитата(KoTeKoT @  24.3.2011,  01:35 Найти цитируемый пост)
в Delphi отсутствует функция IntToBin

Странно. В билдере мне иногда приходилось использовать эту функцию. А ведь в билдере почти всё из делфей и перекочёвывает  smile 

Автор: alexzzzz2 26.3.2016, 08:47
файл исходников пишет вирус, еще вопрос, кто делал hid  примеры еще? стучите в скайп solarstation2 так как быстрее выйдет 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)