Как подключить микроконтроллер к компьютеру
Как подключить микроконтроллер к компьютеру
Один из вопросов, вызывающих повышенный интерес у начинающих (да и у опытных) конструкторов микропроцессорных систем является вопрос взаимодействия микроконтроллера с компьютером. И это не удивительно. Иногда очень нужно создать некое устройство, которое может работать не только автономно, но и под управлением вашего компьютера. Иногда желательно оперативно считывать информацию из устройства на микроконтроллере или задача состоит в том, что бы разработать микроконтроллерную приставку для сопряжения компьютера и какой ни будь внешней управляемой им системой. Естественно, что два устройства, работающих на основе микропроцессорных технологий (компьютер и микроконтроллер) всегда можно заставить обмениваться между собой информацией. Посмотрим, как же это можно сделать.
Проблема соединения микроконтроллера и компьютера в разные времена решалась по-разному. В достопамятные времена, когда царствовали компьютеры под названием PC XT одним из простых и эффективных способов подключить свое собственное устройство к такому компьютеру было самостоятельное изготовление нестандартного внутреннего модуля, который вставлялся в используемую тогда шину ISA внутри корпуса компьютера на материнскую плату. Шина ISA в те времена использовалась для подключения всех устройств расширения, таких как видеокарты, модули дополнительной памяти, контроллеры жестких дисков и т.п. Разъем для подключения к такой шине можно было при определенной сноровке, изготовить самостоятельно. Он представлял собой просто выступ печатной платы вашего вставного модуля с дорожками вместо контактов. Логика работы шины так же была не сложная и позволяла подключиться к ней, используя несложные схемы на цифровых элементах средней интеграции. Эти времена давно прошли. В настоящее время на смену шине ISA давно пришла новая шина, под названием PCI. В ней используются гораздо более мелкие контактные площадки и логика ее работы тоже гораздо сложнее. Теперь для подключения внешних устройств нам приходится использовать один из стандартных интерфейсов ввода вывода. Если отбросить такие сложные в реализации варианты, как подключение по ИК порту или по Bluetooth (БлюТуз), то остается только три варианта: подключение по LPT, подключение при помощи COM-порта и наконец, подключение по USB. Рассмотрим все эти варианты по порядку.
Подключение при помощи LPT порта
Это самый старый и самый простой с точки зрения программной и аппаратной реализации способ. Дело в том, что LPT порт компьютера устроен таким образом, что позволяет легко напрямую программным путем управлять всеми его выходами и читать информацию со всех его входов. Стандартный LPT порт имеет 8 линий шины данных, которые могут работать как входы и как выходы, четыре выхода управления, и пять входов для служебных сигналов. Если вы подключаете к порту свое собственное микропроцессорное устройство, то использовать линии порта по назначению вовсе не обязательно. Все его входы и все выходы, как основные, так и служебные, вы можете использовать по своему усмотрению. В результате вы получаете интерфейс, протокол работы которого который вы можете разрабатывать по своему усмотрению. Вы можете так же программным путем реализовать некоторые стандартные протоколы. Например, программатор PonyProg, описанный в книге [1] при работе с LPT портом программно реализует последовательный канал связи SPI. Это один из протоколов, при помощи которого можно «прошить» программу в микроконтроллер AVR.
Использование LPT для связи с компьютером имеет и свои недостатки:
Во-первых, современные операционные системы, в частности, последние версии Windows XP и тем более Vista защищают LPT порт от прямого доступа со стороны пользовательских программ. Поэтому написание программ, работающих с LPT крайне усложняется. Во-вторых, LPT порты просто выходят из употребления. Все современные принтеры уже сейчас подключаются только по USB. В ноутбуках уже стало стандартом отсутствие как LPT, так и COM портов. Скоро их перестанут устанавливать и в стационарных компьютерах.
Подключение при помощи COM порта
Подключение при помощи USB порта
Аппаратная реализация USB порта
Это самый дешевый способ подключения микроконтроллера к компьютеру посредством USB. Он предполагает наличие лишь самого контроллера. В качестве линий USB интерфейса используются две любые линии одного из портов ввода-вывода. А весь USB протокол реализуется программным путем. При определенных ухищрениях и при условии использования самого медленного режима передачи информации это оказалось вполне возможным. Однако такой способ подключения имеет массу ограничений. Во-первых, из за того, что микроконтроллер работает на грани своей вычислительной мощности, приходится разделять его работу на цикл обмена информацией по USB и цикл выполнения основной задачи. Одновременно выполнять то и другое не получится. Во-вторых, нестыковка по уровням сигналов. Уровень сигнала логической единицы порта USB должен быть в пределах 3…3,6В. А уровень сигнала порта ввода-вывода микроконтроллера примерно равен его непряжению питания. То есть +5В. Поэтому приходится ухищряться. Например, уменьшать напряжение питания микроконтроллера до 3,5 вольт. А это влечет за собой другие неудобства, возникающие при подключении к микроконтроллеру других внешних элементов. Подробно о аппаратной реализации USB читайте в статье Игоря Чешко из Словакии.
Флэш-код и подключение микроконтроллера к компьютеру
Чтобы визуализировать в Excel данные в режиме реального времени с помощью надстройки Data Streamer, нужно подключить микроконтроллер и записать на него флэш-код.
Флэш-код
Перед отображением данных в режиме реального времени необходимо записать флэш-код на плату микроконтроллера. Этот код будет интерпретировать сигналы, отправляемые датчиком или устройством с датчиком.
Скачайте файлы кода Arduino из соответствующего плана занятия Hacking STEM.
Откройте скачанный файл, чтобы запустить приложение Arduino.
В приложении Arduino выберите: Инструменты > Порт > COM 3 (Arduino/Genuino Uno). Номер порта может отличаться от COM3.
Выберите Инструменты > Плата: Arduino/Genuino Uno.
Нажмите кнопку с повернутой вправо стрелкой, чтобы добавить код на плату микроконтроллера.
Скачайте HEX-файлы кода из соответствующего плана занятия Hacking STEM.
Подключите micro:bit к компьютеру с помощью USB-кабеля. Установите драйвер mbed.
В проводнике перейдите к micro:bit. Он отображается в виде внешнего устройства хранения, как флэш-накопитель или жесткий диск.
Откройте второе окно проводника и перейдите к папке Загрузки. Убедитесь, что видны оба окна.
Выберите HEX-файл в папке «Загрузки» и перетащите его в окно micro:bit.
Загрузка кода на плату микроконтроллера micro:bit завершена, когда перестанет мигать светодиодный индикатор.
Подключение микроконтроллера
Выберите элемент Connect a Device (Подключить устройство), чтобы выбрать микроконтроллер (Arduino, micro:bit). Откроется подменю, позволяющее выбрать устройство, которое в настоящий момент подключено к компьютеру.
Если устройства не отображаются или в списке отсутствует ваше устройство, проверьте, что к компьютеру подключено совместимое устройство и что установлены все необходимые драйверы. Ваше устройство отобразится автоматически после подключения.
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
Подключаем микроконтроллер к компьютеру. Com-порт (RS-232), USB
В Микроконтроллерах Atmel есть интерфейс UART. Фактически это тот же RS-232, но с другими логическими уровнями. Используя его подключим наш микроконтроллер к компьютеру.
Подключение микроконтроллера к последовательному порту (RS-232) используя MAX232
Код программы микроконтроллера для тестирования связи с компьютером:
На компьютере открываем Hyper Terminal, подключаемся с Com порту. Теперь можно передавать информацию с компьютера в микроконтроллер и, наоборот, с микроконтроллера в компьютер.
Подключение микроконтроллера к USB порту используя FT232
Используя FT232 можно обеспечить питание Вашей схемы напряжениями +5 и +3.3В. На этапе разработок Вам будет очень полезен модуль для подключения микроконтроллера к компьютеру на базе FT232. Его можно приобрести или сделать самостоятельно. Я поступил проще, купил отдельно плату, необходимые детали и собрал сам и сейчас плотно эксплуатирую. Где купить смотрите здесь.
Существует способ работать с USB напрямую с микроконтроллера, но для этого требуются определенные ресурсы микроконтроллера и использование отдельных драйверов. В этой статье он не рассматривается.
Существует способ подключения микроконтроллера к локальной сети посредством Ethernet модуля, и превращение его в отдельное сетевое устройство. Но о нем поговорим позже.
USB для AVR. Часть 1. Вводная

Здравствуйте, решился я испытать свои творческие таланты 🙂 Речь пойдет об популярном интерфейсе USB, а именно как заюзать этот самый USB на простых микроконтроллерах AVR. Планирую написать несколько топиков с примерами кода и разъяснениями как со стороны микроконтроллера, так и со стороны компьютера. Конечно на просторах интернета полно всяческих примеров на данную тематику, но как писал DI HALT в правилах конкурса: «в лучшем случае это исходник в котором сам черт ногу сломит, да краткое, на страничку, его описание.»
Начну с того, что ранее широко распространенные интерфейсы как COM, LPT, MIDI в настоящее время морально устарели, но ещё нередко присутствует на современных компьютерах и используется в промышленном и узкоспециализированном оборудовании. Так что для связи какой нибудь собственной железки с компьютером давно уже пора осваивать что-то другое. Как вариант ещё можно использовать всякие конверторы/переходники/эмуляторы, но они не всегда работают как оригинальный интерфейс, порождая массу проблем.
Несколько ссылок по сабжу:
www.usb.org/developers/docs — официальная документация по USB. Не легкая для чтения, но наиболее полная.
www.beyondlogic.org/usbnutshell/usb1.htm — хороший обзор важных частей USB спецификации. Легче раскуривать чем официалку…
www.lvr.com/usb.htm — много хороших ссылок связанных с USB
Управление устройством USB HID на Windows 7
Используемое программное обеспечение
1. Для микроконтроллера — библиотека V-USB [1] компании Objective Development и IDE Atmel Studio 6 [2] компании Atmel. Нужно также скачать и установить тулчейн WinAVR [3] для компиляции firmware микроконтроллера (для спецов это необязательно, потому что можно обойтись тулчейном, который входит в состав Atmel Studio).
2. Для написания программы Windows (ПО хоста) использовалась библиотека LibUsbDotNet [4] Тревиса Робинсона и IDE Visual Studio C# 2010 [5] компании Microsoft.
Все программное обеспечение, кроме Visual Studio 2010, бесплатное, хотя есть возможность использовать Visual Studio C# 2010 Express бесплатно в течение ограниченного срока. Все действия проводились в среде операционной системы Windows 7 x64, но наверняка подойдет и любая другая операционная система семейства Windows (Windows XP и более свежая).
Используемое железо
Благодаря библиотеке V-USB для создания устройства USB HID подойдет любой микроконтроллер AVR. Если Вы дружите с паяльником, то даже можете собрать подключение к USB самостоятельно по одной из опубликованных схем. Такая схема (взята из пакета V-USB [1]) в качестве примера приведена на картинке.
Чтобы экономить время и усилия, лучше использовать готовую макетную плату. Особенно удобно, если в плату будет записан USB-загрузчик (bootloader), тогда не понадобится покупать программатор для перепрошивки платы. Я использовал макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega32A, в ней загрузчик есть (USBasploader, эмулирующий поведение программатора USBasp). Вот так платка выглядит в натуральную величину:
Можно взять также metaboard (на нем стоит ATmega168 или ATmega328), или даже программатор на микроконтроллере ATmega8. Подобные железки можно дешево купить на ebay.com или dx.com.
Создание firmware микроконтроллера с помощью Atmel Studio 6 и библиотеки V-USB
Сделайте новый проект в Atmel Studio 6 (далее просто AS6). Когда AS6 предложит выбрать микроконтроллер, выберите Atmega32 без буквы A, не Atmega32A (хотя на плате стоит Atmega32A) — это важно, так как тулчейн WinAVR не видит разницы, он знает только Atmega32. Эти микроконтроллеры по внутреннему устройству идентичны, так что для нас разницы нет, а для AS6 есть.
Теперь нужно правильно настроить компилятор. В верхнем меню AS6 нажите Tools, далее Options.. и появится вот такое окно:
Слева в списке выберите Toolchain. Справа появится список Flavours. Этим словечком Atmel закодировала возможные варианты используемого инструментария (тулчейны).
Для добавления в список Flavours тулчейна WinAVR нажмите кнопку Add Flavour, появится следующее окно:
В верхней строчке этого окна введите имя компилятора WinAVR (произвольное), а в нижней строке введите полный путь, куда установлен сам компилятор тулчейна (с указанием папки \bin) и нажмите кнопку Add. В списке Flavours появится добавленный компилятор, как показано на скриншоте.
Выделите мышкой наш новый добавленный компилятор WinAVR и нажмите кнопку Set As Default (сделать его тулченом по умолчанию), и нажмите OK. После этой процедуры наша AS6 будет использовать компилятор WinAVR.
В выпадающем списке Toolchain Flavour выберите добавленный компилятор WinAVR, чтобы при компилировании проекта AS6 использовала его. На этом настрока AS6 закончена.
Далее необходимо в созданный проект добавить файлы исходного кода проекта [6] — см. папку firmware\VUSB, файлы VUSB.c, usbdrv.c, usbdrvasm.S и oddebug.c. Проект ASS6 создан на основе одного из примеров библиотеки V-USB: hid-custom-rq, который изначально компилировался с помощью утилиты make из командной строки. На основе библиотеки V-USB можно найти много других примеров кода — в основном это устройства USB HID (мыши, клавиатуры, устройства ввода и вывода), но есть также и устройства USB CDC (виртуальный COM-порт). Если Вам лень самому создавать проект, просто откройте в AS6 файл проекта VUSB.atsln, в нем уже сделаны все необходимые настройки и добавлены все нужные файлы.
Если у Вас используется другая макетная плата, то нужно правильно настроить файл usbconfig.h. Это конфигурационный файл библиотеки V-USB, в нем задаются многие настройки и параметры (VID, PID, ножки микроконтроллера, значения для дескрипторов и другие настройки). Подробное описание всех настроек дано в комментриях этого файла. Основное внимание следует уделить назначению выводов микроконтроллера, которые используются под сигналы USD D+ и D- (макроопределения USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT, USB_CFG_DPLUS_BIT), к этим ножкам предъявляются особые требования. Конфигурационный файл usbconfig.h из архива [6] предназначен под разводку ножек макетной платы AVR-USB-MEGA16, и он гарантированно работает. Моргать программа будет светодиодом, который уже имеется на макетной плате и подключен к ножке 0 порта B.
Создание программы для компьютера (ПО хоста)
Наша программа должна посылать через подключение USB пакеты, которые будут управлять микроконтроллером.
Запустите Microsoft Visual C# 2010 Express и создайте новый проект на основе Windows Form. Теперь нужно подключить к проекту библиотеку LibUsbDotNet.dll. В обозревателе решений нажмите правой кнопкой мыши на названии проекта, и выберите «Добавить ссылку».
появится ещё одно окно
здесь нужно найти путь на диске, где находится библиотека LinUsbDotNet.dll (по умолчанию она устанавливается папку C:\Program Files\LibUsbDotNet, но лучше сделать копию файла DLL в рабочий каталог проекта. После подключения библиотеки её нужно объявить в проекте, для этого добавьте в главный модуль программы (файл Form1.cs) строки:
Перейдите к визуальному редактору формы, и приведите её приблизительно к такому виду (добавьте 3 кнопки Button и 3 текстовых метки Label):
Сделайте обработчик события загрузки формы. Он нужен для того, чтобы при старте программы происходила инициализации экземпляра класса LibUsbDotNet, через который осуществляется обмен с устройством USB. Перед началом обмена необходимо открыть доступ именно к нашему устройству, потому что к компьютеру может быть подключено несклько устройств USB HID, и необходимо уметь обращаться к каждому по отдельности. Для целей идентификации USB-устройств служат специальные идентификаторы, которые имеют абсолютно все устройства USB, это VID и PID.
VID это идентификатор производителя (Vendor ID), а PID — идентификатор устройства (Product ID). Наше USB-устройство имеет VID: 0x16C0, PID: 0x05DF, эти значение указаны в конфигурационном файле usbconfig.h (об этом файле мы уже упоминали) проекта микроконтроллера AS6. Чтобы ПО хоста обратилась к именно к нашему USB-устройству, нужно инициализировать объект MyUsbFinder такими же параметрами VID: 0x16c0, PID: 0x05df, как указаны в файле usbconfig.h. Для этого в область определения глобальных переменных класса Form1 добавьте следующий код:
После того как мы определились с каким USB-устройством будем работать, можно к нему подключаться, и это удобно сделать в момент старта программы (открытия окна формы). Для этого выберите основную форму программы, и в редакторе свойств создайте обработчик события загрузки Form1_Load. В теле обработчика введите следующий код:
Сделайте обработчик события клика на кнопке button1 («Вкл»), для этого сделайте в визуальном редакторе на кнопке двойной щелчок, и добавьте в тело обработчика события код:
Для обработчика кнопки «Выкл» добавьте код:
Код для обработки кнопки «Чтение»:
Обработчик события закрытия формы (завершение работы программы) гасит светодиод, если он горит:
Как пакеты USB декодируются в firmware микроконтроллера
Прием и обработка данных на стороне микроконтроллера осуществляется в функции usbFunctionSetup (находится в главном модуле VUSB.c проекта firmware AS6). Вот эта функция:
Наше устройство USB HID простейшее, и реагирует оно только на управляющие передачи (control transfer), которые проходят через конечную точку 0 (default control endpoint). По типу запроса (поле bRequest) декодируется направление передачи данных. Если CUSTOM_RQ_SET_STATUS, то это данные, предназначаемые для микроконтроллера. Данные декодируются и микроконтроллер выполняет заложенную там команду. В этом случае в самом первом по порядку принятом байте данных закодировано состояние светодиода — если там в младшем бите единичка, то светодиод включается, а если нолик, то гаснет. Если же в поле bRequest принято значение CUSTOM_RQ_GET_STATUS, то в ответ заполняется буфер текущим состоянием светодиода, и данные буфера отправляются обратно хосту. Все очень просто, и при желании поведение кода можно легко переделать под свои нужды.
Видео, как это работает:
Буду рад ответить в комментариях на вопросы и конструктивные замечания.
Ссылки
P. S. Толчком к познаниям стал сайт microsin.net, где нашлось много информации по протоколам USB и практическому применению микроконтроллеров в USB-устройствах. Огромное спасибо! разработчику этого сайта за отзывчивость и помощь в вопросах касаемо данной тематики.
В дальнейшем по возможности планирую сделать тоже самое, но на микроконтроллере с аппаратным интерфейсом USB.












