Arduino智能物流小车项目(MEGA2560)

因为这是我做的第一个项目,然后平时也不太喜欢拍照。再加上有强迫症,没事喜欢清理文件相册。导致这个项目的材料照片文件十分匮乏(其实几乎都没了)。这是用的一些仅存残余文件,来写本人的第一篇博客,算是留作纪念也算是一个新旅程的开端。
另外可以看看我的另一篇博客——Arduino智能物流小车各部分功能代码详解(省工程训练能力综合竞赛)


https://github.com/A-HUAN/Arduino-Logistics-car


1.项目功能要求

去年暑假前报了某比赛(工程训练能力综合竞赛),比赛要求是做一个智能物流小车。项目要求小车实现的功能有—“赛道自主行走物料扫码识别规避障碍跨越减速带和栅格码垛规避循迹的功能。”
比赛地图

2.小车组成构架

智能小车结构说明
a.小车底盘设计
小车底盘主要组成是:直流电机、电机支架、孔平板、联轴器、轮胎组成。
在这里插入图片描述
b.机械臂及抓取设计
考虑到机械臂需要实现的功能以及机械臂与物料台之间的协调性,设计了6自由度的机械臂,并且用舵机来作为机械臂的关节。
机械臂设计
抓取部件需要 — 咬合力大;结构简单切材料刚性好;接触点与物料之间的摩擦力大
抓取设计
c.物料台设计
考虑到小车的车型,以及物料台和机械臂之间的距离,选择在小车旁边加一块小车铝合金板,在铝合金板上固定舵机,舵机上放通过金属舵盘和亚克力物料台固定,从而实现舵机对物料架的控制。
物料台设计
d. 小车主视图与左视图
主视图
在这里插入图片描述
e.小车爆炸图
爆炸图

3.主要零部件

名称 型号
主控板 MEGA2560及扩展板
灰度传感器 TCRT5000
超声波 HC-SR04
降压模块 LM2596
直流电机 JGB37-520
金属舵机 D3625MG/PDI6225MG
舵机板 16位舵机板
电池 9V电池

4.程序流程图

1
2

5.成品展示

1.0初期版本(电线凌乱,布局混乱,物料架仅能放三个物体)

在这里插入图片描述

2.0升级版本
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.终极代码

#include <Servo.h>
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4
#define FRAME_HEADER            0xFF   //帧头
#define CMD_SERVO_SPEED         0x01   //设置舵机速度
#define CMD_SERVO_PLACE         0x02   //设置舵机位置
#define CMD_ACTION_GROUP_RUN    0x09   //运行动作组
#define CMD_STOP_REFRESH        0x0b   //急停、恢复指令
#define GET_LOW_BYTE(A) (uint8_t)((A))           //宏函数 获得A的低八位
#define GET_HIGH_BYTE(A) (uint8_t)((A) >> 8)     //宏函数 获得A的高八位
int leftMotor1 = 14;
int leftMotor2 = 15;
int rightMotor1 = 16;
int rightMotor2 = 17;//定义电机
int trac1 =11; 
int trac2 = 10; 
int trac3 = 9; 
int trac4 = 8; //定义前侧红外/从车头方向的最右边开始排序
int trac5 = 7;
int trac6 = 6;//定义右侧红外 
int inputPin =4;   // 定义超声波信号接收接口
int outputPin =5;  // 定义超声波信号发出接口
int leftPWM = 3;
int rightPWM = 2;//定义调速
int Flag_1 = 0; //取物料标志    
int Flag_2 = 0; //放物料标志    
int dis;
int q,w,e,r= 0;
int data[6];//定义红外读取数组
int i,j;
int Position=0;
char scanflag = ' ';
String SciString = " ";      
boolean flag_SetSeiDecMod = true;
boolean flag_StaDec = false;                   
unsigned char SetSeiDecMod[] = {0x07,0xC6,0x04,0x00,0xFF,0x8A,0x08,0xFD,0x9E};  
unsigned char StaDec[] = {0x04,0xE4,0x04,0x00,0xFF,0x14};     
SoftwareSerial mySerial(12,13);                // TX,RX
SoftwareSerial ServoSerial(19,18);             // RX, TX 软串口

void setup() 
{
  Serial.begin(9600);   //串口初始化
  ServoSerial.begin(9600);
  mySerial.begin(9600);
  pinMode(leftMotor1, OUTPUT);
  pinMode(leftMotor2, OUTPUT);
  pinMode(rightMotor1, OUTPUT);
  pinMode(rightMotor2, OUTPUT);
  pinMode(leftPWM, OUTPUT);
  pinMode(rightPWM, OUTPUT);  //测速引脚初始化
  pinMode(trac1, INPUT);
  pinMode(trac2, INPUT);
  pinMode(trac3, INPUT);
  pinMode(trac4, INPUT); 
  pinMode(trac5, INPUT);
  pinMode(trac6, INPUT);
  pinMode(inputPin, INPUT);
  pinMode(outputPin, OUTPUT); //超声波控制引脚初始化
}

void motorRun(int cmd,int value)
{
  analogWrite(leftPWM, value);  //设置PWM输出,即设置速度
  analogWrite(rightPWM, value);
  switch(cmd){
    case FORWARD:
     Serial.println("FORWARD"); //输出状态
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
     case BACKWARD:
      Serial.println("BACKWARD"); //输出状态
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2,HIGH );
      digitalWrite(rightMotor1,HIGH );
      digitalWrite(rightMotor2,LOW);
      break;
     case TURNLEFT:
      Serial.println("TURN LEFT"); //输出状态
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);
      break;
     case TURNRIGHT:
      Serial.println("TURN RIGHT"); //输出状态
       digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, HIGH);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
     default:
      Serial.println("STOP"); //输出状态
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, LOW);
  }
}

void tracing()
{
  data[0] = digitalRead(11);
  data[1] = digitalRead(10);
  data[2] = digitalRead(9);
  data[3] = digitalRead(8);
  data[4] = digitalRead(7);
  data[5] = digitalRead(6);
   if((!data[0] && data[1] && data[2] && !data[
  • 96
    点赞
  • 763
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值