1. 程式人生 > >基於ardunio的遙控小車(含有藍芽遙控、紅外遙控、有線手柄遙控、無線手柄遙控、無線收發遙控)

基於ardunio的遙控小車(含有藍芽遙控、紅外遙控、有線手柄遙控、無線手柄遙控、無線收發遙控)

遙控小車是每個人童年的最愛,不僅好奇它的奇妙,更是喜歡它帶來的刺激。小編為大家帶來幾篇部落格,來給大家講講製作遙控小車的程式。

看大標題可知我們一共有五個方法去製作一款帶有遙控功能的小車,小編分開來給大家講解。

本文是基於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);
}

細節待更