问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于Arduino的四轴寻迹小车制作详解

创作时间:
作者:
@小白创作中心

基于Arduino的四轴寻迹小车制作详解

引用
CSDN
1.
https://blog.csdn.net/2301_78080608/article/details/139883852

四轴寻迹小车是一种能够自动识别并沿着预定轨迹行驶的机器人。它广泛应用于工业自动化、物流运输等领域。本文将详细介绍如何使用Arduino和五路寻迹传感器制作一个四轴寻迹小车,包括硬件连接和软件编程两个方面。

硬件准备

  • Arduino控制板
  • Adafruit Motor Shield电机驱动板
  • 四个直流电机
  • 五路寻迹传感器模块
  • 连接线和面包板

硬件连接

电机连接:

#include <AFMotor.h>      //add Adafruit Motor Shield library
AF_DCMotor LeftMotor1(2);
AF_DCMotor LeftMotor2(3);
AF_DCMotor RightMotor1(1);
AF_DCMotor RightMotor2(4);

五路寻迹传感器连接:

// 五路寻迹模块引脚定义
const int TrackSensorLeftPin1 = 9;
const int TrackSensorLeftPin2 = A2;
const int TrackSensorMid = A3;
const int TrackSensorRightPin1 = A4;
const int TrackSensorRightPin2 = A5;

软件编程

寻迹逻辑

寻迹的原理是通过发送信号,黑色吸光返回0,其他颜色返回1。博主选用的是五路寻迹,当小车直行时,中间返回值为0,总体返回 11011。

五路产生的常见情况:

  • 11011:未偏离
  • 10111:稍稍右偏,左走修正
  • 11101:稍稍左偏,右走修正
  • 01111:大右偏,左修正
  • 11110:大左偏,右修正

代码实现

void setup() {
  Serial.begin(9600);
  // 初始化五路寻迹模块引脚为输入
  pinMode(TrackSensorLeftPin1, INPUT);
  pinMode(TrackSensorLeftPin2, INPUT);
  pinMode(TrackSensorMid, INPUT);
  pinMode(TrackSensorRightPin1, INPUT);
  pinMode(TrackSensorRightPin2, INPUT);
}

void loop(){
  xunji();
}

void xunji(){
  // 读取五路寻迹模块的状态
  int SLL = digitalRead(TrackSensorLeftPin1);
  int SL = digitalRead(TrackSensorLeftPin2);
  int SM = digitalRead(TrackSensorMid);
  int SR = digitalRead(TrackSensorRightPin1);
  int SRR = digitalRead(TrackSensorRightPin2);
  // 根据五路寻迹模块的状态控制电机运动
  if (SLL == 1 && SL ==1 && SM == 0 && SR == 1 && SRR == 1) {
    motor_forward();
  } else if (SLL == 1 && SL ==0 && SM == 1 && SR == 1 && SRR == 1) {
    turn_l();
  } else if (SLL == 0 && SL ==1 && SM == 1 && SR == 1 && SRR == 1) {
    turn_l();
  } else if (SLL == 1 && SL ==1 && SM == 1 && SR == 0 && SRR == 1) {
    turn_r();
  } else if (SLL == 1 && SL ==1 && SM == 1 && SR == 1 && SRR == 0) {
    turn_r();
  }
}

void motor_forward() {
  LeftMotor1.run(FORWARD);
  LeftMotor2.run(FORWARD);
  RightMotor1.run(FORWARD);
  RightMotor2.run(FORWARD);
  LeftMotor1.setSpeed(120);
  LeftMotor2.setSpeed(120);  
  RightMotor1.setSpeed(120);
  RightMotor2.setSpeed(120);
}

void turn_l(){
  LeftMotor1.run(BACKWARD);
  LeftMotor2.run(BACKWARD);
  RightMotor1.run(FORWARD);
  RightMotor2.run(FORWARD);
  LeftMotor1.setSpeed(75);
  LeftMotor2.setSpeed(75);  
  RightMotor1.setSpeed(180);
  RightMotor2.setSpeed(180);
}

void turn_r(){
  LeftMotor1.run(FORWARD);
  LeftMotor2.run(FORWARD);
  RightMotor1.run(BACKWARD);
  RightMotor2.run(BACKWARD);
  LeftMotor1.setSpeed(180);
  LeftMotor2.setSpeed(180);  
  RightMotor1.setSpeed(75);
  RightMotor2.setSpeed(75);
}

void motor_stop() {
  LeftMotor1.run(RELEASE);  
  LeftMotor2.run(RELEASE);  
  RightMotor1.run(RELEASE); 
  RightMotor2.run(RELEASE); 
  LeftMotor1.setSpeed(0);  
  LeftMotor2.setSpeed(0);  
  RightMotor1.setSpeed(0); 
  RightMotor2.setSpeed(0); 
}

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号