基于手柄(有线)的ardunio遥控小车

遥控小车是每个人童年的最爱,不仅好奇它的奇妙,更是喜欢它带来的刺激。小编为大家带来几篇博客,来给大家讲讲制作遥控小车的程序。

看大标题可知我们一共有五个方法去制作一款带有遥控功能的小车,小编分开来给大家讲解。

本文是基于arduino的手柄(有线)遥控小车

基于arduino的手机蓝牙遥控小车

基于arduino的红外遥控小车

基于arduino的无线NRF24L01遥控小车

基于ardunio的无线手柄遥控小车

基于ardunio的有线手柄遥控小车

 

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);
}

 

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值