Как связать контроллер с компьютером

Обновлено: 19.04.2024

Почти все микроконтроллеры имеют на борту последовательный порт — UART . Работает он по стандартному последовательному протоколу, а значит его можно без проблем подключить к компу на COM порт. Но есть тут одна проблема — дело в том, что комповый RS232 он за логические уровни принимает +/- 12 вольт, а UART работает на пятивольтовых уровнях. Как их совместить? Для этого существует несоколько вариантов схем преобразователей уровня, но самая популярная это все же на специальном преобразователе RS232-TTL . Это микросхема MAX232 и ее аналоги.
Практически каждая фирма делает свой преобразователь, так что тут сгодится и ST232 , и ADM232 , и HIN232 . Схемка простая как три копейки — вход, выход, питание и обвязка из пяти конденсаторов. Конденсаторы обычно ставятся 1uF электролиты, но в некоторых модификациях ставится 0.1uF керамика. Я везде впаивал 0.1uF керамику и обычно этого хватало. :) Работает как часы. Если же на высоких скоростях будет глючить, то надо будет повышать емкость.

Кстати, существует еще и MAX3232 это то же самое, но на выходе у него не 5вольт TTL, а 3.3 вольта TTL. Её используют для низковольтных контроллеров.

Я себе сделал один такой универсальный шнурочек, чтобы к контроллерам цепляться было удобно по UART . Для общей компактности всю схему запихал прям в разъем, благо у меня были ST232 в soic корпусе. Получилась платка не больше рублевой монеты. Так как под рукой не было мелких SMD конденсаторов, то пришлось напаять кондеры сверху, кто во что горазд. Главное работает, хоть и не очень красиво вышло.

Плата снизу

Если сомневаешься, что у тебя получится столь мелкий монтаж, то я тебе развел плату на стандартный PDIP корпус. Размером она будет со спичечный коробок, зато мельчить не надо.

Плата сверху

После сборки проверяется просто:
Втыкается в разъем COM порта. Подается 5 вольт питания на схему, а затем замыкаешь Rx на Tx (у меня это зеленый и желтый провода).

Дальше открваешь любую терминалку, хоть Hyper Terminal , цепляешься к порту и начинаешь посылать байты, они должны тотчас возвращаться обратно. Если этого не произошло — проверяй схему, где то косяк.

Если работает, то дальше все просто. Тот провод который идет от ножки 9 микросхемы MAX232 это передающий вывод , его заводи на ногу RxD контроллера. А тот который с ножки 10 — принимающий , его смело сажай на вывод TxD контроллера.

В собранном виде

Плата сделана была методом ЛУТ, в одном месте по моему недосмотру толщина просвета оказалась 0.05мм, протравилась, но со спайками, пришлось процарапывать. А в целом с первого раза ать и никаких проблем. Аж сразу захотелось сделать что нибудь маленькое маленькое, нафаршированное нафаршированное :)

Печатная плата. Тонер не смыт.

Все, аппаратная часть для связи микроконтроллера с компом готова. Ждите следующего поста в котором я расскажу как конфигурировать и использовать UART в микроконтроллерах AVR . В будущем я буду через UART осуществлять отладочную связь с компом. Может быть даже ради этого соберу отдельный модуль с LCD экранчиком. Для отладки в железе. Посмотрим как попрет.

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

165 thoughts on “Связь микроконтроллера с компьютером через RS232”

Актуальнее уже про USB 2 serial рассказывать…

Парадокс однако, последовательные порты в писюках пропадают. А потребители последовательных портов множатся =)

Будет! Когда найду где купить эту гребанную FT232 а заказывать за 3 цены из Москвы совершенно не хочется.

USB — это только провод, и не более 2-3м… И 500 Мбит.сек -оно роботу надо? Видеосигнал гнать — проще камеру со встроенным радиоканалом поставить. (У нас в Алма-ате их в каждом магазине полно, от 10$). Зато с RS232 — хоть через ИК, хоть по простейшему радиоканалу — без проблем. Для управления и телеметрии даже 9600 за глаза, а ведь можно и более 100 кбод обеспечить. Так что у кого нет COM, проще купить переходник USB-RS232 и не морочить голову себе и роботу.
Купить звонок с радиокнопкой за 3-5$, сейчас их полно, вот тебе и командная радиолиния на 430 МГц, если лень самому приемник с передатчиком делать, а подцепить их к USART и COM -не проблема.

Да COM у меня гдет в глубине, а USB на морде. ПЛюс на ноуте нет СОМ порта, а хочется :)

А чо за камеры за 10 баксов да еще с RS232? Чтот не верится.

Нет, в камере радиоканал 1100-1200МГц, на одном транзисторе, а из камеры торчит проводок сантиметров 5-6. Приемник размером с пачку сигарет, видео выход — стандартный, на тюльпанчике. Питание 9-12в,
камера с полспичечного коробка, что чб, что цветная. Цены в зависимости от сложности и качества от 1200 тенге до 6500 и выше.
(Курс = 120 тенге за доллар). Типов — десятки. Например, есть в полусфере, на потолок, поворачивается дистанционно. Большинство имеют встроенную ИК подсветку разной мощности. Китайцы много всего наделали, а Китай от нас рядом, (180км), «Челноки» на автобусе ездят.

Классно, у нас таких цен нет :( Все везут сначала в Москву, а потом только к нам. Выходит раз в 5-10 дороже.

У нас тоже много везут из Москвы, но чаще — с Китая, Тайваня, Турции или Эмиратов. У нас и копьютерное железо заметно дешевле, чем в Москве. И любая валюта свободно ходит, обменники на каждом углу. Полно всяких барахолок, оптовок, магазинчиков. В общем, все есть, были бы деньги…

Не смогли бы вы скинуть фотку платы видеопередатчика описываемого выше?

«Купить звонок с радиокнопкой за 3-5$, сейчас их полно, вот тебе и командная радиолиния на 430 МГц» — не все звонки одинаково полезны. Покупал недавно — так там тупая микрушка, с которой кроме как «подал питание на передатчик — активировался выход на приемнике» никак и не поработаешь.

Много надо?
Могу прислать сколько-нибудь.

В приставки спутниковой антенны, она там стоит для прошивки приставки.

Мож сразу по блютусу будем контроллеры пошивать? ИМХО старый добрый ком ничего не заменит! Пропадают последовательные порты на писюках? Радиолюбители… Спаяй переходник USBtoCOM и никаких тебе проблем.

Сейчас проще уже сразу Obdev AVR-USB использовать, а в пару ему загрузчик BootloadHID. Лишь бы кварц не меньше 12 МГц был.

А как с этим Obdev AVR общатсья с компом? Он виртуальный COM порт открывает?

Сколько памяти в кристалле сжирает код USB?

Какой стандарт выберешь, так и будет общаться. ;) Я использую USB HID — и Windows на стандартный драйвер подхватывает, и утилита есть простейшая для отладки — SimpleHIDWrite.

Можно и CDC (вирт. COM), но тут AVR’ке приходится притворяться Full-speed девайсом — уходит очень много процессорного времени:
«Consumes ca. 90% or more of the AVR’s CPU time because bulk endpoints are polled aggressively by the host. Real-time applications on the AVR are close to impossible.»
Чаще используют на 8 Кбайтовых восьминогих tiny, чтобы сэкономить на FT232.

Можно напрямую, но тогда — пиши свой драйвер для NT. Под *nix можно и без драйвера. :) Ещё, как я понимаю, можно воспользоваться libusb-win32.

Драйвер памяти кушает ~1.5 Кб, зависит от конфигурации. На tiny2313 точно влезало, даже ещё место под свой код оставалось.

HIDBoot кушает 2 Кбайта.

Вопрос: какую набольшую длину кабеля можно сделать от платы с MAX232 до выводов контроллера ? и какая наибольшая длина может быть у кабеля от MAX232 до COM порта, если делать девайс на стороне контроллера ?

У меня от МАХ232 до контроллера 1.5 метра, от MAX232 до порта тоже было 1.5 метра, работало без сбоев. ПОдозреваю, что можно и много больше, по крайней мере раза в два три точно. Но тут уже от скорости передачи зависит.

«RS-232 — интерфейс передачи информации между двумя устройствами на расстоянии до 20 м.» (С)Wikipedia

Это чистый 12В рс232. Поэтому от МАкс до контроллера сильно лучше не удалять.

Я писал про случай Макс-COM.

У меня где-то было описание стандарта RS232. Помнится, при скорости 50 бод — до 1,5 км. Чем быстрее, тем меньше. Точно табличку не помню, но, думаю, что метров до 5 по витой паре и 115кбод — не проблема. А зачем роботу большая скорость? Я 20 лет проработал в лаборатории телеграфа. Основная скорость на сети была 50 бод, 1знак передавался за 150 мсек. 6 знаков в сек. При скорости 200 бод уже еле — еле успеваешь читать теуст, распечатываемый на телетейпе. Что толку выплюнуть знак в линию за микросекунду, а потом несколько секунд ждать следующего? Я думаю, роботу и 9600 — за глаза, а на такой скорости хоть через ИК или простейший радиоканал гони. Не будет же робот на проводке сидеть, ему надо хотя бы по комнате бегать. А режим отладки для него не главное, можно и по шнурку.

На быстром обмене можно не заморачиваться на создание буффера и слать посимвольно. На медленной скорости будет тупить вся прога на передаче =)

Гдето давно схемка была датакабеля для симена с25,на мах232 дак там и питание от ком порта было и вся схема с микрой в дипе в пластмассовый корпус разъёма влезала

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

А зачем роботу USB? Что по нему гнать? Где взять столько информации? Опять же, для USB — только кабель, и то короткий. Уж больно жесткие нормы на задержки. Как я понял, пока что изучение идет с привязкой к роботу. Да и по USB в интернете статей валом, как программному, начиная с 2313, так и аппаратному, встроенному. Кто уж вышел на такой уровень, найдет без труда. При таком подходе проще на робот ноутбук шпагатом привязать, там и USB уже есть, и много чего еще. Лучше больше места в программе уделить функциональности, «интеллекту» робота, чем тратить килобайты кода, чтобы передать сотню байтов в час.

Иногда без USB просто никак. Например знакомые просят сделать им кое какие девайсы, а COM портов на их компах нету… Вот и приходится извращаться.

Извращаться — это как раз делать устройства под благополучно вымерший COM-порт.
USB рулит :)

Да он еще столько же проживет. Может и не на пользовательских компах, но вот в промышленных решениях точно!

FT232 спасет отца русской демократии :)

Да гораздо проще купить за несколько баксов переходник USB — COM, их везде полно, и не расходовать ресурсы контроллера на избыточный для него интерфейс. Все равно ведь чаще всего в компе ему приходится COMом прикидываться… А ставить дорогого монстра с кучей мелких ног ради USB туда, где и Меги 8 или PIC16F873 за глаза — вообще западло… А UART почти в каждом контроллере нахаляву уже есть. И программируется в десяток байт кода.

Скажи это будущим пользователям твоих устройств, им возиться с переходниками не понравится. А COM’ом прикидываться смысла нет… Воткнул устройство в комп, винда увидела HID устройство, и софт сразу начинает с ним работать. Вообще красота.
А монстров ставить и не обязательно, ATMEGA8 софтварно с USB отлично работает.

Ага, и четверть ПЗУ, и процентов 80 производительности- на обслугу этой хрени…

Если, например, в «Умном доме» с компом будет общаться с десяток устройств, шнурков не напасешься… Да и как их разместить в доме, при ограничении на длину 2-3 метра? Робот на такой веревке тоже далеко не убежит. В радиоканал или ИК USB не засунешь (задержки!). А прицепи к COM порту передатчик на одном транзисторе, да приемник на одной микросхеме, и 50-150м на улице или 20-25м в бетонном доме тебе обеспечены.

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

Открываю ГиперТерминал, выбираю подключиться через com 1, пишу текст. Что я должен увидеть?

Свой же набранный текст к тебе должен вернутся (при отключеном эхе). Если схема собрана верно и работает.

Вопрос от новичка. uF — что за приставка микро, мили, нано :(). Что брать в магазине?

Еще вопросик. В печатной плате. номерация площадок для приклеивания разьема RS232 с лево на право 1,2. 5. Когда начал прикладывать разем к спаеной плате получилось, что цифры не на разьеме и на плате не совпадаю. 1(RS232) напротив 5 (плата), 2(RS232) напротив 4 (плата) и т.д. это так и задумывалось? или на печатной плате в электронном виде перепутан порядок цифр?

Если рисунок получившейся платы точно повторяет фотку — то значит на чертеже перепутаны номера контактов. Т.к. я помню, что вначале плату сделал на DIP и лишь потом отзеркалил. Номера контактов перевернуть мог и забыть :))

Нет, все нормально. Это я маму с папой перепутл. Когда взяд маму все цифры совпали :). Тока еще вопрос есть. если нумерация ног начинается от метки с возростанием номера ноги против часовой стрелко, то как Тх и Rx попали на 7 и 8 ногу Мах232. Должны наверно быть 15 и 16 (в тексте статьи)

да кстати. про ноги тоже заметил, только не 15,16 а 9,10.

Хотел купить микруху MAX232, а её в прайсе нет, но есть другие, какую брать? Самую дешёвую? ;-) И чем они отличаются?

MAX232AEJE 127.65руб.
MAX232AEPE+ 71.63руб.
MAX232AESE 63.86руб.
MAX232AESE+ 58.64руб.
MAX232AEWE 56.11руб.
MAX232AMJE 223.67руб.
MAX232CPE 22.12руб.
MAX232DR PBF 9.83руб.
MAX232ECDW PBF 21.07руб.
MAX232EEPE 56.53руб.

ST232ABDR PBF 22.42руб.
ST232ACDR PBF 11.59руб.
ST232BDR PBF 12.64руб.
ST232BN PBF 16.22руб.
ST232CDR PBF 11.24руб.
ST232CN PBF 11.59руб.

Разница только в производителе и в типе корпуса. Еще в температурном диапазоне.

Бери любой в DIP корпуспе (продавцы знают) для большой версии или в SOIC для малой. SOIC правда бывает двух видов — широкий и узкий. Моя плата нарисована для узкого (широкий встречается реже). Так что это тоже надо учитывать.

В любом случае, какую бы ты не купил — подойдет. В худшем случае перерисуешь плату по новой. Цоколевка выводов у них у всех одинаковая.

До сих пор существует множество устройств, которые подключаются к компьютеру через СОМ порт, но, поскольку в состав современных компьютеров все реже входят СОМ порты, то связь с СОМ устройствами выполняется через USB порты дополненными специальными преобразователями сигналов. Значительное повышение частоты сигналов в USB линии (в сравнении с сигналами СОМ порта) накладывает ограничение на длину линий, повышает их стоимость и требует решения вопросов согласования линий. В этой работе на примере контроллера Arduino UNO рассматривается подключение СОМ устройства к компьютеру через протяженные несогласованные линии.

Структура канала USB – плата Arduino UNO

Типовая схема подключения контроллера Arduino UNO к компьютеру через USB порт показана на Рисунок 1. Со стороны компьютера канал связи виден как стандартный СОМ порт. Но, на самом деле, это виртуальный СОМ порт с которым компьютер обменивается пакетами данных на частоте 12 МГц, а специализированный контроллер, расположенный на плате Arduino UNO, преобразует пакеты USB данных в последовательность бит в формате асинхронного интерфейса UART с уровнями 0/5В, которые и используются основным контроллером Arduino UNO (микросхема ATmega328P) для загрузки программ и обмена данными с компьютером в процессе выполнения программ.

image


Рисунок 1. Типовое подключение контроллера Arduino UNO к компьютеру через USB порт.

Временная диаграмма последовательной передачи данных по правилам UART устройства с уровнем сигналов 0/5В показана на Рисунок 2. Данные передаются байтами. Помимо данных последовательность содержит стартовый и стоповый биты и может включать другие служебные биты, например, бит контроля четности, применение которого задается в настройках СОМ порта, там же устанавливается и одна из стандартных скоростей передачи.

Примечание. В семействе асинхронного интерфейса UART наиболее известен стандарт физического уровня RS-232, применяемый COM-портом компьютера.

СОМ порт не имеет сигналов синхронизации, временные интервалы формируются как передатчиком так и приемником с точностью тактирования не хуже 5%.

image


Рисунок 2. Временная диаграмма UART последовательной передачи данных (01001011) микросхемы ATmega328P контроллера Arduino UNO.

Контроллер Arduino UNO содержит специализированный контроллер для преобразования UART сигналов в USB последовательность и наоборот. Порт USB компьютера осуществляющий связь с виртуальным СОМ портом работает в режиме Full-speed на частоте 12 Мбит/с (Рисунок 3). Этот режим поддерживает как USB 1.0. так и USB 2.0.

image


Рисунок 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 байт.

image


Рисунок 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]

image

Для увеличения длины USB кабеля его снабжают встроенными усилителями сигнала.
По требованию спецификации USB 2.0 для режима High-speed (до 480 Мбит/с) задержка распространения сигнала в кабеле не должна превышать 5,2 нс/м и быть не более 26 нс, что и определяет максимальную длину кабеля 5 м.

Задержка на метр длины в коаксиальном кабеле обратно пропорциональна скорости распространения волны в м/c, которая вычисляется как

image

,
где с – скорость света 3*10^8 м/с; е — диэлектрическая проницаемость материала внутреннего изолятора; u — магнитная проницаемость изолятора. Для полиэтилена с u= 1 и е= 2,2 фазовая скорость равна 2*10^8 м/с и, соответственно, задержка 5 нс/м.

Для уменьшения потерь сигнала важно обеспечить однородность волнового сопротивления (в.с.) сигнальной линии. Изменение в.с. может быть связано с некачественной заделкой кабеля, плохим согласованием элементов линии, низким качеством разъёма и др.

Волновое сопротивление кабеля определяется его конструкцией. В.с. коаксиального кабеля в области высоких частот (30 кГц и выше) вычисляется по следующей формуле.

image


где 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]. Расчет в.с. экранированной витой пары должен учитывать и взаимное расположение проводников.

В согласованном кабеле у которого нагрузка по концам, имеет сопротивление, равное в.с., вся передаваемая электромагнитная энергия полностью поглощается приемником без отражения. В неоднородных линиях и при несогласованных нагрузках в местах электрической несогласованности возникают отраженные волны и часть энергии возвращается к началу линии.
Коэффициент отражения волн в кабеле равен отношению

image

,
где 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 Мбит/с.

image


Рисунок 5. Схема подключения контроллера Arduino UNO к компьютеру через USB порт и длинные несогласованные линии. Обозначение контактов GND, передатчика Tx и приемника Rx на стандартном разъеме DB-9 СОМ порта компьютера показано вверху слева. Со стороны устройства сигналы TxD и RxD на разъема DB-9 надо поменять местами.

Преобразователь RS232 уровней (Рисунок 5) не меняет последовательность бит. Он изменяет уровни сигнала 0/5 В в +12/-12 В и наоборот (Рисунок 6).

image


Рисунок 6. Временная диаграмма и уровни сигналов преобразователя RS232.

Для преобразования уровней сигналов RS232 могут использоваться микросхемы, например, MAX232 (компании Maxim Integrated Products), SP232 (Sipex), ADM232 (Analog Devices). Эти микросхемы имеют одинаковые характеристики и назначения выводов. Подключение преобразователя MAX232 показано на Рисунок 7 [6].

image


Рисунок 7. Схема подключения преобразователя уровней MAX232. Схема обеспечивает уровень выходного напряжения приблизительно ± 7.5 В соответствующий интерфейсу RS-232.

Рынок предлагает множество модулей преобразователей уровней построенных на базе перечисленных и других микросхем. Внешний вид одного из таких модулей показан на (Рисунок 5).

К компьютеру устройство можно подключить через стандартный COM порт, если он есть, или использовать преобразователь USB-RS232 (другие названия: USB-COM конвертеры, переходники или адаптеры), связанный с USB портом напрямую или через собственный USB кабель. Внешний вид USB преобразователей показан на Рисунок 5.

Вариант реализации макета линии COM устройство – USB порт компьютера без RS-232 линии показан на Рисунок 8.

image


Рисунок 8. Вариант подключения контроллера Arduino UNO к преобразователю USB-COM компьютера.

Для проверки работоспособности канала обмена данными между контроллером Arduino UNO и компьютером через длинную несогласованную линию был собран провод показанный на Рисунок 9 и Рисунок 10. Куски провода соединялись скруткой или удерживались в гнездах разъемов на трении.

image


Рисунок 9. Канал RS232 из составного кабеля 9,5 м.

image


Рисунок 10. Куски провода канала RS232 из составного кабеля 9,5 м.

Передача и прием данных через СОМ порт контроллера Arduino UNO контролировалась утилитой компьютера COM Port Toolkit.

Используемая для тестирования линии программа Arduino UNO, передающая в СОМ порт байты данных и переключающая светодиод контроллера по приходу внешних команд, показана ниже.


Осциллограммы сигналов, снятые на концах состоящей из кусков линии RS-232 показаны на Рисунке 11. Данные передаются на частоте 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 секунды.

image

.

Прошивка выполнялась успешно и при кратковременном отключении питания контроллера, вместо нажатия на кнопку Reset.

Запуск загрузчика контроллера Arduino можно выполнять и в автоматическом режиме от компьютера, без нажатия на кнопку Reset или кратковременного отключения питания. Для этого необходимо, например, канал RS-232 с Tx, Rx, и GND дополнить линией RTS и подключить ее через преобразователь уровней ко входу RESET контроллера Arduino.

Всем привет! В интернете бытует заблуждение, что для управления компьютером при помощи самодельной электроники нужны только специальные платы, которые могут распознаваться как USB HID устройства. А касаемо Arduino все только и говорят о Arduino Leanardo. Такие популярные библиотеки как Keyboard и Mouse, которые позволяют создавать эмуляцию работы мыши или клавиатуры посредством микроконтроллера предназначены только для пары плат Arduino, Leonardo в их числе.

Я расскажу о том, как наладить связь любого микроконтроллера Arduino (для примера взята Arduino Uno) и своей программы на Processing. Добавив ко всему прочему знания о Java, на котором основывается Processing, можно будет дописать проект под управление всем компьютером, а не только собственным приложением. Тема управления компьютером программой на Java не есть чем то секретным, погуглите и все найдете, уверяю вас.

Скачиваем среды для разработки (IDE)

Существует много интегрированных сред разработки для программирования микроконтроллеров на чистом Си. Из них можно отметить самые удобные: Atollic, Eclipse, Keil.

Среду разработки для программирования на Procrssing так же можно скачать с официального сайта.

Стоит отметить, приличия ради, что данные IDE очень похожи, потому что написаны на одном движке. И когда создавался Arduino основатели старались как можно больше упростить свой редактор кода, как это и было сделано в Processing редакторе.

Arduino. Собираем схему и пишем код

В данном примере я буду использовать Arduino Uno. К ней будет подключена кнопка, потенциометр и светодиод. Соответственно я могу выдавать логический 0 или 1. Читать логический 0 или 1. И проводить Аналого-цифровое преобразование(ADC или АЦП), получая числа от 0 до 1023 (в Arduino Uno 10-ми разрядный АЦП) в зависимости от положения потенциометра. Большего для примера и не нужно, так как это основные функции, которые может делать микроконтроллер.


На схеме светодиод анодом подключен к 5V через ограничивающий резистор ( минимум 220 Ом, желательно 500 Ом), катодом к пину D11. Кнопка замыкает землю и пин D2. Потенциометр меняет потенциал на пине A1.

Вот мое предложение решения данной задачи (не пример для подражания):

Что бы залить прошивку в плату не забывайте выбрать порт и плату.


Если вы не знаете какой COM порт у вас отведен для платы Arduino, то на Windows заходим в
Панель управления -> Диспетчер устройств и нажимаем на вкладку «Порты COM»


Если у вас COM порт не подписан как у меня — всегда можно отсоединить Arduino и посмотреть который порт пропадет. А вот если никакой не пропал и Ардуина вовсе не распознается компьютером — значит пора поискать решение в интернете. Но начните с обновления драйверов или смены платы.

Когда все получится — попробуйте открыть монитор порта и ввести «Led — H», «Led — L», по нажимайте на кнопку, покрутите потенциометр и смотрите на экран, все ли правильно выводится.

Наигрались — поменяйте слегка код.

Замените последнюю строку кодом из комментария.


Теперь значения с потенциометра не будут выглядеть читабельными, но такой маневр требуется для программы на Processing.

Processing. Пишем программу, которая взаимодействует с микроконтроллером

Следующая программа подключит библиотеку Serial и напишет в консоли редактора список всех COM портов, к которым можно подключиться.


Когда вы напишете код в редактор и нажмете на кнопку «Пуск» (стрелочка 1 на картинке), то появится окно приложения(2) и в консоли(3) выведется список COM портов.


У меня только один такой COM порт и в листе, как в массиве, он будет находиться под номером 0. Из этих соображений объекту класса Serial: Serial port; при его создании будет указан именно первый элемент списка портов port = new Serial(this, Serial.list()[0], 9600);


Или вот другой пример. Светодиод будет менять свое состояние после любого нажатия на окно приложения (размеры которого 800х800px) кнопкой мыши.

Processing. Пример многофункционального приложения

Данное элементарное приложение симулирует «полет в космосе», если это можно так назвать. Значение с потенциометра изменяет скорость полета, нажатие на кнопку меняет направление полета. А любое нажатие кнопки мыши на окно приложения — меняет состояние светодиода (да, ничего оригинальнее я не придумал).

Мой код далек от совершенства, не принимайте его как хороший пример. Это просто пример, который работает. Вот, собственно, он.

Заключение

Думаю, нужно написать, что идею последней программы я подцепил у одного программиста — Daniel Shiffman, который снимает ролики, понятные даже детям, о программировании на Processing (решено более 140 визуальных задач).

Когда я пытался сам разобраться в том что и как нужно делать для связи Processing и Arduino мне очень помогли вот эти сайты:

Локальная сеть — вещь прикольная и интересная. Место обитания каждого гика, включая его самого, опутано витой парой сверху донизу. Почему бы не использовать всё это на пользу дела?

Тем более, существует микросхема, позволяющая микроконтроллеру прекрасно чувствовать себя в сети Ethernet. А именно, ENC28J60, разработка вражеской компании Microchip. Об её использовании мы и поговорим.

Вообще-то, Ethernet — достаточно обширная тема. В один пост явно не поместится. Так что частей будет несколько.

Эта первая часть, и как обычно, — вводная и обзорная.

А зачем это нужно?

С точки зрения микроконтроллера, локальная сеть — лишь ещё один интерфейс «наружу». Зачем использовать именно его, а не простейший RS-232, скажем?

  • Это удобно. Любая нормальная операционная система имеет нативную поддержку сети и API для работы с ней. Много стандартного софта умеет работать в сети и сможет обращаться к нашему девайсику.
  • Девайс будет доступен как минимум с любого компа, подключенного к локальной сети, а максимум — вообще с любого компа, имеющего доступ в интернет. В том числе, по беспроводному соединению — к девайсу можно будет обращаться, например, с ноутбука, не привязывая себя к девайсу проводами.
  • Девайс сам сможет выходить в интернет и получать различную информацию — от точного времени до прогноза погоды и последних новостей (хм, ну конечно если памяти у МК хватит на всё это).
  • Это быстро. 10 мбит/с — более чем прилично для микроконтроллерного девайсика.
  • Девайс больше не привязан к компу проводами — максимальные 100 м для витой пары не идут ни в какое сравнение с «классическими» интерфейсами.
  • Это просто. Нет, правда! IP-стек мне кажется куда проще и логичнее чем, скажем, USB.

Конечно, есть и недостатки — для работы с сетью нужен контроллер с обвязкой. Что несколько повышает стоимость конечного девайса.

Disclaimer

Стоит сразу сказать что здесь подразумевается под Ethernet и что это есть на самом деле.

Ethernet — группа стандартов IEEE 802.3, описывающая различные технологии локальных сетей. В этих стандартах определён общий канальный уровень и набор технологий физического уровня (использующих для передачи данных оптоволокно, витую пару, коаксиал, с разными скоростями, etc.).

Здесь же под Ethernet будет подразумеваться конкретный стандарт IEEE 802.3i, который и поддерживается ENC28J60. В этом стандарте физический уровень — это 10BASE-T, 10 мбит/с по витой паре (Twisted pair).

The Plan

Вот, в общем виде, структурная схема девайса:

The Plan

Здесь вроде-бы всё просто. ENC28J60 содержит в себе физический уровень (PHY) и канальный уровень (MAC) Ethernet. Микроконтроллеру остаётся только подтаскивать пакеты для отправки и забирать принятые через SPI.

В прошивке микроконтроллера реализован простенький IP-стек, позволяющий прикладной задаче общаться с задачами на других системах с помощью стандартных протоколов.

Более подробно обо всём этом будет в следующих частях.

Модель OSI

А что это за уровни, о которых я всё говорю? Если ты знаешь, эту часть можно пропустить.

Модель OSI — полезная вещь для понимания того, как работает сеть. Здесь о ней очень кратенько.

Данная модель разбивает коммуникационную систему на простые части, называемые уровнями. Каждый уровень обслуживает следующий (верхний) и обслуживается предыдущим (нижним) — вертикальные связи. Особенности функционирования каждого уровня скрыты от других уровней.

Взаимодействует две системы, соответственно есть и по два экземпляра каждого уровня. На каждом уровне используются свои протоколы (горизонтальные связи).

OSI Model

Всего есть 7 уровней модели OSI.

OSI Model Layers

У нас будет только 5 уровней.

Физический уровень

У нас это 10BASE-T. Физический уровень реализован в ENC28J60. Сюда входит витая пара и всё, что нужно для передачи данных по ней (драйверы, трансформаторы).

Канальный уровень

Канальный уровень Ethenet (MAC) тоже реализован в ENC28J60. Канальный уровень отвечает за передачу Ethernet-фреймов между узлами локальной сети (адресацию, проверку контрольной суммы, разрешение коллизий, etc.).

Проще говоря, канальный уровень — это то, что позволяет посылать фреймы другим узлам локальной сети и принимать фреймы от них.

Также к канальному уровню относится протокол ARP, который служит для преобразовния IP-адресов в MAC-адреса.

Сетевой уровень

Сетевой уровень отвечает за передачу пакетов. У нас это IP. IP-пакет спокойно может пройти через несколько разных сетей с различными технологиями физического и канального уровня.

Проще говоря, сетевой уровень — это то, что позволяет отправлять пакеты любым узлам и принимать пакеты от любых узлов.

В нашем маленьком IP-стеке сетевой уровень будет очень простой. Скажем, отправка пакета будет сводиться к добавлению к блоку данных IP-заголовка и отрпавке в виде фрейма канального уровня на определённый MAC-адрес.

Транспортный уровень

Транспортный уровень отвечает за связь узлов. Скажем, приложение хочет отправит данные другому узлу. Транспортный уровень представляет эти данные в виде пакета сетевого уровня (или пакетов) и отправляет. Если используется протокол с установкой соединения, транспортный уровень занимается также установкой и контролем соединения. UDP и TCP — протоколы транспортного уровня.

Прикладной уровень

А тут может быть всё, что нам вздумается. Это то, ради чего всё затевалось. Та самая задача, обменивающаяся с внешним миром данными по какому-то своему или стандартному протоколу.

Вприницпе, пока это всё. В следующей части будет ближе к делу. Будем писать библиотеку для работы с ENC28J60. :)

Подключение МК к ПК


Микроконтроллеры PIC16 имеют универсальный синхронно-асинхронный приемопередатчик USART, с помощью которого можно реализовать передачу информации между компьютером и микроконтроллером. Передача данных по USART осуществляется поочередно по одному биту, поэтому данный интерфейс называют последовательным, логические уровни сигналов обычно соответствуют уровням логики ТТЛ, КМОП и т.д. На компьютере UART (асинхронный последовательный интерфейс) реализован в виде интерфейса RS-232 через последовательный порт (COM) компьютера. Основное отличие интерфейса RS-232 заключается в величине логических уровней сигнала, логическому “0” соответствует положительное напряжение +5…15В, логической “1” отрицательной напряжение -5…15В. Такие уровни были выбраны для улучшения помехоустойчивости и увеличения дальности связи.

В современных компьютерах и ноутбуках, как правило, COM порт отсутствует, в этом случае можно воспользоваться специальным переходником USB-COM (преобразователь интерфейса USB – RS232), что я и сделал. В моем случае переходник реализован на основе чипа FTDI, при желании его можно изготовить самостоятельно с помощью специализированных микросхем FT232, PL2303 и т д.

Выход передатчика обозначается символами TхD (Tx), вход приемника RxD (Rx), на разъеме COM порта компьютера выход TxD соответствует 3-му выводу, вход RxD 2-му выводу, 5-й вывод общий провод (GND). При подключении двух устройств по UART, выход передатчика 1-го устройства соединяют с входом приемника 2-го устройства, и соответственно выход передатчика 2-го устройства с входом приемника 1-го устройства. Интерфейс UART (асинхронный) позволяет одновременно вести прием и передачу информации между устройствами, в отличие от USRT (синхронный интерфейс). Как было сказано выше, передача данных осуществляется последовательно по битам, через равные промежутки времени, поэтому оба устройства должны быть настроены на одинаковую скорость и режим работы, то есть синхронизация в данном случае осуществляется по времени, соответственно требования к точности временных задержек должны быть высокими.

Схема подключения МК к ПК

Для подключения к ноутбуку по UART в качестве примера я использовал микроконтроллер PIC16F628A, схема представлена ниже:

Преобразователь USB-COM , которым я воспользовался, выдавал следующие уровни напряжения: логической “1” соответствовал уровень отрицательного напряжения -6,5В; логическому “0” положительное +6,5В, что соответствует стандарту интерфейса RS-232, поэтому для согласования уровней микроконтроллера и переходника я установил транзисторы VT1, VT2. Для передачи логической “1” (от микроконтроллера на преобразователь) по стандарту RS-232 необходимо создать отрицательное напряжение, что было сделано мной в самом начале тестирования, с помощью генератора импульсов на таймере NE555 и диодно-конденсаторной схеме. Потом как выяснилось, нулевое напряжение преобразователь воспринимает так же, как и отрицательное, поэтому надобность в источнике отрицательного напряжения отпала.

Чтобы задействовать COM порт на компьютере (в случае использования переходника USB-COM создается виртуальный COM порт), можно запустить стандартную программу HyperTerminal (терминал), которая отсылает на COM порт ASCII коды символов введенных с клавиатуры. Принятые данные программа также преобразует в символы в соответствии с таблицей ASCII. Для визуализации принятых данных от ноутбука, к микроконтроллеру подключены светодиоды HL1-HL4 и цифровое табло на драйвере MC14489AP. Светодиоды зажигаются при нажатии соответствующих кнопок на цифровой клавиатуре ноутбука (цифры 1-4), цифровое табло отображает значение принятого байта. При нажатии кнопки SB1 микроконтроллер отправляет на ноутбук фразу “PIC Alive ”.

Теперь рассмотрим сам код программы:

В основной программе сначала идет настройка линий ввода/вывода микроконтроллера, линии RB1/RX, RB2/TX настраиваются на вход для работы модуля USART. Далее идет настройка скорости передачи данных по USART, путем записи числа 0х19 в регистр скорости обмена SPBRG. В даташите на микроконтроллер приведена таблица, где рассчитаны значения скорости обмена в зависимости от частоты тактового генератора, режима (высокоскоростной, низкоскоростной, синхронный, асинхронный) а также от числа, загружаемого в регистр SPBRG, там же приведены формулы для расчета скорости обмена. В данном примере частота тактового генератора равна 4 МГц (внутренний тактовый генератор), режим асинхронный высокоскоростной, числу 0х19 будет соответствовать скорость обмена в 9615 бит/сек, что незначительно отличается от стандартной скорости 9600 бит/сек, ошибка в процентном соотношении составит +0,16%.

В приемнике главным является сдвиговый регистр RSR, после получения стопового бита, данные переписываются из RSR в регистр RCREG, после чего устанавливается флаг прерывания RCIF в регистре PIR1, само прерывание можно разрешить или запретить битом RCIE регистра PIE1. Флаг прерывания RCIF сбрасывается аппаратно, при чтении регистра RCREG. Регистр RCREG представляет собой двухуровненвый буфер, то есть может принять два байта, при этом необходимо считать его два раза. Если регистр RCREG полон, а в RSR пришел 3-й байт, устанавливается флаг переполнения приемника OERR в регистре RCSTA, приемник при этом отключается. Для сброса флага переполнения, необходимо запретить прием, то есть сбросить бит CREN.

Я организовал прием данных на прерываниях, после приема байта, по флагу RCIF вызывается подпрограмма обработки прерываний, где данные из регистра RCREG переписываются в регистр хранения priem, далее устанавливаем флаг получения байта (0-й бит) в дополнительном регистре flag, который опрашиваем в основной программе. Можно было пойти другим путем, опрашивать флаг прерывания RCIF в основной программе, но в этом случае при большом периоде опроса, приемник может переполниться и отключится. В случае с прерываниями переполнения не произойдет, максимум можно потерять несколько байтов, если в основной программе период опроса флага получения байта (0-й бит регистра flag) большой.

В основной программе происходит опрос кнопки и флага получения байта, если флаг установлен, содержимое регистра priem переписывается во временный регистр var, далее вызывается подпрограмма управления светодиодами (svet), в которой содержимое регистра var проверяется на совпадение с числами 49, 50, 51, 52. Этим числам соответствуют символы 1, 2, 3, 4 (десятичные цифры) из таблицы ASCII. Если в подпрограмме svet обнаружено совпадение, то зажигается соответствующий светодиод из HL1-HL4, остальные гаснут, при отсутствии совпадений выключаются все светодиоды. Далее вызывается подпрограмма вывода (vivod) содержимого регистра var на цифровое табло из семисегментных индикаторов, после возврата сбрасывается флаг получения байта, затем выполняется подпрограмма паузы (15 мс), после чего происходит переход на метку oproskn1, для очередного цикла опроса.

При нажатии кнопки SB1 вызывается подпрограмма message, которая отправляет фразу “PIC Alive ” через USART на ноутбук. Для сокращения кода символы размещены в таблице данных, всего 10 символов, порядковый номер символов хранится в регистре nomer. Перед каждым вызовом таблицы (подпрограмма table) регистр nomer инкрементируется, для извлечения следующего символа, после чего отправляется по USART. Одновременно с этим выполняется проверка равенства содержимого регистра nomer числу 10, если есть соответствие, происходит выход из подпрограммы message, то есть все символы переданы.

В передатчике главным является сдвиговый регистр TSR, буфером передатчика является регистр TXREG, в который загружают данные для передачи. После передачи стопового бита предыдущего байта, в регистр TSR передаются новые данные из регистра TXREG, при этом выставляется флаг прерываний TXIF в регистре PIR1, само прерывание можно разрешить или запретить битом TXIE регистра PIE1. Флаг прерывания TXIF сбрасывается аппаратно, после загрузки новых данных в TXREG. Аналогичным образом состояние регистра TSR отображает флаг TRMT регистра TXSTA, флаг устанавливается при опустошении TSR.

В моем варианте, символы, извлеченные из таблицы данных, загружаются в регистр TXREG, после чего происходит опрос флага TRMT, если флаг установлен (байт передан, TSR пуст), выполняем извлечение следующего символа. Вместо флага TRMT, можно опрашивать флаг прерываний TXIF, получим такой же результат. Чтобы не затрачивать процессорное время на опрос флагов, можно организовать передачу данных на прерываниях, то есть загружать регистр TXREG в подпрограмме обработки прерываний.

Настройки программы HyperTerminal

Перейдем к рассмотрению настроек программы HyperTerminal. Создаем новое подключение (File – New Connection) и задаем ему любое имя, например 111, переходник USB-COM при этом должен быть подключен. В следующем окне выбираем COM порт, далее необходимо настроить параметры порта: выставляем скорость передачи 9600 бит/сек, 8 бит данных, без проверки четности, один стоповый бит, и отключаем управление потоком. После этого в левом нижнем углу должна появиться надпись “Подключено” (Connected). Далее заходим в свойства созданного подключения (File – Properties), выбираем вкладку настройки и нажимаем кнопку “ASCII Setup”. В открывшемся окне ставим галочку для отображения введенных символов на экран (Echo typed characters locally), и еще одну галочку для дополнения символа возврата каретки переводом строк (Send line ends with line feeds), проще говоря, чтобы при нажатии клавиши Enter переходить на новую строку. Вот в принципе и все, можно отправлять и принимать данные, все отображается в окне программы. Ниже представлены скриншоты с настройками программы:

Вместо HyperTerminal, можно воспользоваться еще одной удобной программой под названием Terminal v1.9b by Bray. Здесь все настройки представлены в одном окне, имеется встроенная таблица символов ASCII, также программа умеет строить графики по принятым данным в диапазоне от 0 до 255.

Ниже на видеоролике можно просмотреть результат работы по подключению микроконтроллера PIC16F628A к ноутбуку через переходник USB-COM:

Читайте также: