USB устройство своими руками
Содержание этой части обучения
Прежде чем приступить к этому вы должны были в предыдущей статье ознакомится с Управлением машиной и получить знания о том, что такое микроконтроллер AVR. Если этого не было, сделайте это.
Далее нам надо для связи по USB сделать устройство, программу для микроконтроллера AVR и программу для компьютера.
USB управление для своего устройства
Берем кабель USB и с одной стороны срезаем провода, видим 4 провода, которые нам нужны - красный, чёрный, жёлтый (бывает зеленым) и белый. Красный провод - это плюс питания +5V, чёрный провод - это минус питания. Этими проводами запитываем наше устройство. А другие 2 провода - жёлтый D+ и белый D- используются для обмена данными по USB.Схема USB устройства на микроконтроллере AVR |
USB устройство своими руками |
Программа на микроконтроллер AVR для USB связи
1) Скачиваем исходные коды OpenRoboFW и распакуйте архив на диск C:\, я собрал этот архив из файлов проекта V-USB, настроил их на Attiny2313A и тактовую частоту 12 МГц (эти настройки меняются в файле Makefile, если используется другой микроконтроллер), упростил код для внесения изменений. V-USB дает нам исходники программ с идентификаторами VID и PID, которые нужны для распознания USB устройства компьютером. На всякий случай вот ссылка на проект
Назначение важных файлов: main.c - главный файл программы на языке C, она осуществляет обработку информации, пришедшей по USB, и в ней программируется реакция микроконтроллера на USB пакеты с компьютера Makefile - параметры сборки, тип микроконтроллера (взяли - attiny2313a), частота, информация по фьюзам для других микроконтроллеров, при использовании другого микроконтроллера, в этом файле его нужно прописать в строке DEVICE (например - atmega16a) usbconfig.h - параметры USB, порт подкючения линии D-, ток |
Откройте main.c и обратите внимание на 2 области кода, которые там выделены - программа реакции на USB пакет и настройка портов. В этих областях надо вставлять свой код, остальное можно не трогать. Для примера там уже стоит код, его можно менять. В приходящем пакете USB с компьютера есть 2 параметра - p1 и p2, которые передаются из программы в виде параметров, в зависимости от их значений можно менять состояние линий микроконтроллера (портов) в программе реакции.
2) Скачиваем программу WinAVR и устанавливаем, она нужна для создания HEX-прошивки микроконтроллера AVR, сайт WinAVR
3) Запускаем командную строку Windows, которая находится тут c:\Windows\System32\cmd.exe появляется чёрное окно. В этом окне вводим 2 команды (набираем команду, нажимаем enter):
Командная строка | Комментарии | |
---|---|---|
1 2 | Переходим в директорию OpenRoboFW Запускаем подготовку программы для микроконтроллера |
Подготавливаем программу МК |
После чего в директории C:\OpenRoboFW забираем файл main.hex и прошиваем его в микроконтроллер. Если в процессе появилась ошибка типа warning unused variable, а также can not set period, или нечто подобное, что не имеет большого значения, ничего страшного, все в порядке, используем полученный файл, он полностью нормальный и рабочий. Главное если файл появляется, значит программа была успешно сделана и может быть использована. Напоминаю Как прошивать.
Также надо прошить fuse-биты настроек микроконтроллера, чтобы изменить его тактовую частоту на совместимую с USB стандартом. Встроенной подходящей частоты нет, поэтому применяется внешний источник тактовой частоты 12 МГц. Для прошивки настроек fuse-битов устройство с программатором надо доработать, подключить к микроконтроллеру внешний кварцевый генератор 12 МГц и 2 конденсатора 20 пФ по схеме как на устройстве USB, т.е. в случае с ATTiny2313A к линиям PA1 и PA0, и также соединить это всё с минусом питания, вообщем как на схеме USB устройства, смотрите на фото ниже как подключено. Это нужно для того, чтобы устройство продолжило работу после установки для него нового источника тактового сигнала, именно этот источник 12 МГц и подключаем. Не забудьте кроме программы также прошить fuse-биты.
Меняем настройки программатором |
Для ATtiny2313A (наш случай):
CKSEL0..3=1111 SUT0..1=10 CKOUT=1 CKDIV=1 RSTDISBL=1 BODLEVEL2..0=101 WDTON=1 SPIEN=0 EESAVE=1 DWEN=1
Установите В справочнике эти fuse-биты и прошейте их в микроконтроллер полученной строкой через программу AVR dude, о том Как прошить тут. Также дам на всякий случай fuse-биты для других микроконтроллеров.
Для ATmega8A:
CKSEL0..3=1111 SUT0..1=10 BODEN=0 BODLEVEL=1 BOOTRST=1 BOOTSZ0..1=00 EESAVE=1 CKOPT=0 SPIEN=0 WDTON=1 RSTDISBL=1
Для ATmega16A:
CKSEL3..0=1111 SUT0..1=10 BODEN=0 BODLEVL=1 BOOTRST=1 BOOTSZ0..1=00 EESAVE=1 CKOPT=0 SPIEN=0 JTAGEN=1 OCDEN=1 LB1..2=00 BLB=0000
Теперь когда программа написана и записана в микроконтроллер, можно проверить правильность сборки устройства. Напишите программу на компьютер для USB связи, читайте далее как это сделать и при этом в процессе будет установлен фильтр для возможности опознания устройства. Подключите устройство к USB порту компьютера, установите фильтр как далее будет описано, если все правильно было собрано и установлено, то оно будет обнаружено и опознано как LEDCtlHID. Если этого не произошло, то ищите проблему и ошибки при сборке устройства или при установке программ, еще раз внимательно все сверьте и проверьте, что ничего не пропущено и что все контакты соединены или запаяны как надо. Бывает проблема тут, если пайка была совершена с неконтактами, с не правильными контактами или не всеми контактами, а также что элементы схемы были повреждены высокой температурой паяльника, и устройство поэтому не работает. Важно собирать устройство именно на макетной плате первый раз.
Программа на компьютер для USB связи
Для начала сделаем простую консольную программу, потом будем делать программу с окнами.1) Скачиваем исходные коды консольной программы OpenRobo, которые собраны из исходников проектов V-USB и LibUSB. Распаковываем архив на диск C:\, после чего содержимое директории C:\OpenRobo должно выглядеть так:
Назначение файлов: include и lib - это драйверы LibUSB для доступа к USB из программы set-led.c - это исходник нашей программы |
2) Скачиваем программу LibUSB, которая нужна для работы с устройством из программы. Устанавливаем. Сайт разработчика LibUSB. После установки подключите собранное устройство к USB. Запустите через меню Пуск/Программы/LibUSB-Win32/Filter Wizard. В открывшейся программе выберите
3) Скачиваем программу MinGW, которая нужна для сборки программы из исходника. Устанавливаем. Сайт разработчика MinGW. После установки зайдите в Панель управления, Система, Дополнительные параметры системы, Дополнительно (вкладка), Переменные среды (кнопка), Системные переменные (список), Переменная Path (найти в списке, выделить, нажать кнопку Изменить). Дописываем в поле Значение переменной в конце ;c:\MinGW\bin\ и нажимаем ОК, надеюсь вы установили MinGW в C:\MinGW, иначе надо путь другой прописать.
Настраиваем системную переменную Path для MinGW |
4) Запускаем командную строку Windows, которая находится тут c:\Windows\System32\cmd.exe
В этом окне вводим 2 команды (набираем команду, нажимаем enter):
Командная строка | Комментарии | |
---|---|---|
1 2 | Переходим в директорию OpenRobo Запускаем подготовку программы для компьютера |
Если выходит ошибка, что команды make нет, значит вы не установили выше указанную программу WinAVR, сделайте это. Если выходит ошибка, что команды gcc нет, значит не прописан правильно путь в системную переменную Path, сверьте со скриншотами то как прописано у вас, также возможно командная строка была запущена до прописывания пути, надо перезапустить.
Подготовка программы ПК |
5) Теперь смотрим в директорию C:\OpenRobo, там появился готовый файл программы set-led.exe. Не выходим из cmd, здесь же теперь мы можем набрать команды запуска программы и получить результаты:
Командная строка | Комментарии | |
---|---|---|
1 2 3 | Включает светодиод Отключает светодиод Показывает включен или отключен светодиод |
7) Если все сделано правильно, то при подключении USB устройства и наборе команд в консоле, светодиод будет включаться и выключаться.
Изменяем программы под наши нужды
Берём под контроль все порты, прибавляем свои функции. И так, теперь в C:\OpenRobo размещены исходные коды программы для компьютера, а в C:\OpenRoboFW исходные коды программы для микроконтроллера. Их можно изменять, но после каждого изменения надо их занова пересобирать (и перепрошивать микроконтроллер), делать это теперь вы умеете - см. выше пример - пересобрать обе программы можно 4-мя командами в cmd:Командная строка | Комментарии | |
---|---|---|
1 2 3 4 | Переходим в директорию OpenRoboFW Запускаем подготовку программы для микроконтроллера Переходим в директорию OpenRobo Запускаем подготовку программы компьютера |
Нам нужно подключить к управлению все порты микроконтроллера Attiny2313. Свободных линий портов у нас получается 13 штук, под контролем находится сейчас только 1 линия, светодиод подключен к ней. Возьмём под контроль все 13 линий.
Изменение программы для микроконтроллера
1) Открываем файл C:\OpenRoboFW\main.c, находим там область кода, обозначенную как настройка портов, надо установить все свободные порты на вывод командами DDR, меняем содержимое области на следующий код. Код для main.c:Программа | Комментарии | |
---|---|---|
1 2 3 4 5 6 | Настроили порт B на вывод записав единицы в DDR Порт D не весь настраиваем, а по одному биту вбиваем единицы таким образом на биты 0, 1, 3, 5 и 6 |
Небольшое пояснение этого кода - порт B полностью свободен, все его разряды сразу ставим на вывод, порт A полностью занят, его не трогаем, порт D частично занят, поэтому на вывод ставим только свободные разряды, которые тут и перечисляем - 0, 1, 3, 5, 6.
2) Открываем файл C:\OpenRoboFW\main.c, находим область кода, обозначенную как программа реакции на USB пакет, сделаем, чтобы по команде зажигались светодиоды на всех свободных линиях. Меняем содержимое области на... Код для main.c
Программа | Комментарии | |
---|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Если первое число пришло 1 Записываем единицы в порт B и в части порта D Если первое число пришло другое Записываем нули в порт B и в части порта D |
Пересобираем и перепрошиваем, убеждаемся, что светодиод работает на всех линиях.
К тому же неплохо бы научится вставлять свои функции, которые будут выполняться по вашим командам, пока есть только on, off, status, нужно добавить еще команд, например добавим команду discoteka, по которой будет вызываться какая-нибудь наша функция в микроконтроллере, например - светодиоды горят через один на порте B. Добавим в микроконтроллере обработку дополнительных кодов, пусть это будет код 2, т.к. 1 и 0 уже используются для функций on и off, из программы для компьютера будем посылать потом микроконтроллеру код 2 функцией, вызываемой по команде discoteka. Опять меняем файл C:\OpenRoboFW\main.c, область реакции... Код для main.c
Программа | Комментарии | |
---|---|---|
1 2 3 4 5 6 7 8 9 | Если пришла единица Включить весь порт B Если пришла двойка Включить биты порта B через один Если пришло другое Вылючить весь порт B |
Вставляем обработку кодов таким образом, старые коды 1 и 0 как видите сохранили свои функции (зажечь / потушить светодиоды) и появился еще новый код 2, по которому на порте B выставляется состояние, при котором светодиоды через один горят. Таким же образом можно сюда поставить любые другие коды и написать для них необходимые функции.
Изменение программы для компьютера
1) Открываем файл C:\OpenRobo\set-led.c2) Надо научиться отправлять микроконтроллеру более сложные сообщения, при приеме которых он будет выполнять нужные функции. Сейчас отправляется только 2 сообщения в переменной isOn - 0 = выключить светодиод, 1 = включить светодиод. Научимся отправлять также код 2 = выставить светодиоды через один на порте B (в предыдущем примере мы подготовили микроконтроллер для обработки этого кода, теперь просто пошлём его программой с компьютера).
3) Редактируем файл set-led.c вставляем сверху от строчки
Программа | |
---|---|
1 |
следующий код, который добавляет новый код вызова 2 для функции микроконтроллера
Программа | |
---|---|
1 2 3 4 |
Код отправляет команду 2 микроконтроллеру, что вызывает там запуск дискотеки. Пересобираем программу для компьютера и нам становится доступна новая команда - discoteka. Таким образом можно вставить любые другие коды и функции для них. В C++ есть функция Sleep(1000); она задаёт задерку выполнения в милисекундах, например 1000 - это 1 секунда. Она полезна, с ней также можете сделать светодиоды мигающими. В будующем эта функция пригодится.
Обратите внимание на функцию usb_control_msg, в ней можно передать 2 изменяемых параметра (в первом у нас передаётся 2 или переменная isOn, которая равна 1 или 0), следующее число (там стоит 0) может передать еще 1 значение, например, 1 переменная может быть всё также быть изначальной командой на on или off, а второй переменной можно передать, например, номер порта, который следует включить. Получить доступ к этим параметрам в программе для микроконтроллера можно по именам p1 и p2, для этого примера p1=2, p2=0.
Как сделать программу для Windows
Чтобы создать программу для Windows, скачайте бесплатное средство разработки программ для Windows1) Заходим на сайт, выбираем русский язык, нажимаем INSTALL NOW.
2) После установки запускаем, нажимаем Создать проект. Для начала создадим простую программу с 1 кнопкой - нажимаем эту кнопку, текст в ней меняется.
3) Выбираем шаблон Приложение Windows Forms, внизу вводим название программы, нажимаем OK.
4) Перетаскиваем справа элемент Button на центральное окно с формой и оставляем его внутри формы.
5) Кликаем на форму и на кнопку, при этом справа внизу есть окно Свойства, его содержимое меняется. В этом окне задаём необходимые свойства элементов - текст кнопки и окна. Редактируем свойство Text, пишем там любой текст, например, Моя кнопка. Текст на кнопке меняется, это видно на форме в центральном окне.
6) Теперь сделаем так, чтобы при нажатии на эту кнопку, ее свойство, которое определяет текст на ней менялось на другое. Так же можно менять любые другие свойства.
7) Делаем двойной клик на кнопке Моя кнопка, которая находится в форме в центральном окне, попадаем в файл кода Form.h (его можно выбрать в любое время слева в меню). В этом файле после двойного клика была создана функций button1_Click (остальной код автоматом был создан по шаблону при создании проекта), курсор находится внутри нее, нажмите Enter, чтобы создать пустую строку, куда и будем писать код.
8) Как можно видеть в этом же файле чуть повыше есть разделы - button1 и form1, там заданы начальные установки для элементов - кнопки и формы. Воспользуемся ими, скопируем внутрь нашей функции клика по кнопке (это место отмечено красной стрелкой) строчку, где устанавливается название кнопки, а именно this->button1->Text = L"Моя кнопка"; Только текст Моя кнопка изменим на Работает!
9) Нажимаем на кнопку с зеленым треугольником, через некоторое время наша программа запустится (если вы не совершили ошибок) и при нажатии на кнопку, текст внутри меняется с Моя кнопка на Работает!
10) Забрать готовую программу (файл .exe) можно в директории текущего пользователя
Весь процесс показан на картинках.
Делаем свою программу для Windows, из которой будем управлять устройством USB |
Перенос программы для USB в Windows Forms. Я перенес программу управления из консольного приложения в приложение с окнами Windows и немного улучшил её - сделал управление шаговым двигателем в дополнение к управлению светодиодом, добавил горячие клавиши запуска двигателя в определенном направлении с заданным количеством шагов, управляющие сигналы драйвера шагового двигателя подключены к портам PB7 (шаг), PB6 (направление), PB5 (питание), светодиод подключен к порту PB0. Вы можете просто скачать мой проект для Microsoft Visual C++ 2010 Express Edition (русская версия) и посмотреть как я это сделал.
Тех. поддержка ответит на ваши вопросы по этой статье
phpinbox@yandex.ru |
Перейти к следующей теме обучения
Как сделать перемещение инструментов для работы |