Главная » Статьи » Мои проекты и мысли

Semi-Autonomous Robot (SAR)

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

Конечно сразу встало очень много вопросов по поводу этого:

1. Как управлять им?
2. От куда и с помощью чего отдавать команды? 
3. Как реализовать автономный режим? 

4. Какие датчики использовать и для чего? 

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

И так, начнем! Для начала нам нужно определиться с платформой для нашего робота. Это может быть танк, машинка, ну или иное устройство на колесах. Я использовал для этого р/у машинку, которая лежала на полке лет 5, и умоляла использовать ее для какого-нибудь проекта.  

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

Для передачи команд на расстоянии был выбран блютуз. Хоть и радиус действия не очень большой (~30-40 м), но все же для моих нужд этого было достаточно. В качестве контроллера был выбран Arduino Uno.

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

И так, в итоге, было заказано:

  • Arduino Uno
  • Готовый модуль L298N
  • Bluetooth-модуль HC-06
  • Ультразвуковой дальномер HC-SR04

Заказывал на ebay. Срок доставки был примерно месяц.

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

Примерив его к машинке, все подходило идеально. 

Потом захотелось сделать фары. Было перепробовано много вариантов реализации

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

После проверки этого варианта фар, было принято решение сделать их более прочными и аккуратными. Для этого в корпусе бампера были проделаны небольшие отверстия. В эти отверстия вставлялась проволока, которая потом составляла скелет будущих фар. 

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

После того как скелет был готов, надо было придать ему толщину. Для этого была использована холодная сварка. 

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

Теперь надо было начинать собирать саму фару. С нижней стороны были проделаны отверстия для ножек светодиодов. Потом были установлены отражатели. И сам светодиод.

Самый тяжелый шаг, это крепление самого "стеклышка". Я вырезал его из пластикого стаканчика. Потом подгонял уже под размер фары. 

Собрав первую фару, вся конструкция стала выглядеть так:

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

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

Устанавливаем модифицированный бампер на машинку и любуемся результатом. 

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

Вид ночью. 

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

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

 

 

В принципе ничего сложного тут нет. И когда собрал, получилось что-то такое:

 

 

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

 

Для управления машинкой, было создано приложение для телефона. Делалось все это в  MIT App Invertor . Учился я по вот этому видео :

Рассказывается все доступно и интересно. Так что сделать такое приложение труда не составит. Принцип работы был такой: когда вы нажимаете "Вперед" на телефоне, то через блютуз на Arduino приходит сигнал "W". В контроллере под этим символом заложена программа двигаться вперед. Так же и для других команд. 

Вот самый первый скетч для Arduino:

#define M1 2 //Двигатель поворота
#define M2 4 //Двигатель поворота
#define D1 6 //Двигатель
#define D2 7 //Двигатель
#define ENM 3 //Скорость для двигателя поворота
#define END 5 //Скорость для двигателя
#define led 8 //Фары
int signal; //Команда с телефона
void setup()
{
 
 Serial.begin(9600);
 pinMode (M1, OUTPUT);
 pinMode (M2, OUTPUT);
 pinMode (D1, OUTPUT);
 pinMode (D2, OUTPUT);
 pinMode (ENM, OUTPUT);
 pinMode (END, OUTPUT);
 pinMode (led, OUTPUT);
 
}
void loop()
{
 if (Serial.available())
 {
 signal = Serial.read();
 
 if (signal == 'W')
{
 Vpered();
} 
 if (signal == 'S')
{
 Nazad();
} 
 if (signal == 'A')
{
 Nalevo();
} 
 if (signal == 'D')
{
 Napravo();
} 
 if (signal == 'H')
{
 digitalWrite(led, HIGH);
} 
if (signal == 'OH')
{
 digitalWrite(led, LOW);
}
if (signal == 'T')
{
 Stop();
}
 if (signal == 'WD')
{
 Vpered();
 Napravo();
} 
 if (signal == 'WA')
{
 Vpered();
 Nalevo();
} 
 if (signal == 'SD')
{
 Nazad();
 Napravo();
} 
 if (signal == 'SA')
{
 Nazad();
 Nalevo();
} 
 }
 
}
void Vpered () // Функция для движения прямо
 {
 digitalWrite (D1, HIGH);
 digitalWrite (D2, LOW); 
 analogWrite(END,10); 
 delay(50);
 analogWrite(END,40); 
 delay(50);
 analogWrite(END,70); 
 delay(50);
 analogWrite(END,100); 
 delay(50); 
 analogWrite(END,130); 
 delay(50);
 analogWrite(END,150); 
 delay(50);
 
 }
 
void Nazad () // Функция для движения назад
 {
 digitalWrite (D1, LOW);
 digitalWrite (D2, HIGH); 
 analogWrite(ENM,10); 
 delay(50);
 analogWrite(ENM,40); 
 delay(50);
 analogWrite(ENM,70); 
 delay(50);
 analogWrite(ENM,100); 
 delay(50); 
 analogWrite(ENM,130); 
 delay(50);
 analogWrite(ENM,150); 
 delay(50);
 
 }
 
void Napravo () // Функция для поворота направо
 {
 digitalWrite (M1, HIGH);
 digitalWrite (M2, LOW); 
 analogWrite(ENM, 255); 
 }
 
void Nalevo () // Функция для поворота налево
 {
 digitalWrite (M1, LOW);
 digitalWrite (M2, HIGH); 
 analogWrite(ENM, 255);
 }
 
void Stop () // Функция для полной остановки
 {
 digitalWrite (D1, LOW);
 digitalWrite (D2, LOW);
 digitalWrite (M1, LOW);
 digitalWrite (M2, LOW); 
 }

Пришло время сделать все аккуратно. Для этого разобрал машинку, и стал пропаивать все провода, и прятать их под корпусом. 

 

 

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

 

 

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

 

 

Аккумулятор был спрятан в отсек для батареек, снизу машинки. 

 

 

Был выведен штекер, для подключения к Arduino. 

 

 

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

 

 

 

После небольшого перерыва, пришло в голову еще несколько идей. И пришлось разобрать снова :)

 

 

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

 

 

Но! Захотелось кое-что добавить. И пришлось разобрать еще раз :) Вот оно, самая важная вещь в машинке - разъем для зарядки аккумулятора (не снимать же его каждый раз для зарядки). Вот что получилось:

 

 

 

 

 

 

 

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

 

 

Захотелось немного прогуляться и взял ее с собой. Я не ожидал что будет все настолько круто. Было записано видео езды машинки под управлением телефона. Но в процессе оно потерялось.. И это очень обидно. Люди, проходящие мимо, были тоже шокированы от происходящего. Многие спрашивали как и что. А фары.. Все были от них без ума.

 

 

И все же, через некоторое время прогулки, немного был огорчен. Заряда аккумулятора хватало на очень маленькое время. Было принято решение, модифицировать дальше :) 

 

 

Машинка была снова разобрана. Были добавлены новые кнопки, новые разъемы, перепаяна все провода. 

 

 

 

 

 

 

 

А главное, был добавлен новый аккумулятор (уже от другого DVD-плеера, более мощный). Этот аккумулятор питал двигатели. Т.е тот, старый аккумулятор, нужен был только для питания платы Aduino и для блютуз-модуля.

 

 

 

 

 

 

 

 

Конечно результат был классным. Время работы выросло на много. Теперь машинка могла ездить без перерыва примерно часа 2-2.5 и стала более мощной. В зависимости еще от фар (были ли они включены или нет).  Радиус действия машинки, доходил примерно до 50 м. Что было более чем достаточно. И как ни странно, задержек в принятии команд не наблюдалось. 

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

 

 

 

 

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

 

 

 

 

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

 

 

 

 

 

 

 

 

Потом решил сделать боковые стенки для нее:

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

А вот и само приложение. Конечный вариант. Начальная скорость машинки была равна 100. И нажав на кнопку "Сбросить скорость" мы бы устанавливали машинку на эту скорость. Можно было и изменять скорость на 150, 200, 250. В зависимости от того, какая скорость сейчас включена, соответствующая кнопка подсвечивалась красным цветом. Тоже самое было и с значком фары. Если фары были включены, то значок загорался красным. Кнопка "Переключить режим" должна была производить переключение режимов с "ручного" в "автоматический" и обратно. Так как, одновременное нажатие кнопок не получалось, то были добавлены кнопки по диагоналям (вперед и влево, вперед и вправо и т.д).

 

Конечный скетч устройства:

#define D1 4 //Двигатель 
#define D2 2 //Двигатель 
#define M1 7 //Двигатель поворота
#define M2 5 //Двигатель поворота
#define END 3 //Скорость для двигателя
#define ENM 6 //Скорость для двигателя поворота
#define led 8 //Фары
int b = 0; //проверка для фар
int cmd; //Команда с телефона
int maxspeed = 100; //максимальная скорость для движения
//=============================================================
void setup()
{
 Serial.begin (9600);
 pinMode (M1, OUTPUT);
 pinMode (M2, OUTPUT);
 pinMode (D1, OUTPUT);
 pinMode (D2, OUTPUT);
 pinMode (ENM, OUTPUT);
 pinMode (END, OUTPUT);
 pinMode (led, OUTPUT);
}
//==============================================================
void loop()
{
 if (Serial.available())
 {
 cmd = Serial.read(); 
 if (cmd == 'U' || cmd == 'I' || cmd == 'O' || cmd == 'P' )
 {
 maxspeed = speedSelection(cmd); 
 } 
 
 if (cmd == 'H')
 {
 lightmode();
 }
 
 motion(cmd,maxspeed);
 } 
 
 
}
//=============================================================
//============================ функции ========================
//=============================================================
//=============================================================
// Функция движения ===========================================
//=============================================================
void motion(char n, int s)
 {
 
 switch (n)
 {
 
 case 'W' :
 {
 digitalWrite (D1, HIGH);
 digitalWrite (D2, LOW); 
 analogWrite(END,70); 
 delay(20);
 analogWrite(END,100); 
 delay(20); 
 analogWrite(END,s); 
 delay(20); 
 break;
 }
 
 case 'S' :
 {
 digitalWrite (D1, LOW);
 digitalWrite (D2, HIGH); 
 
 analogWrite(END,70); 
 delay(20);
 analogWrite(END,100); 
 delay(20); 
 analogWrite(END,s); 
 delay(20); 
 break;
 }
 
 case 'A' :
 {
 digitalWrite (M1, LOW);
 digitalWrite (M2, HIGH); 
 analogWrite(ENM, 255); 
 break;
 }
 
 case 'D' :
 {
 digitalWrite (M1, HIGH);
 digitalWrite (M2, LOW); 
 analogWrite(ENM, 255); 
 break;
 }
 
 case 'WD' :
 {
 digitalWrite (D1, HIGH);
 digitalWrite (D2, LOW); 
 digitalWrite (M1, HIGH);
 digitalWrite (M2, LOW); 
 analogWrite(ENM, 255); 
 analogWrite(END,70); 
 delay(20);
 analogWrite(END,100); 
 delay(20);
 analogWrite(END,s); 
 delay(20); 
 break;
 }
 
 case 'SD' :
 {
 digitalWrite (D1, LOW);
 digitalWrite (D2, HIGH); 
 digitalWrite (M1, HIGH);
 digitalWrite (M2, LOW); 
 analogWrite(ENM, 255); 
 analogWrite(END,70); 
 delay(20);
 analogWrite(END,100); 
 delay(20); 
 analogWrite(END,s); 
 delay(20); 
 break;
 }
 
 case 'WA' :
 {
 digitalWrite (D1, HIGH);
 digitalWrite (D2, LOW); 
 digitalWrite (M1, LOW);
 digitalWrite (M2, HIGH); 
 analogWrite(ENM, 255);
 analogWrite(END,70); 
 delay(20);
 analogWrite(END,100); 
 delay(20); 
 analogWrite(END,s); 
 delay(20); 
 break;
 }
 
 case 'SA' :
 {
 digitalWrite (D1, LOW);
 digitalWrite (D2, HIGH); 
 digitalWrite (M1, LOW);
 digitalWrite (M2, HIGH); 
 analogWrite(ENM, 255); 
 analogWrite(END,70); 
 delay(20);
 analogWrite(END,100); 
 delay(20); 
 analogWrite(END,s); 
 delay(20); 
 break;
 }
 
 case 'T' :
 {
 digitalWrite (D1, LOW);
 digitalWrite (D2, LOW);
 digitalWrite (M1, LOW);
 digitalWrite (M2, LOW); 
 break;
 } 
 
 }
 }
//============================================================
// Функция выбора скорости ===================================
//============================================================
int speedSelection(char s)
 {
 
 switch (s)
 {
 
 case 'U' :
 {
 return 100;
 break;
 }
 
 case 'I' :
 {
 return 150; 
 break;
 }
 
 case 'O' :
 {
 return 200; 
 break;
 }
 
 case 'P' :
 {
 return 255; 
 break;
 } 
 
 }
 }
//=============================================================
// Функция для включения и отключения фар =====================
//=============================================================
void lightmode()
 {
 if (b == 0)
 {
 digitalWrite(led, HIGH);
 b++;
 }
 else
 {
 digitalWrite(led, LOW);
 b=0;
 } 
 }

При разработке программного обеспечения для SAR, возникли трудности. Точнее трудности были связаны не с ПО, а с устройством самой машинки. Она была не поворотлива, тяжелая (даже без корпуса), Поворот был очень тяжелый, т.к передние колеса поворачивали только на скорости. Поворот на месте не мог быть осуществим, а из-за этого для объезда препятствий требовалось очень много места. Что не всегда могло быть. Все эти факторы, как не печально, повлияли на закрытие проекта. Все файлы конечного варианта я выложу в общий доступ. Теперь в планах найти платформу танка, у него шасси очень хорошо позволяет осуществлять поворот, разные виды маневрирования и хорошую проходимость. До скорого!

Конечные файлы SAR:

Скачать приложение

Скачать скетч

 

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

 

Если Вам понравилась наша статья, поделитесь ею с друзьями.

 

 

Категория: Мои проекты и мысли | Добавил: GM (06.10.2015)
Просмотров: 1371 | Теги: статьи, SAR, Arduino | Рейтинг: 5.0/4
Всего комментариев: 0
avatar