Самодельный робот следующий по линии


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

Примечание: для выполнения этого проекта, использовалась платформа EasyEDA (проект PICTO92 Line follower), поэтому проект легко повторить заказав изготовление платы.

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

При этом, любой робот обладает такими важными чертами, как: датчики, акутаторы, энергия, интеллект.

Шаг 1: Что такое робот следующий по линии?

Самодельный робот следующий по линии
Робот называется следующий по линии (line follower), потому, что он выполняет задачу следования по чёрной дорожке (которую вы для него нарисуете).
Чтобы робот двигался, потребуются два двигателя постоянного тока, и, разумеется, некоторые датчики, такие как ИК-приёмопередатчик, который обнаруживает линию и позволяет следовать за ней.
В качестве контроллера, можно использовать Arduino Nano, но можно использовать и другие контроллеры, чтобы иметь возможность управлять колёсами, в зависимости от сигналов датчиков.
Для управления двигателями, потребуется драйвер двигателей — микросхема L293, которая позволяет контролировать направление и скорость вращения двигателей постоянного тока.
Например, если вы захотите, чтобы робот повернул налево, вы должны замедлить работу левого двигателя и ускорить работу правого двигателя. Если сделать наоборот, то робот повернёт направо, а если поддерживать одинаковую скорость вращение двигателей, то робот будет ехать прямо.

Самодельный робот следующий по линии
Но как найти чёрную линию?
Чтобы робот мог следовать по линии, используются ИК-датчики.
Чёрная поверхность линии сильнее поглощает свет, а окружающая белая поверхность, наоборот, его отражает.
Установка пары датчиков на передней стороне робота, позволит удерживать чёрную линию в промежутке между ними. Сравнивая показания датчиков, можно определить, что они не получают отраженный свет, компаратор датчика выставляет логическую 1 на ножке микроконтроллера, а микроконтроллер, в свою очередь, включает двигатель, связанный с этим датчиком.
И наоборот, когда какой-либо из датчиков окажется над черной линией, то микроконтроллер останавливает двигатель, связанный с этим датчиком, и тем самым поворачивает робота в направлении чёрной линии.

Когда робот достигает конечной точки (финиша), то оба датчика определяют чёрную поверхность, что приводит к остановке робота.

Самодельный робот следующий по линии
Шаг 2. Дизайн механизма

Робот должен иметь какую-нибудь механическую структуру (хотя бы для удержания электронных деталей из которых он сделан), поэтому был разработан дизайн механики робота. Для этого, автор использовал программное обеспечение SolidWorks, чтобы сделать верхнюю и нижнюю базовые пластины для робота.
Для повторения, доступны dxf-файлы, по которым на ЧПУ-станке для лазерной резки можно изготовить свою версию механики.

Шаг 3: Дизайн печатной платы с использованием платформы EasyEDA

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

Онлайн-программа EasyEDA, поддерживается на всех платформах (включая Android) с её помощью можно редактировать свои электрические схемы, есть симулятор схем, онлайн-трассировщик и редактор топологии, с возможностью импорта файлов схемы и топологии.
Мы можем создать свою схему, как в онлайн-редакторе, так и нарисовать её в какой-либо другой программе, а потом загрузить gerber-файлы в easyEDA, чтобы сразу же заказать изготовление.

Самодельный робот следующий по линии
Как изготовить печатную плату с помощью EasyEDA
Сначала, нужно запустить платформу EasyEDA, затем запустить новый проект и импортировать необходимые компоненты, такие как Arduino Nano, драйвер двигателя L293, пины и т.д.
Теперь, нужно соединить их вместе, чтобы получилась схема, как на картинке, после чего просто нажать на Конвертировать проект в PCB. Вы получите область дизайна печатной платы.
Нажмите на следующую ссылку, чтобы получить уже готовые схемы: PICTO92 Line follower

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

Закончив дизайн, остаётся перейти к выпуску продукции, где можно задать параметры изготовления плат, например, чёрный цвет маски. Осталось оплатить изготовление и дождаться доставки.

Самодельный робот следующий по линии
Через несколько дней, можно получить готовые печатные платы, которые с чёрной маской и своей круглой формой действительно смотрятся потрясающе. Можно видеть, выполненное название робота PICTO92 и другую полезную информацию. EasyEDA действительно впечатляет высоким качеством изготовления.

Шаг 4: Просмотр компонентов

Самодельный робот следующий по линии
Для создания этого проекта вам понадобятся следующие компоненты:

Пластины робота из оргстекла
Плата от EasyEDA
Два двигателя постоянного тока с двумя колесами
Контроллер Arduino Nano
Четыре инфракрасных датчика (TCRT5000)
Драйвер двигателя L293
Четыре светодиода 3 мм
Четыре резистора 330 Ом
Пины для подключения Arduino
9В батарейка для питания

Шаг 5: Сборка
Самодельный робот следующий по линии
Всё, что вам нужно — это только припаять компоненты к печатной плате, чтобы собрать схему, как показано на рисунке. На печатной плате нарисованы подсказки для руководства при пайке компонентов.

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

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

Шаг 6: Проверка кода и тестирование
Самодельный робот следующий по линии
После сборки робота, остаётся только написать и прошить его программой, которая будет управлять роботом, чтобы он следовал по линии.
Такой код уже написан. Он хорошо прокомментирован и снабжен инструкциями, позволяющими вам адаптировать его для удовлетворения ваших потребностей, поэтому вы можете изменить его в зависимости от структуры и технологии робота.
Скачать исходный код: PICTO92.zip.

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

Автор проекта DIY Line Follower Robot — Mohamed Belkhir

Принципиальная схема робота
Самодельный робот следующий по линии

Прошивка робота для следования по линии

/************************************************************************************************************************************************************************                                              
 * - Author           : BELKHIR Mohamed (BEE MB)     *                                               
 * - Profession       : (Developer) MEGA DAS owner   *                                                                                              
 * - Main purpose     : Robotic Application          *                                                                                  
 * - Copyright holder : No copyrights                *                                  
 * - Date             : 25/02/2017                   *
 * ***********************************************************************************************************************************************************************
                                           -----------------------------------------------------------------------
                                               P I C T O   9 2   T H E   L I N E   F O L L O W E R   R O B O T
                                           -----------------------------------------------------------------------
This project is established by MEGA DAS in order to perform some Robotic skills. PICTO92 is a mobile robot which has the capability to move around in its environment
folloa visual line painted or embedded in the floor or ceiling or an electrical wire in the floor. Most of these robots operated a simple "keep the line in 
the center sensor" algorithm, this means the robot is capable of navigating an uncontrolled environment without the need for physical or electro-mechanical guidance 
devices. In our robot we used 4 IR Transmitter and Receiver sensors (TCRT5000) in order to detect the line to follow, and we used a motor driver (l293D) to control 
two 9V DC motors placed in both sides of our device. The robot can detect objects and avoid it through a small servo motor and an Ultrasonic sensor. 
Th following connecting indicates the wiring technique to properly use the sensors and actuators.

                                                          ░░░░░░░░░░░░▄▄░░░░░░░░░
                                                          ░░░░░░░░░░░█░░█░░░░░░░░
                                                          ░░░░░░░░░░░█░░█░░░░░░░░
                                                          ░░░░░░░░░░█░░░█░░░░░░░░
                                                          ░░░░░░░░░█░░░░█░░░░░░░░
                                                          ███████▄▄█░░░░░██████▄░
                                                          ▓▓▓▓▓▓█░░░░░░░░░░░░░░█░
                                                          ▓▓▓▓▓▓█░░░░░░░░░░░░░░█░
                                                          ▓▓▓▓▓▓█░░░░░░░░░░░░░░█░
                                                          ▓▓▓▓▓▓█░░░░░░░░░░░░░░█░
                                                          ▓▓▓▓▓▓█░░░░░░░░░░░░░░█░
                                                          ▓▓▓▓▓▓█████░░░░░░░░░█░░
                                                          ██████▀░░░░▀▀██████▀░░░ 


 /*I/O CONNECT:
 * MotorDriverIN1 to digital pin 7
 * MotorDrive to digital pin 6
 * MotorEN1 to digital pin 5
 * MotorEN2 to digital pin 3
 * MotorDriverIN3 to digital pin 4
 * MotorDriveIN4 to digital pin 2
 * SensorLeft to digital pin 8
 * SensorRight to digital pin 9
 * UltrasonicEco to digital pin 12
 * UltrasonicTrig to digital pin 10
 * ServoMotor to digital pin 11
 */
//------------------------------------------------------------------------- INCLUDES -----------------------------------------------------------------------------------

#include<Servo.h>                      //Use this library to control the servo motor

//------------------------------------------------------------------------- INSTANCES -----------------------------------------------------------------------------------

Servo myServo;
 
#define MotorDriverIN1 7    //  | This pin is used to control the direction of the first Motor
#define MotorDriverIN2 6    //  | This pin is used to control the direction of the first Motor
#define MotorEN1 5          //  | This pin is used to Enable or disable the rotation of the first Motor
#define MotorEN2 3          //  | This pin is used to Enable or disable the rotation of the second Motor
#define MotorDriverIN3 4    //  | This pin is used to control the direction of the second Motor
#define MotorDriverIN4 2    //  | This pin is used to control the direction of the second Motor
#define SensorLeft1 18      //  | This pin is used to Read the digital signal from the first Left IR sensor
#define SensorLeft2 8       //  | This pin is used to Read the digital signal from the second Left IR sensor
#define SensorRight1 17     //  | This pin is used to Read the digital signal from the first Right IR sensor
#define SensorRight2 9      //  | This pin is used to Read the digital signal from the second Right IR sensor
#define UltrasonicEco 12    //  | We provided this connector if you want to make and obstacle detector robot
#define UltrasonicTrig 10   //  | We provided this connector if you want to make and obstacle detector robot
#define ServoMotor 11       //  | We provided this connector if you want to make and obstacle detector robot
#define LedPower 13         //  | This pin is used to control the LED power
#define LedObstacle 14      //  | This pin is used to control the LED for Obstacle detection
#define LedRightMotor 15    //  | This pin is used to control the LED that indicates the Right motor rotation
#define LedLeftMotor 16     //  | This pin is used to control the LED that indicates the Left motor rotation

//------------------------------------------------------------------ STARTING THE SETUP FUNCTION -----------------------------------------------------------------------
void setup() 
{
                                      //************************************* I/O pins configuration **************************************************
  pinMode(MotorDriverIN1,OUTPUT);
  pinMode(MotorDriverIN2,OUTPUT);
  pinMode(MotorEN1,OUTPUT);
  pinMode(MotorEN2,OUTPUT);
  pinMode(MotorDriverIN3,OUTPUT);
  pinMode(MotorDriverIN4,OUTPUT);
  pinMode(ServoMotor,OUTPUT);

  pinMode(SensorLeft1,INPUT);
  pinMode(SensorLeft2,INPUT);
  pinMode(SensorRight1,INPUT);
  pinMode(SensorRight2,INPUT);
  pinMode(UltrasonicEco,INPUT);
  pinMode(UltrasonicTrig,OUTPUT);

  pinMode(LedPower,OUTPUT);
  pinMode(LedRightMotor,OUTPUT);
  pinMode(LedLeftMotor,OUTPUT);
  pinMode(LedObstacle,OUTPUT);

  myServo.attach(11);
                                    //**************************** Output pins initial value pins configuration ***************************************
  digitalWrite(MotorEN1,LOW);
  digitalWrite(MotorEN2,LOW);
  digitalWrite(MotorDriverIN1,HIGH);
  digitalWrite(MotorDriverIN2,LOW);
  digitalWrite(MotorDriverIN3,HIGH);
  digitalWrite(MotorDriverIN4,LOW);
  
  digitalWrite(LedPower,HIGH);
  digitalWrite(LedRightMotor,LOW);
  digitalWrite(LedLeftMotor,LOW);
  digitalWrite(LedObstacle,LOW);
  
  myServo.write(90);
}
//------------------------------------------------------------------- ENDING THE SETUP FUNCTION -----------------------------------------------------------------------

//------------------------------------------------------------------- STARTING THE LOOP FUNCTION ----------------------------------------------------------------------

void loop()
{
  if((digitalRead(SensorLeft1)==LOW && digitalRead(SensorLeft1)==LOW) && (digitalRead(SensorRight1)==HIGH || digitalRead(SensorRight2)==HIGH))
  {
    motorDrive("leftMotor","forward","fast");
    motorDrive("rightMotor","stop","slow");
  }
  if((digitalRead(SensorRight1)==LOW && digitalRead(SensorRight1)==LOW) && (digitalRead(SensorLeft1)==HIGH || digitalRead(SensorLeft1)==HIGH))
  {
    motorDrive("rightMotor","forward","fast");
    motorDrive("leftMotor","stop","slow");
  }
  if(digitalRead(SensorRight1)==LOW && digitalRead(SensorLeft1)==LOW && digitalRead(SensorRight2)==LOW && digitalRead(SensorLeft2)==LOW)
  {
    motorDrive("rightMotor","stop","fast");
    motorDrive("leftMotor","stop","fast");
  }
  if(digitalRead(SensorRight1)==HIGH && digitalRead(SensorLeft1)==HIGH)
  {
    motorDrive("rightMotor","forward","fast");
    motorDrive("leftMotor","forward","fast");
  }
}

//------------------------------------------------------------------- ENDING THE LOOP FUNCTION ------------------------------------------------------------------------------

//------------------------------------------------------------------- STARTING THE motorDrive FUNCTION ----------------------------------------------------------------------
/* This function will help you to drive your DC motors using L293D H-bridge IC.  
 * The function takes three arguments:
 * - motor: which can be leftMotor or rightMotor
 * - commande: to indicate the movement (you can selecte a forward movement; backward movement or stop)
 * - Speed: to set the motor speed (you can choose fast or slow speed)
 */
void motorDrive(String motor, String commande, String Speed)
{
  int drivePinEn=0;
  int drivePinIN1=0;
  int drivePinIN2=0;
  int LedPin=0;
  int motorSpeed;
  
  if(motor=="leftMotor")
  {
    drivePinEn=MotorEN1;
    drivePinIN1=MotorDriverIN1;
    drivePinIN2=MotorDriverIN2;
    LedPin=LedLeftMotor;
  }
  if(motor=="rightMotor")
  {
    drivePinEn=MotorEN2;
    drivePinIN1=MotorDriverIN3;
    drivePinIN2=MotorDriverIN4;
    LedPin=LedRightMotor;
  }  
  if(Speed=="fast")
  {
    motorSpeed=250;
  }
  else
  {
    motorSpeed=100;
  }
  if(commande=="forward")
  {
    analogWrite(drivePinEn,250);
    digitalWrite(drivePinIN1,HIGH);
    digitalWrite(drivePinIN2,LOW);
    digitalWrite(LedPin,HIGH);
  }
  if(commande=="backward")
  {
    analogWrite(drivePinEn,motorSpeed);
    digitalWrite(drivePinIN1,LOW);
    digitalWrite(drivePinIN2,HIGH);
    digitalWrite(LedPin,HIGH);
  }
  if(commande=="stop")
  {
    digitalWrite(drivePinEn,LOW);
    digitalWrite(LedPin,LOW);
  }
}
//------------------------------------------------------------------- ENDING THE motorDrive FUNCTION ------------------------------------------------------------------------------

Ссылки
DIY Line Follower Robot (оригинал статьи на английском)

По теме
Практическое программирование Arduino/CraftDuino — драйвер двигателей L293D
Простой робот для следования за объектом
Глаз насекомого, как вариант инфракрасного зрения робота
ИК-датчик препятствий для Arduino на базе фототранзистора
Пример использования компьютерного зрения на Raspberry Pi для следования по линии


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение