遥控小车是每个人童年的最爱,不仅好奇它的奇妙,更是喜欢它带来的刺激。小编为大家带来几篇博客,来给大家讲讲制作遥控小车的程序。
看大标题可知我们一共有五个方法去制作一款带有遥控功能的小车,小编分开来给大家讲解。
本文是基于arduino的手柄(有线)遥控小车
1、CSDN下载:
https://download.csdn.net/download/qq_38351824/11107000
2、可以关注点赞并在下方评论,我给你邮箱发过去。
3、关注微信公众号下载:
① 关注微信公众号:Tech云
②
一、接线:
(1)手柄接线:
VRX -----> A4
VRY -----> A5
SW -----> P2
+5V -----> 5V
GND -----> GND
(2)电机接线:
四个逻辑通道从左到右(即IN1到IN4)分别接5、6、9、10
12v供电,5伏输出给arduino供电
注意:此处驱动一定要和arduino共地!!!否则无法传输数据。
输出A接左边电机,输出B做右边电机
二、数据处理:
利用以下代码,可以得出绘制大致的数据图。
// 电机设置 //
#define leftA_PIN 5
#define leftB_PIN 6
#define righA_PIN 9
#define righB_PIN 10
int speedR2,speedL2,speedL1,speedR1;
int PS2Y_Pin = 2; //Y轴引脚
#define value erX-analogRead(A4) //ADC采集手柄X模块数据
#define value2 erY-analogRead(A5) //ADC采集手柄Y模块数据
#define value3 digitalRead(PS2Y_Pin) //IO 采集手柄Z模块数据
float erX;//X轴均值滤波采集初始化数据
float erY;//Y轴均值滤波采集初始化数据
float errorX(void);//误差计算X
float errorY(void);//误差计算Y
float X;//最终的数据
int Y;//最终的数据
float K;
void PS2_LAST(void);//最终的数据处理
void determ(void);//决断函数
void setup() {
pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚
pinMode(PS2Y_Pin, INPUT);
Serial.begin(115200);
erX=errorX();//X轴均值滤波采集初始化数据
erY=errorY();//Y轴均值滤波采集初始化数据
}
void loop() {
Serial.println("--------");
Serial.println(analogRead(A4), DEC);
Serial.println(analogRead(A5), DEC);
Serial.println("--------");
//Serial.println(speedR1, DEC);
//PS2_LAST();
//determ();
delay(100);
while(!);
}
float errorX(void)//X轴均值滤波采集初始化数据
{
float err=0,res=0;
int i=0;
for(i=0;i<1000;i++)
{
res = analogRead(A4);//采集数据(原始数据)
delay(1);
err = err+res;//累加
}
err = err/100;
return err;
}
float errorY(void)//Y轴均值滤波采集初始化数据
{
float err=0,res=0;
int i=0;
for(i=0;i<1000;i++)
{
res = analogRead(A5);//采集数据(原始数据)
delay(1);
err = err+res;//累加
}
err = err/100;
return err;
}
void PS2_LAST(void)//最终的数据处理
{
float A;
float B;
float R;
/y轴数据处理/
A=(value2)/2;//数据处理
Y=(int)A;//最终的结果
if(Y>255) Y=255;
else if(Y<-255) Y=-255;
/x轴数据处理/
B=(value )/2;//数据处理
if(B>255) B=255;
else if(B<-255) B=-255;
R=sqrt(sq(Y/10)+sq(B/10));
K=(Y/10)/R;
if(K>=0)
{if(R!=0) X=1-K;//最终的结果
else X=666;}//停车指令
else
{if(R!=0) X=1+K;//最终的结果
else X=666;}//停车指令
}
void determ(void)//决断函数
{
if(Y>0)
{
if(K==0)
{
speedL2=0;speedR2=0;
speedL1=Y;
speedR1=Y;
}
else{
speedL2=0;speedR2=0;
speedL1=Y;
speedR1=Y+X*Y/2;
if(speedL1>253) speedL1=speedL1-100;
if(speedR1>253) speedR1=255;}
}
else
{
if(K==0)
{
speedL1=0;speedR1=0;
speedL2=Y;
speedR2=Y;
}
else{
speedL1=0;speedR1=0;
speedL2=Y;
speedR2=Y+X*Y/2;
if(speedL2<-253) speedL1=speedL1-100;
if(speedR2<-253) speedR1=255;}
}
//Serial.print("speedR1:");
//Serial.println(speedR1, DEC);
//
//Serial.print(" | speedR2:");
//Serial.println(speedR2, DEC);
//
//Serial.print("speedL1:");
//Serial.println(speedL1, DEC);
//
//Serial.print(" | speedL2:");
//Serial.println(speedL2, DEC);
analogWrite(leftA_PIN, speedR1);
analogWrite(leftB_PIN, speedR2);
analogWrite(righA_PIN, speedL1);
analogWrite(righB_PIN, speedL2);
}
我们将该图数据的原点(0,0)点移到中心处(492,521)
三、书写代码:
然后将以下代码下载到arduino板:
// 电机设置 //
#define leftA_PIN 5
#define leftB_PIN 6
#define righA_PIN 9
#define righB_PIN 10
int speedR2,speedL2,speedL1,speedR1;
int PS2Y_Pin = 2; //Y轴引脚
#define value erX-analogRead(A4) //ADC采集手柄X模块数据
#define value2 erY-analogRead(A5) //ADC采集手柄Y模块数据
#define value3 digitalRead(PS2Y_Pin) //IO 采集手柄Z模块数据
float erX;//X轴均值滤波采集初始化数据
float erY;//Y轴均值滤波采集初始化数据
float errorX(void);//误差计算X
float errorY(void);//误差计算Y
float X;//最终的数据
int Y;//最终的数据
float K;
void PS2_LAST(void);//最终的数据处理
void determ(void);//决断函数
void setup() {
pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚
pinMode(PS2Y_Pin, INPUT);
Serial.begin(115200);
erX=errorX();//X轴均值滤波采集初始化数据
erY=errorY();//Y轴均值滤波采集初始化数据
}
void loop() {
PS2_LAST();
determ();
delay(100);
}
float errorX(void)//X轴均值滤波采集初始化数据
{
float err=0,res=0;
int i=0;
for(i=0;i<100;i++)
{
res = analogRead(A4);//采集数据(原始数据)
delay(1);
err = err+res;//累加
}
err = err/100;
return err;
}
float errorY(void)//Y轴均值滤波采集初始化数据
{
float err=0,res=0;
int i=0;
for(i=0;i<100;i++)
{
res = analogRead(A5);//采集数据(原始数据)
delay(1);
err = err+res;//累加
}
err = err/100;
return err;
}
void PS2_LAST(void)//最终的数据处理
{
float A;
float B;
float R;
/y轴数据处理/
A=(value2)/2;//数据处理
Y=(int)A;//最终的结果
if(Y>255) Y=255;
else if(Y<-255) Y=-255;
/x轴数据处理/
B=(value )/2;//数据处理
if(B>255) B=255;
else if(B<-255) B=-255;
R=sqrt(sq(Y/10)+sq(B/10));
K=(Y/10)/R;
if(K>=0)
{if(R!=0) X=1-K;//最终的结果
else X=666;}//停车指令
else
{if(R!=0) X=1+K;//最终的结果
else X=666;}//停车指令
}
void determ(void)//决断函数
{
if(Y>0)
{
if(K==0)
{
speedL2=0;speedR2=0;
speedL1=Y;
speedR1=Y;
}
else{
speedL2=0;speedR2=0;
speedL1=Y;
speedR1=Y+X*Y/2;
if(speedL1>253) speedL1=speedL1-100;
if(speedR1>253) speedR1=255;}
}
else
{
if(K==0)
{
speedL1=0;speedR1=0;
speedL2=Y;
speedR2=Y;
}
else{
speedL1=0;speedR1=0;
speedL2=Y;
speedR2=Y+X*Y/2;
if(speedL2<-253) speedL1=speedL1-100;
if(speedR2<-253) speedR1=255;}
}
Serial.print("speedR1:");
Serial.println(speedR1, DEC);
Serial.print(" | speedR2:");
Serial.println(speedR2, DEC);
Serial.print("speedL1:");
Serial.println(speedL1, DEC);
Serial.print(" | speedL2:");
Serial.println(speedL2, DEC);
analogWrite(leftA_PIN, speedR1);
analogWrite(leftB_PIN, speedR2);
analogWrite(righA_PIN, speedL1);
analogWrite(righB_PIN, speedL2);
}