本小車基于Arduino uno開發,循跡比較靈敏,避障部分只適合本人設計的特殊賽道。 設計智能小車首先應該確定小車的基本結構,其主要包括以下幾個部分: (1)循跡模塊:指小車利用紅外發射裝置發射紅外線后,照射物體表面返回量的多少來測定小車的具體的位置,以進行循跡。 (2)電機驅動模塊:指通過專用電路對電機進行驅動,單片機給出控制信號通過L298驅動電機正常運轉。 (3)控制模塊:這是小車的控制中心,本設計采用Arduino系列單片機 (4)電源模塊: 因設計需要,我們給小車單獨供電,設置獨立的電源模塊,使之穩定運行。 (5)超聲波避障模塊:本文使用Arduino連接 HC-SR04 超聲波測距傳感器,超聲波完成距離測定,并控制小車在前方障礙小于某一特定值時,做出“停止”、“后退”等一系列動作。 - #define STOP 0
- #define FORWARD 1
- #define BACKWARD 2
- #define TURNLEFT 3
- #define TURNRIGHT 4
- int Trig = 12;
- int Echo = 13;
- float distance;
- int Distance = 0;
- int leftMotor1=2;//定義I1接口
- int leftMotor2=4;//定義I2接口
- int ENA = 6;//定義EA(PWM調速)接
- int rightMotor1 =7;//定義I3接口
- int rightMotor2 =8;//定義I4接口
- int ENB=5;//定義EB(PWM調速)接口
- int IRR=14;//定義右側尋線傳感器接口
- int IRM=15;//定義中間尋線傳感器接口
- int IRL=16;//定義左側尋線傳感器接口
- void setup()
- {
- Serial.begin(9600);
- pinMode(Trig,OUTPUT);
- pinMode(Echo,INPUT);
- pinMode(leftMotor1,OUTPUT);
- pinMode(leftMotor2,OUTPUT);
- pinMode(ENA,OUTPUT);
- pinMode(rightMotor1,OUTPUT);
- pinMode(rightMotor2,OUTPUT);
- pinMode(ENB,OUTPUT);
- pinMode(IRR,INPUT);
- pinMode(IRM,INPUT);
- pinMode(IRL,INPUT);
- }
- void motorRun(int cmd,int value)
- {
- analogWrite(ENA, value); //設置PWM輸出,即設置速度
- analogWrite(ENB, value);
- switch(cmd){
- case FORWARD:
- Serial.println("FORWARD"); //輸出狀態 前進
- digitalWrite(leftMotor1,HIGH );
- digitalWrite(leftMotor2,LOW );
- digitalWrite(rightMotor1,LOW );
- digitalWrite(rightMotor2,HIGH );
- break;
- case BACKWARD:
- Serial.println("BACKWARD"); //輸出狀態 后退
- digitalWrite(leftMotor1,LOW);
- digitalWrite(leftMotor2,HIGH);
- digitalWrite(rightMotor1,HIGH);
- digitalWrite(rightMotor2,LOW);
- break;
- case TURNLEFT:
- Serial.println("TURN LEFT"); //輸出狀態 左轉
- digitalWrite(leftMotor1, LOW);
- digitalWrite(leftMotor2, HIGH);
- digitalWrite(rightMotor1, LOW);
- digitalWrite(rightMotor2, HIGH);
- break;
- case TURNRIGHT:
- Serial.println("TURN RIGHT"); //輸出狀態右轉
- digitalWrite(leftMotor1, HIGH);
- digitalWrite(leftMotor2, LOW);
- digitalWrite(rightMotor1, HIGH);
- digitalWrite(rightMotor2, LOW);
- break;
- default:
- Serial.println("STOP"); //輸出狀態 停止
- digitalWrite(leftMotor1, LOW);
- digitalWrite(leftMotor2, LOW);
- digitalWrite(rightMotor1, LOW);
- digitalWrite(rightMotor2, LOW);
- }
- }
- float Distance_test()
- {
- digitalWrite(Trig,LOW); //產生一個10US的高脈沖去觸發Trigpin
- delayMicroseconds(2);
- digitalWrite(Trig,HIGH);
- delayMicroseconds(10);
- digitalWrite(Trig,LOW);
- float distance = pulseIn(Echo,HIGH);
- Distance = distance/58;
- return Distance;
- }
- void loop()
- {
-
- Distance_test();
- Serial.println(Distance);
- if(Distance > 20 )
- {
- tracing();
- }
- else if(Distance < 20 )
- {
- motorRun(STOP,0);
- delay(900);
- motorRun(BACKWARD,60);
- delay(200);
- motorRun(STOP,0);
- delay(900);
- motorRun(TURNLEFT,80);
- delay(800);
- motorRun(STOP,0);
- delay(900);
- motorRun(FORWARD,60);
- delay(700);
- motorRuin(STOP,0);
- delay(900);
- motorRun(TURNRIGHT,80);
- delay(800);
- motorRun(FORWARD,60);
- delay(1100);
- motorRun(STOP,0);
- delay(900);
- motorRun(TURNRIGHT,70);
- delay(600);
- motorRun(FORWARD,60);
- delay(600);
- }
- }
- void tracing()
- {
- int r,m,l;
- r=digitalRead(IRR);
- m=digitalRead(IRM);
- l=digitalRead(IRL);
- if(l==HIGH && m==HIGH && r== HIGH){
- motorRun(FORWARD,60);
- }
-
- if(l==LOW &&m==LOW && r== LOW){
- motorRun(FORWARD,60); //如果刪掉forward和delay,在三岔路口小車可能會左右來回“抽風”,讀者可以去掉嘗試一下。
- delay(20);
- motorRun(TURNRIGHT,90);
- // motorRun(TURNRIGHT,90);
- }
- if(l==LOW &&m==HIGH && r==LOW){
- motorRun(FORWARD,60);
- }
- else if(l==LOW &&m==HIGH && r==HIGH){
- motorRun(TURNRIGHT,90);
- }
- else if(l==HIGH &&m==HIGH && r==LOW){
- motorRun(TURNLEFT,90);}
- else if(l==HIGH && m==LOW && r==LOW){
- motorRun(TURNLEFT,90);}
- else if(l==LOW && m==LOW && r==HIGH){
- motorRun(TURNRIGHT,90);}
- else if(l==HIGH && m==LOW && r==HIGH){
- motorRun(TURNRIGHT,90);}
- }
復制代碼
|