基於ardunio的遙控小車(含有藍芽遙控、紅外遙控、有線手柄遙控、無線手柄遙控、無線收發遙控)
阿新 • • 發佈:2019-02-15
遙控小車是每個人童年的最愛,不僅好奇它的奇妙,更是喜歡它帶來的刺激。小編為大家帶來幾篇部落格,來給大家講講製作遙控小車的程式。
看大標題可知我們一共有五個方法去製作一款帶有遙控功能的小車,小編分開來給大家講解。
本文是基於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); }
細節待更