Колесная робоплатформа. Часть 3а — Мультимодульный USART. Теория.


Удивительно мало написано про такой простой и удобный инструмент, как связь по USART нескольких модулей. Эта тема требует отдельного рассмотрения физической, протокольной и программной части. Поскольку я в конце 2007 года увлекся микроконтроллерами фирмы Atmel, связывать мы будем по их методике. Тут существуют и промышленные решения, к примеру RS-485 или его дуплексные близнецы, но они совершенно не подходят для мобильной робототехники. Там обычно к каждому узлу ставится свой блок, одной стороной подключенный к общей шине, другой к приемопередатчику. Сейчас я хочу описать свой вариант связи нескольких устройств по USART.

В целом.

Как я уже упоминал, требуется определить физический уровень, протокол передачи и программную часть. Если про последнюю еще сказано в документации Atmel, то про две предыдущие гугл дает только разбитые, разрозненные данные. Про USART можно много что прочитать в интернете, в той же документации на контроллеры AVR и даже в моем очень кривом переводе. Что же, начнем изобретать.

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

Итак, нам нужно соединить несколько передатчиков и приемников. С приемниками все просто — это входные линии, как я понимаю, высокоомные, поэтому ничего не мешает просто взять и соединить приемники вместе. Передатчики, само собой так соединять нельзя. Оно и понятно. Пока один передатчик находится в режиме ожидания, он выставляет высокий уровень сигнала на линии. Если другой передатчик попытается что-то передать… Ток хлынет большой, и кто-то откинется первым. Первое, что можно сделать — соединить приемники, подтянуть к плюсу, а передатчики закинуть на транзисторы, которые будут тянуть линию к земле. Так вполне можно делать.

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

Вот и добро не пропадает и работать должно как следует. Только завалялась у меня HEF4081, в которой четыре отдельных элемента И с двумя входами у каждой. Не дела. Придется их каскадировать. Самый рациональный способ, который я знаю выглядит так:

Теперь осталось подтянуть большим резистором каждый вход к плюсу и получим USART хаб на пять устройств.

Протокол.

Atmel в своей документации предлагает простой протокол для мультимодульной связи, который аппаратно поддерживается AVR контроллерами. А я надеюсь, что читатель уже в курсе того, каким бывает UART и что в нем летает. Если нет — читать. Это полезно. Выглядит он так:

Как видно из диаграммы, фрейм адреса от фрейма данных отличается девятым битом: адресный — высокий уровень, данные — низкий. Так вот если переключить приемопередатчик в мультипроцессорный режим, то он будет аппаратно отсеивать все фреймы данных, пока не получит адресный фрейм. Получив адресный фрейм, данные из него можно будет прочитать, сравнить с адресом устройства, и если адрес совпадет, принимать все данные дальше, до тех пор, пока не встретится другой адресный фрейм. Или если адрес не совпадет — то и не нам говорят. Ждем дальше. Это со стороны приемника. Со стороны передатчика мы шлем адресный фрейм получателя, а затем просто отправляем данные как обычно во фреймах данных. И так до тех пор, пока не потребуется обратиться к другому устройству. Тогда снова отправляем адрес, затем данные.
Это не единственный вариант реализации мультимодульного режима связи, но и рекомендуемый в документации и просто самый удобный. Можно слать меньше бит, тогда шестой или к примеру восьмой бит будет выполнять роль адресного флага. Это совсем не удобно по двум причинам: читать придется за раз меньше байта, а также выковыривать адресный флаг из принятых данных. В девятибитном режиме данные принимаются также, как и при связи двух устройств, а адресный флаг находится в отдельном бите RX8 регистра управления и статуса (UCSRB для AtMega8).

Содержание серии:
0 — Планирование.
1 — Приводы и питание.
2 — Контроллер периферии и связь.
3а — Мультимодульный USART. Теория.
3б — Мультимодульный USART. Реализация.


0 комментариев на «“Колесная робоплатформа. Часть 3а — Мультимодульный USART. Теория.”»

    • Кстати, данный вариант включения транзисторов реализует именно логику «ИЛИ»

    • Абсолютно верно подмечено:) Логика нужна ИЛИ. Но только перевернутая, т.е. ИЛИ по низкому сигналу. Именно это мы и делаем, притягивая входы И к высокому напряжению.

      Наверное я немного не так изложил просто.

      Если бы я взял микросхему ИЛИ, то ни один передатчик ничего бы не передал, т.к. режим ожидания — высокий уровень, и на выходе всегда будет высокий.

      Можно сказать, что я сделал инвертированную функцию ИЛИ на элементе И:)

    • Кстати, изделие уже протестировано, и оно работает:)

    • О_о Вот на это я не обратил внимания. Спасибо. Буду знать )

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение