Машинка на ДУ управлении своими руками — Интерфейсы. Протоколы.

Программная реализация — передатчик.

На этом уроке мы с вами уясним для себя что такое интерфейсы и протоколы. Узнаем какие варианты реализации доступны нам. Попробуем реализовать обмен между двумя МК.

Для управления машинкой нам понадобится система радиоуправления. Состоит она из пульта управления и ответной части, установленной непосредственно в самой машинке.

Пульт управления включает в себя: органы управления, кодер (в виде нашего МК) и передатчик.

В машинке установлен: приёмник, декодер (нам придётся использовать дополнительный МК), драйверы приводов и исполнительные механизмы.

Физическая связь между кодером и декодером осуществляется посредством интерфейса связи. Данные передаются по заранее установленным правилам, которые определяются протоколом обмена.

Для примера: всем мы общаемся, создавая звуковые волны голосовыми связками – это наш интерфейс. Звуки складываются в слова, мы с вами говорим на русском языке, американцы на английском, французы на французском. Язык — это наш протокол обмена. Вот и получается, что обладая одним и тем же интерфейсом, у людей не совпадают протоколы обмена. Потому то русские и не понимают американцев, пока не выучат их «протокол»!!!

Какие интерфейсы нам доступны?

  • вывод данных посредством линии порта с программным формирования пакета данных;
  • передача данных с использования аппаратных интерфейсов имеющихся в МК, таких например как UART, I2C, SPI.

По поводу протоколов… есть несколько вариантов реализации:

  • программное формирования импульсов с длительностью соответствующей передаваемым данным;
  • программное формирования цифровой, байт ориентированной последовательности;
  • передача данных посредством использования аппаратных интерфейсов имеющихся в МК, таких например как UART, I2C, SPI.

Попробуем разобраться с программной реализацией… В начале мы должны выяснить, какие данные мы будем передавать, для этого определим состав нашей машинки:

Во первых двигатель привода, во вторых рулевая система. Что можно ещё добавить??? 

Фары, клаксон?? В них я не вижу смысла.

Коробка передач… её у нас нет.

Адаптивная система управления клиренсом – интересная тема! Но подвеска у нас «не той системы»…

Контроль напряжения батареи… возможно!

Значит, для управления выше перечисленным нам понадобится:

  • Один импульс для передачи мощности двигателя от ручки газа;
  • Один импульс для передачи направления движения;
  • Один импульс для передачи направления поворота: прямо, влево, вправо.
  • Пакет данных будет выглядеть следующим образом:

    Стартовая пауза в 300 отсчётов, для идентификации начала пакета. Три импульса, длительностью в 255 отсчётов каждый. Плюс две паузы, чтобы разграничить импульсы. Всего посылка занимает 1165 отсчётов общей длительностью в 26,6мс.

    Рассмотрим как происходит формирование посылки.

    Во первых АЦП. Мы настроили его проводить измерения в автоматическом режиме. Никаких действий по запуску/перезапуску нам выполнять не требуется. 

    Опрос клавиш заднего хода и поворота происходит следующим образом. Для обработки нажатий введены дополнительные переменные…

    direction_of_motion //Направление движения
    direction_of_rotation //Направление поворота

    В основном цикле программы происходит опрос клавиш и кодирование текущего состояния…

    //Направление движения
    if (!(PIND & (1 << PD0))) direction_of_motion = 255;
    else direction_of_motion = 128;

    //Направление поворота
    if (!(PIND & (1 << PD1))) direction_of_rotation = 3; //Влево
    if (!(PIND & (1 << PD2))) direction_of_rotation = 255; //Вправо
    if (PIND & (1 << PD1) && PIND & (1 << PD2)) direction_of_rotation = 127; //Прямо

    Формирование основной посылки данных происходит в прерывании. Работает это следующим образом. Для проведение отсчётов введена переменная…

    counter_cycles //Счётчик тактов посылки

    …каждый раз когда счетчик переполняется, переменная инкрементируется и обнуляется при достижении 1165 отсчётов…

    counter_cycles++;
    if (counter_cycles = 1165) counter_cycles = 0;

    Исходя из текущего положения по оси Х импульсы начинаются с отметок 300, 605, 910. Проверяя значение переменной counter_cycles на совпадения с отметкой программно формируется фронт импульса…

    if (counter_cycles == 300) PORTB |= (1 << PB0); //Мощность двигателя

    Точка среза вычисляется путём сложения значения отметки импульса и значения передаваемой переменной (которое лежит в диапазоне 0..255)…

    if (counter_cycles == (300 + ADCH + 3)) PORTB &= ~(1 << PB0);

    Остальные данные передаются аналогичным образом.


    Прикрепленные файлы:

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

    Ваш адрес email не будет опубликован.