шаблоны сайт визитка joomla
Скачать шаблоны Joomla 3.5 бесплатно
Вы находитесь здесь:Главная»Учебные материалы»Движение по линии»Алгоритм движения для одного датчика

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

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

Какие особенности можно учесть при движении робота, и на какие условия опираться при написании программы? Нам необходимо, чтобы робот, имея один датчик двигался по черной линии. Это можно осуществить, если постоянно будет вестись проверка цвета поля, по которому происходит движение. Таким образом, необходимо придумать такой алгоритм, чтобы робот постоянно "проверял" состояние поля, по которому движется и предпринимал действия, опираясь на показания датчика.

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

liniya2

Видно, что характер самого движения состоит в перемещении поочередно из области одного цвета в другой. Движение должно быть все время вперед, только меняется направление поворота. Итак, программа должна состоять из следующих действий:
1. Начать поворот налево.
2. Ехать до тех пор, пока значение на сенсор (датчик) не уловит белый цвет
3. Остановиться.
4. Начать поворот направо.
5. Ехать до тех пор, пока значение на датчик не уловит черный
6. Остановиться.
7. Повторить действия, начиная с шага 1.

Так как точные размеры поля нам не известны, невозможно определит, сколько шагов "елочкой" роботу нужно сделать, поэтому количество повторов цикла не ограничивается.
Если кто-то уже попытался применить программы, описанные здесь, к реальному роботу на реальной карте, то тот заметил, что робот останавливается не на середине белой и черной области, а недалеко (почти) границе, где одна область переходит в другую. Поэтому повороты робота длятся крайне маленький промежуток времени и складывается впечатление, что робот не ездит с черной области на белую, а движется по их границе. Все верно! Это поведение умышленно не изменялось, чтобы программа с минимальными изменениями стала работать на следующей карте:

liniya3

По своей сути ни характер движения, ни его направление не поменялись по сравнению с предыдущей задачей. Робот все также двигается вперед попеременно с черной на белую область, выполняя развороты то вправо, то влево. Единственное, в чем произошло отличие, так это в том, что черная область теперь не большой прямоугольник, а узкая полоска (линия) черного цвета. А поскольку робот будет двигаться вдоль кромки этой линии, то со стороны будет казаться, что он движется вдоль линии. 
Внимание! На крутых поворотах робот будет вылетать с линии, поэтому следует делать "шашки" как можно меньше. 

Как увеличить скорость?

 В данный момент траекторя движения робота представляет собой своеобразный зигзаг. Чтобы увеличить скорость, необходимо сделать его углы менее острыми. Как это осуществить? Один из секретов состоит в "мягком торможении": при повороте не выключать мотор у второго колеса полностью, а просто делать его мощность (скорость) очень маленькой. Тогда робот будет ехать гораздо ровнее и будет выигрывать в скорости по сравнению с предыдущим варинатом.

Программный код, который мы использовали:

#include <AFMotor.h>
AF_DCMotor MotorL(3);
AF_DCMotor MotorR(2);
int v=150;
int t=50; // переменная отвечающая за уменьшение скорости

const int line = 14;

void setup() {
Serial.begin(9600);
MotorL.run(RELEASE);
MotorR.run(RELEASE);
pinMode(line,INPUT);
delay(3000);
MotorL.run(FORWARD);
MotorR.run(FORWARD);
}

void turn (int v1, int v2){
MotorL.setSpeed(v1);
MotorR.setSpeed(v2);
}

void loop() {
int Sensor=digitalRead(line);
turn(Sensor*v+t, abs(Sensor-1)*v+t);
}

Программный код, который для начинающих:

#include <AFMotor.h>
AF_DCMotor MotorL(3);
AF_DCMotor MotorR(2); 
int v=150;
int t=50; // переменная отвечающая за уменьшение скорости

const int line = 14;

void setup() {
Serial.begin(9600);
MotorL.run(RELEASE);
MotorR.run(RELEASE);
pinMode(line,INPUT);
delay(3000);
MotorL.run(FORWARD);
MotorR.run(FORWARD);
}

void turn (int v1, int v2){
MotorL.setSpeed(v1);
MotorR.setSpeed(v2);
}

void loop() {
int Sensor=digitalRead(line);

if (Sensor==1){

    turn(v+t,t);

} else{

     turn(t,v+t);
}
}

Похожие материалы (по тегу)

Другие материалы в этой категории: Движение по линии с двумя датчиками »

Новости о нас

Расписание занятий для каждой сформированной группы по робототехнике на 2017-2018 учебный год. Подробнее
Учебный год начался, и у нас очередная радостная новость для вас, педагоги! В этом году... Подробнее
Наши учащиеся выступили на августовской конференции педагогов! Подробнее
Хочешь учиться в Толтеке по выгодной цене? Приводи друзей и получай большие скидки!... Подробнее
19 августа в ТРЦ Сити Молл с блеском прошел РобоКвест! Героями квеста стали более сотни... Подробнее

Наши партнеры

 TZOyoOCZ8y0 logotip novy SF BashGU  utv logo  CityMoll  VolnoeDelo