arduino智能跟随小车

前言
目前,“机器人"已经成为生活中频繁出现的词汇。本课设所做的智能跟随机器人,属于反馈型移动机器人。
反馈型移动机器人:

  • 可以简单定义为一种对外界信号进行处理反馈最终实现的方式将感知和动作连接在一起的可自移动设备。
  • 它必须具有在一个位置的环物独立完成某些工作的能力。这里的智能更多的是指通过传感器感受外界的变化,通过通过传感器感受外界的变化,最终通过执行器做出反应。

在这里插入图片描述

如今中国具有跟随性的产品.主要是有轨机械跟随,用于工厂的各类生产机车的一部分,或是比赛场的有轨跟随拍摄车,并没有实际针对超市、旅馆、飞机场等大众场合,或家庭个人的产品。基于超声波定位及单片机各模块的综合运用,设计了一款能够对特定移动目标进行实时跟踪的智能小车。利用超声波定位技术和跟随性技术可以根据不同场合的跟踪要求设置小车的跟踪距离和跟踪速度等参数,可以实现对移动目标的准确跟踪,帮助携带物品,解放人们双手。

可以用充电宝当电源
图中充电宝为电源

在智能小车项目中,我们通过控制直流电机的正反转刹车转速来控制小车的行动。

在这台小车中,对直流电机发出的控制指令来自于Arduino主控板,而Arduino主控板的外部输入则来自于超声波传感器、遥控器。本文的自动跟随小车的Arduino主控板外部输入来自于超声波传感器。

超声波传感器

在这里插入图片描述
​超声波传感器是利用超声波的特性的传感器。超声波接收到触发信号后,模块自动发出8个40KHZ的方波,同时开始计时并自动监测是否有信号返回,通过记录超声波从开始发送到接收回波间隔,来判断前方障碍物的距离

注:感应角度范围:15°
超声波测距
在这里插入图片描述

const int TrigPin = 9;  //超声波触发引脚连接UNO引脚9
const int EchoPin = 2;    //超声波接受引脚连接UNO引脚2

const int leftPin1=8;  //AIN1连接引脚8
const int leftPin2=7;  //AIN2连接引脚7
const int rightPin3=4;  //BIN1连接引脚4
const int rightPin4=3;  //BIN2连接引脚3d
const int leftSpeed=6;  //PWA连接引脚6
const int rightSpeed=5;  //PWB连接引脚5
const int intSpeedPWM=120;  //设置小车运行的初始速度

int dist;
int followDist = 30; // ❶定义反应的距离
int followBalance = 10; // ❷定义范围

void setup() {
    
    
  // put your setup code here, to run once:
    pinMode(TrigPin,OUTPUT);
    pinMode(EchoPin,INPUT);
    pinMode(leftPin1,OUTPUT);
    pinMode(leftPin2,OUTPUT);
    pinMode(rightPin3,OUTPUT);
    pinMode(rightPin4,OUTPUT);
}

void loop() {
    
    
   followDrive();  // 自动跟随
 }

//******************************
//  功能:跟随模式
//  参数:无
//*******************************
void  followDrive() {
    
      // ❸
    getDistance();  // ❹获取当前的距离
    if ((dist >= followDist - followBalance) && (dist <= followDist + followBalance)) {
    
    
      analogWrite(leftSpeed, intSpeedPWM);
      analogWrite(rightSpeed, intSpeedPWM);
      if (dist > followDist) {
    
      // 当两者间的距离大于设定值时,小车前进
        forward();    
      }
    else if (dist < followDist) {
    
      // 当两者间的距离大于设定值时,小车后退
        backward();   
      }
      else {
    
    
        pause();   // 小车停止
      }
    }
    else {
    
    
      pause();
    }
}


void getDistance() {
    
      // 超声波测距函数
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  dist = pulseIn(EchoPin, HIGH) / 58.0;
}

//===============
// 前进
//===============
void forward(){
    
    
    digitalWrite(leftPin1,1);
    digitalWrite(leftPin2,0);
    digitalWrite(rightPin3,1);
    digitalWrite(rightPin4,0);
}
//===============
// 后退
//===============
void backward(){
    
    
    digitalWrite(leftPin1,0);
    digitalWrite(leftPin2,1);
    digitalWrite(rightPin3,0);
    digitalWrite(rightPin4,1);
}
//===============
// 左转
//===============
void turnLeft(){
    
    
    digitalWrite(leftPin1,0);
    digitalWrite(leftPin2,0);
    digitalWrite(rightPin3,1);
    digitalWrite(rightPin4,0);
}
//===============
// 右转
//===============
void turnRight(){
    
    
    digitalWrite(leftPin1,1);
    digitalWrite(leftPin2,0);
    digitalWrite(rightPin3,0);
    digitalWrite(rightPin4,0);
}
//===============
// 原地左转
//===============
void rotateLeft(){
    
    
    digitalWrite(leftPin1,0);
    digitalWrite(leftPin2,1);
    digitalWrite(rightPin3,1);
    digitalWrite(rightPin4,0);
}
//===============
// 原地右转
//===============
void rotateRight(){
    
    
    digitalWrite(leftPin1,1);
    digitalWrite(leftPin2,0);
    digitalWrite(rightPin3,0);
    digitalWrite(rightPin4,1);
}
//===============
// 停止
//===============
void pause(){
    
    
    digitalWrite(leftPin1,0);
    digitalWrite(leftPin2,0);
    digitalWrite(rightPin3,0);
    digitalWrite(rightPin4,0);
}

系统测试
以手与小车的距离为标准 通过手的移动,来测试小车。
测试超声波模块时,可通过编译器的串口检测器测试。

猜你喜欢

转载自blog.csdn.net/m0_52773286/article/details/127496829