ДВИГАТЕЛИ И КОЛЁСА.
Двигатели выбираем с редуктором, и небольшим передаточным числом. Китайский магазин нам в помощь. Наш робот должен быть в меру быстрым, чтобы не вылететь на скорости с ринга, и достаточно сильным, чтобы вытолкнуть соперника. В качестве колес я взял ролики от слистывающего механизма денежно-счетной машинки. У них оказался подходящий диаметр, и хорошее резиновое покрытие, которое обеспечит необходимое сцепление с поверхностью ринга. Как вы понимаете, колеса могут быть абсолютно любые и из любого материала.

Рис.1.
4.ДАТЧИКИ КРАЯ РИНГА.
Для того чтобы наш робот не уехал за границу ринга, нам необходимо оснастить его специальными датчиками (Рис.2) которые не дадут роботу пересечь ее. Принцип работы таких датчиков подробно описан здесь. Но если говорить кратко, их принцип основан на светоотражающих способностях поверхностей. Темная поверхность отражает меньше света, чем светлая. В качестве излучателя света используют инфракрасный светодиод, а в качестве приемника фототранзистор чувствительный к инфракрасному излучению. Ну а черное это или белое, разберется микроконтроллер, но об этом позже.
Изображенные на Рис.2 датчики, трофейные, и взяты из узла контроля бумаги чекового принтера кассового аппарата. Гибкие провода заменены на контакты, для удобства подключения. Могут использоваться и другие датчики, такие как на Рис. 3.

Рис.2 Рис.3.Датчик TCRT5000
Датчик довольно дешевый и очень распространен в интернет-магазинах радиодеталей. Можно сделать свои датчики из отдельных светодиодов и фототранзисторов, только обязательно нужно организовать между ними перегородку, как на рисунке, дабы предотвратить боковое засвечивание транзистора и его ложное срабатывание.
5.ДАТЧИКИ ПРЕПЯТСТВИЯ.
Для обнаружения противника нам нужен датчик, способный обнаружить перед собой препятствие. В робототехнике очень распространены два типа датчиков ультразвуковые и инфракрасные. Самые дешевые датчики – это ультразвуковые. Мы будем использовать именно такой датчик. По габаритам он конечно больше чем инфракрасный, но зато идеально подходит для поставленной задачи, прост в подключении, монтаже и программировании.

Рис. 4 Ultrasonic HC-SR04
Принцип работы такого датчика заключается в отражении ультразвуковой волны от препятствия. У летучих мышей и дельфинов аналогичные сонары. Один глазок нашего датчика излучает ультразвуковую волну, звук долетает до препятствия, отражается от него и этот сигнал принимает второй глазок датчика. Зная время, за которое сигнал вернется назад, несложно вычислить расстояние до препятствия. Не переживайте, нам вычислять ничего не нужно, на плате датчика уже есть микроконтроллер который занимается этими вычислениями. На выходе мы получим чистое значение в сантиметрах или других заданных величинах.
6.ДРАЙВЕР ДВИГАТЕЛЯ.
Любой электрический двигатель является отменным потребителем тока, и напрямую его конечно нельзя подключать к выводам микроконтроллера, микросхема может выйти из строя. Большую нагрузку подключают через мощные транзисторы. Мы бы тоже могли подключить двигатели таким способом, но транзистор может обеспечить прохождение тока только в одном направлении. Для робота, следующего по линии - это идеальный вариант, так как он движется только вперед, но в нашем случае робот мини-сумо должен двигаться и вперед и назад. Одним транзистором тут не обойтись, их понадобится по 4 штуки на каждый двигатель! Поэтому мы не будем искать себе проблем и дополнительных затрат и возьмем готовый драйвер для двух двигателей.

Рис.5.
Этот недорогой драйвер рассчитан на ток двигаМа, в нашем случае этого будет достаточно. Каждая микросхема может крутить двигатель как в одну, так и в другую сторону. Управляется драйвер обычными логическими сигналами и подключается драйвер напрямую к контроллеру. К достоинствами драйвера еще можно отнести возможность использования отдельного источника питания двигателей. Это позволит избежать помех от работающих моторов, а так же использование моторов с питанием больше питания схемы. Ну и управление сигналом ШИМ – это позволит регулировать скорость вращения.
7.ИЗГОТОВЛЕНИЕ ШАССИ.
Настало время для творческой работы. Чтобы создать легкий и прочный корпус нам понадобится ПВХ пластик. Что это такое, и где его взять? ПВХ пластик это легкий, достаточно прочный и хорошо обрабатываемый материал белого цвета. Он широко применяется у рекламщиков, они используют его как основу для наклейки пленки Oracle с отпечатанным изображением. А обрезки у них есть всегда! Просто просим чуть-чуть.

Рис.6.
Нам еще понадобится канцелярский нож, двусторонний скотч, супер клей, тонкий картон, наждачная бумага и железная линейка. Пластик ПВХ отлично режется ножом и прочно склеивается супер клеем. Швы и неровности легко обрабатываются наждачной бумагой. Для чертежей мы будем использовать обычный лист из школьной тетради в клетку. Первое что мы сделаем – это разметим основу робота и постараемся разместить все наши элементы на прямоугольнике со сторонами 9,5х9,5 см. Вы спросите, почему у нас сторона не 10см как в правилах? Поверьте, лучше сделать чуть меньше указанных размеров, так как если размеры будут чуть больше, то наш робот просто не пройдет квалификационный отбор. Ну, если очень хочется, то можно и по размерам 10х10см.

Рис.7.
У нас получилась заготовка размером 9,5х8 см. Это будет у нас рама или днище. Недостающие 1,5 сантиметра с одной стороны мы используем для размещения датчиков края ринга. Колеса мы размещаем так, чтобы они были вровень с боковыми частями корпуса и не выступали наружу. Чем меньше выступающих частей, тем сложнее противнику будет за что либо зацепиться.

Рис.8.
По нашему шаблону вырезаем выкройки из картона. Закрепляем двигатели при помощи двусторонней липкой ленты и проектируем боковые стенки. Я решил сделать корпус робота в виде «зубила», уже можно назвать это классикой у роботов мини-сумо. Но вы можете выбрать совершенно любой дизайн. Можно экспериментировать сколько угодно, картона хватит на все эксперименты.
Ну вот, наш картонный макет готов и все детали подогнаны. Можно приступать к изготовлению их из пластика.
ВАЖНО! Канцелярский нож очень острый! Будьте предельно аккуратны. Ручка ножа должна быть удобной и плотно сидеть в руке. Не стоит оставлять детей без присмотра во время работы острыми и опасными инструментами!
Не забывайте, что у пластика есть своя толщина и ее обязательно нужно учитывать при моделировании, чтобы не выйти за планируемые размеры. Толщина моего пластика составляет 3 мм, и если я приклею боковые стенки как показано на Рис. 9, то ширина моего робота составит чуть больше 10 см.

Рис.9.
Если клеить боковые стенки сверху, Рис. 10, то мы получим некрасивый шов на всю длину. Конечно, его можно зашкурить, но если вы уже вырезали колесные арки, мы столкнемся с еще одной проблемой – арка будет выглядеть овальной, что так же выглядит плохо.

Рис.10.
На Рис. 11 показано как мы поступим. От основания отрезается полоска шириной равной толщине листа пластика.

Рис.11.
Эта же полоска пойдет в дело, как усилитель шва. Рис. 12.

Рис.12. Рис.13.
После того как клей окончательно высохнет, обрабатываем шов наждачной бумагой. Кстати супер клей или гель, может выступать в качестве шпаклевки. Достаточно еще раз промазать шов снаружи и дать ему высохнуть, затем зашкурить. После покраски шов видно не будет.
Размечаем место под двигатели и приклеиваем их. Предварительно к двигателям припаиваем провода, потом это будет сделать не просто. Рис. 13

Рис.14.
Теперь закрепляем датчики края ринга как показано на Рис. 14. Снизу мы приклеиваем опорную планку, она будет служить третьей точкой опоры, и будет скользить по поверхности ринга. Максимальный контакт с поверхностью даст нам преимущество как можно ниже подлезть под противника.

Рис.15.
В центре есть еще много места для установки дополнительных датчиков, скажем, еще трех. В перспективе, после этого можно будет смело запускать робота следовать по линии.

Рис.16.
Продолжаем макетировать. На этот раз делаем «таран» с местом для датчика расстояния. Обратите внимание, на Рис. 16 двигатели уже закрыты пластиком. Это предотвратит случайные замыкания на поверхности двигателей и защитит редукторы от пыли. Но и дополнительная фиксация самих двигателей не помешает. Желательно капнуть на редукторы по капле смазки до момента их полного закрытия пластиком.

Рис.17.
После окончательной подгонки размеров, вырезаем пластину «тарана» из пластика. Формируем подставочки для датчика расстояния и приклеиваем на место.

Рис.18.
Вот так у нас выглядит законченный вариант корпуса для робота мини сумо. Осталось подготовить его к покраске, замотав колеса, датчики и провода малярной лентой. Пластик очень хорошо красится. Для покраски возьмем баллончик с черной матовой краской.
В качестве управляющего микроконтроллера выбираем Arduino Pro Mini – это миниатюрный контроллер с небольшой стоимостью. Давайте поближе рассмотрим устройство этого контроллера.
1.Порты ввода-вывода и питание МК.

Рис. 1 Arduino Pro Mini.
На что нам следует обратить внимание? Первое – это питание схемы. Модель этого микроконтроллера питается от 5В. Это напряжение можно подать на ножку VCC. Но что делать, если батареи или аккумуляторы питания вашего робота дают большее напряжение, скажем 9 и более вольт? Для этого в схеме предназначен вход RAW, на него можно смело подавать до 14-15 вольт, но не больше, потому что внутренний стабилизатор напряжения Arduino начнет перегреваться и может выйти из строя. Оптимальным напряжением можно считать 9-12В. Его мы и будем использовать, потому что питание наших двигателей 9В. Для наших датчиков ринга и дальномера мы будем брать питание с ножки VCC. На ней будет уже стабилизированное напряжение 5 В. Следует понимать что, ток, который отдает стабилизатор не безграничен (800ma), нужно учитывать это при проектировании схемы и не запитывать мощные потребители тока, такие как двигатели и т. п.
Второе, что нам понадобится это порты широко-импульсной модуляции (ШИМ) (3,5,6,9,10,11). Четыре из них мы используем для управления двигателями, один для генерации звука и еще один у нас остается про запас. И наконец, третье, на что обращаем внимание - это порты, которые могут обрабатывать аналоговые сигналы (АЦП). Их восемь, А0-А7, но нам понадобится четыре, а для начала даже два. Этими портами мы будем обрабатывать сигналы, поступающие с датчиков ринга.
2.Принципиальная схема.
В любом конструкторском деле без чертежей, схем и планов работ, не обойтись. Так же и в нашем случае. Прежде чем начать сборку устройства нам понадобится принципиальная схема. Ее можно нарисовать на клочке бумаги, в компьютере, и даже на стене. Я ее нарисовал сначала на бумаге, но для наглядности перенес в электронный вид при помощи программы SPlan 6.0.

Рис. 2 Принципиальная схема.
Для того чтобы не путаться в процессе монтажа деталей и при моделировании печатной платы, ножки на контроллере я расположил точно так же как на Ардуино Рис. 1.
Как было сказано выше, питанию мы уделим первостепенное значение. Мы будем использовать четыре элемента АА по 1,5В каждый. Когда батарейки новые, на выходе мы получим 6.4-6.5в, но даже этого маловато для питания двигателей, и для входного напряжения стабилизатора микроконтроллера. Поэтому мы будем использовать еще один готовый модуль – импульсный DC/DC повышающий преобразователь Рис.3. Его стоимость не высокая, да и работать с ним достаточно просто.

Рис.3. Импульсный DC/DC повышающий преобразователь
На вход IN преобразователя мы подаем питание с батареек, а с выхода OUT забираем повышенное напряжение. При помощи построечного сопротивления его можно регулировать. Для этого нужно подключить мультиметр в режиме измерения постоянного напряжения, и установить построечным сопротивлением 9.5 – 10 В. С выхода преобразователя питание пойдет на драйвер двигателей и на вход микроконтроллера RAW. Для питания датчиков ринга и датчика расстояния Ultrasonic, мы будем брать питание 5В (ножка МК VCC).
Далее необходимо подключить драйвер двигателей к ШИМ выходам Ардуино. Я не буду останавливаться на принципе работы ШИМ микроконтроллера, в Интернете достаточно подробного материала на эту тему, но говоря простым языком, подключение драйвера двигателей к ШИМ, позволит нам программно управлять их скоростью, от минимума к максимуму и наоборот. Двигатель М1 мы подключаем к выходу (3,5) а М2 к (6,9). Выход 10 МК мы будем использовать для подключения «пищалки» или зуммера ВА1. Особой премудрости в подключении нет.
Ультразвуковой дальномер Ultrasonic мы подключаем к выводу 2 (Echo) и к выводу 4 (Trig). Питание дальномера осуществляется от 5В, вывод VCC Ардуино. Принцип работы дальномера заключается в следующем: по команде микроконтроллера на вход Trig подается некий импульс, он преобразуется в ультразвуковую частоту одним из «глазков» сенсора. Как только излучатель выдал ультразвуковой импульс, встроенная схема сенсора включает счетчик времени и ждет возвращения отраженного сигнала, который принимается вторым «глазком». Результат преобразуется в некое значение, и возвращается в МК через выход Echo. Программа микроконтроллера преобразует это значение в понятную нам метрическую систему - сантиметры.
И напоследок у нас остались только ИК датчики для определения края ринга. Обычно это инфракрасный (ИК) светодиод и фототранзистор, так сказать оптическая пара. Принцип работы такого датчика весьма прост. ИК светодиод излучает свет, который, отражаясь от поверхности, улавливается фототранзистором. Чем светлее отражаемая поверхность, тем сильнее откроется фототранзистор. Коллектор транзистора, подключен к входу АЦП контроллера, он то и определит, на сколько сильно откроется транзистор. АЦП нашего контроллера 10 битный, то есть его значение при напряжении 5В на входе равно 1024.

Рис.4 Работа АЦП МК
На рисунке 4 изображен принцип работы АЦП в режиме измерения. Когда транзистор закрыт, через сопротивление R2 на вход АЦП поступает положительное напряжение, оно будет равно напряжению питания и опорному напряжению МК. Транзистор закрыт из-за того что на его базу не поступает достаточное количества света. Отражающая поверхность темная.
Когда на транзистор поступает достаточное количество света (светлая поверхность), он открывается, напряжение на входе АЦП падает, стремясь к нулю. Соответственно значение самого АЦП так же будет уменьшаться. В итоге нам нужно только будет получить значение АЦП, проанализировать его и определить цвет поверхности ринга. Следует учитывать, что даже самая темная поверхность что-то да отражает. В процессе моих экспериментов значение темной поверхности колебались в пределах 700-850, а светлой 28-30. Этого вполне достаточно чтобы определить светлую и темную поверхность. Но в любом случае эти параметры подбираются экспериментально или при помощи программы калибровки, ведь датчики у всех могут быть разными. Подбирая сопротивление R1, мы можем регулировать яркость ИК светодиода, при напряжении 5В номинал может быть в пределах 180-330 Ом. Значение сопротивления R2 в пределах 10-56К.
Совсем забыл сказать про еще два датчика, которые у нас есть на принципиальной схеме. Пока их мы не будем использовать, оставим их, так сказать на случай модернизации, но печатную плату для них все же разработаем. Возможно, это будет задние или боковые датчики, которые смогут определить, с какой стороны произойдет атака противника. Возможно, кто-то захочет добавить еще датчиков для полноценного следования по линии. Вариантов для творчества достаточно.
К выводам 7 и 8 Ардуино подключены обычные светодиоды. Можно их использовать как фары. Так как у нас есть еще свободные АЦП входы можно поставить делитель напряжения и замерять емкость батарей, а светодиодами сигнализировать об их состоянии (красный-разряжены, зеленый-норма).
3.Проектирование печатной платы.
Соберем сначала все детали. Как и прежде, при помощи картона, расположим элементы на будущей плате. Рис 4.

Рис. 4 Макетирование расположения деталей.
На прямоугольном кусочке картона располагаем наши будущие детали. Элементы питания идеально располагаются по бокам от контроллера, в дальнейшем их будет очень легко заменить.
Разработку самой печатной платы делаем в знакомой все программе Sprint-Layout v5.0.

Рис. 5 Чертеж печатной платы.
Готовую плату в формате lay, вы можете скачать в конце данной статьи. После того как плата будет вытравлена, впаиваем сначала, перемычки, потом сопротивления и остальные детали Рис. 6. Микроконтроллер и драйвер двигателя не впаиваются, а вставляются в специальные панельки – это упростит ремонт и обслуживание. УЗ датчик расстояния из-за своих размеров пришлось впаять в плату.

Рис. 6 Монтаж элементов на печатной плате.
Плата у нас готова, самое время завершить монтаж всех элементов непосредственно на шасси. Сначала мы закрепим преобразователь напряжения. Я посадил его на несколько капель суперклея. Предварительно к входу и выходу преобразователя припаиваем разъёмы.
Выводы двигателей прикручиваем к драйверу, как на Рис.7

Рис. 7 Монтаж компонентов на шасси.
В процессе испытания уже собранного робота, выяснилась она маленькая неприятность. При движении вперед, двигатели на столько резво стартовали с места, что носовую часть подбрасывало вверх и датчики ринга получали неверный сигнал. Одним словом наш сумоист вел себя странно. Пришлось искусственно утяжелить носовую часть. В рыболовном магазине мне попался цилиндрический грузик весом 90 г. Этого было достаточно, чтобы робота не подбрасывало вверх. Главное не переусердствовать с весом, помните, что вес нашего робота мини-сумо не должен превышать 500 гр. Но и слишком легким он тоже не должен быть, так как соперник может легко победить из-за разницы в весе.

Рис. 8 Плата в сборе
К нашей плате припаиваем разъемы для датчиков. Красной стрелкой показана вилка питания. Посередине общий провод. Верхний контакт – это питание МК, а нижний - питание драйвера. При желании питание двигателей и Ардуино можно разделить, это на тот случай если плата будет использоваться с более мощными двигателями или вобще в другом проекте. Теперь еще немного поработаем над шасси. Нам осталось закрепить батарейные отсеки, так чтобы они не выпали при перевертывании робота. Сделаем нечто похожее на полочки. Рис. 9.

Рис. 9 Полочки для крепления батарей.
Полочки изготовляются из пластика ПВХ. Режем канцелярским ножом, клеим суперклеем. Батарейные отсеки прикручиваем сверху. Боковые части прикручиваются черными саморезами к стенкам шасси, остальные части полочек просто опираются на него, этого вполне достаточно. Тонкая прорезь удерживает нашу плату на месте и дает ей двигаться. Остается только укоротить или убрать лишние провода и закрепить выключатель или кнопку питания.
1. Основа программы-алгоритм.
Как и прежде, нам не обойтись без некоего плана. В предыдущей статье нашим планом была принципиальная электрическая схема. В программирование план, называется алгоритмом. Кто-то из вас знает, что это такое, кто-то просто слышал, но есть и те, кто не знал и первый раз слышит.
Не буду использовать научные термины, скажу просто, Алгоритм – это описание последовательности неких действий. Вся наша жизнь – это различные действия; мы ходим, говорим, двигаем руками и ногами, вертим головой. У всего этого есть свой смысл - алгоритм, последовательность, которая определяет наше поведение, и его можно составить и описать. Для наглядности приведу пример из жизни. Вы каждое утро чистите зубы. Попробуйте описать, как вы это делаете, как бы составьте программу для себя. Вот что получится: «Берем зубную щетку. Выдавливаем пасту. Чистим зубы движениями влево-вправо. Полощем рот. Моем щетку».
В принципе все верно, но эту маленькую программу мы можем выполнить в обед, вечером или после каждого приема пищи. Но мы не учли важные факторы, которые могут свести на НЕТ все наши старания. Изначально мы говорили про утро. Это важный фактор и если его не учесть, то чистить зубы придется лежа в постели и с закрытыми глазами. Поэтому всегда у любой программы должно быть какое-то начало и конец с возможностью повторения цикла. Повторяющимся циклом для человека является следующий день, где снова будет утро, и снова нужно будет чистить зубы. Поэтому добавим к нашей программе следующий алгоритм (последовательность действий).
«Проснуться. Встать с постели...» Если на этом этапе остановить создания алгоритма и перейти сразу к чистке зубов то программа застопорится (зависнет). Почему? Потому что мы снова не учли всех факторов. Вы стоите посреди своей спальни и не можете выполнить следующую команду; «Берем зубную щетку», так как щетка находится в ванной, а в нее нужно еще дойти. Ну, если вы спите в ванной, то нет проблем – программа выполнится! Но в большинстве случаев нормальные люди спят в другой комнате. Такой подход называется логическим, то есть осмысленным. Все наши действия должны быть разумными и содержать определенный смысл, иначе поставленная цель не будет достигнута. Поэтому «Проснуться. Встать с постели. Пойти в ванную комнату», будет наилучшим вариантом.
Вернемся к роботу. Как же теперь нам составить план действий робота мини-сумо на ринге? У нас есть правила, где четко обозначена цель - «Вытолкнуть противника за пределы ринга». Но для ее достижения нужно учитывать определенные факторы. Основной фактор это не выйти за пределы круга самому, а если быть точнее, то не выйти за белую границу круга. Вот что у нас получилось:

Рис. 1 Алгоритм поведения робота на ринге.
На рисунке 1 вы видите блок-схему. По всем правилам, именно так принято составлять алгоритмы. Наглядно и понятно.
Первый блок – «Начало». С этого момента программа начинает выполнение действий робота после включения. Первое что он должен будет сделать – это найти противника, блок «Поиск цели». Следующий блок нашей схемы в виде ромбика «Цель найдена?». Это означает, что перед нами будет стоять выбор действий по достижению определенного события. Если цель найдена (Да), то мы продолжим выполнение программы и перейдем к следующей части программы «Атаковать», но если цель не найдена (Нет), то логичнее всего продолжить ее поиск. Программа зациклится на этом моменте, пока робот не обнаружит противника. При атаке робот движется вперед на противника, пытаясь вытолкнуть его за пределы ринга, в этот момент работает блок «Достигнут край ринга?», если край ринга не достигнут, то атака продолжается, но если датчики обнаружили белую полосу края, то атака прекращается и программа переходит к следующему блоку «Отъезжаем назад» и «Разворот». После разворота, цикл основной программы повторяется, то есть она начинается с самого начала и робот снова ищет противника. Так сделано неспроста. Если в момент атаки, противнику удалось улизнуть от нашего робота, то мы должны вернуться к его поиску не выехав за край ринга. С теорией все. Перейдем к практике.
2. Правила написания программ для Arduino.
Хоть я и говорил что с теоретической частью покончено, но нам следует изучить принцип построения программы для микроконтроллеров Arduino, хотя эти принципы будут верными и для других МК семейства AVR.

Рис. 2 Метод написания программы для Arduino.
Данная блок-схема нам наглядно показывает, какие важные моменты, и в каком порядке следует соблюдать при написании программы.
В самом начале программы при необходимости подключаются дополнительные модули. Затем объявляются глобальные переменные. Далее идет блок инициализации контроллера. В нем определяются назначения портов, вход это или выход и другие настройки. Так же из этого блока могут быть вызваны дополнительные вспомогательные подпрограммы. Если быть кратким, то в этом месте программа производит предварительные настройки контроллера. Этот блок выполняется один раз при старте или перезагрузке контроллера. Обратите внимание, в блоке добавлена строчка «задержка 5 сек». К общим правилам написания программы это не относится, но для робота мини-сумо необходимо. В правилах сказано, что после команды судьи роботы должны начать движение по истечении 5 секунд. Данную задержку нельзя выполнять в основном цикле программы, так как она будет постоянно повторяться, и поведение робота изменится не в лучшую сторону.
В блоке основного цикла программы будет выполняться основной алгоритм поведения робота на ринге, который мы рассмотрели на Рис. 1. В процессе работы основного цикла можно будет обращаться к подпрограммам. Программисты очень часто, для оптимизации и сокращения кода используют подпрограммы. Например, программу движения вперед или назад, логичнее выделить в отдельные модули, и не включать в основное тело программы. Она от этого станет огромной, совершенно не читаемой, а найти ошибку или сделать небольшое изменение будет очень проблематично.
3. Средство разработки Arduino IDE.
Скачайте с сайта Arduino. ru последнюю версию Arduino IDE. Программа не требует какой-то специальной установки, достаточно распаковать содержимое архива в нужное место. В конце данной статьи находится файл библиотеки УЗ дальномера Ultrasonic. Его следует распаковать в папку Libraries.
Запускаем приложение. Проверяем правильность установки библиотеки, заходим в меню, «Файл» - «Примеры». Почти в самом низу должен появиться пункт Ultrasonic как на рис. 3.

Рис. 3 Проверка правильности установки библиотеки Ultrasonic.
Если все нормально, переходим в пункт «Сервис» - «Плата». Нам необходимо выбрать нашу плату – Arduino Pro Mini 5v.

Рис. 4 настройка платы контроллера
Последовательный порт необходимо выбрать тот, который появится после подключения Arduino к компьютеру. Следует немного сказать по поводу Arduino Pro Mini. В отличие от других контроллеров семейства Arduino, у Pro Mini нет встроенного модуля соединения с компьютером. Он поставляется отдельно в виде платы адаптера USB to UART(TTL) и при помощи четырех проводков соединяется с платой контроллера.

Рис. 5 USB-UART (TTL) адаптер.
На рис. 6 показано, как правильно нужно соединить контроллер и адаптер.

Рис. 6. Соединение контроллера с USB-UART адаптером.
В отличии от принятого соединения сигнальных линий, вместо RX-TX и TX-RX эти линии нужно соединять напрямую: RX-RX, TX-TX. При первом подключении адаптера к компьютеру автоматически начнется установка драйверов устройства. Следует дождаться окончания установки. Еще одной особенностью контроллера является отсутствия программного сброса Reset в момент программирования. Это конечно немного неудобно, но не настолько чтобы отказаться от Pro Mini. Достаточно нажать кнопку Reset на контроллере после того, как надпись «Компилирование» сменится на «Загрузка», Рис. 7.

Рис. 7. Отображение информации о ходе программирования МК.
4. Пишем код.
В этой главе я не буду подробно останавливаться на описании команд, директив и операторов. Предполагается, что вы уже имеете некоторые базовые знания. В противном случае нужно обратиться к документации на официальном сайте или другим источникам в сети. Написание кода программы мы будем выполнять четко по плану или алгоритму, который мы составили. В определенные блоки алгоритма я добавил код, который мы сейчас рассмотрим подробнее на рис. 8.

Рис. 8. Написания начального блока программы.
Первый блок: директива # подключает к нашему проекту библиотеку управления модулем.
Второй блок: Объявляем переменные и записываем в них начальные значения равные нулю. Обращаю ваше внимание, что мы не будем создавать имена для портов выводов МК. Я намеренно оставил их в цифровом виде, чтобы вам было удобно сверяться с принципиальной схемой. В данном блоке мы объявляем всего три переменные - это левый и правый датчики ринга (_и _) в них будут записаны значения АЦП. А так же переменная расстояния УЗ дальномера (_), в нее запишется расстояние в сантиметрах до препятствия.
Строчка Ultrasonic ultrasonic (4, 2), не что иное, как объявление переменной для УЗ дальномера, взятое из примера подключенной библиотеки. В скобках указаны порты, к которым подключены ножки датчика и.
Третий блок: (), в нем мы настраиваем все входы и выходы микроконтроллера. Входящие сигналы мы будем принимать портами 15, 17, поэтому назначаем им (Вход). Двигателями у нас управляют четыре порта: 3,5 для левого двигателя и 6,9 для правого двигателя, назначаем их как выход.
Почему мы задействуем для одного двигателя два порта? Все просто; если на контакты мотора подать напряжение он начнет крутиться в одну из сторон, скажем по часовой стрелке. Но если изменить полярность, т. е. поменять «плюс» и «минус» - вал моторчика будет крутиться в другую сторону. Это свойство мы и будем использовать для полноценных маневров.
5. Основной цикл loop.
В этом цикле выполняется основная программа контроллера. Из него нельзя выйти совсем или завершить его. Из него возможны лишь вызовы внешних процедур, так называемых подпрограмм.
Рассмотрим структуру нашего цикла на основе алгоритма рис. 9

Рис. 9. Алгоритм основного цикла Loop.
С самого начала нам необходимо получить показания всех датчиков, для этого мы вызываем подпрограмму:
void check_sensor() // Подпрограмма проверки сенсоров.
{
R_Sensor=analogRead(15); // считываем показания правого датчика
delay(10); //задержка для окончания преобразования АЦП
L_Sensor=analogRead(17); // считываем показания левого датчика
delay(10); //задержка для окончания преобразования АЦП
dist_cm = ultrasonic. Ranging(CM); // считываем показания УЗ дальномера
delay(10); // Задержка для окончания преобразования
}
После получения данных нам нужно их обработать. Сначала мы должны определить свое местоположение, на ринге мы ли нет. Если на ринге проверяем наличие противника в пределах 40 см. Если противника нет, мы его ищем поворачиваясь налево процедура:
void go_left() // поиск цели или движение налево
{
analogWrite(3, 0); //LEFT MOTOR
analogWrite(5, 100); //LEFT MOTOR
analogWrite(6, 100); //RIGHT MOTOR
analogWrite(9, 0); //RIGHT MOTOR
}
Значение мощности моторов снижено почти вдвое, если крутиться слишком быстро мы можем по инерции проскочить обнаруженную цель.
Если цель обнаружена, мы должны ее атаковать, двигаясь вперед на полном ходу.
void go_forward() //Атакуем - движение вперед
{
analogWrite(3, 0); //LEFT MOTOR
analogWrite(5, 255); //LEFT MOTOR
analogWrite(6, 0); //RIGHT MOTOR
analogWrite(9, 255); //RIGHT MOTOR
}
Если в момент атаки мы наехали на край ринга и обнаружили белую полосу, то нам нужно остановиться, сдать назад, развернуться и проехать чуть вперед, затем снова возобновить поиск. Для этого по порядку вызываем процедуры:
{
go_stop(); // Остановка
delay(100); //Ждем 10 мс
go_back(); //Движемся назад
delay(1000); //1 секунду.
go_right(); //Поворачиваем направо
delay(300); //300 мс
go_forward(); //Движемся вперед
delay(300); //300 мс
}
void go_stop() //остановка
{
analogWrite(3, 255); //LEFT MOTOR
analogWrite(5, 255); //LEFT MOTOR
analogWrite(6, 255); //RIGHT MOTOR
analogWrite(9, 255); //RIGHT MOTOR
}
void go_back () //двидение назад
{
analogWrite(3, 255); //LEFT MOTOR
analogWrite(5, 0); //LEFT MOTOR
analogWrite(6, 255); //RIGHT MOTOR
analogWrite(9, 0); //RIGHT MOTOR
}
void go_right () //поиск цели или движение направо
{
analogWrite(3, 100); //LEFT MOTOR
analogWrite(5, 0); //LEFT MOTOR
analogWrite(6, 0); //RIGHT MOTOR
analogWrite(9, 100); //RIGHT MOTOR
}
void go_forward() //Атакуем движение вперед
{
analogWrite(3, 0); //LEFT MOTOR
analogWrite(5, 255); //LEFT MOTOR
analogWrite(6, 0); //RIGHT MOTOR
analogWrite(9, 255); //RIGHT MOTOR
}
Временные задержки между процедурами определяют длительность работы двигателей в разных направлениях движения. Если ее увеличивать или уменьшать, то можно добиться различных углов поворота или расстояния, которое робот проедет до выполнения следующей команды.


