-
Введение
-
Глава 1. Аппаратная основа
- Содержание Главы 1
- Подготовка
- Плата Arduino UNO
- Плата управления моторами
- Плата связи с датчиками
- Аппаратная основа на базе набора miniQ
- Аппаратная основа на базе набора Turtle
- Аппаратная основа на базе набора ShieldBot
- Как ученики строили своих miniQ роботов
- Этапы сборки
- Система электропитания робота
- Провода энкодеров и датчиков линии
- Завершение главы 1
-
Глава 2. Начало работ с системой программирования Arduino
- Содержание Главы 2
- Подготовка
- Общие правила организации систем управления
- Входные данные. Датчики
- Обработка данных. Микроконтроллер
- Выходные данные. Исполнительные устройства
- То, что нужно всегда помнить
- Начало работы с системой Arduino
- Загрузка программы-примера “Мигающий огонь”
- Модификация программы “Мигающий огонь”
- Алгоритм программы “Мигающий огонь”
- Завершение Главы 2
-
Глава 3. Управление тяговыми моторами
-
Глава 4. Связь с ультразвуковым датчиком расстояния
- Содержание Главы 4
- Подготовка
- Постановка задач
- Электрическое подключение датчиков расстояния
- Разработка алгоритма
- Исходный текст
- Адреса Echo и Trigger как глобальные переменные
- Отладка и испытание программы
- Руководство пользователя
- Приложение 4.1. Подсказки по сложному алгоритму
- Приложение 4.2. Исходный текст (для упрощённого алгоритма)
- Завершение главы 4
- Факультативная часть главы 4
-
Глава 5. Робот следует за рукой или лидером
- Содержание главы 5
- Подготовка
- Релейный регулятор
- Пропорциональный регулятор
- Утилиты
- UTILIT_OneRangeMeter ()
- UTILIT_Motors_Control ()
- UTILIT_Hand_Follow_Proportional (int _range_needed)
- Два факультативных упражнения после перерыва
- Программа следования за лидером
- Постановка задачи
- Макрос следования за Лидером
- Отладка и испытание программы Programm_modul_5_Leader_Follow.ino
- Если что-то не так
- Исследуем робота
- Важные замечания
- Приложение 5.1 Алгоритм пропорционального регулирования
- Приложение 5.2. Исходный текст утилиты регулятора для следования за рукой
- Приложение 5.3. Документация для макроса и утилит следования за лидером
- MACROS_Leader_Follow (int _distasnce_to_leader)
- UTILIT_LeftRightRangeMeter ()
- UTILIT_Leader_Follow_Proportional (int _range_needed)
- UTILIT_Motors_Control () & UTILIT_Motors_Stop ()
- Завершение главы 5
- Как можно улучшить нашего робота?
-
Глава 6. Структура программного обеспечения
- Содержание главы 6
- Подготовка
- Уровни программного обеспечения
- loop ()
- Задачи
- Макросы
- Утилиты
- Драйверы. Библиотеки. Калькуляторы
- Ввод-вывод
- Глобальные переменные
- Правила обмена информации между уровнями
- Практическое занятие 6.1. Учтём трение в механизмах
- Практическое занятие 6.2. Доворот в сторону лидера умножением
- Практическое занятие 6.3. Доворот в сторону лидера сложением
- Практическое занятие 6.4. Доворот в сторону лидера обнулением
- Практическое занятие 6.5. Делаем калькулятор
- Гонки за лидером
- Послесловие
- Список программ для Ардуино
- Лицензионное соглашение
Разработка алгоритма и список локальных переменных
Итак, задача поставлена, переходим к алгоритму и локальным переменным.
Сначала поговорим о входных параметрах и локальных переменных.
• Входные параметры _left_power
, _right_power
– как уже говорилось выше, это два целых числа со знаком, которые поступают в наш драйвер извне и задают ему направление и мощность моторов. Отметим, что модуль этих чисел может быть больше 250, так как функция, которая вызывает драйвер, может и не “знать” о наших ограничениях по мощности.
• Локальные переменные. Это четыре числа, определяющие направление вращения (HIGH или LOW) и модули мощности (целые числа от 0 до 250) для левого и правого моторов.
_left_direction
_right_direction
_left_power_modul
_right_power_modul
Имена адресов портов управления моторами
Port_POWER_LEFT_MOTOR
Port_POWER_RIGHT_MOTOR
Port_DIRECTION_LEFT_MOTOR
Port_DIRECTION_RIGHT_MOTOR
Вообще-то можно было обойтись и без имён портов-контактов, а просто использовать их номера, задействованные в плате MotorShield. Задать в соответствующем операторе номера платы Arduino UNO, которые используются у нас в системе и дело с концом.
Но если мы хотим программировать на хорошем профессиональном уровне, лучше давать имена контактам ввода-вывода и определять их в начале исходного текста функции. В будущем, когда мы начнём писать более сложные программы, Вы это поймёте сами. А пока поверьте на слово. Да и контактам приятно – всё-таки имя лучше номера.
Локальные переменные это такие переменные, которые существуют только внутри нашей функции. Никакая другая функция использовать их не может.
И ещё – все локальные переменные нашего драйвера имеют тип ЦЕЛОЕ СО ЗНАКОМ. В исходном тексте такой тип обозначается int (от английского – Integer). Надо отметить, что задавать тип локальной переменной нужно один раз внутри функции, иначе это будет синтаксическая ошибка. Кстати вопрос на пройденное – как Вы узнаете, что допустили синтаксическую ошибку?
Ну вот, теперь АЛГОРИТМ. Посмотрите на него и попробуйте представить какими операторами и встроенными функциями можно реализовать этот алгоритм. Вспомните, что Вы узнали из “Ардуино блокнота программиста” или из описаний языка С/C++ в интернете.
Попробуйте определить, какие блоки алгоритма выполняют ту или иную часть постановки задачи. И не забывайте, что в одном блоке алгоритма может содержаться много операторов исходного текста.
В этом алгоритме есть четыре блока принятия решения.
Причём два из них могут быть выполнены с помощью оператора if (условие) {действие;}
.
А два с помощью оператора if (условие) {действие_1;} else {действие_2;}
Попробуйте определить самостоятельно, какие выполняются как. Отметим себе, что в этом алгоритме нет циклов, значит анализировать его на зависание не надо.
И ещё вопрос для самостоятельной проработки. В этом алгоритме есть контроль на превышение числа 250 (в алгоритме оно названо MAX), но нет контроля на подачу в моторы числа меньшего, чем ноль.
Вопрос – почему? Как обеспечивается защита платы MotorShield от подачи отрицательных чисел в моторы?
Зеленой рамкой выделены блоки алгоритма.