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

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

本文是基于arduino的无线(蓝牙传输)手柄遥控小车

发送数据端,即手柄段

char test1[10];
char test2[10];
char test3[10];
 
int PS2Y_Pin = 2;     //Y轴引脚
#define value  analogRead(A4)        //ADC采集手柄X模块数据
#define value2 analogRead(A5)        //ADC采集手柄Y模块数据
#define value3 digitalRead(PS2Y_Pin) //IO 采集手柄Z模块数据
 
void setup() {
Serial.begin(9600);
pinMode(PS2Y_Pin, INPUT);
}
void loop() {
dtostrf(value,4,0,test1);  //将value的值放到临时数组test1中
dtostrf(value2,4,0,test2); //将value的值放到临时数组test2中
strcat(test1,test2);       //将临时数组test2的数据放到临时数组test1中
Serial.println(test1);    //发送手柄数据
for(int i=0;i<10;i++) { test1[i]=""; test2[i]=""; }
delay(500);
}
 

接收数据段,即小车端

//-------------------------------------------------------------------//
//*******************************************************************//
///
//电机设置/
///
 
#define leftA_PIN 5
#define leftB_PIN 6
#define righA_PIN 9
#define righB_PIN 10
int speedR2,speedL2,speedL1,speedR1;
 
 
String  comdata = "";//储存
int getB(int a, int b, int c,int d);//数组转换为int类型变量
char test4[10]; //临时数组4
int x;
int y;
void Seria(void);//从串口读取手柄数据
void determ(void);//决断函数
 
void setup() {
Serial.begin(9600);
}
 
void loop() {
  Seria();   //从串口读取手柄数据
  determ();//决断函数
}
void Seria(void)
{
    while (Serial.available() > 0)  { 
       comdata += char(Serial.read());
       delay(2);
    }
    if (comdata.length() > 0){
        for(int i=0;i<comdata.length();i++)//for循环更改每个值
        test4[i] = comdata[i];             //string类型转换为char类型数组
        x = getB(test4[0], test4[1], test4[2],test4[3]);//数组转换为int类型变量
        y = getB(test4[4], test4[5], test4[6],test4[7]);//数组转换为int类型变量
        //Serial.print(x);Serial.println(y);
        comdata = "";
    }
}
void determ(void)//决断函数
{
  if(y<515)//前进
  {
    speedL2=0;speedR2=0;
    if(x<510) //左转---前进+左转
    {
 
    speedL1=(515-y)/4;
    speedR1=(515-y)/4+(505-x)/4;
    }
    else{//右转---前进+右转
    speedL1=(515-y)/4+(505-x)/4;
    speedR1=(515-y)/4;
    }
  }
  else//后退
  { 
    speedL1=0;speedR1=0;
    if(x<510) //左转---后退+左转
    {
    speedL2=(y-515)/4;
    speedR2=(y-515)/4+(x-510)/4;
    }
    else{ //右转---后退+右转
    speedL2=(y-515)/4+(x-510)/4;
    speedR2=(y-515)/4;
  } 
 }
    analogWrite(leftA_PIN, speedL1);
    analogWrite(leftB_PIN, speedL2);
    analogWrite(righA_PIN, speedR1);
    analogWrite(righB_PIN, speedR2);
 
}
int getB(char a, char b, char c, char d)//数组转换为int类型变量
{
  if(a==32) a=48;
  if(b==32) b=48;
  if(c==32) c=48;
  if(d==32) d=48;
  int t = (a -48)*1000 + (b-48)*100 + (c-48)*10+(d-48);
  return t;
}

细节待更