Как подключить микросхему к компьютеру
Как подключить микросхему к компьютеру
Один из вопросов, вызывающих повышенный интерес у начинающих (да и у опытных) конструкторов микропроцессорных систем является вопрос взаимодействия микроконтроллера с компьютером. И это не удивительно. Иногда очень нужно создать некое устройство, которое может работать не только автономно, но и под управлением вашего компьютера. Иногда желательно оперативно считывать информацию из устройства на микроконтроллере или задача состоит в том, что бы разработать микроконтроллерную приставку для сопряжения компьютера и какой ни будь внешней управляемой им системой. Естественно, что два устройства, работающих на основе микропроцессорных технологий (компьютер и микроконтроллер) всегда можно заставить обмениваться между собой информацией. Посмотрим, как же это можно сделать.
Проблема соединения микроконтроллера и компьютера в разные времена решалась по-разному. В достопамятные времена, когда царствовали компьютеры под названием 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 читайте в статье Игоря Чешко из Словакии.
Микроконтроллер + компьютер + своё программное обеспечение
Своё устройство на микроконтроллере я начал «пилить» еще в начале 2019-го. Тогда я даже не думал, что захочу связать его с компьютером, но устройство постоянно эволюционирует, и вот настала пора. Причём нужно не просто связать, а написать своё фирменное ПО, которое будет управлять устройством через USB. С подобной задачей я столкнулся впервые, а беглый поиск в сети выдал такие результаты, после которых появилось ещё больше вопросов и каша в голове. Про свой опыт решения данной задачи «От» и «До» делюсь в этой статье.
Вступление
О моём устройстве расскажу немного позже, сохраним интригу. Предвидя вопрос типа «В чём смысл этого топика?», отвечу, что простого и законченного решения в сети я так и не нашёл. Под простым и законченным решением я подразумеваю дуэт микроконтроллера (далее МК) с компьютером (далее ПК) и заготовки кода с функцией автоматического коннекта, а также мега-функцией «поморгать светодиодом». Пришлось повозиться и собрать все элементы мозайки в единую картину, которую я решил оформить в статью. Надеюсь, она поможет новичкам в вопросе «Как связать микроконтроллер с компьютером через USB» без лишних заумных слов. Уточню, что программированием занимаюсь для удовольствия, поэтому не претендую на образцово-показательный код. Это всего-лишь мой личный опыт, и вам судить, дорогой читатель, насколько он полезен.
Постановка задачи
Обеспечить двусторонний обмен данными между МК и ПК через USB. Никаких плат и софта типа Arduino в готовом решении мы не используем.
Сделать так, чтобы ПО компьютера автоматически определяло наше устройство при подключении его к любому USB-разъему.
USB-устройство должно отображаться в диспетчере устройств под нашим собственным именем (например, под именем нашей компании).
Примечание. Последний пункт я не стал раскрывать в рамках этой статьи, потому что бесконечную простыню текста и картинок читать утомительно. Оставлю материал для будущей статьи, если тема окажется интересной.
Что нужно уметь/иметь
Знать C++ хотя бы на начальном уровне.
Уметь работать с любым МК (главное, чтобы у него был интерфейс UART).
Собственно сам МК (я взял Atmega328, т. к. она используется в моём проекте).
Макетная плата и несколько простых радиодеталей для сборки тестовой схемы.
Плата USB/UART преобразователя (о ней скажу ниже).
Не совсем USB-устройство
Проект, для которого я делаю канал связи с ПК, называется «Teslafon». Это название музыкальных катушек тесла с микроконтроллерным управлением (описание их работы тут). Пока катушка является автономным устройством и ни к чему не подключается, но недавно мне пришла идея сделать управление молниями с ноутбука. Несмотря на то, что тема специфическая, в сети можно найти примеры даже на неё, но там всё довольно индивидуально и я решил пойти своим путём.
Теория
Оказалось, вопрос не в том, как передать данные через USB, а как передать данные через виртуальный COM-порт! Передача данных через COM-порт намного проще, хотя это устаревший вид портов. А раз так, то реального COM-порта у нас не будет, только виртуальный. Физически же мы по-прежнему будем использовать привычный USB. Виртуальный COM-порт будет предоставлен драйвером, о котором мы поговорим ниже. А еще к устройству добавится некая микросхема-посредник, которая снимет целый ворох проблем. Взгляните на схему:
Между ПО хоста и нашей прошивкой есть целых 4 звена. С аппаратным UART-ом всё понятно, что же с остальными?
Круто, теперь можно увидеть всю последовательность действий:
Покупаем USB/UART преобразователь и собираем тестовое устройство;
Скачиваем и устанавливаем драйвер;
Макетная плата
Помните, что наше устройство кроме моргания светодиодом ничего пока уметь не будет? Чтобы не было скучно, давайте сделаем три светодиода:
Нажатие ‘x’ на клавиатуре будет разрывать сеанс передачи данных, гасить зелёный светодиод и завершать работу ПО хоста. Но я забежал немного вперед, вернёмся к схеме устройства:
Думаю, тут всё понятно. Я даже не стал ставить подтягивающий резистор R1, хотя в реальной схеме он нужен. Сейчас нам главное получить минимально рабочую модель. Вот так выглядит макетка:
Примечание. Если у вас другой МК, подключите все пины в соответствии с его даташитом и схемой на рисунке 3.
Установка драйверов
Наш USB/UART преобразователь уже вставлен в ПК, открываем диспетчер устройств и видим:
Мы могли бы сделать своё красивое имя устройству, но я решил, что это будет тема другой статьи, т. к. материала получается слишком много. Пока ограничимся тем, что есть. Качаем готовый драйвер, устанавливаем и переходим к программированию.
Программное обеспечение хоста
Итак, схема имеет три светодиода: зелёный, красный и белый. Логика работы будет такая: запускаем программу на ПК, если девайс не подключён, то программа будет ждать, пока мы его не подключим. При подключении автоматически будет осуществлён коннект с устройством и загорится зелёный светодиод. Клавиши «w» и «r» будут управлять белым и красным светодиодом соответственно. При вводе «x» произойдёт разрыв связи с нашим устройством и зелёный светодиод погаснет. Как видите, все очень просто.
Сперва я написал программу в процедурном стиле, но если захочется работать сразу с двумя и более устройствами, то такой подход не годится. К тому же, по мере роста программа станет нечитабельной. И тогда я переписал код в стиль ООП. Прошивку МК наоборот, оставим в процедурном стиле, она будет маленькая и простая, оборачивать ее в классы не вижу смысла.
Создадим класс устройства, но на самом деле это будет скорее класс COM-порта, т. к. в нём будут его настройки, функции подключения/отключения и передачи данных. Начало файла tesladevice.h:
Для простоты мы отправляем один байт, но если надо отправить более сложные данные, можно несколько раз вызвать SendData() в цикле. Следующая функция GetPortNum() просто возвращает номер порта, к которому мы подключились. Конечно, можно было сделать переменную portNum публичной, но правила хорошего тона велят закрывать данные класса от всеобщего доступа:
И последняя функция нашего класса просто завершает работу с портом, возвращая результат операции:
Я решил сэкономить на файле tesladevice.cpp и все тела функций разместил в tesladevice.h. Вы можете разделить их или оставить как есть.
Теперь напишем основное тело нашего хоста. Так как это тестовый проект, я сделал его в консольной программе:
На этом работа с хостом закончена. Это всего лишь заготовка, но вполне рабочая, из которой можно слепить что душе угодно. Осталось написать прошивку для USB-устройства и переходить к долгожданным тестам.
Прошивка
Ну вот, проделана большая работа. Теперь всё компилируем, прошиваем устройство, втыкаем его в ПК и с замиранием сердца запускаем программу.
Тест всего проекта
Если всё сделано правильно, программа выведет это:
Дальше вводим разные буквы и жмём Enter. Результат работы я продемонстрирую на видео:
Если у вас всё это добро не запускается или запускается криво, придется попыхтеть над отладкой. По крайней мере, я проверял эту систему на трёх разных компьютерах и на двух Windows (7 и 10), и результатами остался доволен. Желаю и вам удачного запуска.
Выводы
Подключаем микроконтроллер к компьютеру. Com-порт (RS-232), USB
В Микроконтроллерах Atmel есть интерфейс UART. Фактически это тот же RS-232, но с другими логическими уровнями. Используя его подключим наш микроконтроллер к компьютеру.
Подключение микроконтроллера к последовательному порту (RS-232) используя MAX232
Код программы микроконтроллера для тестирования связи с компьютером:
На компьютере открываем Hyper Terminal, подключаемся с Com порту. Теперь можно передавать информацию с компьютера в микроконтроллер и, наоборот, с микроконтроллера в компьютер.
Подключение микроконтроллера к USB порту используя FT232
Используя FT232 можно обеспечить питание Вашей схемы напряжениями +5 и +3.3В. На этапе разработок Вам будет очень полезен модуль для подключения микроконтроллера к компьютеру на базе FT232. Его можно приобрести или сделать самостоятельно. Я поступил проще, купил отдельно плату, необходимые детали и собрал сам и сейчас плотно эксплуатирую. Где купить смотрите здесь.
Существует способ работать с USB напрямую с микроконтроллера, но для этого требуются определенные ресурсы микроконтроллера и использование отдельных драйверов. В этой статье он не рассматривается.
Существует способ подключения микроконтроллера к локальной сети посредством Ethernet модуля, и превращение его в отдельное сетевое устройство. Но о нем поговорим позже.
Подключение удаленного СОМ контроллера к USB порту компьютера через несогласованные линии
Структура канала USB – плата Arduino UNO
Типовая схема подключения контроллера Arduino UNO к компьютеру через USB порт показана на Рисунок 1. Со стороны компьютера канал связи виден как стандартный СОМ порт. Но, на самом деле, это виртуальный СОМ порт с которым компьютер обменивается пакетами данных на частоте 12 МГц, а специализированный контроллер, расположенный на плате Arduino UNO, преобразует пакеты USB данных в последовательность бит в формате асинхронного интерфейса UART с уровнями 0/5В, которые и используются основным контроллером Arduino UNO (микросхема ATmega328P) для загрузки программ и обмена данными с компьютером в процессе выполнения программ.
Рисунок 1. Типовое подключение контроллера Arduino UNO к компьютеру через USB порт.
Временная диаграмма последовательной передачи данных по правилам UART устройства с уровнем сигналов 0/5В показана на Рисунок 2. Данные передаются байтами. Помимо данных последовательность содержит стартовый и стоповый биты и может включать другие служебные биты, например, бит контроля четности, применение которого задается в настройках СОМ порта, там же устанавливается и одна из стандартных скоростей передачи.
Примечание. В семействе асинхронного интерфейса UART наиболее известен стандарт физического уровня RS-232, применяемый COM-портом компьютера.
СОМ порт не имеет сигналов синхронизации, временные интервалы формируются как передатчиком так и приемником с точностью тактирования не хуже 5%.
Рисунок 2. Временная диаграмма UART последовательной передачи данных (01001011) микросхемы ATmega328P контроллера Arduino UNO.
Контроллер Arduino UNO содержит специализированный контроллер для преобразования UART сигналов в USB последовательность и наоборот. Порт USB компьютера осуществляющий связь с виртуальным СОМ портом работает в режиме Full-speed на частоте 12 Мбит/с (Рисунок 3). Этот режим поддерживает как USB 1.0. так и USB 2.0.
Рисунок 3. Измеренный 4В сигнал на дифференциальной линии USB–COM контроллера Arduino. Длина USB кабеля 2м. Частота сигналов на USB линии 12 МГц. Для формирования сигналов использовалась запись данных в СОМ порт контроллера. Частота USB данных 12 МГц не изменялась при записи в СОМ порт как на скорости 9600 бит/c так и 115200 бит/c.
Данные по шине USB передаются пакетами (Рисунок 4). Размеры пакета зависят от типа выполняемой передачи. Каждый пакет в режиме Full-speed содержит 8 бит синхронизации тактов приемника и передатчика (Sync), 8 бит идентификатора пакета (PID) и 2 бита конца пакета (EOP). Блок данных может составлять от 0 до 1023 байт.
Рисунок 4. Пример передачи пакета по дифференциальной линии USB 1.1 в режиме Full-speed [2]. Изменение состояние дифференциального сигнала соответствует передаче нуля, сохранение уровней — соответствует передаче единицы. Для улучшения синхронизации на единичных последовательностях принудительно вставляют нуль на каждые 6 единиц подряд.
Кроме пакета данных передаются и другие пакеты. Для выполнения всех передач по USB требуется, чтобы 2 или 3 пакета информации были переданы между хост-контроллером и приемником. Если передача оказалась успешной, пункт назначения возвращает пакет квитирования. При обнаружении ошибки во время передачи генерируется пакет отсутствия уведомления.
Дифференциальные сигналы USB передаются по витой паре экранированного 4-проводного кабеля. По стандарту, сечение сигнальных проводников высокоскоростного кабеля USB 2.0 должно быть 28 AWG и от 20 до 28 AWG для жил питания, в зависимости от длины кабеля (см. Таблица 1).
Таблица 1. Примерное соответствие длины и диаметра проводов USB2 кабеля.
Размер провода [3]
Для увеличения длины USB кабеля его снабжают встроенными усилителями сигнала.
По требованию спецификации USB 2.0 для режима High-speed (до 480 Мбит/с) задержка распространения сигнала в кабеле не должна превышать 5,2 нс/м и быть не более 26 нс, что и определяет максимальную длину кабеля 5 м.
Задержка на метр длины в коаксиальном кабеле обратно пропорциональна скорости распространения волны в м/c, которая вычисляется как
,
где с – скорость света 3*10^8 м/с; е — диэлектрическая проницаемость материала внутреннего изолятора; u — магнитная проницаемость изолятора. Для полиэтилена с u= 1 и е= 2,2 фазовая скорость равна 2*10^8 м/с и, соответственно, задержка 5 нс/м.
Для уменьшения потерь сигнала важно обеспечить однородность волнового сопротивления (в.с.) сигнальной линии. Изменение в.с. может быть связано с некачественной заделкой кабеля, плохим согласованием элементов линии, низким качеством разъёма и др.
Волновое сопротивление кабеля определяется его конструкцией. В.с. коаксиального кабеля в области высоких частот (30 кГц и выше) вычисляется по следующей формуле.
где L – продольная индуктивность закороченного кабеля, Гн; C – поперечная ёмкость разомкнутого кабеля, Ф; e — диэлектрическая проницаемость изолятора; D — диаметр изолятора; d – диаметр проводника. Величина в.с. не зависит от длины кабеля.
Диэлектрическая проницаемость изоляторов лежит в диапазоне 1… 7: 1 – воздух, вакуум; 1.3… 2.4 – полиэтилен; 2.5..6 — резина; 5..7 – фарфор; 6..7 – слюда; 7 — стекло.
Величина в.с. витой пары USB 2.0.кабеля составляет 90 ± 15% Ом [5]. Расчет в.с. экранированной витой пары должен учитывать и взаимное расположение проводников.
В согласованном кабеле у которого нагрузка по концам, имеет сопротивление, равное в.с., вся передаваемая электромагнитная энергия полностью поглощается приемником без отражения. В неоднородных линиях и при несогласованных нагрузках в местах электрической несогласованности возникают отраженные волны и часть энергии возвращается к началу линии.
Коэффициент отражения волн в кабеле равен отношению
,
где rH — сопротивление нагрузки; Z – в.с. кабеля.
Включении несогласованных элементов в USB линию может значительно исказить сигнал. Например, линия оказывается неработоспособной при включение в неё эектровводов из силового кабеля с волновым сопротивлением 10… 40 Ом.
Структура канала USB – RS-232 – плата Arduino UNO
Для обеспечения устойчивой связи удаленного СОМ устройства с компьютером через USB порт длина USB канала сведена к минимуму, на выходе USB линии поставлен USB – RS-232 преобразователь, который через длинную линию подключен к преобразователю уровней +15/-15В == 0/5В, находящегося вблизи контроллера Arduino и подключенного к его UART порту, как показано на Рисунок 5. Скорость обмена данными в этой структуре такая же как и при подключении Arduino к компьютеру через USB кабель, но частота сигнала в протяженной линии почти в 100 раз ниже — как 0,115200 Мбит/с и 12 Мбит/с.
Рисунок 5. Схема подключения контроллера Arduino UNO к компьютеру через USB порт и длинные несогласованные линии. Обозначение контактов GND, передатчика Tx и приемника Rx на стандартном разъеме DB-9 СОМ порта компьютера показано вверху слева. Со стороны устройства сигналы TxD и RxD на разъема DB-9 надо поменять местами.
Преобразователь RS232 уровней (Рисунок 5) не меняет последовательность бит. Он изменяет уровни сигнала 0/5 В в +12/-12 В и наоборот (Рисунок 6).
Рисунок 6. Временная диаграмма и уровни сигналов преобразователя RS232.
Для преобразования уровней сигналов RS232 могут использоваться микросхемы, например, MAX232 (компании Maxim Integrated Products), SP232 (Sipex), ADM232 (Analog Devices). Эти микросхемы имеют одинаковые характеристики и назначения выводов. Подключение преобразователя MAX232 показано на Рисунок 7 [6].
Рисунок 7. Схема подключения преобразователя уровней MAX232. Схема обеспечивает уровень выходного напряжения приблизительно ± 7.5 В соответствующий интерфейсу RS-232.
Рынок предлагает множество модулей преобразователей уровней построенных на базе перечисленных и других микросхем. Внешний вид одного из таких модулей показан на (Рисунок 5).
К компьютеру устройство можно подключить через стандартный COM порт, если он есть, или использовать преобразователь USB-RS232 (другие названия: USB-COM конвертеры, переходники или адаптеры), связанный с USB портом напрямую или через собственный USB кабель. Внешний вид USB преобразователей показан на Рисунок 5.
Вариант реализации макета линии COM устройство – USB порт компьютера без RS-232 линии показан на Рисунок 8.
Рисунок 8. Вариант подключения контроллера Arduino UNO к преобразователю USB-COM компьютера.
Для проверки работоспособности канала обмена данными между контроллером Arduino UNO и компьютером через длинную несогласованную линию был собран провод показанный на Рисунок 9 и Рисунок 10. Куски провода соединялись скруткой или удерживались в гнездах разъемов на трении.
Рисунок 9. Канал RS232 из составного кабеля 9,5 м.
Рисунок 10. Куски провода канала RS232 из составного кабеля 9,5 м.
Передача и прием данных через СОМ порт контроллера Arduino UNO контролировалась утилитой компьютера COM Port Toolkit.
Используемая для тестирования линии программа Arduino UNO, передающая в СОМ порт байты данных и переключающая светодиод контроллера по приходу внешних команд, показана ниже.
Осциллограммы сигналов, снятые на концах состоящей из кусков линии RS-232 показаны на Рисунке 11. Данные передаются на частоте 115200 бит/с.
Рисунок 11. Сигнал амплитудой +7.5/-8 В на концах RS-232 линии составного кабеля длиной 9,5 м. Частота передачи данных 115200 бит/с. Сигнал не имеет заметных искажений.
Прошивка контроллера Arduino UNO
Загрузка программ в контроллер Arduino выполняется при помощи его внутреннего загрузчика, который запускается сразу после включения питания контроллера, или после нажатия на кнопку reset платы, или когда компьютер через линию USB выдаёт сигнал сброса.
При подключении платы Arduino через канал RS-232 с двумя сигнальными линиями Tx и Rx при отсутствии линии сигнала сброса загрузка выполнялась в следующем порядке.
1. Запускалась среда разработки Arduino (как и в режиме загрузки через USB).
2. Загружалась программа (как и в режиме загрузки через USB).
3. Прошивка программы запускалась командой Ctrl+U или через кнопку (как и в режиме загрузки через USB)
4. Дополнительно, после запуска прошивки и заполнения прогресс индикатора нажималась кнопка Reset
на плате контроллера Arduino приблизительно на 0,5 секунды.
Успешная прошивка завершается сообщением
.
Прошивка выполнялась успешно и при кратковременном отключении питания контроллера, вместо нажатия на кнопку Reset.
Запуск загрузчика контроллера Arduino можно выполнять и в автоматическом режиме от компьютера, без нажатия на кнопку Reset или кратковременного отключения питания. Для этого необходимо, например, канал RS-232 с Tx, Rx, и GND дополнить линией RTS и подключить ее через преобразователь уровней ко входу RESET контроллера Arduino.