如何利用Arduino制作智能避障机器人

 

简介:如何使用Arduino Uno避开机器人的智能障碍

嗨,大家好。在此指导中,我将教您如何构建避障机器人。该机器人将是一辆小型且简单的两轮汽车,它将向前移动,直到在其路径中检测到障碍物为止。这样做后,它将停止,向后移动一点,然后向左和向右看。

然后它将比较任一侧前方的可用距离,然后转向可用距离似乎相对大的方向。这样,它将能够在充满障碍的环境中移动而不会与任何物体碰撞。这只是在诸如仓库机器人,无人驾驶汽车等各种应用中使用的避免碰撞概念的小部分展示。

为了检测距离,机器人使用了HC-SR04超声波传感器。此传感器每10微秒发送一次超声波,如果前方有障碍物,则传感器会接收到回声。根据行程时间,它可以知道传感器与物体之间的距离。因此,让我们开始吧!

 

步骤1:收集组件


 


 


 

首先,显然,我们显然需要收集构建机器人所需的组件和工具。查找以下所需的组件和工具:

这里已经将所有组件放在一处了:Arduino机器人套件

各个组成部分:

工具(可选):

准备好组件并继续下一步!

步骤2:安装马达和车轮


 


 

我对底盘所做的第一件事是在前部增加了一个脚轮,该脚轮将在前部充当支撑性的第三轮,并且由于具有360度的自由度而可以自由旋转。这样,我们可以避免使用4个轮子,而只能使用2轮机器人。

接下来,我们需要做的是任何与车辆相关的项目中的经典步骤。电动机车轮连接到底盘。这样做没有特别的方法,因为每个人都可能使用不同的底盘,但是我想在这里提一件事:确保电动机牢固地固定且水平度相同,并且车轮正好指向前方。否则,您以后可能会遇到一些与运动有关的问题。

将电线焊接到电动机上,然后继续下一步!

步骤3:连接Arduino和Motor Shield


 


 

将Arduino板连接到机箱顶部。您可以以任何更可取的方式附加它。这可以使用一些垫片和螺钉,也可以使用一块双面胶带将Arduino板直接粘贴在机箱上。就我个人而言,我总是会选择第一种方法,因为它可以使它看起来更专业。

然后,只需将电动机护罩插入Arduino板的顶部,就可以了!

步骤4:添加伺服电机和超声波传感器


 


 


 

现在我们需要添加机器人的感应机制。这包括三个组成部分。

  • 超声波传感器,用于感应前方的距离。
  • 伺服电机,用于左右旋转传感器。
  • 用于将传感器固定在伺服电机上的传感器安装座

我的机箱上有一个用于安装伺服电机的切口,因此我只需要将其插入切口中即可。只需用一张双面胶带将其粘贴在机箱的前部即可

然后使用传感器安装座,将传感器安装到伺服电机上,并继续进行下一步!

步骤5:接线


 

我们在这里再次有三件事。因此,在为机器人接线时需要注意三件事:

  • 马达

电机护罩具有用于连接多达四个电机的端口,这些端口为螺钉端子形式。只需将电动机连接到任意两个端子即可,因为我们仅使用两个电动机。

  • 伺服马达

伺服电机只有一根插头线,其中有三根线。只需将其插入电机罩上的伺服端子即S1即可

  • 超声波传感器

有关超声波传感器与Arduino板的连接,请参考上图。(或)连接:

  1. 传感器GND:Arduino GND
  2. 传感器VCC:Arduino + 5V
  3. 传感器跳闸:Arduino A4
  4. 传感器回声:Arduino A5

另外,将电池座连接到电动机护罩的电池螺钉端子,然后再次向前移动!

 

步骤 6:编码对决

现在是时候对机器人进行编码了,然后看看机器人是否可以正常工作!

您可以尝试自行编写机器人代码,以获得更好的体验和学习,但是您始终可以参考下面提供的我的代码。我还上传了Arduino代码文件。在尝试运行代码之前,请确保已安装Arduino IDE :)

请尝试在这些基础上继续前进,如果您这样做,则下面有一个名为“ I Made It”的部分在那里见我。

   ////////////////////////////////////////////////////////
  //          Arduino Obstacle Avoiding Robot v2.0      //             
 //            By Aarav Garg - 2021                    //
////////////////////////////////////////////////////////

//including the libraries
#include <AFMotor.h>
#include <NewPing.h>
#include <Servo.h> 

//defining pins and variables
#define TRIG_PIN A4 
#define ECHO_PIN A5 
#define MAX_DISTANCE 200
#define MAX_SPEED 200 // sets speed of DC  motors
#define MAX_SPEED_OFFSET 20

#define turn_amount 500

//defining motors,servo,sensor
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); 
AF_DCMotor motor1(2, MOTOR12_8KHZ); 
AF_DCMotor motor2(1, MOTOR12_8KHZ);
Servo myservo; 
  
//defining global variables
boolean goesForward=false;
int distance = 100;
int speedSet = 0;

void setup() {
  Serial.begin(9600);
  myservo.attach(10);  
  myservo.write(90); 
  delay(2000);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
}

void loop() {
 int distanceR = 0;
 int distanceL =  0;
 delay(40);
 Serial.println(distance);
 
 if(distance<=15)
 {
  Serial.println("Object Detected");
  moveStop();
  delay(100);
  moveBackward();
  delay(300);
  moveStop();
  delay(200);
  distanceR = lookRight();
  Serial.print("Distance Right = ");
  Serial.println(distanceR);
  delay(200);
  distanceL = lookLeft();
  Serial.print("Distance Left = ");
  Serial.println(distanceL);
  delay(200);

  if(distanceR>=distanceL)
  {
    turnRight();
    moveStop();
  }
  else
  {
    turnLeft();
    moveStop();
  }
 }
 else
 {
  moveForward();
 }

 //reseting the variable after the operations
 distance = readPing();
}

int lookRight()
{
    myservo.write(0); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(90); 
    return distance;
}

int lookLeft()
{
    myservo.write(180); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(90); 
    return distance;
    delay(100);
}

int readPing() { 
  delay(70);
  int cm = sonar.ping_cm();
  if(cm==0)
  {
    cm = 250;
  }
  return cm;
}

void moveStop() {
  motor1.run(RELEASE); 
  motor2.run(RELEASE);
  } 
  
void moveForward() {

 if(!goesForward)
  {
    goesForward=true;
    motor1.run(FORWARD);      
    motor2.run(FORWARD);      
   for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly
   {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet+MAX_SPEED_OFFSET);
    delay(5);
   }
  }
}

void moveBackward() {
    goesForward=false;
    motor1.run(BACKWARD);      
    motor2.run(BACKWARD);  
  for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly
  {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet+MAX_SPEED_OFFSET);
    delay(5);
  }
}  

void turnRight() {
  Serial.println("Turning Right");
  motor1.run(FORWARD);
  motor2.run(BACKWARD);     
  delay(turn_amount);
  motor1.run(FORWARD);      
  motor2.run(FORWARD);      
} 
 
void turnLeft() {
  Serial.println("Turning Left");
  motor1.run(BACKWARD);     
  motor2.run(FORWARD);     
  delay(turn_amount);
  motor1.run(FORWARD);     
  motor2.run(FORWARD);
}</pre>

版权说明

如何使用Arduino Uno避开机器人的智能障碍
本文遵循CC BY-SA版权协议,转载请附上原文出处链接及本声明。
链接:https://chandianzi.cn/how-to-make-smart-obstacle-avoiding-robot-using-ar.html
作者:Aarav+G
版权协议:CC BY-NC-SA
分类名称:arduino-10
资源标识:How-to-Make-Smart-Obstacle-Avoiding-Robot-Using-Ar

生成海报
点赞 1

[db:作者]

我还没有学会写个人说明!

暂无评论

相关推荐

使用 Arduino 测量土壤水分-G

土壤湿度传感器用于测量土壤内的水量,并提供土壤的水分水平或干燥或潮湿程度。该传感器的输出有助于判断土壤中是否需 ...

让你的植物说话

简介:让植物说话在今天的教程中,我们将学习如何使用带有MP3播放器模块的Arduinonano进行工厂对话。基本上,我们将3个传感器连接到Arduino模块:LDR传感器。电容式湿度传感器。DHT22温湿度传感器。我们将在Arduino中读取传感器值并定义每个传感器的限制,然后基于这些限制,Arduino将向MP3模块发送命令以播放特定警报。在本教程中,我们不会编写任何代码脚本,而是使用XODide软件。如果您不熟悉XOD,则XOD是免费的开放源代码且功能强大的微控制器可视化编程软件。它使用图形界面将硬件和计算元素表示为节点,这些节点可以连接在一起以允许数据在对象之间流动。您可以从下面的链接下

DIY 自平衡Arduino机器人-【单片机教程-创客】

关于DIY自平衡机器人的,我将向您展示如何构建自己的自平衡机器人。我尝试构建该项目,但未能获得预期的结果。但是这款机器人的表现相当不错且准确,尽管与我以前的机器人相比,这并不完美。