Что может быть скучнее и монотоннее, чем работа на складе? Одну коробку нужно перетащить туда, другую — сюда, паллету поставить на полку, а вот тот контейнер притащить на выдачу заказчику. И главное не ошибиться! А можно ли автоматизировать эту рутинную, но в тоже время сложную и ответственную работу? В этом нам помогут роботы, которые уже сегодня часто заменяют людей на складах. Существуют их различные виды, и даже целые системы решения автоматизации складов, состоящие из промышленных манипуляторов, мобильных роботизированных тележек, паллетайзеров и другой подобной техники.
Робот-тележка, например, автономно перемещает грузы по территории склада или доставляет необходимые детали между различными участками цеха. Для этого большинству из них требуется разметка на полу или наличие специальных меток (беспроводных или отражательных) на стенах и полках. Кстати, именно такие роботы на складах компании Amazon заменили около 20 000 рабочих. Используемые там роботележки Kiva перемещают грузы по складу, ориентируясь по меткам на полу. После их внедрения акции компании выросли на 57%, продажи через сайт — на 32%, а прибыль увеличилась почти в пять раз! А все потому, что робот за 15 минут выполняет больше задач по сортировке, сбору, упаковке и отгрузке товаров, чем человек-сотрудник за час. Роботы могут работать в прохладных помещениях, поэтому можно экономить на отоплении. Также они занимают меньше места, что позволяет за счет уменьшения расстояний между стеллажами разместить на них больше товаров.
Манипуляторы будут темой следующего занятия нашей школы, а на этом уроке соберем и запрограммируем робота-тележку, то есть сделаем устройство, которое будет самостоятельно перемещаться по криволинейной трассе и останавливаться в случае возникновения опасности столкновения с препятствием. Для этого потребуется следующие элементы: плата Arduino Uno, Motor Shield, Troyka Shield, УЗ-дальномер НС — SR04, цифровой датчик линии (2 шт.), каркас, электродвигатели с диаметром корпуса 12 мм (2 шт.), колеса (2 шт.), балансировочный шар, П-образные крепления моторов (2 шт.), соединительные провода, болты и гайки, колодка питания и батарейка «Крона» (9 В).
![Компоненты для сборки простой робото-тележки](https://modelist-konstruktor.com/wp-content/uploads/2019/12/2-54.jpg)
Электронные компоненты несложно приобрести в различных магазинах электроники или заказать на интернет-сайтах, а каркас тележки выпилить из тонкой фанеры или прессованного картона. В нашем случае была использована пластина оргстекла толщиной 2 мм. Отсканировав приведенный здесь QR-код, можно воспользоваться 3D-моделью этой детали (файл с расширением .stl).
Сборка тележки элементарна — ее последовательность показана на фотографиях, и вряд ли вызовет какие-либо сложности. Последовательно крепим к каркасу колеса с моторами, балансировочный шар, платы Arduino и расширений, батарею питания и соединяем все элементы проводами. Но чтобы робот «ожил», необходимо разобраться в компонентах и запрограммировать его.
![Крепление колес к моторам](https://modelist-konstruktor.com/wp-content/uploads/2019/12/3_1-2.jpg)
Итак, для того, чтобы управлять двигателями, мы используем плату Motor Shield. Пины Arduino — слаботочные, поэтому ток мотора при подключении его напрямую выведет их из строя. Эту проблему решает так называемый Н-мост, который может управлять скоростью и направлением вращения мотора с помощью логических сигналов микроконтроллера. Motor Shield — это плата расширения для платформы Arduino, позволяющая управлять моторами с напряжением от 5 до 24 В в режиме раздельного питания и от 7 до 12 В в режиме объединенного питания. Выходы под каждый из двигателей выполнены в виде клеммников с винтами, так что пайка тут не требуется.
![Установка платы Arduino](https://modelist-konstruktor.com/wp-content/uploads/2019/12/4-33.jpg)
![Установка платы расширения Motor Shield поверх Arduino и подключение двигателей к терминалам](https://modelist-konstruktor.com/wp-content/uploads/2019/12/5-29.jpg)
![Установка платы расширения Troyka Shield на плату Motor Shield и подключение датчиков линий: G к G, V к V, S к S II и 12 пинам](https://modelist-konstruktor.com/wp-content/uploads/2019/12/6-23.jpg)
![Подключение батареи питания](https://modelist-konstruktor.com/wp-content/uploads/2019/12/7-17.jpg)
При разгоне и торможении двигатели сами индуцируют кратковременный обратный ток большой величины, который может выжечь контакты микроконтроллера, поэтому на Motor Shield установлены возвратные диоды, которые это предотвращают.
Для коммуникации с микроконтроллером используются цифровые пины Arduino: 4 — направление, правый; 5 — скорость (ШИМ), правый; 6 — скорость (ШИМ), левый; 7 — направление, левый.
Плата расширения Troyka Shield используется для подключения датчиков периферии (различных сенсоров, например) через стандартные трехпроводные шлейфы. Это позволяет не прибегать к пайке. На плате установлены тройки контактов «S-V-G». Они соединены с линиями управляющей платы следующим образом: сигнал (S) — с соответствующим цифровым или аналоговым пином; питание (V) — с рабочим напряжением; земля (G) — с землей.
Цифровой датчик линии — это устройство, отличающее темную поверхность от светлой. В его основе находится оптопара, то есть собранные в одном корпусе светодиод и фототранзистор. Светодиод выдает излучение в инфракрасном диапазоне на длине волны 950 нм, которое отражается от поверхности и попадает на фототранзистор. Темная поверхность поглощает излучение, а светлая отражает его. Соответственно, при низком напряжении на фототранзисторе — на выходе датчика единица, при высоком напряжении — ноль. Датчик подключен к пинам 5v и GND на плате Arduino, а также к 11 и 12 пинам на плате Troyka Shield.
![Плата расширения Motor Shield](https://modelist-konstruktor.com/wp-content/uploads/2019/12/8-11.jpg)
![Плата расширения Troyka Shield](https://modelist-konstruktor.com/wp-content/uploads/2019/12/9-6.jpg)
![Цифровой датчик линии](https://modelist-konstruktor.com/wp-content/uploads/2019/12/10-4.jpg)
![Вариант трассы движения робота-тележки](https://modelist-konstruktor.com/wp-content/uploads/2019/12/10_1.jpg)
Теперь необходимо определить алгоритм движения нашего робота. Он будет перемещаться по белому полу, ориентируясь по черной линии. Когда оба датчика видят белую поверхность, то тележка должна ехать вперед. Если левый датчик оказывается над черной линией, то устройство должно повернуть налево. Если же правый наткнется на черную линию, то направо. Таким образом, робот поворачивает.
Приведем программный код с описанием:
//пины отвечающие за:
int sl=6; // speed left — скорость левого колеса
int sr=5; // speed right — скорость правого колеса
int dl=7; // dir left — направление левого колеса
int dr=4; // dir right — направление правого колеса
int ls= 11; //left sensor — левый датчик линии
int rs=12; //right sensor — правый датчик линии
int s=70;
/*
speed — скорость, с который будет перемещаться платформа.
Указывается значение диапазона ШИМ 0-255
Чем выше значение, тем выше скорость
Экспериментальным путем выбрано значение 70
*/
int k=4; // Коэффициент торможения колеса при повороте
void goForward(){
analogWrite(sl, s); // задаем скорость левому двигателю
analogWrite(sr, s); // задаем скорость правому двигателю
digitalWrite(dl, HIGH); // задаем направление вращения левому двигателю
digitalWrite(dr, LOW); // задаем направление вращения правому двигателю
/*
HIGH — направление по часовой стрелке, при правильном подключении двигателя к шилду.
LOW — направление против часовой стрелке, при правильном подключении двигателя к шилду.
Если колесо вращается в неправильную сторону, то следуют поменять значение HIGH/LOW или переустановить двигатель, поменяв полярность.
*/
}
void goRight() {
analogWrite(sr, s/k); 11 замедляем колесо на повороте
analogWrite(sl, s);
digitalWrite(dl, HIGH);
digitalWrite(dr, LOW);
}
void goLeft(){
analogWrite(sl, s / k);
analogWrite(sr, s);
digitalWrite(dl, HIGH);
digitalWrite(dr, LOW);
}
void setup() {
for(int i = 4; i <= 7; i++){
pinMode(i, OUTPUT); // настраиваем пины для двигателей
}
goForward(); // Робот сразу едет вперед
}
void loopO {
boolean left = !digitalRead(ls); // считываем левый датчик
boolean right = !digitalRead(rs); // считываем правый датчик
/*
Новый тип данных — boolean.
Хранит в себе всего лишь 2 значения:
0 и 1.
Над переменными этого типа можно производить те же операции, что и над переменными типа int.
Новый символ — «!»
Это логический оператор «Отрицание». Используется для того, чтобы инвертировать значение аргумента.
То есть, если ему передали истину, то он вернет ложь, если получил ложь, то вернет истину.
Ложью считается целочисленный 0, а любое ненулевое целое будет логической истиной.
Так как датчик линии возвращает 1 от черной поверхности, то надо инвертировать значения, для удобного восприятия.
*/
if (left = right) {
goForward();
// случай, когда под роботом полностью белый или черный пол.
}
else{ if (left) {
goRight();
// случай, когда под левым датчиком черная линия.
}
else{
goLeft();
// случай, когда под правым датчиком черная линия.
}
}
delay(50);
// задержка для устранения виляния робота.
}
Осталось загрузить программу в плату и запустить робота по маршруту, который можно нарисовать на листе ватмана, распечатать на принтере или приклеить к полу из скотча. Организовать, например, доставку чашечки кофе из кухни в комнату. Тележка будет самостоятельно принимать решения, где повернуть, тем не менее, будет лучше обезопасить ее (да и свой кофе тоже!) от случайного столкновения с препятствием — вдруг кошка заинтересуется новым «жильцом»!
![Подключение УЗ-датчика: GND к G, VCC к V, Echo к 2, Trig к 3 пинам](https://modelist-konstruktor.com/wp-content/uploads/2019/12/11-3.jpg)
Как роботу определить, что перед ним появился предмет? С помощью ультразвукового дальномера, конечно. На прошлом уроке мы уже мы об этом рассказывали. Итак, очередное домашнее задание: нужно модернизировать робота, добавив в его конструкцию УЗ-датчик и изменив программный код. В качестве подсказки, поможем с алгоритмом: 1 — тележка считывает показания со своих датчиков линии и дальномера; 2 — тележка проверяет показания с УЗ-датчика, и если расстояние до предмета слишком короткое, то робот останавливается, а если расстояние приемлемое, то робот движется по линии.
Азизжон УЛЬМАСОВ