-
Введение
-
Глава 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
декларируются в заголовке драйвера, а не в его тексте.
Такой рамкой выделены группы операторов, которые соответствуют блокам алгоритма. Номера на алгоритме и исходном тексте помогут Вам разобраться, какие группы операторов, каким кускам алгоритма соответствуют.
Обратите внимание, что вначале исходного текста идут строчки декларирования и определения портов связи с аппаратурой. Потом – локальные переменные. И за ними – исполняемые операторы исходного текста. В Ваших будущих программах лучше придерживаться именно такого порядка.
И ещё одно замечание. В программе мы задаём в моторы мощность в виде чисел. И полагаем, что скорость вращения колеса эквивалентна мощности. В реальной жизни это не совсем так. Скорость пропорциональна мощности, но так же она зависит от сопротивления вращению колёс, которое испытывает робот. Более подробно зависимость скорости движения от мощности Вы будете изучать в школе на уроках физики.
Здесь для некоторого упрощения мы принимаем, что скорость эквивалентна мощности. Это возможно, так как условия движения нашего робота практически не меняются. Он всегда двигается по жёсткой и ровной поверхности.
//******************************************************
|
|
// Декларирование и назначение портов вывода
|
|
// Декларирование и первоначальное назначение внутренних переменных управления двигателем
|
Не отражены в алгоритме |
// НАЧАЛО ИСПОЛНЯЕМЫХ ОПЕРАТОРОВ
|
|
// Вычисление направления вращения двигателей
|
|
// Учёт ограничений на значение, подаваемое в моторы
|
|
analogWrite (Port_POWER_LEFT_MOTOR, _left_power_modul);
|
|
}
|
Теперь мы понимаем, как блоки алгоритма связаны с группами операторов в исходном тексте.
Декларирование внутренних переменных и ограничителей не упомянуты явно в алгоритме. Они выделены штриховой рамкой в исходном тексте.
Так же не упомянуты явно два оператора if (условие) {действие_1;} else {действие_2;}
в начале программы (// Вычисление модулей int _left_power, int _right_power
). Они входят в первый блок алгоритма, в котором настраиваются порты и вычисляются модули мощностей, полученных от вызвавшей программы.
Если Вы ещё не проходили раздел “Модуль числа”
по математике, то скажу, что модуль положительного числа равен самому этому числу, а модуль отрицательного числа равен этому числу с противоположным знаком. То есть ноль минус это число.
Именно эти действия делают операторы if (условие) {действие_1;} else {действие_2;}
в блоке
// Вычисление модулей int _left_power, int _right_power
.
Так что в нашей программе есть –
- две пары операторов
if (условие) {действие_1;} else {действие_2;}
- одна пара –
if (условие) {действие;}
.