1、CSDN下载:
① 避障:https://download.csdn.net/download/qq_38351824/11107034
② 跟随:https://download.csdn.net/download/qq_38351824/11107197
③ 魔术手:https://download.csdn.net/download/qq_38351824/11107060
2、可以关注点赞并在下方评论,我给你邮箱发过去。
3、关注微信公众号下载:
① 关注微信公众号:Tech云
②
(1)伪代码部分:
主函数
{
舵机摆正
循环部分
{
c如果超声波采集的数据 { 电机停转 舵机左摆 b如果超声波采集的数据 { 舵机右摆 a如果超声波采集的数据 { 舵机摆正 倒车 } aelse { 舵机摆正 电机右转--->停下---->直行 } baelse { 舵机摆正 电机左转--->停下---->直行 } } celse { 电机直行 } } } .(2)滤波部分(超声波滤波):算术平均滤波法 (3)舵机转向: 调节出中值和左右摆的值,写一个按键程序,每按一次旋转一定角度,便可轻易记录下各个位置的数据,操作简单,此处就不再赘述。 (4)电机接线方式如下: https://jingyan.baidu.com/article/75ab0bcbcb5320d6864db2e4.html (5)按照伪代码写程序: 四个逻辑通道从左到右(即IN1到IN4)分别接5、6、9、10 12v供电,5伏输出给arduino供电 输出A接左边电机,输出B做右边电机 使用了三个该模块,分别在车的前左、前中、前右。如图: 下载下面的代码: (1)逻辑部分: 只写了一个简单的,能前后走的,用了跟随小车的左右两边的那个两个避障模块 (2)按照逻辑部分部分程序(算法):
/*
A、名称:算术平均滤波法
B、方法:
连续取N个采样值进行算术平均运算:
N值较大时:信号平滑度较高,但灵敏度较低;
N值较小时:信号平滑度较低,但灵敏度较高;
N值的选取:一般流量,N=12;压力:N=4。
C、优点:
适用于对一般具有随机干扰的信号进行滤波;
这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
D、缺点:
对于测量速度较慢或要求数据计算速度较快的实时控制不适用;
比较浪费RAM。
E、整理:sumjess 2018-07-01
*/
int Filter_Value;
void setup() {
Serial.begin(9600); // 初始化串口通信
randomSeed(analogRead(0)); // 产生随机种子
}
void loop() {
Filter_Value = Filter(); // 获得滤波器输出值
Serial.println(Filter_Value); // 串口输出
delay(50);
}
// 用于随机产生一个300左右的当前值
int Get_AD() {
return random(295, 305);
}
// 算术平均滤波法
#define FILTER_N 12
int Filter() {
int i;
int filter_sum = 0;
for(i = 0; i < FILTER_N; i++) {
filter_sum += Get_AD();
delay(1);
}
return (int)(filter_sum / FILTER_N);
}
#include
2、跟随小车的制作
一、接线:
(1)电机接线:
注意:此处驱动一定要和arduino共地!!!否则无法传输数据。
(2)避障模块接线:
二、书写代码:
//电机使用:5-6-9-10
//避障模块使用:11--8--2
// 左 中 右
/************电机设置*************/
#define leftA_PIN 5
#define leftB_PIN 6
#define righA_PIN 9
#define righB_PIN 10
void motor_pinint(); //电机引脚初始化
void _stop(); //停车
void turnSRight(); //小右转
void turnSLeft(); //小左转
void turnRight(); //右转
void turnLeft(); //左转
void forward(); //前进
int error; //中间变量
int sensor[4]; //存取三个传感器数据信息的数组
//****************循迹模块设置 ***************//
#define left_track_PIN 11
#define middle_track_PIN 8
#define righ_track_PIN 2
int read_sensor_values(void); //读取初值
void track_pinint(); //避障引脚初始化
void setup()
{
motor_pinint(); //电机引脚初始化
}
void loop()
{
switch (read_sensor_values()){ //读取初值
case 0: turnLeft(); break;
case 1: turnSLeft(); break;
case 2: forward();break;
case 3: _stop(); break;
case 4: turnSRight(); break;
case 5: turnRight(); break;
default: _stop();break;
}
}
/*循迹模块引脚初始化*/
void track_pinint()
{
pinMode (left_track_PIN , INPUT); //设置引脚为输入引脚
pinMode (middle_track_PIN, INPUT); //设置引脚为输入引脚
pinMode (righ_track_PIN , INPUT); //设置引脚为输入引脚
}
/*电机引脚初始化*/
void motor_pinint(void)
{
pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚
}
int read_sensor_values()
{
sensor[0] = digitalRead(left_track_PIN);
sensor[1] = digitalRead(middle_track_PIN);
sensor[2] = digitalRead(righ_track_PIN);
//0为检测到障碍
if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1)) {
error = 0;// 001 大左转
} else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1)) {
error = 1;// 011 小左转
} else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1)) {
error = 2;// 111 前进
} else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 0)) {
error = 3;// 010 停止
} else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 0)) {
error = 4;// 110 小右转
} else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 0)) {
error = 5;// 100 大右转
} else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0)) {
error = 3;// 000 前进
} else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 1)) {
error = 3;// 101 停止
} else error = 3;// error 停止
return error;
}
/**************************************************
forward子函数——前进子函数
函数功能:控制车前进
**************************************************/
void forward()
{
analogWrite(leftA_PIN,120);
analogWrite(leftB_PIN,0); //左轮前进
analogWrite(righA_PIN,120);
analogWrite(righB_PIN,0); //右轮前进
}
/**************************************************
turnLeft子函数——大左转子函数
函数功能:控制车大左转
**************************************************/
void turnLeft()
{
analogWrite(leftA_PIN,50);
analogWrite(leftB_PIN,0); //左轮前进
analogWrite(righA_PIN,120);
analogWrite(righB_PIN,0); //右轮前进
}
/**************************************************
turnRight子函数——小右转子函数
函数功能:控制车大右转弯
**************************************************/
void turnRight()
{
analogWrite(leftA_PIN,120);
analogWrite(leftB_PIN,0); //左轮前进
analogWrite(righA_PIN,50);
analogWrite(righB_PIN,0); //右轮前进
}
/**************************************************
turnLeft子函数——大左转子函数
函数功能:控制车小左转
**************************************************/
void turnSLeft()
{
analogWrite(leftA_PIN,90);
analogWrite(leftB_PIN,0); //左轮前进
analogWrite(righA_PIN,120);
analogWrite(righB_PIN,0); //右轮前进
}
/**************************************************
turnRight子函数——小右转子函数
函数功能:控制车小右转弯
**************************************************/
void turnSRight()
{
analogWrite(leftA_PIN,120);
analogWrite(leftB_PIN,0); //左轮前进
analogWrite(righA_PIN,90);
analogWrite(righB_PIN,0); //右轮前进
}
/**************************************************
stop子函数—停止子函数
函数功能:控制车停止
**************************************************/
void _stop()
{
analogWrite(leftA_PIN,0);
analogWrite(leftB_PIN,0); //左轮静止不动
analogWrite(righA_PIN,0);
analogWrite(righB_PIN,0); //右轮静止不动
}
3、魔术手的制作
//电机使用:5-6-9-10
//避障模块使用:11----2
// 左 右
/************电机设置*************/
#define leftA_PIN 5
#define leftB_PIN 6
#define righA_PIN 9
#define righB_PIN 10
void motor_pinint(); //电机引脚初始化
void back(int a);
void forward(int a);
//****************循迹模块设置 ***************//
#define left_track_PIN 11
#define righ_track_PIN 2
void read_sensor_values(void); //读取初值
void track_pinint(); //避障引脚初始化
int error; //中间变量
int sensor[4]; //存取三个传感器数据信息的数组
void setup()
{
motor_pinint(); //电机引脚初始化
}
void loop()
{
read_sensor_values3();
}
/*循迹模块引脚初始化*/
void track_pinint()
{
pinMode (left_track_PIN , INPUT); //设置引脚为输入引脚
pinMode (righ_track_PIN , INPUT); //设置引脚为输入引脚
}
/*电机引脚初始化*/
void motor_pinint()
{
pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚
}
void read_sensor_values3()
{
sensor[0] = digitalRead(left_track_PIN);
sensor[2] = digitalRead(righ_track_PIN);
/*****左边远、右边近*****/
if ( (sensor[0] == 1) && (sensor[2] == 1) || (sensor[0] == 0) && (sensor[2] == 1)) {
forward(80); // 前进 1 1/0 1
} else if ( (sensor[0] == 0) && (sensor[2] == 0) || (sensor[0] == 1) && (sensor[2] == 0)) {
back(80); // 后退 0 0/1 0
}
}
/**************************************************
forward子函数——前进子函数
函数功能:控制车前进
**************************************************/
void forward(int a)
{
analogWrite(leftA_PIN,a);
analogWrite(leftB_PIN,0); //左轮前进
analogWrite(righA_PIN,a);
analogWrite(righB_PIN,0); //右轮前进
}
/**************************************************
forward子函数——后退子函数
函数功能:控制车后退
**************************************************/
void back(int a)
{
analogWrite(leftA_PIN,0);
analogWrite(leftB_PIN,a); //左轮后退
analogWrite(righA_PIN,0);
analogWrite(righB_PIN,a); //右轮后退
}
如果大家在制作过程中有什么问题或者思路可以在下方留言和我一起交流噢!
如果发现本文有错误,也请在下方评论区指出,感激不尽!