-
Введение
-
Глава 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. Делаем калькулятор
- Гонки за лидером
- Послесловие
- Список программ для Ардуино
- Лицензионное соглашение
Алгоритм программы “Мигающий огонь”
И наконец, последнее, но самое главное – РАБОЧАЯ ДОКУМЕНТАЦИЯ.
Основа документации для любой программы – АЛГОРИТМ. Вообще-то хороший программист разрабатывает алгоритм до начала написания исходного текста. Сначала обсуждается и записывается ПОСТАНОВКА ЗАДАЧИ. Потом разрабатывается, пишется и обсуждается АЛГОРИТМ, а потом по нему пишется и отлаживается ИСХОДНЫЙ ТЕКСТ.
Помните рассказ о логических ошибках. Так вот – грамотно поставленная задача, тщательно написанный и обсуждённый c коллегами алгоритм позволяют избежать до 90% логических ошибок в исходном тексте программы.
Программа “Мигающий огонь” очень проста, поэтому написание и обсуждение алгоритма этой программы поможет нам понять основные принципы построения алгоритмов. Надо только помнить, что на самом деле программа содержит две функции – setup и loop. Поэтому у нас будет два алгоритма.
Итак – алгоритм любой функции содержит только четыре типовых элемента
- Точка входа в алгоритм
- Точка выхода из алгоритма
- Блок выполнения действий
- Блок принятия решения.
Давайте возьмём алгоритмы функций setup и loop программы “Мигающий огонь” и посмотрим, как в нём располагаются эти блоки.
Алгоритм функции setup () очень прост – вход, выполнение единственного действия и выход.
Алгоритм функции loop () сложнее – у него нет выхода. Помните, мы говорили, что функция loop непрерывно повторяется до тех пор, пока есть электропитание или не нажата кнопка сброса.
Здесь именно так и написан алгоритм. Есть Вход. Есть четыре действия – вывести HIGH, подождать 1 секунду, вывести LOW, подождать 1 секунду. Но нет Выхода.
Вместо Выхода возврат к первому действию и всё повторяется сначала до бесконечности.
Вы наверняка заметили, что тут нет блоков принятия решения. Это так – ведь никаких решений принимать не приходится – знай себе включай, жди, выключай, жди. И так пока батарея не разрядится.
Но в наших будущих программах решения принимать придётся и придётся менять ход программы, в зависимости от этого решения. Поэтому пока просто поговорим об этом теоретически.
Для начала посмотрим, как рисуется блок принятия решения в алгоритмах.
Есть вход – в данном случае сверху.
Вход в блок решения это выход из какого-то другого блока.
Внутри блока записано какое-то условие и стоит знак вопроса. Условие формулируется так, чтобы на него можно было ответить либо ДА, либо НЕТ.
Давайте запомним – в алгоритмах отсутствуют – НЕ ЗНАЮ, МОЖЕТ БЫТЬ, НАДО СПРОСИТЬ У КОГО-НИБУДЬ.
Только ДА или НЕТ.
Ну, а дальше понятно, – если условие выполнено, то выходим по стрелке ДА, если условие не выполнено – по стрелке НЕТ. А к этим стрелкам подсоединяются следующие блоки алгоритма.
Возьмём пример из жизни – Вы подходите к перекрёстку для того, чтобы перебраться на другую сторону улицы. Вы смотрите на сигнал светофора и либо идёте вперёд, если сигнал разрешающий, либо стоите на тротуаре, если сигнал запрещающий.
Но всё время, пока Вы стоите, Вы поглядываете на светофор, и ждёте, когда появится разрешающий сигнал. Если постоянно поглядывать Вы не будете, то так и застрянете на перекрёстке. Посмотрим, как будет выглядеть алгоритм в этом случае.
Я специально не поставил, ДА и НЕТ. Думаю, Вы сами сможете это сделать.
Кстати надеюсь, что вы понимаете, что разрешающий сигнал светофора – это только ЗЕЛЁНЫЙ.
КРАСНЫЙ И ЖЁЛТЫЙ – запрещающие сигналы.
И ещё – обратите внимание, что после блока “Стоять и Ждать” мы возвращаемся ко входу в блок принятия решения, ещё раз проверяем, какой сигнал горит в это мгновение и крутимся в этом цикле до тех пор, пока не зажжётся разрешающий сигнал светофора. Обратная стрелка и есть то самое поглядывание на светофор, пока стоим и ждём.
На первый взгляд простой возврат к началу блока принятия решения ничего страшного не несёт – дождёмся зелёного, перейдём к блоку “Переходить улицу” и выйдем из алгоритма. Но представьте себе, что светофор сломался или постоянно горит жёлтый. Мы так навсегда и останемся стоять перед ним.
В программировании это называется: “Бесконечный Цикл”.
В просторечии: “Компьютер завис”.
Если мы будем допускать в своих программах такие бесконечные циклы, то наш робот в какой-то момент прекратит нормальную работу и начнёт бесконечную последовательность бессмысленных действий или просто замрёт навсегда.
Поэтому этап анализа алгоритма на возможность попадания в бесконечный цикл очень важный этап проектирования программ. Со временем мы займёмся этим вплотную, а пока просто запомните это.
Три задания для самостоятельной работы:
- Перепишите алгоритм так, чтобы учитывать не два варианта цветов – РАЗРЕШАЮЩИЙ и ЗАПРЕЩАЮЩИЙ. А три – ЗЕЛЁНЫЙ, ЖЁЛТЫЙ и КРАСНЫЙ. Небольшая подсказка – так как у нас три варианта действий, то надо будет записать в алгоритме два блока принятия решений.
- Перепишите алгоритм так, чтобы исключить возможность зависания (бесконечного цикла), если светофор исправен, но постоянно горит мигающий ЖЁЛТЫЙ. Так называемый ночной режим. Надо и дорогу перейти и под машину не попасть.
- Перепишите алгоритм так, чтобы учитывать, что не все водители автомобилей народ дисциплинированный и останавливаются на перекрёстке, когда Вам дан разрешающий сигнал. Задача та же – перейти дорогу и не попасть под машину.