13 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Робот, ездящий по линии под управлением Arduino

Содержание

ROBOTяга ARDUINO — 7. Едем по ЛИНИИ

Вот мы и добрались до «крайней» возможности посылки из Китая – следование по полосе.
Теоретически эта функция проще Сонара, чего не скажешь о практической реализации…
Но все по порядку.

Необходимо:
— Модуль слежения за полосой с датчикам — 4 x Line inductive module.
— Провода.
— Скотч двухсторонний.
— Изолета белая.
— Отвертка шлицевая малая.

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

Датчики полосы скреплены – нам нужны 3 датчика, поэтому четвертый оставляем про запас.
Изоленту белую будем использовать в качестве ЛИНИИ по которой будет ехать робот… поэтому рекомендую брать с запасом – мало ли какую «трассу» вы решите построить.

Подключение:
Подключать нужно:
— датчики к модулю слежения;
— модуль слежения Arduino.

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

Модуль слежения подключаем согласно таблице:

Установка:
Установка так же разбита на две части:
— установка датчиков слежения;
— установка модуля слежения.
Обе установки имеют свои особенности…

Датчики слежения.
Должны быть в передней части робота.
Я прикрепил их к верхней палубе, используя, опять-таки, конструктор ЛЕГО и скотч.
В нижней палубе сделал вырез – чтобы датчикам ничего не мешало.

Сразу скажу – пробовал их различное расположение – выше, ниже, перед передней осью, за передней осью – но наилучший эффект на выбранном мною положении.
Возможно, вы найдете лучшее положение – дайте мне знать.

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

С доработанным сервоприводом, места для модуля не хватает – поэтому сняв «голову» расположил так:

Вы можете расположить как вам угодно – главное, что бы был доступ к потенциометрам и индикаторам на плате – они понадобятся нам для настройки.
Для крепления использовал двухсторонний скотч и ЛЕГО.

Настройка:
Это единственный случай, когда нам потребуется настройка!
Датчик состоит из двух элементов излучателя и приемника – сигнал от датчика «приемника» поступает в модуль слежения – откуда он уже поступает в Arduino. С помощью потенциометров – подстрочных резисторов можно отрегулировать, на что будет реагировать датчик.
В своих экспериментах я пришел к тому, что на моем линолеуме датчики лучше всего реагируют на белую изолету, чем на черную!
Поэтому полоса у меня белая! Если вы захотите поменять – ездить по «черной» полосе, вы можете изменить настройки на противоположные, а так же поменять скетч.
Самое главное, что нужно знать – для «черного» модуль выдает сигнал HIGH, а для «белого» — LOW!
И так, датчики и модуль подготовлены и подключены – ставим робот на покрытие по которому предстоит путешествовать РОБОТяге, и готовим образе «полосы».
И очень важно! Питание должно быть стабильное и полное! При просадке напряжения вы никогда не настроитесь/не добьетесь нормального результата!
А дальше работа не для слабонервных! Поворачиваем отверткой потенциометры, добиваясь того чтобы светодиод на модуле загорался только тогда, когда «полоса» оказывалась под датчиком:

Сразу предупреждаю – работа тонкая! Отвертку приходится не крутить, а чуть чуть «подталкивать» — что бы добиться необходимой чувствительности!
ВНИМАНИЕ! Для лиц со слабой нервной системой! Не расшатывайте ее дальше! Бросьте это дело!
Если у вас все получилось настроить датчики — 70% работы сделано! Теперь «чуть-чуть» настроить скетч…

Программирование:
Ну и для начала немного теории…
Вообще для того, что бы держать полосу достаточно двух датчиков!
В этом случае система настраивается таким образом, что сигнал от датчиков – отклонение и нужна коррекция.
В нашем случае, датчика три – в зависимости от комбинации сигналов от датчиков робот принимает действия:
— центральный датчик на белой полосе, остальные нет – все в порядке, едем вперед;
— центральный и один боковой на белой полосе – робот начал сбиваться с курса – нужно довернуть в противоположную сторону;
— боковой датчик на белой полосе – робот сбился с курса – нужно развернуться в противоположную сторону.
На случай если все датчики вне белой полосы – беда! Нужно искать полосу!
Логика достаточно простая, но случаи «доворота» и «разворота» в нужную сторону очень тонкие параметры. Если не «довернуть» — робот будет терять полосу… «перевернуть» будет нервным… или тоже потеряет полосу. По правильному, робот в случае отклонения должен стремиться довернуть, пока не поймает полосу и дальше продолжит движение вперед…
Но в моем случае использован «простой» вариант – параметры «доворота» и «разворота» заданы с помощью «задержек» и «скорости»…
В скетче параметры подбирались под конкретного РАБОТягу…
В вашем случае может потребоваться коррект.
И в зависимости от особенностей робота, настройка для движения по часовой и против часовой стрелки может отличаться – самые внимательные могут заметить это в моем скетче.

СКЕТЧ:
[code]
//Робот с функцией следования по белой полосе «изоленте».

// *********************** Установка выводов моторов ************************
int MotorLeftSpeed = 5; // Левый (А) мотор СКОРОСТЬ — ENA
int MotorLeftForward = 4; // Левый (А) мотор ВПЕРЕД — IN1
int MotorLeftBack = 2; // Левый (А) мотор НАЗАД — IN2
int MotorRightForward = 8; // Правый (В) мотор ВПЕРЕД — IN3
int MotorRightBack = 7; // Правый (В) мотор НАЗАД — IN4
int MotorRightSpeed = 6; // Правый (В) мотор СКОРОСТЬ — ENB
int duration;

// ********************* Установка выводов датчиков линии *******************
const int LineSensorLeft = 19; // вход левого датчика линии
const int LineSensorMiddle = 18; // вход центрального датчика линии
const int LineSensorRight = 17; // вход правого датчика линии
int SL; // статус левого сенсора
int SM; // статус центрального сенсора
int SR; // статус правого сенсора

// *********************************** SETUP ********************************
void setup ()
<
//*************** Задаем контакты моторов
pinMode (MotorRightBack, OUTPUT); // Правый (В) мотор НАЗАД
pinMode (MotorRightForward, OUTPUT); // Правый (В) мотор ВПЕРЕД
pinMode (MotorLeftBack, OUTPUT); // Левый (А) мотор НАЗАД
pinMode (MotorLeftForward, OUTPUT); // Левый (А) мотор ВПЕРЕД
delay(duration);
//*************** Задаем контакты датчиков полосы
pinMode (LineSensorLeft, INPUT); // определением pin левого датчика линии
pinMode (LineSensorMiddle, INPUT);// определением pin центрального датчика линии
pinMode (LineSensorRight, INPUT); // определением pin правого датчика линии
>
// ****************** Основные команды движения ******************
void forward (int a, int sa) // ВПЕРЕД
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, HIGH);
analogWrite (MotorRightSpeed, sa);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, HIGH);
analogWrite (MotorLeftSpeed, sa);
delay (a);
>
void right (int b, int sb) // ПОВОРОТ ВПРАВО (одна сторона)
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, LOW);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, HIGH);
analogWrite (MotorLeftSpeed, sb);
delay (b);
>
void left (int k, int sk) // ПОВОРОТ ВЛЕВО (одна сторона)
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, HIGH);
analogWrite (MotorRightSpeed, sk);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, LOW);
delay (k);
>
void turnR (int d, int sd) // БЫСТРЫЙ ПОВОРОТ ВПРАВО (обе стороны)
<
digitalWrite (MotorRightBack, HIGH);
digitalWrite (MotorRightForward, LOW);
analogWrite (MotorRightSpeed, sd);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, HIGH);
analogWrite (MotorLeftSpeed, sd);
delay (d);
>
void turnL (int e, int se) // БЫСТРЫЙ ПОВОРОТ ВЛЕВО (обе стороны)
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, HIGH);
analogWrite (MotorRightSpeed, se);
digitalWrite (MotorLeftBack, HIGH);
digitalWrite (MotorLeftForward, LOW);
analogWrite (MotorLeftSpeed, se);
delay (e);
>
void back (int g, int sg) // НАЗАД
<
digitalWrite (MotorRightBack, HIGH);
digitalWrite (MotorRightForward, LOW);
analogWrite (MotorRightSpeed, sg);
digitalWrite (MotorLeftBack, HIGH);
digitalWrite (MotorLeftForward, LOW);
analogWrite (MotorLeftSpeed, sg);
delay (g);
>
void stopp (int f) // СТОП
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, LOW);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, LOW);
delay (f);
>
// *********************************** LOOP *********************************
// ********************** Режим следования по ЛИНИИ *************************
void loop ()
<
SL = digitalRead (LineSensorLeft); // считываем сигнал с левого датчика полосы
SM = digitalRead (LineSensorMiddle); // считываем сигнал с центрального датчика полосы
SR = digitalRead (LineSensorRight); // считываем сигнал с правого датичка полосы


Я показал пример следования по полосе на примере четырех колесного робота.
Но как правило, роботы для движения по полосе строят трехколесные – они больше всего подходят для управления «реверсом» колес. Хотя и выглядит это смешно – как трясогузка 🙂
По началу РОБОТягу был таким:

Ну вот и все!
Стандартный «пакет опций» заложенный фасовщиком посылки я попробовал.
Но это не предел его возможностей!
Об этом я расскажу отдельно – если кому то будет интересно.

Модель робота, следующего по линии

  • Информация
  • Новости
  • Статьи
  • Информация
  • Новости
  • Статьи

Модель робота, следующего по линии

1.Введение

Я увлекаюсь робототехникой и занимаюсь ей уже полтора года. Робототехника, это прикладная наука, занимающаяся разработкой автоматизированных технических систем. Она опирается на такие дисциплины, как электроника, механика, информатика, а также радиотехника и электротехника. Обычно все новички в этой интересной науке начинают с наборов LEGO Mindstorms. В этих наборах уже даны готовые основные элементы, не требующие спайки и легкие в использовании, удобная среда программирования, позволяющая быстро собрать и запрограммировать робота, используя визуальную среду программирования Lego Mindstorm NXT, в которой запрограммировать робота, может даже человек, незнакомый с языками программирования. Я начинал именно с такого. Это отличный набор, позволяющий изучить основы робототехники, программирования. Несмотря на простоту использования, с помощью этих наборов можно собрать очень сложных роботов, решающих сложные математические задачи. Например, из данного набора собран самый быстрый в мире робот собирающий кубик Рубика 3 X 3 за 4 секунды (Cubestormer II), в котором программа, взаимодействующая с датчиками и двигателями, вращающими кубик, выполняется на телефоне Samsung Galaxy S.

Читать еще:  Делаем правильно сварочный аппарат своими силами

При работе с наборами Lego, содержимое модулей скрыто от нас пластиковой оболочкой. Для того чтобы лучше понять как устроены элементы робота, можно использовать платформу Arduino, при работе с которой нужно глубже понимать как работает робот на уровне “железа”, дает больше гибкости при использовании составных элементов робота. Также, в настоящей робототехнике используются более сложные языки программирования, чем в LEGO Mindstorms, которые дают больше гибкости при программировании роботов и более высокую скорость выполнения программ, что дает большую скорость реакции робота на данные, получаемые с датчиков. Именно поэтому я решил выяснить, возможно ли самому в домашних условиях собрать настоящего действующего робота, не используя LEGO Mindstorms.

Часть 1. Сборка.

2. С чего начать?

Я начал сборку робота с планировки месторасположения его составляющих на платформе. Робот получился двухэтажный. На нижнем ярусе я расположил мотор-редукторы и отсеки с батареями (общее напряжение 9 вольт). Я использовал пластиковые трубочки-стойки для крепления второго яруса. На нем располагались микроконтроллер Arduino UNO и жидкокристаллический дисплей. На микроконтроллер Arduino я установил драйвер управления моторами. Я воспользовался им, так, как моторы потребляют ток, с которым мой микроконтроллер не смог бы обрабатывать, и просто-напросто бы сгорел. В нижней части робота, со стороны колес установлен цифровой датчик линии Pololu QTR-8RC состоящий из 6 отдельных датчиков.

План месторасположения компонентов на моём роботе

3. Arduino UNO

Теперь несколько слов о самой платформе Arduino Uno. Arduino — это открытая платформа, которая позволяет собирать всевозможные электронные устройства. Платформа состоит из аппаратной и программной частей; обе чрезвычайно гибки и просты в использовании. Для программирования используется упрощенная версия языка С++. Разработку можно вести как с использованием бесплатной среды Arduino IDE, так и с помощью другого инструментария. “Мозгом” аппаратной части является микропроцессор ATmega328 работающий на частоте 16 MГц. Платформа имеет 14 цифровых входов/выходов (6 из которых могут использоваться как выходы широтно-импульсной модуляции), 6 аналоговых входов (в моем проекте не используются). На плате установлен разъем USB, через который платформу можно подключить к компьютеру и осуществлять программирование платформы, разъем для подключения питания (7 – 12 Вольт), разъёмы выхода стабилизированного напряжения 5В, 3,3В и кнопку перезагрузки. Также имеется 2 кб оперативной памяти, которые используются для хранения временных данных вроде переменных программы. Эта память очищается при обесточивании. Ещё имеется 1 кб памяти для долговременного хранения данных. По своему назначению это аналог жёсткого диска для Arduino.

4. Подключение компонентов к портам.

После распланировки места для «внутренностей» робота требовалось подключить их к плате Arduino. На плате 14 входов. Датчики требуют 6 портов, моторы 4, а дисплей 6. В сумме 16. 14 // подключение библиотеки для работы с дисплеем при помощи сдвигового регистра

#include // подключение библиотеки для работы с световыми сенсорами

// Коэффициенты KP и KD подбираются опытным путем, т.о. что бы обеспечить стабильность и плавность движения робота.

#define M1_DEFAULT_SPEED 255

#define M2_DEFAULT_SPEED 255

#define M1_MAX_SPEED 255

#define M2_MAX_SPEED 255

#define MIDDLE_SENSOR QTR_NO_MIDDLE_SENSOR

#define NUM_SENSORS 6 // number of sensors used

#define TIMEOUT 2500 // waits for 2500 us for sensor outputs to go low

#define EMITTER_PIN QTR_NO_EMITTER_PIN // emitter is controlled by digital pin 2

#define DEBUG 0 // set to 1 if serial debug output needed

ShiftLCD lcd(2, 0, 1);

QTRSensorsRC qtrrc((unsigned char[]) <8,9,10,11,12,13>,NUM_SENSORS, TIMEOUT, EMITTER_PIN);

Робот, ездящий по линии под управлением Arduino

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

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

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

В результате выглядеть он будет так:

Что понадобится

Для нашего примера понадобятся следующие детали:

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

Собираем робота

Сначала соберём робота, установим всю механику и электронику.

Собираем платформу

Для начала прикрепим колёса к моторам.

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

Теперь крепим балансировочный шар.

Отлично! Платформа собрана. Если вам кажется, что колёсам отведено слишком мало места и они трутся о платформу, то скорее всего вам нужно посильнее надавить на колёса, чтобы они плотнее сели на вал мотора.

Крепим сенсоры

Закрепим их, как показано на фото:

Можно было бы выбрать и другое место. Это могло бы сделать контроль проще или сложнее, а самого робота более или менее эффективным. Оптимальное расположение — вопрос серии экспериментов. Для этого проекта просто был выбран такой способ крепления.

Крепим Arduino

Arduino закрепим с противоположной стороны двумя винтиками и гайками.

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

Крепим Motor Shield и соединительные провода

Установим Motor Shield на Arduino и подсоединим соединительные провода. Обратите внимание, чтобы соотвествовать программному коду из примера ниже, моторчики соединены с Motor Shield так: правый — к клеммам M1 с прямой полярностью (плюс к плюсу), а левый — к M2 с обратной (плюс к минусу).

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

Крепим Troyka Shield

Присоединяем сверху Troyka Shield и подключаем датчики к 8 и 9 цифровым контактам. В итоге получаем следующую конструкцию:

Программирование

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

Основная идея алгоритма

Пусть у нас усть белое поле, и на нём чёрным нарисован трек для нашего робота. Используемые датчики линии выдают логический ноль, когда «видят» чёрное и единицу, когда «видят» белое.

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

При повороте траектории направо, правый сенсор наезжает на трек и начинает показывать логический ноль. При повороте налево, ноль показывает левый сенсор.

Таким образом получаем простую систему с тремя состояниями:

На вход системы поступает информация с сенсоров. Получаем следующую логику переходов:

ЛевыйПравыйЦелевое состояние
STATE_FORWARD
1STATE_RIGHT
1STATE_LEFT
11STATE_FORWARD

Реализация на Arduino

Проблема инертности и её решение

Однако если выставить скорость моторов побольше, мы столкнёмся со следующей проблемой: наш робот будет вылетать с трека, не успевая отреагировать на поворот. Это связано с тем, что наши моторчики не умеют тормозить мгновенно.

В этом легко убедиться поставив следующий эксперимент: с заданной скоростью робот будет двигаться по поверхности, и в некоторый момент будет установлена нулевая скорость и измерен тормозной путь робота. Пусть робот разгоняется по монотонной поверхности и тормозится при фиксировании импровизированной стоп-линии.

Эксперимент проведём для разных скоростей. Код программы для эксперимента таков:

На той поверхности, на которой проводился эксперимент, были получены следующие результаты:

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

Что можно сделать?! После того, как сенсоры улавливают поворот, можно остановиться и вернуться назад на некоторое расстояние, зависящее от скорости перед остановкой. Однако мы можем отдать команду роботу ехать с какой-то скоростью, но не можем приказать ему проехать какое-то расстояние.

Для того, чтобы понять зависимость расстояния при заднем ходе от времени, был проведён ещё один замер:

На скорости 50, например, робот проделывал путь, зависящий от времени следующим образом:

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

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

Адаптивное поведение

Перед финальным экспериментом произведём ещё несколько поправок.

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

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

В итоге наш код будет выглядит следующим образом:

Результат

Что дальше?

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

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

Урок 33. Обучаем Arduino робота ездить по линии

Введение:

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

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

Видео:

Нам понадобится:

  • Arduino Uno х 1шт.
  • Motor Shield (на 2 канала) x 1шт.
  • Аналоговый датчик линии x 3шт.
  • Машинка (базовый комплект)

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

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

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .

Схема подключения:

Моторчики подключаются к клеммам M1 (левый мотор) и M2 (правый мотор) расположенным на Motor Sield. Аналоговые датчики линии подключаются к любым аналоговым входам Arduino Uno, в нашем примере используются входы A5 (для правого датчика), A4 (для центрального датчика) и A3 (для левого датчика). Вывод TRIG ультразвукового датчика расстояния подключается к любому выводу Arduino Uno, в нашем случае вывод D2. Вывод ECHO, при использовании библиотеки iarduino_HC_SR04_int, может подключаться только к тем выводам Arduino Uno, которые используют внешние прерывания, в нашем случае это вывод D3. Все датчики запитаны от напряжения 5 В. Напряжение питания на Arduino Unoподаётся через Motor Shield (клеммник Vin), для чего нужно установить перемычку, рядом с клеммником, в позицию «Общ. Пит.». Входы Motor Shield H1 (направление 1 мотора), E1 (ШИМ 1 мотора), E2 (ШИМ 2 мотора), H2 (направление 2 мотора), по умолчанию, подключены к выводам D7, D6, D5 и D4 соответственно, но их можно поменять, сняв перемычку и соединив вывод Motor Shield с нужным выводом Arduino Uno.

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

  • Если центральный датчик находится на линии, а боковые вне линии, то машинка едет прямо.
  • Если левый датчик находится на линии, а правый вне линии, то машинка поворачивает налево (независимо от показаний центрального датчика)
  • Если правый датчик находится на линии, а левый вне линии, то машинка поворачивает направо (независимо от показаний центрального датчика)
  • Если правый и левый датчики находятся на линии (вне зависимости от показаний центрального датчика), то такое состояние является неопределённым, машинка продолжает предыдущее движение (прямо или с поворотом) в течении 2 секунд (можно менять в скетче). Если в течении этого времени состояние не изменится, то она остановится.
  • Если все три датчика находятся вне линии, то такое состояние является неопределённым (потеря линии). Если этому состоянию предшествовал поворот, то машинка продолжит поворот в течении 2 секунд (можно менять в скетче). Если в течении этого времени состояние не изменится, то она остановится. Если этому состоянию не предшествовал поворот (машинка ехала прямо и линия оборвалась), то машинка сразу остановится.
  • Если перед машинкой появилось препятствие, на расстоянии менее 10 см (можно менять в скетче), то машинка остановится и продолжит движение, как только препятствие исчезнет.

Скорость движения задаётся в константе valSpeed, от 1 до 255. Крутизна поворотов задаётся в константе valTurning, от 1 до 255. Время продолжения движения, при неопределённом состоянии, задаётся в константе tmrDelay, в микросекундах. Направление движения моторов указывается логическими значениями элементов массива arrRoute (0 элемент — правый мотор, 1 элемент — левый мотор), по умолчанию все элементы равны «1». Если вы перепутали полярность при подключении мотора, то измените значение соответствующего элемента этого массива на «0».

Калибровка для светлых, слабоконтрастных или цветных линий:

Машинка настроена на движение по темной линии, но она может ездить по светлым, слабоконтрастным или цветным линиям. Для этого её нужно откалибровать, указав значения для констант valSensor1 (показание датчика находящегося на линии) и valSensor0 (показание датчика находящегося вне линии). Для чего, в коде setup скетча, предусмотрен вывод показаний центрального датчика в монитор последовательного порта.

  • Поместите машинку так, чтобы центральный датчик находился над линией.
  • Подключите Arduino Uno по USB кабелю.
  • Откройте монитор последовательного порта. В мониторе высветится показание датчика на линии.
  • Поместите машинку так, чтобы центральный датчик находился вне линии.
  • Нажмите кнопку reset на Motor Shield. В мониторе высветится показание датчика вне линии.
  • Укажите первое значение константе valSensor1, а второе значение константе valSensor0 и повторно загрузите скетч.

Движущийся вдоль линии робот на Arduino

Движущийся вдоль линии робот представляет собой механизм, который способен следовать вдоль черной или белой линии. Существуют две разновидности подобных роботов: одна предназначена для следования вдоль черной линии, а другая – вдоль белой. Фактически, робот как бы «чувствует» линию едет вдоль нее.

Принцип работы робота движущегося вдоль линии

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

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

В нашем проекте мы будем использовать робота, который при обнаружении белой поверхности подает на вход платы Arduino 1, а при обнаружении черной поверхности – 0.

Необходимые компоненты

Arduino

В нашем проекте мы использовали микроконтроллер для управления всем процессом движения робота, в данном случае его роль выполняет плата Arduino, которая является универсальной платформой для разработки приложений различного назначения. Мы применили плату Arduino pro mini (купить на AliExpress) поскольку она небольшая по размерам и легко интегрируется с макетной платой.

Драйвер мотора L293D

L293D представляет собой микросхему драйвера мотора (motor driver), имеющую в своем составе 2 канала для управления двумя двигателями. Микросхема L293D имеет две транзисторные пары Дарлингтона для усиления и раздельного управления мощностью двигателей, подключаемых к ее выходам.

Инфракрасный модуль

Инфракрасный модуль представляет собой датчик, включающий пару инфракрасных светодиода/фотодиода, потенциометр, компаратор LM358, резисторы и светодиод. Инфракрасный светодиод излучает инфракрасный свет, а фотодиод его принимает.

Также в схему добавлен регулятор напряжения на 5 В, а питание устройства осуществляется от батарейки 9 В.

Работа схемы

Схема устройства представлена на следующем рисунке.

Как вы можете видеть из представленной схемы выходы компараторов напрямую подсоединены к цифровым выводам Arduino 2 и 3. Входные контакты драйвера мотора 2, 7, 10 и 15 соединены с цифровыми контактами Arduino 4, 5, 6 и 7 соответственно. Один из двигателей подсоединен к выходным контактам драйвера мотора 3 и 6, а второй двигатель – к его контактам 11 и 14.

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

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

Модуль управления построен на основе платы Arduino Pro Mini, которая будет контролировать весь процесс движения робота. Выходы компараторов подсоединены к цифровым контактам 2 и 3 платы Arduino. Плата Arduino считывает эти сигналы и посылает команды управления модулю движения.

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

Принцип работы робота, следующего вдоль линии, достаточно прост. Датчики робота обнаруживают (чувствуют) линию и передают соответствующие сигналы на Arduino. А плата Arduino в соответствии с этими сигналами управляет двумя моторами, движущими робота.

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

Если левый датчик обнаруживает черную линию, то робот поворачивает влево.

Если правый датчик обнаруживает черную линию, то робот поворачивает вправо..

Если оба датчика обнаруживают черную линию, робот останавливается.

В нашем проекте мы использовали два инфракрасных датчика (сенсора), которые мы назовем левым датчиком и правым датчиком. Когда оба датчика видят перед собой белый цвет робот движется прямо.

Исходный код программы

В программе первым делом мы инициализируем входные и выходные контакты, а затем в цикле программы мы будем проверять сигналы на входных контактах и формировать соответствующие управляющие сигналы на выходных контактах, которые будут управлять вращением двигателей. Для проверки сигналов на входных контактах мы будем использовать операторы “if”.

В следующей таблице представлены 4 условия, согласно которым осуществляется управление нашим роботом.

Далее приведен полный текст программы с комментариями.

/*—инициализируем входные контакты——*/
#define LS 2 // левый датчик
#define RS 3 // правый датчик
/*— инициализируем выходные контакты —*/
#define LM1 4 // левый двигатель
#define LM2 5 // левый двигатель
#define RM1 6 // правый двигатель
#define RM2 7 // правый двигатель
void setup()
<
pinMode(LS, INPUT);
pinMode(RS, INPUT);
pinMode(LM1, OUTPUT);
pinMode(LM2, OUTPUT);
pinMode(RM1, OUTPUT);
pinMode(RM2, OUTPUT);
>
void loop()
<
if(digitalRead(LS) && digitalRead(RS)) // движение вперед
<
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, LOW);
>

Видео, демонстрирующее работу схемы

Программирование Arduino с помощью ArduBloсk на примере робота, движущегося по полосе

Здравствуйте! Я Аликин Александр Сергеевич, педагог дополнительного образования, веду кружки «Робототехника» и «Радиотехника» в ЦДЮТТ г. Лабинска. Хотел бы немного рассказать об упрощенном способе программирования Arduino с помощью программы «ArduBloсk».

Эту программу я ввел в образовательный процесс и восхищен результатом, у детей она пользуется особым спросом, особенно при написании простейших программ или для создания какого-то начального этапа сложных программ. ArduBloсk является графической средой программирования, т. е. все действия выполняются с нарисованными картинками с подписанными действиями на русском языке, что в разы упрощает изучение платформы Arduino. Дети уже со 2-го класса с легкостью осваивают работу с Arduino благодаря этой программе.

Да, кто-то может сказать, что еще существует Scratch и он тоже очень простая графическая среда для программирования Arduino. Но Scratch не прошивает Arduino, а всего лишь управляет им по средством USB кабеля. Arduino зависим от компьютера и не может работать автономно. При создании собственных проектов автономность для Arduino — это главное, особенно при создании роботизированных устройств.

Даже всеми известные роботы LEGO, такие как NXT или EV3 нашим ученикам уже не так интересны с появлением в программировании Arduino программы ArduBloсk. Еще Arduino намного дешевле любых конструкторов LEGO и многие компоненты можно просто взять от старой бытовой электронной техники. Программа ArduBloсk поможет в работе не только начинающим, но и активным пользователям платформы Arduino.

Итак, что же такое ArduBloсk? Как я уже говорил, это графическая среда программирования. Практически полностью переведена на русский язык. Но в ArduBloсk изюминка не только это, но и то, что написанную нами программу ArduBloсk конвертирует в код Arduino IDE. Эта программа встраивается в среду программирования Arduino IDE, т. е. это плагин.

Ниже приведен пример мигающего светодиода и конвертированной программы в Arduino IDE. Вся работа с программой очень проста и разобраться в ней сможет любой школьник.

В результате работы на программе можно не только программировать Arduino, но и изучать непонятные нам команды в текстовом формате Arduino IDE, ну а если же «лень» писать стандартные команды — стоит быстрыми манипуляциями мышкой набросать простенькую программку в ArduBlok, а в Arduino IDE её отладить.

Чтобы установить ArduBlok, необходимо для начала загрузить и установить Arduino IDE с официального сайта Arduino и разобраться с настройками при работе с платой Arduino UNO. Как это сделать описано на том же сайте или же на Амперке, либо посмотреть на просторах YouTube. Ну, а когда со всем этим разобрались, необходимо скачать ArduBlok с официального сайта, вот ссылка. Последние версии скачивать не рекомендую, для начинающих они очень сложны, а вот версия от 2013-07-12 — самое то, этот файл там самый популярный.

Затем, скачанный файл переименовываем в ardublock-all и в папке «документы». Создаем следующие папки: Arduino > tools > ArduBlockTool > tool и в последнею кидаем скачанный и переименованный файл. ArduBlok работает на всех операционных системах, даже на Linux, проверял сам лично на XP, Win7, Win8, все примеры для Win7. Установка программы для всех систем одинакова.

Ну, а если проще, я приготовил на Mail-диске 7z архив, распаковав который найдете 2 папки. В одной уже рабочая программа Arduino IDE, а в другой папке содержимое необходимо отправить в папку документы.

Для того, чтобы работать в ArduBlok, необходимо запустить Arduino IDE. После чего заходим во вкладку Инструменты и там находим пункт ArduBlok, нажимаем на него — и вот она, цель наша.

Теперь давайте разберемся с интерфейсом программы. Как вы уже поняли, настроек в ней нет, а вот значков для программирования предостаточно и каждый из них несет за собой команду в текстовом формате Arduino IDE. В новых версиях значков еще больше, поэтому разобраться с ArduBlok последней версии сложно и некоторые из значков не переведены на русский.

В разделе «Управление» мы найдем разнообразные циклы.

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

В разделе «Числа/Константы» мы можем с вами выбрать цифровые значения или создать переменную, а вот то что ниже вряд ли будите использовать.

В разделе «Операторы» мы с вами найдем все необходимые операторы сравнения и вычисления.

В разделе «Утилиты» в основном используются значки со временем.

«TinkerKit Bloks»- это раздел для приобретенных датчиков комплекта TinkerKit. Такого комплекта у нас, конечно же, нет, но это не значит, что для других наборов значки не подойдут, даже наоборот — ребятам очень удобно использовать такие значки, как включения светодиода или кнопка. Эти знаки используются практически во всех программах. Но у них есть особенность — при их выборе стоят неверные значки обозначающие порты, поэтому их необходимо удалить и подставить значок из раздела «числа/константы» самый верхний в списке.

«DF Robot» — этот раздел используется при наличии указанных в нем датчиков, они иногда встречаются. И наш сегодняшний пример — не исключение, мы имеем «Регулируемый ИК выключатель» и «Датчик линии». «Датчик линии» отличается от того, что на картинке, так как он от фирмы Амперка. Действия их идентичны, но датчик от Амперки намного лучше, так как в нем имеется регулятор чувствительности.

«Seeedstudio Grove» — датчики этого раздела мной ни разу не использовались, хотя тут только джойстики. В новых версиях этот раздел расширен.

И последний раздел это «Linker Kit». Датчики, представленные в нем, мне не попадались.

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

Вот сам набор деталей все было приобретено на сайте Амперка.

  1. AMP-B001 Motor Shield (2 канала, 2 А) 1 890 руб
  2. AMP-B017 Troyka Shield 1 690 руб
  3. AMP-X053 Батарейный отсек 3×2 AA 1 60 руб
  4. AMP-B018 Датчик линии цифровой 2 580 руб
  5. ROB0049 Двухколёсная платформа miniQ 1 1890 руб
  6. SEN0019 Инфракрасный датчик препятствий 1 390 руб
  7. FIT0032 Крепление для инфракрасного датчика препятствий 1 90 руб
  8. A000066 Arduino Uno 1 1150 руб

Для начала соберем колесную платформу и припаяем к двигателям провода.

Затем установим стойки, для крепления платы Arduino UNO, которые были взяты от старой материнской платы ну или иные подобные крепления.

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

Следующим крепим инфракрасный датчик препятствий на его специальное крепление. Обратите внимание, что регулятор чувствительности находиться сверху, это для удобства регулировки.

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

Следующим устанавливаем Motor Shield или по другому можно назвать драйвер двигателей. В нашем случае обратите внимание на джампер. Мы не будем использовать отдельное питание для двигателей, поэтому он установлен в этом положение. Нижняя часть заклеивается изолентой, это чтобы не было случайных замыканий от USB разъема Arduino UNO, это на всякий случай.

Сверху Motor Shield устанавливаем Troyka Shield. Он необходим для удобства соединения датчиков. Все используемые нами сенсоры цифровые, поэтому датчики линии подключены к 8 и 9 порту, как их еще называют пины, а инфракрасный датчик препятствий подключен к 12 порту. Обязательно обратите внимание, что нельзя использовать порты 4, 5, 6, 7 так как оны используются Motor Shield для управлением двигателями. Я эти порты даже специально закрасил красным маркером, чтобы ученики разобрались.

Если вы уже обратили внимание, мной была добавлена черная втулка, это на всякий случай, чтобы установленный нами батарейный отсек не вылетел. И наконец, всю конструкцию мы фиксируем обычной резинкой.

Подключения батарейного отсека может быть 2-х видов. Первый подключение проводов к Troyka Shield. Также возможно подпаять штекер питания и подключать уже к самой плате Arduino UNO.

Вот наш робот готов. Перед тем как начать программировать, надо будет изучить, как все работает, а именно:
— Моторы:
Порт 4 и 5 используются для управления одним мотором, а 6 и 7 другим;
Скоростью вращения двигателей мы регулируя ШИМом на портах 5 и 6;
Вперед или назад, подавая сигналы на порты 4 и 7.
— Датчики:
У нас все цифровые, поэтому дают логические сигналы в виде 1 либо 0;
А что бы их отрегулировать, в них предусмотрены специальные регуляторы а при помощи подходящей отвертки их можно откалибровать.

Подробности можно узнать на Амперке. Почему тут? Потому что там очень много информации по работе с Arduino.

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

И программа конвертированная в Arduino IDE:

В заключении хочу сказать, эта программа просто находка для образования, даже для самообучения она поможет изучить команды Arduino IDE. Самая главная изюминка — это то, что более 50 значков установки, она начинает «глючить». Да, действительно, это изюминка, так как постоянное программирование только на ArduBlok не обучит вас программированию в Arduino IDE. Так называемый «глюк» дает возможность задумываться и стараться запоминать команды для точной отладки программ.

Источники:

http://www.drive2.ru/b/2891581/

http://robototehnika.ru/content/article/model-robota-sleduyushchego-po-linii/

http://wiki.amperka.ru/%D1%80%D0%BE%D0%B1%D0%BE%D1%82%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0:%D1%80%D0%BE%D0%B1%D0%BE%D1%82-%D1%81-%D0%B4%D0%B0%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC%D0%B8-%D0%BB%D0%B8%D0%BD%D0%B8%D0%B8-%D0%BD%D0%B0-arduino

http://lesson.iarduino.ru/page/urok-33-obuchaem-arduino-robota-ezdit-po-linii

Движущийся вдоль линии робот на Arduino

http://habr.com/ru/post/240441/

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector