Мы с Вами разобрались, как суморобот сможет найти соперника в бою. Но это только часть «зрения», необходимая для победы. Вторая часть «зрения» должна быть направлена «под ноги» суморобота – по правилам поединка робот, выехавший или вытолкнутый за пределы ринга – проиграл. Как вы заметили ранее – в материалах урока №4, ринг черный, а по краю ринга проходит белая полоса. Таким ринг сделан именно для того, чтобы суморобот смог различить край (границу между черным рингом и белой полосой по краю) боевого поля и совершить действия, препятствующие выходу за эту границу.
Для различения такой границы нам необходим специализированный датчик. Существует достаточно большое количество производителей таких датчиков - для поиска их в интернете надо ввести «датчик линии», «датчик уровня серого», «датчик цвета». Мы остановимся на наиболее распространенных, компактных и недорогих, представленных на сайте www.pololu.com (или на сайтах www.amperka.ru, www.electronshik.ru)
Как видите, датчики представлены в различных исполнениях – по 8, 3 и по 1 сенсору. 8 и 3 сенсора на одной плате обычно исппользуются для проектов роботов, следующих по линии. Для проектов сумороботов наиболее удобны датчики QTR-1A и QTR-1RC
QTR-1A возвращает аналоговый сигнал, QTR-1RC – цифровой.
Сколько таких датчиков нам необходимо для суморобота и как их располагать? Оптимально расположить датчики макимально близко к краю по углам робота ПЕРЕД колесами для того, чтобы он мог распознать край и вовремя отъехать от него и колесо не висело в воздухе, за границей ринга – это снижает устойчивость робота и повышает шансы проигрыша.
Сколько таких датчиков? Минимально один спереди по центру. В этом случае движение робота по рингу должно происходить только передним ходом – чтобы различить границу и не вылететь с ринга. Оптимально – 4 сенсора по краям робота или 3 (два сенсора спереди по краям и один сзади по центру) – такой робот будет иметь больше возможностей в тактическом превосходстве – сможет перемещаться в любые стороны.
В нашем роботе с двумя колесами мы будем использовать два датчика QTR-1A черного/белого, раположенные спереди.
Для примера приведены примеры компоновки датчиков — изображения снизу реальных роботов:
Робот с четырьмя датчиками QTR-1A
по углам робота.
Робот с двумя датчиками QTR-1A спереди (робот гусеничный и имеет хорошую центровку массы, тактика движения по рингу только вперед).
Как прочитать данные с датчиков линии?
Как всегда обратимся к документации по ввыбранным датчикам QTR-1A:
Итак, отметим, что датчик питается от напряжения 5V и потребляет примерно 17mA и возвращает аналоговое значение напряжения в зависимости от цвета поверхности. Его надо располагать оптимально на расстоянии 3мм от поверхности и не более 6мм от ринга.
Для этого датчика также написана специальная библиотека, которую можно использовать в Arduino проектах.
Подключим контакты OUT наших датчиков QTR-1A с аналоговыми контактами A6 и A11 (контакты 4 и 12 микропроцессорной платы A-Star 32U4), контакты VIN к напряжению питания 5V, контакты GND к общей шине (земле).
Для чтения данных с датчиков будем использовать обычную функцию чтения аналогового сигнала analogRead(pin) как в предыдущем уроке. Помним, что эта функция возвращает значения от 0 до 1023.
Скетч будет максимально похож на программу предыдущего урока – ведь это практически такое-же «зрение» — просто направленное вниз. J
Итак:
//объявляем переменные, содержащие значения //аналоговых портов, подключенных к датчикам //QTR-1A
int left_bw = A6;
int right_bw = A11;
void setup(){
//инициализируем терминальный вывод
Serial.begin(9600);
}
void loop(){
//выводим данные о значениях датчиков в окно //терминала в одну строку
Serial.print(“left side color = ”);
Serial.print(analogRead(left_bw));
Serial.print(“ right side color = ”);
Serial.println(analogRead(right_bw));
//немного задерживаем вывод данных, чтобы было //удобнее смотреть
delay(500);
}
Предполагаю, что в данном скетче Вам уже все понятно и объяснения будут лишними.
Загрузим скетч в микропроцессорную плату и также запустим монитор порта для представления данных. Теперь датчики станем передвигать так, чтобы они попеременно оказывались над белой и черной частями листа.
Экран терминала:
На экране терминала мы видим, что когда датчики попадают на белую поверхность листа значения становятся ближе к нулю и наоборот – при попадании датчиков на черную поверхность листа значения ближе к 1024.
Видео с примером работы скетча
Предлагаю воспользоваться этим свойством датчика QTR-1A и для различения границы ринга свормулировать следующее условие с известным допущением:
«Если возвращаемое значение функции analogRead(pin) меньше значения 400 считаем поле под датчиком QTR-1A условно белым (светлая поверхность), если больше 400, то условно черным (темная поверхность)».
Модернизируем скетч:
//объявляем переменные, содержащие значения //аналоговых портов, подключенных к датчикам //QTR-1A
int left_bw = A6;
int right_bw = A11;
void setup(){
//инициализируем терминальный вывод
Serial.begin(9600);
}
void loop(){
if(analogRead(left_bw) < 400) {
Serial.print(“under left sensor – light surface”);
}
else {
Serial.print(“under left sensor – dark surface ”);
}
if(analogRead(right_bw) < 400) {
Serial.print(“ under right sensor – light surface”);
}
else {
Serial.print(“ under right sensor – dark surface”);
}
Serial.println(“ “);
delay(500);
}
Загрузите скетч в микропроцессорную плату и попробуйте перемещать датчики над темным и светлым полями.
Обратим внимание на новую управляющую конструкцию условия if(условие верно){действия если условие верно}else{действия если условие неверно}.
Вопросы для самопроверки:
- В чем основное отличие ИК – датчиков дистанции от ИК – датчиков линии?
- Подумайте, какое количество датчиков линии оптимально для круглого суморобота (такие также бывают)?*