Робот на контроллере PIC от SWG. Простой робот с ультразвуковым дальномером

Робот на контроллере PIC от SWG. Простой робот с ультразвуковым дальномером

24.04.2019

Вступление

В эллинистическую эпоху, на острове Фарос был маяк, на котором были установлены четыре статуи. Эти статуи через определённые промежутки времени, поворачиваясь, отбивали склянки; в ночное же время они издавали трубные звуки, предупреждая мореплавателей о близости берега.

5 век до н.э. В работах Платона выражаются идеи, имеющие отношение к человеческому мышлению и механике машин. Блестящий философ и математик Архит из Тарентума, друг Платона, конструирует деревянного голубя, который мог летать и управлялся струей пара.

1495 год. Леонардо да Винчи разрабатывает детальный проект механического человека, способного двигать руками и поворачивать голову. Механизм выглядит как бронированный рыцарь.

Что объединяет все эти «изобретения»? То, что человек пытался создать предметы, которые могли бы также автономно, как и живые существа, существовать в нашем мире, или даже мыслить.

Меняются времена, меняются технологии. Но человека не покинула идея сделать себе «механических слуг», способных мыслить и выполнять разные задачи. Современное название этих устройств - роботы.

Цели, задачи, а также приветствие

Здравствуйте, многоуважаемые радиокоты и радиокошки! Так как сам я ещё котёнок, как в области радиолюбительства, так и в области моего физического возраста, то и устройства, создаваемые мной, должны быть детскими и выполнять роль игрушки(да и вообще, данная статья будет интересна только начинающим). А что будет выполнять роль игрушки, вы уже, наверное, догадались. Что же оно будет делать? Хм... О! А пусть оно следует за нарисованной линией, ведь это почти следование по заданной траектории! (можно будет заставить его таскать бутерброды от холодильника к рабочему месту, что бы не отвлекаться от любимого занятия:)) И так, мы вплотную подошли к целям моей работы, а точнее цели :

  • Создать робота (действующую модель), который будет следовать за нарисованной на белом листе бумаги линией.

Задачи:

  • Создание принципиальной электрической схемы
  • Создание программы для созданной платформы
  • Сборка робота, согласно схеме
  • Тестирование, отладка
  • Анализ результатов

Создание действующей модели робота

Итак, создание принципиальной электрической схемы:

Начальная схема выглядит так:

Главная часть схемы - 8- битный МК семейства mega от фирмы Atmel. Именно он выполняет функцию контроллёра поведения робота. В нём заложена программа. Он получает сигналы от двух датчиков - фототранзисторов L32P3C (можно любые другие, лишь бы реагировали на свет). Когда фототранзистор освещён, он пропускает ток, и импульс появляется на выводе МК. МК, получив сигнал высокого уровня, в зависимости от того есть ли сигнал на другом фототранзисторе, посылает сигнал на входы драйвера двигателей L293D, который усиливает эти сигналы (т.к. выводы МК не способны выдерживать ток больше 20мА) и передаёт их на двигатели M1 и M2, которые вращаются. Z1, C1 и C2 задают тактовую частоту МК, в данном случае она установлена на 4МГц, то есть контроллёр будет выполнять 4 миллиона операций в секунду. Всем известно, что правильное питание - залог здоровья, поэтому C3, C4 и VR1 выполняют функцию стабилизатора напряжения, для уничтожения нежелательных помех.

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


Конечно, это не окончательная схема, доработки некоторых блоков будут представлены ниже.

Алгоритм работы:

Алгоритм работы достаточно прост(подразумевается, что датчики находятся по разные стороны линии)

Небольшие поясниения:

Если участок линии, на которой находится робот, прямой, то от обоих датчиков будет идти сигнал.

Соответственно нужно вращать оба мотора.

Если участок линии, направлен влево, то на левом датчике будет отсутствовать сигнал.

Тогда нужно подать напряжение на правый двигатель.

Если же отсутствует сигнал на правом датчике, то имеет место поворот направо.

Естественно, нужно вращать левый мотор.

Собственно, разработка программы.

В качестве языка разработки был выбран распространённый и мощный язык программирования C.

Разберу, только основной блок, весь код смотрите ниже.

while (1)
{
PORTC.0 = PIND.0;
PORTC.2 = PIND.1;
}

Здесь нет варианта, когда робот завершает роботу, что не соответствует описанному выше алгоритму, потому что не бывает совершенных систем, мой робот, к сожалению, не исключение. Поэтому эта часть была убрана, что бы робот вдруг ни с того ни с сего не останавливался.

Загружая из порта D (ответственен за датчики) в необходимые выводы порта C (именно он ответственен за движение робота) мы заставляем робота реагировать как на одиночные импульсы от разных датчиков, так и от обоих вместе.

Итак, мы подошли к сборке робота, согласно схеме.

Сборка управляющей платы.

Управляющая плата, это плата с микроконтроллером, которая будет контролировать поведение робота. Её схема:

Как видно, схема проста, собирается в течении недолгого времени. Конечный результат:

Сборка стабилизотора напряжения и драйвера двигатетей.

На схеме это:

Собирается так же недолго, вот, что у меня получилось:

Сборка блока датчиков.

Блок датчиков отвечает за приём информации о мире. На схеме это:

Схема настолько проста, что собирается в течении 3-х минут. Конечный результат:

После соединения всех блоков получаем:


Естественно, я никого не заставляю собирать робота именно таким образом, просто сборка данным образом даёт некую "взрослую" систематизацию.

Тестирование, отладка.

Управляющая плата и плата стабилизатора напряжения, к моему удивлению не требовали отладки. Но зато плата драйвера двигателей, а точнее сами двигатели, и блок датчиков компенсировали эту потерю.

В блоке драйвера двигателей, отладки требовали двигатели. Проблема в том, что изначально я неправильно рассчитал мощность двигателей (чего вам делать не советую) и решил, что мне хватит и такой конструкции:

Естественно, я ошибался. Робот не то что медленно ехал, он просто стоял на месте.

Соответственно, мне понадобились редуктора. Ни в магазине, ни в интернете подходящих я не нашёл, поэтому мне пришлось «зверски вырвать» их из радиоуправляемой машинки и добавить их в конструкцию.

После добавления их в конструкцию, робот стал «летать». Он настолько быстро ездил, что иногда пропускал дорогу. О том, как я это исправил написано ниже.

Отладка датчиков

Наверное, ещё ни один датчик не работал сразу без отладки. Мой случай не исключение. Изначально датчики реагировали даже на слабый свет. Следовательно, нужно сделать регулятор чувствительности. Поэтому схема была дополнена:

Переменные резисторы позволяют настроить чувствительность. Затем можно померить сопротивление переменного резистора и поставить уже постоянный. Кстати, оптимальное сопротивление резистора в моём случае равно 9.1 кОм. Также были добавлены светодиоды, которые позволили датчикам работать даже в тёмных помещениях. Конечный результат:

Отладка программы

Как было сказано выше, робот слишком быстро ездил, следовательно, нужно уменьшить скорость робота. Делать это с помощью железа мне показалось неразумным, и я сделал регулировку скорости, напоминающую регулировку с помощью широтно-импульсной модуляции.

Была разработана функция:

void PWM (unsigned char vector)

Return ;

Опытный радиолюбитель скажет, что никакой это не ШИМ, и он будет прав. Но всё же данная функция позволяет регулировать скорость робота. (конечный код смотрите ниже в списках файлов)

И вот когда сборка и отладка закончены, настаёт время проверить работоспособность робота (там на фоне играла музыка, но youtube её убрал =()

Анализ результатов

По завершению работы нужно подвести итоги. И так, что же мне удалось?

  • Создание программы.
  • Создание электромеханической платформы . Остановимся на этом моменте поподробнее. Конечная ЭМП получилась такой, что её можно применять для решения таких простых задач как: прохождение лабиринта, как двухмерного, так и трёхмерного, следование за источником света, он может рисовать (достаточно прикошачить присобачить к корпусу фломастер), робот даже может участвовать в таких робототехнических соревнованиях, как кегельринг.
  • Отладка системы.
  • И самое главное - робот двигается по линии.

Заключение

В заключение обязательно нужно что-то сказать. А скажу я вот что:

Дело это:

  • Финансово затратное

На Arduino очень легко делать разные машинки с дистанционным управлением, простыми сенсорами и логикой. Поэтому линейка эта невероятно популярна. Продается множество совместимых с ней сенсоров и плат расширения. Интернет наполнен готовыми программными библиотеками и проектами с открытым исходным кодом на все случаи жизни. Практически все вопросы, которые у тебя возникнут в процессе освоения Arduino, уже кем-то задавались, и ты всегда найдешь ответ.

Давай с чего-нибудь начнем? Главный вопрос - выбор контроллера. Существует множество ревизий Arduino, а также сторонних клонов, построенных на основе этих версий. Вот, пожалуй, два самых интересных для нас класса:

  • Arduino Uno - лучший выбор новичка, самая простая, бюджетная и распространенная плата. В основе - чип ATmega328 с тактовой частотой в 16 МГц, 32 Кб флеш-памяти, 2 Кб ОЗУ и 1 Кб EEPROM. В Uno 14 цифровых входов/выходов, которые могут использоваться для управления сенсорами и сервоприводами и другими устройствами;
  • Arduino Mega / Mega 2560 - плата, которая подойдет в случае, когда ты заранее знаешь, что проект будет сложным. Главное отличие - большее количество входов/выходов (48 в Mega, 54 в Mega 2560). Также тут намного больше памяти: 8 Кб ОЗУ, 4 Кб EEPROM, а флеш-памяти 128 и 256 Кб (в Mega и Mega 2560 соответственно). Между собой платы также отличаются чипом, скоростью USB и некоторыми другими характеристиками.

Разумеется, еще есть Arduino Pro, Arduino LilyPad и многие другие. Но сейчас давай остановимся на первых двух моделях. В нашем случае все довольно просто: Mega нужна для робота с большим количеством ног.

Первый код

Для начала установим Arduino IDE (arduino.cc) - это кросс-платформенная бесплатная среда разработки. Теперь, если мы подключим наш Arduino, мы сможем попробовать написать первый код на самом простом примере: программе мигания светодиодом. На большинстве Arduino-контроллеров он есть и подключен к пину 13. Кстати, в мире Arduino программы принято называть скетчами. Вот текст скетча с комментариями:

// Дадим этому пину имя LED: const int LED = 13; void setup() { // Инициализация цифрового пина // для вывода: pinMode(LED, OUTPUT); } void loop() { // Подать уровень логической единицы // на пин 13 (зажечь светодиод): digitalWrite(LED, HIGH); // Приостановить выполнение скетча // на секунду: delay(1000); // Подать уровень логического нуля // на пин 13 (потушить светодиод): digitalWrite(LED, LOW); // Снова приостановить выполнение // скетча на секунду: delay(1000); }

Обрати внимание на функции setup и loop. Они должны присутствовать в любом Arduino-скетче. Setup вызывается единожды при включении или после перезапуска контроллера. Если хочешь, чтобы код выполнялся только один раз, его следует размещать именно здесь. Чаще всего это всевозможные процедуры инициализации чего-либо. Наш скетч не исключение: цифровые пины Arduino могут работать и как входы, и как выходы. В функции setup мы говорим, что пин 13 будет работать как цифровой выход контроллера.

После того как функция setup завершит свою работу, автоматически запускается замкнутый цикл, внутри которого будет вызываться функция loop. От нас требуется написать, что мы хотим там выполнять. А мы хотим подать на пин 13 уровень логической единицы (5 В), то есть зажечь светодиод, затем подождать одну секунду (1000 в миллисекундах), потом подать уровень логического нуля (0 В) и опять подождать одну секунду. Следующий вызов loop все повторит.

Теперь «заливаем» наш скетч в контроллер. Нет, нам не понадобится программатор. Контроллеры Arduino, кроме наших скетчей, содержат специальную программу - bootloader, которая, в частности, управляет загрузкой кода из компьютера. Так что для заливки скетча нам понадобится только USB-кабель и пункт меню File → Upload (Ctrl + U) в Arduino IDE.

Ключевой вопрос

А сколько, собственно, нам нужно ног? Определимся во множестве конфигураций шагающих роботов. По количеству ног:

  • biped - двуногий (прототип - человек);
  • quadruped - четвероногий (прототип - большинство млекопитающих животных);
  • hexapod - шестиногий (прототип - большинство насекомых);
  • octopod - восьминогий (прототип - пауки, скорпионы, крабы и другие членистоногие).

Кроме количества ног, важна и конфигурация каждой. Главной характеристикой ноги является количество степеней свободы, или dimensions of freedom (DOF). Степень свободы - это способность поворачиваться или изгибаться вокруг одной оси (реже - поступательно двигаться вдоль нее). Очевидно, что если степень свободы одна, то на такой ноге далеко не уйдешь. Ноги с двумя степенями свободы (2DOF) уже позволяют двигаться многоногим роботам, хотя 2DOF дает возможность свободно перемещать кончик ноги только в одной плоскости. А 3DOF-нога перемещает «стопу» в 3D-пространстве (если, конечно, не все три оси параллельны). Есть и 4DOF-ноги, которые просто увеличивают гибкость и диапазон перемещения ноги. У насекомых чаще всего 4DOF-лапы.

Что это значит для нас? В дешевых любительских роботах каждую степень свободы реализует один двигатель, точнее, сервопривод, или серв. Конфигурация ног однозначно определяет, сколько таких сервов нужно. Так, 3DOF-гексапод потребует 18 сервов, а 4DOF-паук - уже 32. Не пугайся количества, маленькие сервоприводы, используемые в любительских радиоуправляемых моделях, очень дешевы. В интернет-магазинах их можно найти по запросу micro servo.

Чтобы программировать сервоприводы, достаточно знать, что в них уже есть контроллер, который делает основную работу. И все, что нужно, - подавать питание и цифровой сигнал, сообщающий контроллеру, в какую позицию мы хотим повернуть вал привода. Об их конструкции легко найти информацию. Протокол у них самый простой из всех цифровых протоколов связи: широтно-импульсная модуляция - ШИМ (PWM на английском). У всех простых сервов есть разъем с тремя контактами: земля, +5 В (вольтаж может отличаться в зависимости от размера и мощности) и сигнальный вход. Arduino-контроллеры могут двумя различными способами генерировать такой сигнал. Первый - аппаратный PWM, который сам чип умеет выдавать на нескольких из своих цифровых I/O-пинов. Второй - программный. Программный позволяет получить одновременно больше различных PWM-сигналов, чем аппаратный. Для него под Arduino предоставляется удобная обертка - библиотека Servo. Она позволяет использовать одновременно 12 сервоприводов на большинстве малогабаритных контроллеров (Uno, Due, Nano) и 48 сервоприводов на Arduino Mega и ему подобных. Сигнальный контакт серва подключается к цифровому выводу Arduino. Земля и питание - очевидно, к земле и питанию, они могут быть общими для всех сервов. В трехпроводных шлейфах сервов черный или коричневый - это земля, посередине обычно красный +5 В и, наконец, белый или желтый - сигнальный. С программной точки зрения управление предельно простое:

Servo myservo; // Сервопривод на 9-м пине Arduino myservo.attach(9); // Повернуть в положение на 90º myservo.write(90);

Большинство сервов умеют вращать вал на 180°, и для них 90° - среднее положение. Для упрощения подключения сервов к плате Arduino существует ряд решений. Самое каноничное - это Sensors Shield. Установив его на Uno и подав на клеммы питание для сервов, можно их разъемы подключать прямо в него.

Батарея

Еще один важный вопрос - питание. Если у тебя продвинутая плата, которая позволяет снабжать всю систему по одной линии питания (и двигатели сервов не дадут помех в работу контроллера), то можно обойтись одним источником. Выбор огромен, лучше всего, конечно, Li-Ion/Li-Po брикеты для радиомоделек. Но им нужны и соответствующие зарядные устройства. Если у тебя контроллер попроще (Uno/Due/Nano), то можно питать его отдельно, например 9-вольтовой «Кроной», а сервоприводы подключить к основной мощной батарее. Так сервоприводам точно хватит питания. В случае литиевых аккумуляторов нужно еще тщательней, чем обычно, следить за напряжением, чтобы не было переразряда (допустимые напряжения стоит уточнить для конкретного типа батареи). Для этого на робота-Слейпнира, о котором дальше пойдет речь, также прикручен маленький цифровой вольтметр.

Робожук своими руками

Набор

  • Контроллер Arduino Uno: 1150 р.
  • Три серводвигателя. Я использовал HXT500, 200 р. за штуку
  • Батарейный отсек для «Кроны» с выключателем: 50 р.
  • Батарейка «Крона»: 145 р.
  • ИК-приемник: 90 р.
  • Стальная проволока диаметром примерно 1,5 мм. Я, к примеру, использовал сломанный венчик для взбивания яиц

Итого: 2035 р.

DmitryDzz: Я хочу предложить тебе сделать небольшого дистанционно управляемого шестиногого робожука на базе контроллера Arduino Uno. Лапки будут иметь одну степень свободы, управление будет происходить с помощью обычного ТВ-пульта.

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

Более простой способ - взять набор-конструктор, потому что на первых шагах одного контроллера будет мало. Сейчас много магазинов предлагают такие наборы. Например, есть замечательный интернет-магазин «Амперка» . Здесь тебе предложат несколько подобных конструкторов, отличающихся наполненностью и, конечно, ценой. Мне вполне хватило самого простого - «Матрешка X». В него входит контроллер Arduino Uno, USB-кабель для подключения к компьютеру, доска для прототипирования (незаменимая вещь!), набор перемычек, светодиоды, резисторы и прочая мелочь.

В этом же магазине есть раздел «Вики», где ты найдешь даже замечательные короткие видео­уроки, переведенные на русский язык. Обязательно посмотри их. И конечно, есть форум, где тебе наверняка постараются помочь.

Что понадобится из инструментов:

  • паяльник и все, что нужно для пайки. Паять много не придется, и особого мастерства не потребуется;
  • термоклеевой пистолет и стержни к нему;
  • пассатижи для работы с проволокой.

Если все собрали, приступим!

Управление

Перейдем к первому шагу: нам надо научиться взаимодействовать с пультом ДУ и выведать коды нажатий на некоторые его кнопки. Эти коды потом пригодятся для скетча управления роботом.

На этом этапе понадобится еще ИК-приемник и хорошо бы иметь доску для прототипирования. Подавляющее большинство ИК-пультов работают на несущих частотах 36 кГц, 38 кГц или 40 кГц (Panasonic, Sony). Исключение составляют пульты Sharp (56 кГц), Bang & Olufsen (455 кГц) и, может, кто-то еще более экзотический. Поэтому нам вполне подойдет любой ИК-приемник на 36, 38 или 40 кГц. Частота может точно не совпадать с несущей частотой сигнала. В таком случае чувствительность приемника будет снижаться, но на практике я не заметил дискомфорта, используя ИК-приемник TSOP2136 (36 кГц - последние две цифры - частота) и пульт ДУ Sony (40 кГц).

Итак, для большинства пультов подойдут ИК-приемники TSOP21xx, TSOP22xx, TSOP312xx. Две последние цифры могут быть 36, 37, 38 или 40. Перед включением ИК-приемника уточни разводку его контактов - их всего три: +5V (питание), GND (земля), Vs (выход). Соберем схему, как на иллюстрации (разводка для TSOP2136).


Как видишь, к аналоговому входу контроллера A0 мы подключили выход ИК-приемника.

Вот как выглядит код скетча:

#include "IRremote.h" // Аналоговый вход контроллера, // к которому подключен ИК-приемник: const int IR_PIN = A0; // Создаем объект ИК-приемник: IRrecv irrecv(IR_PIN); void setup() { Serial.begin(9600); Serial.println("ready"); // Начинаем прослушивание ИК- // сигналов: irrecv.enableIRIn(); } void loop() { // Описываем структуру results, // в которую будут помещаться // принятые и декодированные // ИК-команды: decode_results results; // Если ИК-команда принята и успешно // декодирована, то выводим // полученный код в последовательный // порт контроллера: if (irrecv.decode(&results)) { Serial.println(results.value); irrecv.resume(); } }

В скетче используется специальная библиотека IRremote.h, декодирующая сигналы самых разных ИК-пультов. Эта библиотека - открытый проект, скачать ее ты можешь со страницыhttps://github.com/shirriff/Arduino-IRremote. А чтобы ее подключить к нашему проекту, надо выполнить три действия:

  • каталог библиотеки скопировать в каталог libraries, который, в свою очередь, находится в инсталляционном каталоге Arduino IDE;
  • перезапустить IDE;
  • добавить в начало нашего скетча строку #include «IRremote.h».

Теперь в скетче будут доступны функции декодирования ИК-сигналов. Но, чтобы увидеть полученные коды, мы еще будем использовать объект Serial. С его помощью по последовательному порту (все тот же USB-кабель) мы будем передавать коды на компьютер. В функции setup мы выполняем инициализацию объекта Serial. «9600» - это 9600 бод - скорость, которая будет использоваться для передачи данных. После инициализации мы можем производить запись в последовательный порт с помощью функции println. Для просмотра результата этого вывода на компьютере в Arduino IDE выбери пункт меню Tools → Serial Monitor (Ctrl + Shift + M). Только убедись, что в нем установлена скорость 9600 бод.

Итак, питание контроллер получает по USB-кабелю, данные передает по нему же. Загружаем скетч, запускаем Serial Monitor и начинаем жать кнопки пульта ДУ. В окне Serial Monitor должны появляться коды. Протоколы пультов отличаются, иногда это может быть один код, иногда несколько. В любом случае ты всегда можешь выделить коды, уникальные для каждой кнопки пульта.

Нам потребуется 13 кнопок пульта. Я использовал следующие:

  • 1 - плавный поворот налево;
  • 2 - движение вперед;
  • 3 - плавный поворот направо;
  • 4 - поворот налево на месте;
  • 5 - стоп;
  • 6 - поворот направо на месте;
  • 7 - движение назад с поворотом направо;
  • 8 - движение назад;
  • 9 - движение назад с поворотом налево;
  • синяя кнопка - очень медленно;
  • желтая - медленно;
  • зеленая - быстро;
  • красная - очень быстро.

Запиши коды этих кнопок, позже они понадобятся для скетча управления роботом.

Алгоритм движения

Скетч управления роботом доступен на странице нашего проекта (bit.ly/1dEwNDC). Не забудь изменить значения констант кодов нажатых кнопок пульта на коды своего пульта (константы IR_COMMAND_XXX_CODES в файле ir_command_codes.h).

Скетч подробно мы разбирать не будем, думаю, достаточно комментариев в коде, но один вопрос все же стоит рассмотреть.

Движения насекомых очень интересны. И хоть всем этим жукам падать до земли совсем недалеко, они почему-то всегда устойчивы: в любой момент времени минимум три ноги (две с одной стороны и одна с другой) стоят на поверхности. И пока эти ноги тянут жука к одному ему ведомой цели, три другие подтягиваются, чтобы повторить это движение. Наша задача - сделать что-то похожее.

У нашего робожука три серводвигателя, расположенные в ряд перпендикулярно движению. У левого и правого серводвигателей ось вала направлена вверх, а у центрального - вперед. Задача, например, левой сервомашинки - качать сразу две ноги: левую переднюю и левую заднюю. Они, кстати, жестко соединены между собой и приклеены к качалке этой сервомашинки. Задача центральной сервы - приподнимать то левый бок жука, то правый. Поэтому к качалке этого двигателя крепятся центральные левая и правая ноги, представляющие собой единую П-образную деталь.

Скетч должен обеспечивать движение робота вперед, назад, плавные повороты в движении и повороты на месте. А еще хотелось бы управлять скоростью жука. Чтобы описать эти движения программно, нам пригодится математика. Посмотри на схему.

Синими кружками обозначены ноги робожука, стоящие на поверхности, а белыми - находящиеся в воздухе. Обрати внимание, что при движении вперед или назад левый и правый серводвигатели должны двигаться абсолютно одинаково. А при поворотах на месте двигатели должны крутиться в разных направлениях (симметрично). Еще интересно, что движение вперед и назад отличается только фазой центрального серводвигателя.

Итак, как это реализовано? Мы помним, что контроллер постоянно вызывает функцию loop. Значит, в эту функцию мы должны поместить код, который определяет текущее положение серводвигателей и устанавливает их в это положение. Каждый серводвигатель должен совершать колебательные движения. Рассчитать положение серводвигателя в момент времени t мы сможем по следующей формуле:

X = A sin(2πt/T),

где X - искомое положение серводвигателя, A - амплитуда колебаний, T - период колебаний.

Так, в зависимости от момента времени t мы получим изменение величины X в интервале от –A до +A. Серводвигатели могут принимать положение в диапазоне от 0 до 180°. Поэтому колебания нам лучше производить вокруг «нулевого» положения в 90°. И если мы хотим обеспечить колебания с периодом 1 с вокруг положения 90° с амплитудой 30°, то формула преобразуется в следующий вид:

X = 90 + 30 sin(2πt/1000),

где t - это время в миллисекундах, прошедшее от начала колебаний. Для управления скоростью движения робожука мы можем изменять период колебаний. Чем он больше, тем ниже скорость.

А теперь еще раз вернемся к нашей схеме, потому что формула, написанная выше, еще не завершена. Как обеспечить то синхронное, то встречное движение левого и правого серводвигателя? Как менять фазу центрального серводвигателя? Мы должны добавить в нашу формулу фазу колебаний. Сдвиг аргумента синуса на величину π для, например, правого двигателя заставит его работать в противофазу левому, то есть так, как нам надо для поворота на месте. Вот как теперь будет выглядеть наша формула:

X = 90 + 30 sin(2πt/1000 + Φ),

где Φ - фаза колебаний, значение от 0 до 2π.

Посмотри на таблицу, чтобы понять, какими должны быть фазы колебаний для серводвигателей применительно к каждому типу движения.

Сборка

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

Это очень важный этап перед сборкой. Попробуй отключить USB-кабель и запитай макет от батарейки «Крона». Проверь все фазы движения и убедись, что все работает. После сборки робота что-либо менять (например, заменить неработающий серводвигатель) будет уже сложнее.

Теперь перейдем к самой сборке. Основной несущий элемент - это батарейный отсек. Я советую использовать отсек закрытого типа и обязательно с выключателем.

Закреплять детали жука проще всего термоклеем. Начни с серводвигателей. Удали ненужные ушки креплений и соедини машинки между собой. Затем приклей эту сборку из трех «серв» к крышке батарейного отсека. Не забывай, что батарейный отсек должен свободно открываться для смены батарейки.

Контроллер проще всего приклеить к отсеку, но мне этот вариант не очень нравится, так как придется навсегда отдать Arduino Uno жуку. Поэтому можно усложнить себе жизнь и использовать разъемы Arduino для крепления батарейного отсека. На нижней части отсека приклей штырьковый разъем с шагом между штырьками 2,54 мм. Он должен располагаться так, чтобы входить в гнездо контроллера в районе цифровых выводов 8–11. Они пока все равно нам не понадобятся. Если разъема под рукой не оказалось, подойдет П-образно изогнутая канцелярская скрепка.

Провода, идущие от батарейного отсека, надо соединить с выводами Vin и соседним с ним GND. Не перепутай полярность! Плюс «Кроны» на Vin, минус на GND. Чтобы обеспечить надежный контакт проводов с Arduino-разъемами, можно просто облудить кончик провода потолще, я же как штекер использовал короткий отрезок скрепки. А место пайки закрыл термоусадочной трубкой.

Разъемы со шлейфов сервоприводов следует срезать, провода питания (+5 В - обычно красный и GND - черный или коричневый) надо объединить и вывести к гнездам 5V и соседнему с ним GND на контроллере. Подключать будем чуть позже. Провода управляющего сигнала (обычно желтый) выводим на цифровые выводы контроллера: левый серводвигатель на пин 2, центральный на пин 4, правый на пин 7.

«+» и «–» ИК-приемника можно просто вставить в разъем Arduino (5V и соседний GND). Правда, согнув пополам, удвоив их толщину. К этим же ножкам питания ИК-приемника припаиваем ранее подведенные провода питания серводвигателей. Выход сигнала ИК-приемника до аналогового входа контроллера А0 уже вряд ли дотянется, и тебе придется наращивать его проводом.

Несколько советов по изготовлению ног. Сначала подготовь левую и правую «передне-задние» ноги. Убедись в их симметричности (обрати внимание и на длины, и на углы изгибов). Начинай клеить ноги, только убедившись, что серводвигатели установлены в «нулевое» положение (90°).

Среднюю пару ног лучше устанавливай в последнюю очередь. Советую сначала сделать средние ноги длиннее, а затем после установки подрезать их до нужной длины. В «нулевом» положении все шесть ног должны стоять на поверхности. Качение средних ног с амплитудой 15° не должно мешать поворотам «передне-задних».

Что дальше?

Робожук - это готовая мобильная платформа на базе одного из самых популярных и доступных контроллеров. Проект открытый: https://github.com/beetle-ringo/arduino . Делай в GitHub форк (ответвление) и добавляй свою функциональность. Дай волю фантазии - добавь ИК-светодиод, и робот готов для робобитвы. Подключи дальномеры, тактильные сенсоры, гироскоп… Научи робота обходить препятствия или ходить по линии, попробуй установить на него веб-камеру. Идей может быть миллион, и ты всегда можешь выбирать самую интересную.

Робот-Слейпнир

Набор

  • Контроллер Arduino Uno Dagu Spider Robot: 2530 р.
  • Сервоприводы SG90 9g (16 штук) 1150 р.
  • Аккумулятор LiPo battery pack, 7,4 В, 1800 мА ч 490 р.
  • Радиомодуль 4 Pin Bluetooth RF Transceiver 270 р.
  • Индикатор напряжения (опционален) DC 3,3–30 В Red LED Panel Meter 100 р.
  • Уголок алюминиевый. В ближайшем строймаркете 135 р.
  • Болтики и гайки. На ближайшей барахолке 35 р.

Итого: 4710 р.

*Компоненты покупались в разное время, и многие позиции можно оптимизировать

poconoco: Попробуем собрать нестандартную конфигурацию - восьминогого 2DOF-робота. 2DOF-ноги намного проще программировать, к тому же у меня есть в запасе куча неиспользованных сервоприводов. А главное, можно будет назвать его в честь восьминогого коня бога Одина Слейпниром (всегда мечтал!).

У нашего Слейпнира с каждой стороны будет по четыре ноги с двумя шарнирами. Каждый шарнир - сервопривод, значит, восемь сервоприводов на сторону. Для простоты все восемь шарниров одной стороны коня будут вращаться в одной плоскости. Хотя это вовсе не обязательно. Более того, если ноги с одной стороны пустить немного «шахматкой», чтобы две соседние ноги не могли задеть друг друга, это будет даже лучше, позволит делать шире шаг и скакать галопом.

Аккуратное и функциональное, но далеко не самое дешевое решение - использовать нестандартную плату контроллера, оптимизированную для подключения сервоприводов в большом количестве. Мне подвернулась Dagu Spider Robot Controller - это тот же самый Arduino Mega, но на плате с заранее распаянными 3-пиновыми штырьковыми разъемами, куда сразу, без всяких шилдов, можно подключить те самые 48 сервоприводов. Идеальна для многоногих роботов на Arduino.

Управление

Управление у нас будет происходить по Bluetooth. Для этого есть различные аппаратные решения. Это и шилды, и отдельные платки с UART последовательным интерфейсом (как обычный ком-порт, только с уровнями сигналов 5 В). Мне самой практичной показалась именно маленькая платка с UART-интерфейсом. Подключается к соответствующим контактам UART/Serial порта Arduino. Отметим два нюанса: на Uno/Due/Nano и подобных всего один такой порт, и он же используется для прошивки через USB. Поэтому, возможно, потребуется отключать Bluetooth-модуль на время прошивки. А второй нюанс - не забывай, что RX-контакт модуля подключается к TX-контакту Arduino, а TX - к RX. Такие дела в UART.

Программирование Bluetooth не сложнее сервов, данные можно побайтово вычитывать, чем мы и будем пользоваться:

Char cmd; Serial.begin(9600); if (Serial.available()) cmd = Serial.read();

Если используется Arduino Mega и Bluetooth подключен ко второму порту, то вместо Serial пишется Serial1. Примечательно, что можно и не использовать Bluetooth, а управлять роботом прямо по USB. И в коде выше не изменится ничего! Это просто работа с последовательным портом, а висит ли там BT-передатчик или преобразователь USB Serial - нам неважно.

Другая сторона Bluetooth

Самый удобный способ подключения - это стандартные утилиты Linux. Для работы нам понадобятся утилиты sdptool, rfcomm (входят в состав пакета bluez в репозиториях Ubuntu), а также minicom (пакет так и называется). Инструкции по работе с этими утилитами можно найти в Сети.

Алгоритм движения

Для гексапода самой простой походкой будет такая: ноги делятся на две группы по три ноги, и одна из групп полностью на земле, другая - в воздухе, переставляется вперед. Это далеко не единственная возможная походка. Можно в воздухе держать только две лапы или даже одну, а остальные четыре или пять - на земле. Для октапода походок тоже множество. Мы возьмем самую простую, также с двумя группами по четыре ноги.

Итак, что нам нужно делать для работы с 16 сервоприводами и выбранной походкой? Правильный ответ - читать про инверсную кинематику (ИК). Объем статьи не позволяет развернуть тему широко, но материалов в интернете предостаточно. Вкратце, ИК решает задачу нахождения необходимых управляющих сигналов для того, чтобы система в пространстве заняла нужное положение. Для ноги это значит, что по координатам точки, куда должна попасть стопа, следует определить углы сервоприводов, которые для этого нужно выставить. А управляя координатами стоп, можно управлять положением тела. У нас 2DOF-ноги, оси параллельны, поэтому стопа перемещается всегда в одной плоскости. Задача ИК в данном случае сводится к 2D-пространству, что сильно ее упрощает.

Пускай для каждой ноги локальным началом координат O будет вал верхнего серва, то есть бедра. И у нас есть координаты точки A, куда нужно попасть стопе. Тогда легко увидеть, что нужно решить задачу нахождения точек пересечения двух окружностей (см. схему ног одной стороны, там на самой правой ноге это проиллюстрировано). Найдя точку B пересечения окружностей (выбрав любую из них), несложно посчитать искомые углы, используя перевод из декартовых координат в полярные. В коде решение этой задачи выглядит так:

Float A = -2 * x; float B = -2 * y; float C = sqr(x) + sqr(y) + sqr(hipLength) - sqr(shinLength); float X0 = -A * C / (sqr(A) + sqr(B)); float Y0 = -B * C / (sqr(A) + sqr(B)); float D = sqrt(sqr(hipLength) - (sqr(C) / (sqr(A) + sqr(B)))); float mult = sqrt(sqr(D) / (sqr(A) + sqr(B))); float ax, ay, bx, by; ax = X0 + B * mult; bx = X0 - B * mult; ay = Y0 - A * mult; by = Y0 + A * mult; // или bx для другой точки пересечения float jointLocalX = ax; // или by для другой точки пересечения float jointLocalY = ay; float hipPrimaryAngle = polarAngle(jointLocalX, jointLocalY); float hipAngle = hipPrimaryAngle - hipStartAngle; float shinPrimaryAngle = polarAngle (x - jointLocalX, y - jointLocalY); float shinAngle = (shinPrimaryAngle - hipAngle) - shinStartAngle;

где x и y - координаты точки, куда нужно дотянуться стопой; hipStartAngle - угол, на который повернуто «бедро» изначально (при среднем положении серва), аналогично - shinStartAngle. Кстати, в этих расчетах углы, очевидно, в радианах, а в объекты Servo их передавать нужно уже в градусах. Полный работоспособный код прошивки, включающий этот кусочек, выложен на GitHub, см. ссылку в конце статьи. Это кусок ИК, но кроме него нужно еще немного довольно простого кода, чтобы использовать эту ИК на всех ногах (см. функции legsReachTo(), legWrite()). Также необходим будет код, который собственно реализует походку - движение одной группы ног «назад» (чтобы робот двигался вперед), в то время как другая группа ног приподнимается и переставляется вперед для следующего шага, см. функцию stepForward(). Она делает один шаг с заданными параметрами. Этими параметрами, кстати, можно сделать и шаг назад, несмотря на название функции. Если эту функцию вызывать в цикле, то робот будет шагать вперед.

Теперь получение команд и их интерпретация. Добавим в программу состояние:

Enum State { STOP, FORWARD, BACKWARD, FORWARD_RIGHT, FORWARD_LEFT };

И в главном цикле исполнения loop() будем смотреть на текущее состояние (переменная state) и дергать stepForward(), если движемся вперед (с поворотом или без), и опять же stepForward(), но с отрицательным аргументом xamp, если надо двигаться назад. Повороты при этом будут обрабатываться в legWrite(), и для поворота направо ноги с правой стороны будут стоять на месте (пока левые гребут). Вот такой вот конь-танк. Брутально, зато очень просто и работает. Плавный поворот можно сделать только с 3DOF-ногами, пример этого можно увидеть в репозитории buggybug.

Switch (state) { case FORWARD: case FORWARD_RIGHT: case FORWARD_LEFT: stepForward(h, dh, xamp, xshift); break; case BACKWARD: stepForward(h, dh, - xamp, xshift); break; }

Char command; while (Serial1.available()) command = Serial1.read(); switch (command) { case "w": state = FORWARD; break; case "s": state = BACKWARD; break; case "d": state = FORWARD_RIGHT; break; case "a": state = FORWARD_LEFT; break; default: state = STOP; }

На этом основные моменты прошивки закончились, остальное - всякая мелочевка. Хотя есть еще один, пожалуй, важный момент - возможность точной подстройки сервов. Даже при самой аккуратной сборке, если всем сервам подать команду повернуться на 90°, все равно некоторые из них получатся чуть со сбитым углом. Потому нужна возможность его подстраивать. Как у меня это сделано, можно посмотреть в методах hipsWrite() и shinsWrite() и собственно в массивах тонких настроек hipsTune и shinsTune.

Сборка

Для подобных конструкций не нужно ничего особенного: подойдет листок оргстекла подходящей толщины (с ближайшей хозяйственной барахолки) и лобзик либо ножовка, чтобы выпиливать детальки. И конечно, дрель, чтобы сверлить отверстия. Вместо оргстекла можно использовать фанеру (тогда на финальной конструкции можно еще сделать памятную надпись выжигателем). Можно использовать и листы или уголки алюминия. Со Слейпниром я пошел как раз по пути использования алюминиевого уголка с ребрами в 1 см (купил где-то в строительном супермаркете).

Основой будет прямоугольная рама. Конечности - 4-сантиметровые полосочки. Стоит также запастись множеством маленьких болтиков, гаечек. Режем уголок на нужные кусочки, вырезаем пазы для сервов, сверлим дырочки для крепежных болтов и шурупов. Конструкцию лучше раз показать, чем описывать. Размеры могут быть любые, роботы должны быть разнообразны. Но помни: чем длиннее ноги, тем больший рычаг придется толкать сервоприводу и тем больше будет на него нагрузка. Вплоть до невозможности провернуться и даже поломки. Но 4–5 см - без проблем.

Для бюджетных легких роботов часто не заморачиваются на отдельное шарнирное соединение конечностей, и вся нагрузка ложится целиком на вал сервопривода. При маленьком весе это совсем не критично. А при большем весе стоит подумать о сервах с металлическими шестеренками и шариковым подшипником вала.

В комплекте с каждым сервом, как правило, поставляется пара-тройка шурупов и набор насадок, которые можно закрепить шурупом на валу для различных применений. Нам больше всего подойдет одиночный «рог» (или horn), который позволяет прикрепить к серву планку. Так, к одной планке крепятся оси двух сервов, и планка становится «бедром». При этом один серв крепится на теле, а другой становится частью голени. К нему стоит прикрутить еще планку, просто чтобы удлинить или сделать конечность поинтересней. Немного кропотливой работы - и платформа готова (удобные наборы отверток, ключей, пинцеты, кусачки и прочее сильно ускоряют дело).


Что дальше?

Весь проект доступен на странице https://github.com/poconoco/sleipnir . Я описал одну из самых непрактичных конфигураций - много 2DOF-ног, высокий, узкий, легко валится на бок. Попробуй сделать лучше, робота с 3DOF-ногами. С 4DOF-ногами. С клешнями или челюстями. В качестве примера 3DOF инверсной кинематики можешь обращаться к репозиторию buggybug - там прошивка гексапода. Также можно делать не управляемых, а интеллектуальных роботов, ставя вместо Bluetooth датчики расстояния, научить робота обходить стены и препятствия. Если такой сенсор поставить на сервопривод и вращать им, то можно сканировать местность, практически сонаром.

В этой статье мы рассмотрим несколько схем роботов, в которых реализованы следующие варианты поведения:
1. Объезжает препятствие при контакте с ним "усиками".
2. Избегает препятствия без контакта (ИК бампер).
3. Упирается "усиками" в препятствие, отъезжает назад, делает поворот, затем продолжает движение.
4. Избегает препятствие с разворотом (ИК бампер).
5. Следует за объектом, сохраняя дистанцию (ИК бампер).

Перед тем как приступить к рассмотрению схем давайте кратко разберем особенности микросхемы L293.

Рис.1. Расположение выводов микросхемы L293D

Внутри нее имеется два драйвера для управления электромоторами.
Моторы подключаются к выходам OUTPUT. Мы имеем возможность подключить два двигателя постоянного тока.
8-й и 16-й выводы микросхемы подключаются к плюсу питания. Поддерживается раздельное питание, т.е. 16-й вывод (Vss) предназначен для питания самой микросхемы (5 вольт), а контакт Vs (8-й вывод) можно подключить к источнику питания для двигателей. Максимальное напряжение силовой части составляет 36 вольт.
Я их разделять не буду и во всех схемах подключу к общему источнику питания.
Минус питания или земля (GND) подключается к выводам № 4, 5, 12, 13. Эти контакты, кроме того, обеспечивают теплоотвод микросхемы, поэтому при пайке на плату для этих выводов желательно выделить увеличенную металлизированную область.
Еще микросхема имеет входы ENABLE1 и ENABLE2.
Для включения драйверов, необходимо наличие логической единицы на этих выводах, проще говоря 1-й и 9-й выводы подключаем к плюсу питания.
Также имеются входы INPUT для управления двигателями.

Рис.2. Таблица соответствия логических уровней на входах и выходах.

Выше представлена таблица, по которой можно понять, что если на вход INPUT1 подать логической единицу, т.е. соединить с плюсом источника питания, а вход INPUT2 - с минусом, то мотор М1 начнет вращаться в определенную сторону. А если поменять местами логические уровни на этих входах, то мотор М1 будет вращаться в другую сторону.
Аналогично происходит и со второй частью, к которой подключается мотор М2.

Именно эта особенность и использована в представленных схемах роботов.

Схема №1. Робот объезжает препятствие при контакте с ним "усиками".

Рис.3. Схема №1. С механическими датчиками препятствий.

После подачи питания моторы будут вращаться в определенную сторону, двигая робота вперед. Это происходит за счет того, что на INPUT1 через резистор R2 поступает сигнал высокого уровня, так же как и на входе INPUT4. Транзистор VT1 надежно закрыт, база стянута на минус питания, на коллектор ток не втекает.
Объяснять я буду по левой части, т.к. обе части симметричны.
На входе INPUT2 через резистор R3 устанавливается логический 0. Судя по таблице (рис.2) мотор вращается в определенную сторону. В правой части схемы происходит тоже самое и робот едет вперед.
В схеме имеются ключи (SB1, SB2), в качестве которых применены SPDT переключатели. На них с помощью термоклея прикрепляются скрепки и получаются датчики препятствий.

Рис.4. Из скрепок сделаны датчики "усики".

Когда такой датчик упирается в препятствие, ключ замыкается и вход INPUT2 оказывается подключенным к плюсу питания, т.е. подается логическая "1". В этот же момент времени открывается и транзистор, вследствие чего логическая единица на входе INPUT1 сменяется логическим нулем. Мотор при нажатой кнопке вращается в другую сторону. Рывками происходят микропереключения и мотор разворачивает робота от препятствия, до того момента, пока датчик перестанет соприкасаться с препятствием.

Как вы уже догадались, переключатели или сами моторы нужно расположить крест-накрест.

Схема №2. Робот избегает препятствия без контакта (ИК бампер)

Еще более интересное поведение можно реализовать, если в качестве датчиков использовать TSOP-приемники для приема инфракрасных сигналов. Это будет некое подобие ИК-бампера.
Итак, теперь схема выглядит таким образом.

Рис.5. Схема №2. С инфракрасными датчиками препятствий.

"Модуль приема ИК" работает так: при поступлении инфракрасного сигнала на TSOP-приемник на его выходе появляется отрицательное напряжение, которое отпирает PNP транзистор, и ток с плюса питания поступает на входную цепь микросхемы. Если в прошлый раз были использованы механические переключатели, с так называемыми усиками из скрепок, то новая схема позволит роботу не врезаться в препятствие, а реагировать на него с некоторой дистанции. Это выглядит так:

Приемная часть выполнена таким образом: два абсолютно одинаковых модуля (левый и правый) скрепленные между собой (рис.8).

В качестве приемников использованы TSOP1136 с рабочей частотой 36 кГц. Расположение выводов представлено на рисунке ниже.

Рис.6. TSOP1136.

С приемниками мы разобрались, но для обнаружения препятствий нужно в пространство перед роботом посылать инфракрасное излучение с определенной частотой. Рабочая частота приемников бывает разная, в моем случае она составляет 36 кГц. Поэтому на микросхеме NE555 был собран генератор импульсов на данную частоту, а к выходу подключены излучающие диоды инфракрасного диапазона.


Рис.7. Схема излучателя на NE555.

На шасси робота закреплен фрагмент макетной платы, на которую можно установить желаемое количество ик-диодов.
На диоды желательно надеть термоусадочные трубочки или что нибудь подобное, чтобы они светили вперед, а не в разные стороны.

Рис.8. ИК бампер.

После подачи питания робот может попятиться назад, это из-за слишком большой чувствительности TSOP-приемников. Они воспринимают отраженный сигнал даже от пола, стен и других поверхностей. Поэтому в схеме излучателя ИК-сигнала (рис.7) использован подстроечный резистор, с помощью него уменьшаем яркость инфракрасных диодов и добиваемся желаемой чувствительности.

Схема №3. Такой робот отъезжает назад от препятствия, делая поворот.

Давайте рассмотрим еще одну интересную схему.

Рис.9. Схема №3.

Когда такой робот упирается в препятствие одним из своих усиков, то он отъезжает назад, делая небольшой поворот, затем после небольшой паузы робот продолжает движение. Поведение показано на анимации ниже:

Эта схема тоже полностью совместима с инфракрасным бампером, от предыдущей схемы.

В схеме появились электролитические конденсаторы между эмиттером и базовыми резисторами транзисторов VT1 и VT2. Появились диоды VD1, VD2 и светодиоды HL1, HL2.
Давайте по порядку разберем, зачем нужны эти дополнительные компоненты.
Итак, когда замыкается переключатель SB1, т.е. первый датчик, ток от плюса питания через диод VD1 и токоограничивающий резистор R1 поступает на базу транзистора. Он открывается, меняя логический уровень на входе INPUT1, на входе INPUT2 уровень тоже меняется.
В этот момент ток также поступает на конденсатор C1 и он заряжается. Мотор М1 резко меняет направление вращения и робот отъезжает назад от препятствия. На видео можно заметить, что второй мотор тоже меняет направление движения, но на более короткий промежуток времени. Это происходит из-за того, что при замыкании датчика SB1, ток от плюса питания поступает также и на правую часть схемы, через светодиод HL2. Светодиоды не только подают кратковременный сигнал о столкновении с препятствием, но и являются гасителем напряжения, поступающего на противоположную половину схемы. Проще говоря, при замыкании ключа SB1, конденсатор C2 заряжается меньше, чем C1. А при замыкании ключа (датчика) SB2 происходит тоже самое, но наоборот - С2 заряжается больше (т.е. напряжение на его обкладках больше). Это позволяет не только отъехать от препятствия, но и немного отвернуться от него. Угол этого отворачивания зависит от емкости конденсаторов C1 и С2. Конденсаторы емкостью 22 мкФ, на мой взгляд, являются оптимальными. При емкости 47 мкФ угол поворота будет больше.
Также на видео можно заметить, что после того, как робот отъезжает назад от препятствия, то присутствует небольшая пауза перед тем как он поедет вперед. Это происходит из-за разрядки конденсаторов, т.е. в некоторый момент времени логические сигналы на входах INPUT уравновешиваются и драйвер на секунду перестает понимать в какую сторону вращать мотор. Но когда C1 и С2 разрядятся, на входах INPUT установятся первоначальные логические уровни.
Диоды VD1 и VD2 препятствуют разрядке конденсаторов через светодиоды HL1, HL2. Без светодиодов схема не работает.

Схема №4. Предыдущая схема с ИК бампером.

Эта схема отличается от предыдущей тем, что вместо механических датчиков здесь использованы инфракрасные (ИК бампер).

Рис.10. Схема №4.

Коллекторы PNP транзисторов VT1 и VT2 при обнаружении препятствия, подадут сигнал на входную цепь микросхемы. Далее всё происходит также, как было описано ранее, только такой робот при обнаружении препятствия перед собой отъезжает назад, делает поворот, затем продолжает движение.
Поведение показано на анимации ниже:

У робота будет более резкое поведение, если уменьшить емкость конденсаторов C1 и C2 например до 1 мкФ (минимальная емкость 0,22 мкФ).

Как сделать так, чтобы робот следовал за объектом?

Во всех схемах, представленных выше, датчики-сенсоры или сами моторы должны быть расположены крест-накрест. А при прямом подключении (когда левый датчик "командует" левым двигателем, правый - правым) робот будет не избегать препятствие, а наоборот следовать за ним. Благодаря прямому подключению можно добиться очень интересного поведения робота - он будет активно преследовать объект, сохраняя определенную дистанцию. Расстояние до объекта зависит от яркости ИК диодов на бампере (настроить).

Еще немного фотографий:

В шасси использованы металлические детали от конструктора. Макетная плата откидывается для удобства замены батареек.

Питание робота осуществляется от 4-х батареек АА.

Варианты изготовления корпуса и шасси для робота ограничиваются только вашей фантазией, тем более в продаже имеется много готовых решений. В моем случае схема будет перенесена на плату, т.к. куча проводов это не эстетично. Также будут установлены аккумуляторы со схемой подзарядки. А какие еще доработки можно произвести или добавить новые функции - это всё вы можете предложить в комментариях.

К этой статье имеется видео, в котором подробно описана работа схем и продемонстрированы разные варианты поведения робота.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Элементы схемы №1 и №2 (кроме ИК бампера)
VT1, VT2 Биполярный транзистор

2N3904

2 В блокнот
R1, R2, R4, R6 Резистор

10 кОм

4 В блокнот
R3, R5 Резистор

4.7 кОм

2 В блокнот
C1 100 мкФ 1 В блокнот
Элементы "модуля приема ИК" на схеме №2, №4
VT1, VT2 Биполярный транзистор

2N3906

2 КТ361, КТ816 В блокнот
R1, R2 Резистор

100 Ом

2 В блокнот
C1, C2 Электролитический конденсатор 10-47 мкФ 2 В блокнот
Элементы "модуля излучения ИК сигнала" рис.7
R1 Резистор

1 кОм

1 В блокнот
R2 Резистор

1.5 кОм

1 В блокнот
R3 Переменный резистор 20 кОм 1 для настройки яркости FD1, FD2 В блокнот
C1 Конденсатор керамический 0.01 мкФ 1 В блокнот
C2 Конденсатор керамический 0.1 мкФ 1 В блокнот
FD1, FD2 ИК диод 2 Любой

В этой статье показано изготовление простого робота, избегающего препятствия на плате Xboard v2.0 . Данная плата хорошо подходит для небольших умных роботов, потому что она компактна, имеет четыре контроллера двигателей постоянного тока, может быть прошита по USB и имеет ещё много других функций. Также она очень проста в освоении и использовании. xAPI представляет собой набор функций на С, предназначенные для решения сложных программных задач, таких как работа с ШИМ, ЖК-дисплеем, дистанционным управление и т.д. Очень хорошо и легко для новичков. Её конструкция является открытой, поэтому если вы не хотите покупать Xboard v2.0 , вы можете изготовить её самостоятельно.

Цель нашего робота проста: необходимо двигаться в любом месте, избегая препятствий. Задача проста, и робот выполняет её полностью самостоятельно. У него есть мозг, который считывает информацию с датчиков, принимает решение и управляет двигателями.

Во время создания робота вы узнаете различные базовые методы, которые пригодятся вам в будущем.

Механическая часть робота

Робот собран в качественном металлическом корпусе, который можно приобрести в магазине робототехники. Робот приводится в движение двумя моторами-редукторами постоянного тока 200 RPM. Он использует систему дифференциальной передачи и имеет одно касторовое колесо спереди. Колеса связаны непосредственно с валом двигателя.

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

Xboard v2.0 монтируется с помощью монтажного комплекта, который идет в комплекте и включает в себя болты, гайки и стойки. Xboard v2.0 сделана так, что её крепежные отверстия совпадают с отверстиями в корпусе.

Дифференциальная передача

Дифференциальная передача позволяет осуществить движение и управление при помощи двух колес. Нет необходимости в рулевых колесах, как на велосипеде или автомобиле. Для поворота транспортного средства (или робота) левое и правое колесо вращаются при разных скоростях. Вот почему это называется дифференциальной передачей. Например, если правое колесо вращается быстрее левого, то робот поворачивает налево.

На картинке это показано более наглядно.

Таким образом, перемещение и управление роботом осуществляется путем управления двумя двигателями, что легко делается при помощи xAPI. Подробнее об этом написано по ссылкам:

http://xboard.extremeelectronics.co.in/Motor1.htm

http://xboard.extremeelectronics.co.in/Motor2.htm

В статьях рассказано, как запустить двигатель по часовой стрелке или против неё. MotorA – правый двигатель, MotorB – левый двигатель. Фрагменты кода, показывающие работу с двигателями.

Движение робота вперед:

Движение робота назад:

Поворот на лево:

MotorA(MOTOR_CW,255); // правый мотор вращается по часовой стрелке (CW) с макс. скоростью (255)

MotorB(MOTOR_CW,255); // левый мотор вращается по часовой стрелке (CW) с макс. скоростью (255)

Поворот на право:

MotorA(MOTOR_CCW,255); // правый мотор вращается против часовой стрелки (CCW) с макс. скоростью

MotorB(MOTOR_CCW,255); // левый мотор вращается против часовой стрелки (CCW) с макс. скоростью (255)

О MotorA и MotorB можно узнать подробнее, перейдя по ссылке

Датчики

Бесконтактные датчики помогают роботу обнаруживать препятствия на своем пути. Датчики включают в себя ИК-передатчики и ИК-приемники. В качестве ИК-передатчика используется ИК-светодиод, который излучает свет в ИК-спектре, невидимом для человеческого глаза. ИК-приемник принимает эти лучи.

ИК-датчик

ИК-датчик состоит из ИК-приемника, Ик-передатчика и нескольких резисторов. Схема приведена ниже. Нам необходимо три таких датчика, установленных на переднюю часть робота.

Как вы можете видеть, датчик имеет два контакта: питание и выход. На выходе датчика может быть напряжение от 0 до 5В в зависимости от расстояния до препятствия и его типа. Напряжение приближается к 5В, когда препятствие рядом.

Номинал R1 150Ом, R2 22кОм. Цветовой код показан на схеме выше. Номиналы резисторов очень важны, поэтому используйте только резисторы указанного номинала. Короткий вывод ИК-приемника черного (полупрозрачного) цвета является положительным выводом. Это не ошибка, поэтому подключайте его именно так.

ИК-приемник и ИК-передатчик должны быть установлены так, чтобы ИК лучи от ИК-передатчика падали на препятствия и отражались в ИК-приемник. Их правильное расположение показано на картинке.

Выход датчика подключается к АЦП AVR микроконтроллера. АЦП превращает напряжение в 10 битное цифровое значение от 0 до 1024. То есть, ориентируясь на значение с АЦП, вы можете узнавать о наличии препятствий перед датчиком. Работа с АЦП Xboard v2.0 проста и описана по ссылке.

Если мы подключили датчик к ADC0, то получить информацию с него можно при помощи следующей функции:

int sensor_value;

sensor_value=ReadADC(0);//Read Channel number 0

При использовании резисторов указанных на схеме выше, значение sensor_value составляет около 660 когда перед датчиком нет препятствия, и 745 когда до препятствия около 15 см. Если препятствие находится на расстоянии ближе чем 6 см, то значение 1023. Это максимальное значение, и даже если препятствие еще ближе, то значение не повышается.

Обратите внимание, что эти значения могут варьироваться в зависимости от типа препятствия. Некоторые объекты отражают ИК лучи лучше или хуже, чем другие. Некоторые объекты отражают ИК-лучи очень плохо, и не могут быть обнаружены. Эти результаты были получены при использовании ладони в качестве препятствия. Например, ИК-лучи плохо отражает дерево, покрашенное в темные цвета, например двери.

Объединение и подключение ИК-датчиков

Три ИК-датчика крепятся на макетную плату, которая крепится на переднюю часть робота. Один датчик установлен в центре плату, а два других справа и слева соответственно.

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

Теперь нужно просверлить два отверстия для монтажа. Тогда мы можем использовать винты, гайки и стойки для установки платы на шасси. Я использовал электрическую дрель, чтобы сделать отверстия за несколько секунд, но если её у вас нет, вы можете использовать ручную дрель.

На другой стороне платы мы одеваем распорки на винты, чтобы иметь расстояние между макетной платой и шасси.

Теперь макетную плату можно устанавливать на шасси

Обратите внимание, что я использую подстроечные резисторы вместо постоянных на 22кОм. Но вы должны использовать постоянные резисторы на 22кОм. Макетная плата подключается к Xboard v2.0 с использованием стандартного 8 выводного коннектора. Xboard v2.0 имеет 8 выводной разъем для датчиков. Также в этом разъеме есть выводы +5В и GND для датчиков. Его распиновка показана ниже.

Подключите правый датчик к ADC0, центральный датчик к ADC 1 и левый датчик к ADC 2. Датчики готовы, и теперь можно перейти к их тестированию.

Тестирование ИК-датчиков

Ниже приведена небольшая тестовая программа, которая считывает значение с трех датчиков и отображает его на ЖК-дисплее. Для понимания работы программы прочитайте статью Взаимодействие с ЖК-дисплеем при помощи xAPI.

#include “avr/io.h” #include “util/delay.h” #include “lcd.h” void InitADC() { ADMUX=(1<

Скомпилируйте и прошейте программу в Xboard v2.0. После этого подключите ЖК-дисплей и плату с датчиками. На экране должны быть значения с трех датчиков как показано ниже.

Когда вы подносите препятствие к одному из датчиков, значение с него должно увеличиваться, а когда препятствие совсем близко, то увеличиться до 1023. Запишите значения датчиков когда препятствия перед ними нет и когда препятствие на расстоянии около 15 см от него. Эти значения понадобятся вам для настройки программы робота.

Также я предоставил HEX файл, готовый для прошивки микроконтроллера ATmega32 (или ATmega16) и запуска в кратчайшие сроки.

Если на дисплее нет никакого текста, настройте контрастность потенциометром.

Если датчики работают не как ожидалось, проверьте соединения. Для проверки работы ИК-светодиодов используйте любую цифровую камеру, например Handicam или камеру мобильного телефона. Невидимые для человеческого глаза ИК-лучи хорошо видны камере. Если светодиоды не излучают ИК-лучи, проверьте соединения.

Программная часть

Задача программы состоит в том, чтобы считывать значения с датчиков, принимать решения и управлять двумя двигателями. Таким образом, робот будет ездить по комнате, объезжая всё на своем пути.

Мы определили три константы, а именно RTHRES, CTHRES и LTHRES:

//Threshold Values For Sensor Triggering

#define RTHRES 195

#define CTHRES 275

#define LTHRES 195

Их постоянными величинами являются внесенные значение. Они должны быть уже записаны. Как их получить описано выше. Когда значение с датчика приближается к этому пороговому значению, программа воспринимает это как препятствие. Обратите внимание, что значения указанные выше могут не соответствовать вашим. Это нормально.

Программа начинается с инициализации подсистемы двигателя и подсистемы АЦП:

Потом мы начинаем двигать робота вперед. Это делается при помощи обращения к функциям MotorA и MotorB. Первым аргументом является необходимое направление:

Вторым аргументом является необходимая скорость. Ее значение может от 0 до 255. Мы используем 25,5 чтобы двигаться на полной скорости.

Более подробную информацию о работе с двигателем при помощи xAPI можно найти в документации Xboard v2.0 .

После того как наш робот начинает двигаться вперед, мы переходим в бесконечный цикл, проверяя, если какое-то препятствие перед роботом. Если да, то робот поворачивает.

Оригинал статьи на английском языке (перевод: Александр Касьянов для сайта cxem.net)



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows