因为这是我做的第一个项目,然后平时也不太喜欢拍照。再加上有强迫症,没事喜欢清理文件相册。导致这个项目的材料照片文件十分匮乏(其实几乎都没了)。这是用的一些仅存残余文件,来写本人的第一篇博客,算是留作纪念也算是一个新旅程的开端。
另外可以看看我的另一篇博客——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.程序流程图
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[