Проект полноприводной машинки на основе микроконтроллера Arduino Uno, сенсора HC-SR04 и на базе шасси RoboRoverM1.
Комплектующие
Для нашего транспорта понадобится приличное количество деталей. Полный список вы можете найти ниже.
- Драйвер мотора L298N
- Sharp GP2Y0A21YK0F Аналоговый датчик расстояния 10-80 см
- Ультразвуковой датчик - HC-SR04 (универсальный)
- Датчик TCRT5000 (цифровой выход)
- Мотор DAGU DC 1:48 (вы можете использовать 2 или 4 мотора)
- Arduino UNO
- Сенсорный экран V5
- Робот RoboRover M1
Вам не нужно покупать перечисленные выше аппаратные компоненты, если вы будете использовать шасси RoboRover M1. Это шасси имеет все необходимые компоненты:
- 2 инфракрасных датчика расстояния Sharp A21,
- 3 линейных датчика TCRT5000,
- 1 ультразвуковой датчик расстояния HC-SR04.
А драйвером двигателя является L298N с 4 двигателями (2 двигателя с каждой стороны, соединенные параллельно). Робот поворачивается как танк, меняя скорость вращения правого и левого колес.
И, конечно, из программного обеспечения нам нужна Arduino IDE для работы с нашим кодом.
Робота
Шасси
Очень простой проект, который демонстрирует основы сборки машинки/автомобиля Arduino. По этой причине мы используем шасси RoboRoverM1, но вы можете создать свой собственный автомобиль Arduino, используя свои комплектующие, так как важна идея. Для урока мы будем использовать свое собственное роботизированное шасси RoboRover M1, полноприводное шасси из пластика 4 мм.
Робот RoboRover M1 со всей установленной электроникой ниже. Также был сделан большой зеленый корпус для робота, чтобы защитить всю электронику внутри.
В собранном виде это выглядит таким образом.
Электроника
На фото ниже вы можете увидеть все датчики этого роботизированного автомобиля. Думаю, достаточно изучить основы роботизированного автомобильного движения:
- 3 линейных датчика, чтобы следовать за линией и изучить, как следовать за линией. Модель TCRT5000.
- 2 инфракрасных датчика расстояния, чтобы изучить, как измерить расстояние и написать алгоритмы обхода препятствий. Модель GP2Y0A21YK0F.
- 1 ультразвуковой датчик, который установлен на сервоприводе. Серво может вращаться, и вы можете сделать простую карту расстояний впереди робота. Модель ультразвукового датчика - HC-SR04, а модель сервопривода - MG995R.
Моторы
Чтобы заставить робота двигаться, нам нужны моторы, поэтому мы используем 4 желтых мотора DAGU 1:48 (передаточное число) 5V. Если вы делаете свою собственную машинку, вы можете использовать 2 мотора.
Для управления моторами мы используем моторный привод L298N, не самый лучший, потому что он использует много пинов ввода/вывода автомобиля Arduino, но это руководство для начинающих. Позже вы сможете обновить автомобиль с помощью I2C привода.
Питание машинки-робота
Чтобы позволить роботу двигаться, нам нужно использовать батарею. Рекомендуем использовать 7,4 В Li-Po 2S батарею, думаем, что это лучшее решение для такого типа робота. Не используйте батарейки типа АА или ААА, это плохой выбор.
Для Li-Po аккумулятора необходимо использовать специальное зарядное устройство и контроллер напряжения, но это того стоит.
Это зарядная станция, но вы можете найти разные модели. Самым дешевым является USB-зарядное устройство, но оно очень медленное.
Используйте небольшой тестер напряжения во время работы робота. Он покажет вам время, когда нужно начать заряжать аккумулятор. Эта мелочь поможет вам не разряжать батарею, потому что, если батарея Li-Po чрезмерно разряжена, она перестает правильно функционировать.
Подключение драйвера L298N
Припаиваем все двигатели через небольшой конденсатор и устанавливаем их.
Для правого двигателя один провод подключите к OUT3, а второй провод подключите к OUT4. Таким же образом подключите второй правый мотор.
Для левого двигателя один провод соединяется с OUT2, а второй провод соединяется с OUT1. Таким же образом подключите второй левый мотор.
Если вы сделали неправильное соединение, после загрузки программы тестирования, просто поменяйте провода так, как необходимо.
Сделайте такого рода разъем. Используйте двухпозиционный переключатель (для включения и выключения двигателей и сервопривода робота). Я думаю, вы знаете как паять. Красный разъем для батареи, проверьте, какой тип разъема установлен в вашей батарее. Рекомендуем использовать T-штекер.
Схема соединения источника питания.
Т-образный разъем. Слева разъем батареи (мама), справа (папа) разъем робота.
Не соединяйте Т-образные разъемы сейчас. Сделайте это после того, как все соединения завершены, на последнем шаге.
Затем установите всё на свой автомобиль. Если вы используете другое собственное шасси, монтаж шасси может быть другим.
Красный провод подключается к крайнему левому разъему + 12В 3-контактного разъема на драйвере L298N.
Два черных провода подключаются к среднему разъему GND 3-контактного разъема на L298N.
Затем возьмите 6 длинных проводов длиной 30-40 см и подключите их к контактам ENA, IN1, IN2, IN3, IN4, ENB на автомобильном приводе L298N.
Провод № 7 подключите к среднему разъему GND 3-контактного разъема на драйвере L298N (туда же, куда вы подключали предыдущие черные провода).
В конце концов, ваше соединение должно выглядеть так.
Если вы хотите использовать сервопривод в своем автомобиле-роботе, убедитесь, что он совместим с напряжением 7,4 В. Затем вы можете извлечь красный провод из разъема сервомеханизма и подключить провод к крайнему левому разъему + 12 В 3-контактного разъема на приводе L298N (там же, куда вы ранее подключали красный провод).
Сначала проверьте напряжение сервопривода! Если это не совместимо, просто подключите сервопривод к датчику шилда без каких-либо изменений. В моем случае сервопривод MG995R (MG995) совместим с 7,4 В, к сожалению, на фото мы забыли подключить сервопривод.
Подключение сенсорного шилда к Arduino Uno
Драйвер двигателя
Используйте простой сенсорный шилд для Arduino Uno, чтобы подключить все датчики и провода моторного привода. Наша модель - Arduino Sensor Shield V5.
Провод от автомобильного привода, который необходимо подключить к цифровым контактам на шилде:
- ENA на D5
- IN1 на D2
- IN2 на D8
- ENB на D3
- IN3 на D11
- IN4 на D10
Линейные датчики
Линейный датчик является цифровым, но мы можем использовать аналоговые входы Arduino Uno для считывания цифровых сигналов. Мы подключаем вывод GND датчика к выводу GND на экране, вывод VCC датчика к выводу VCC на шилде 5V.
Сигналы линейных датчиков мы подключаем к аналоговым контактам на шилде:
- Линейный датчик (слева) на A3
- Линейный датчик (в центре) на А4
- Линейный датчик (справа) на A5
Инфракрасные датчики
Аналоговые инфракрасные датчики расстояния Sharp мы подключаем аналогичным образом. Обратите внимание, что в этом случае средний провод датчиков Sharp (черный) - это GND, левый провод (красный) - это VCC, а правый провод (желтый) - это выходной сигнал.
Мы подключаем вывод GND датчика к выводу GND на шилде, вывод VCC датчика к выводу VCC на шилде 5V.
Сигналы инфракрасных датчиков мы подключаем к аналоговым контактам шилда:
- Датчик слева на A0
- Датчик справа на А1
Ультразвуковой датчик и сервопривод
Ультразвуковой датчик подключается к следующим контактам:
- подсоедините вывод GND датчика к выводу GND на шилде,
- вывод VCC датчика к выводу VCC на шилде 5V.
Другие контакты мы подключаем к цифровым входам шилда.
- Штырь к D7
- Эхо-штырь к D4
Сервопривод подключается к следующим контактам:
- подключите провод заземления (черный или коричневый) сервопривода к выводу заземления на шилде.
- если сервопривод совместим с 7,4 В, подключите провод VCC (красный или оранжевый) к крайнему левому разъему + 12 В 3-контактного разъема на драйвере L298N. Если сервопривод несовместим, подключите провод VCC сервопривода к выводу VCC на шилде сервопривода.
Сигнальный провод (желтый, белый или оранжевый) подключите к цифровому выводу D9.
Поздравляем! Ваш робот готов!
Вы можете подключить черный разъем к Arduino, чтобы включить его.
Подключите аккумулятор с помощью Т-образного разъема (или любого другого). Включите двигатели с помощью этого переключателя.
Код проекта
Целиком код и все библиотеки вы можете скачать ниже в ZIP-архивах. Также ниже даются некоторые объяснения по программе для робота-машинки Ардуино.
Установка библиотек
Были созданы библиотеки для этого робота, чтобы изучение программирования было легким и увлекательным. Сделаны свои пользовательские библиотеки для следующих модулей: сервопривод, драйвер, инфракрасный датчик расстояния, ультразвуковой датчик расстояния.
Всё это сделано для тех, кто не является экспертом Arduino. Вы можете смотреть комментарии в библиотеках, чтобы лучше понять, как они работают. Перед тем, как работать с кодом, установите все библиотеки. Вы можете установить их так же, как и все обычные библиотеки Arduino.
Примеры кода
Ниже приведены несколько примеров кода. Пожалуйста, внимательно читайте комментарии в коде.
Тест моторов
Сначала тестим ваши моторы, если они вращаются неправильно, просто поменяйте местами провода.
Загрузите программу, включите Arduino Uno и включите моторы, нажмите кнопку RESET на плате Arduino, чтобы запустить код с самого начала.
//Include all necessary libraries to control motoriver L298N #include <MotorL298NRobotCar.h> //Create class instances for the motordriver L298N Motors myMotors; //Setup all class instances and attach them to the necessary ports void setup() { /* Motor digital pins are hardcoded in the library, for your reference pins connections is the next: Motor 1: enA = 5, in1 = 2, in2 = 8 Motor 2: enB = 3, in3 = 11, in4 = 10 */ myMotors.attach(); } int speed = 0; //variable to make accleration smoothly void loop() { /* How program runs: Motors are rotating forward during 5 seconds on maximum possible speed 255 Motors are rotating backward during 5 seconds on maximum possible speed --255 */ for (speed; speed < 255; speed++) { myMotors.write(speed, speed); // Rotate motors forward and gain speed smoothly using for delay(15); // delay to make accleration smoothly } delay(5000); //delay 5 seconds for (speed; speed > -255; speed--) { myMotors.write(speed, speed); // Rotate motors forward and gain speed smoothly using for delay(15); // delay to make accleration smoothly } delay(5000); //delay 5 seconds }
Тест инфракрасного датчики расстояния
Проверяем инфракрасные датчики, чтобы понять, правильно ли они работают. Вся информация пойдет на последовательный порт.
Загрузите программу и откройте последовательный порт в Arduino IDE, чтобы увидеть измерения расстояния.
//Include all necessary files to control Sharp distance sensor #include <SharpA21RobotCar.h> //Create class instances for the Sharp distance sensors Sharp mySharpA0; Sharp mySharpA1; //Setup all class instances and attach them to the necessary ports void setup() { //Serial port attach on the speed 9600 Serial.begin(9600); //You can choose pins from A0 to A5 for the Arduino Uno and add more distance sensors mySharpA0.attach(A0); mySharpA1.attach(A1); } void loop() { Serial.print("Infrared sensor left: "); Serial.println(mySharpA0.read()); Serial.print("Infrared sensor right: "); Serial.println(mySharpA1.read()); Serial.println(""); delay(500);
Радар ультразвукового датчик расстояния
Этот код проверяет ультразвуковой датчик и проверяет вращение сервопривода. Это простой радар. Сервопривод вращается влево, вправо или в среднее положение, ультразвуковой датчик измеряет расстояние.
Загрузите программу, откройте последовательный порт в Arduino IDE, включите Arduino Uno и включите моторы, нажмите кнопку RESET на плате Arduino, чтобы запустить код с самого начала.
//Include all necessary files to control ultrasonic distance sensor and rotate servo #include <HCSR04RobotCar.h> #include <ServoRobotCar.h> //Create class instance for the ultrasonic distance sensor Ultrasonic myUltrasonic; //Create class instance for the servo ServoMotor myServo; //Setup all class instances and attach them to the necessary ports void setup() { //Serial port attach on the speed 9600 Serial.begin(9600); //Attach sensor and servo //Pins for the ultrasonic sensor and servo are hardcoded in the library myUltrasonic.attach(); myServo.attach(); //Set servo in the middle position myServo.write(90); //Wait 2 seconds before program starts delay(2000); } void loop() { myServo.write(90); //Set servo in the middle position Serial.print("Distance center "); Serial.println(myUltrasonic.read()); delay(1000); //Wait 1 second myServo.write(130); //Turn servo left Serial.print("Distance left "); Serial.println(myUltrasonic.read()); delay(1000); //Wait 1 second myServo.write(50); //Turn servo right Serial.print("Distance right "); Serial.println(myUltrasonic.read()); delay(1000); //Wait 1 second }
Тестируем линейные сенсоры
//Include all necessary files to control line sensors #include <LineSensorRobotCar.h> //Create class instances for the line sensors LineSensor myLineSensorA3; LineSensor myLineSensorA4; LineSensor myLineSensorA5; //Setup all class instances and attach them to the necessary ports void setup() { //Serial port attach on the speed 9600 Serial.begin(9600); //You can choose pins from A0 to A5 for the Arduino Uno and add more sensors myLineSensorA3.attach(A3); myLineSensorA4.attach(A4); myLineSensorA5.attach(A5); } void loop() { Serial.print("Line sensor left: "); Serial.println(myLineSensorA3.read()); Serial.print("Line sensor center: "); Serial.println(myLineSensorA4.read()); Serial.print("Line sensor right: "); Serial.println(myLineSensorA5.read()); Serial.println(""); delay(500); }
Уклонение робота от препятствий с помощью инфракрасных датчиков расстояния
Эта программа позволит роботу избегать препятствия с помощью инфракрасных датчиков расстояния.
Загрузите программу, включите Arduino Uno и включите моторы, нажмите кнопку RESET на плате Arduino, чтобы запустить код с самого начала. Робот начнет двигаться и избегать препятствий!
//Include all libraries to control Sharp distance sensor, and motordriver L298N #include <SharpA21RobotCar.h> #include <MotorL298NRobotCar.h> //Create class instances for the Sharp distance sensors and motordriver L298N Sharp mySharpA0; Sharp mySharpA1; Motors myMotors; //Setup all class instances and attach them to the necessary ports void setup() { Serial.begin(9600); //You can choose pins from A0 to A5 for the Arduino Uno and add more distance sensors mySharpA0.attach(A0); mySharpA1.attach(A1); /* Motor digital pins are hardcoded in the library, for your reference pins connections is the next: Motor 1: enA = 5, in1 = 2, in2 = 8 Motor 2: enB = 3, in3 = 11, in4 = 10 */ myMotors.attach(); } void loop() { /* How program runs: If distance from the left sensor less than 60cm (true) or distance from the right sensor less than 60cm (true), we are going to the next enclosured "if" conditional statement. If distance from both sensors is less than 35cm (true), robot is going backward. Else we are going to the next enclosured "if" conditional statement. If distance from the left sensor is less or equal to the distance from the right sensor, robot turns to the right. If distance from the left sensor is bigger than right sensor, robot turns left. If distance from the both sensors more than 60cm, robot is running straight forward. */ if (mySharpA0.read() <= 60 || mySharpA1.read() <= 60) { if (mySharpA0.read() <= 35 && mySharpA1.read() <= 35) { //Robot is going backward myMotors.write(LEFT MOTOR, RIGHT MOTOR) myMotors.write(-220, -220); } else { if (mySharpA0.read() <= mySharpA1.read()) { myMotors.write(255, -100); //Robot turns right } if (mySharpA0.read() > mySharpA1.read()) { myMotors.write(-100, 255); //Robot turns left } } } else { myMotors.write(220, 220); //Robot is running straight forward } }
Движение робота по линии следования
Эта программа позволит роботу следить за линией, используя линейные датчики. Сделайте небольшой трек с черной линией.
Загрузите программу, включите Arduino Uno и включите моторы, нажмите кнопку RESET на плате Arduino, чтобы запустить код с самого начала. Робот начнет следовать за черной линией, если он обнаружен датчиками линии.
//Include all necessary files to control line sensors and motordriver #include <LineSensorRobotCar.h> #include <MotorL298NRobotCar.h> //Create class instances for the line sensors and motordriver LineSensor myLineSensorA3; LineSensor myLineSensorA4; LineSensor myLineSensorA5; Motors myMotors; //Setup all class instances and attach them to the necessary ports void setup() { //Serial port attach on the speed 9600 Serial.begin(9600); //You can choose pins from A0 to A5 for the Arduino Uno and add more sensors myLineSensorA3.attach(A3); myLineSensorA4.attach(A4); myLineSensorA5.attach(A5); /* Motor digital pins are hardcoded in the library, for your reference pins connections is the next: Motor 1: enA = 5, in1 = 2, in2 = 8 Motor 2: enB = 3, in3 = 11, in4 = 10 */ myMotors.attach(); } void loop() { /* How program runs: If value from the center sensor (A4) is 0, it means black line, robot is going forward. Else, if value from the left sensor (A3) is 0 (black line detected), while center sensor is on white surface, robot turns left. Else, if value from the right sensor (A5) is 0 (black line detected), while center sensor is on white surface, robot turns right. */ if (myLineSensorA4.read() == 0) { myMotors.write(120, 120); //Robot is going forward } else { if (myLineSensorA3.read() == 0) { while (myLineSensorA4.read() == 1) { myMotors.write(-180, 180); //Robot turns left } } else { if (myLineSensorA5.read() == 0) { while (myLineSensorA4.read() == 1) { myMotors.write(180, -180); //Robot turns right } } } } }
На этом всё.