本小車基于Arduino uno開發(fā),循跡比較靈敏,避障部分只適合本人設(shè)計(jì)的特殊賽道。 設(shè)計(jì)智能小車首先應(yīng)該確定小車的基本結(jié)構(gòu),其主要包括以下幾個(gè)部分: (1)循跡模塊:指小車?yán)眉t外發(fā)射裝置發(fā)射紅外線后,照射物體表面返回量的多少來測(cè)定小車的具體的位置,以進(jìn)行循跡。 (2)電機(jī)驅(qū)動(dòng)模塊:指通過專用電路對(duì)電機(jī)進(jìn)行驅(qū)動(dòng),單片機(jī)給出控制信號(hào)通過L298驅(qū)動(dòng)電機(jī)正常運(yùn)轉(zhuǎn)。 (3)控制模塊:這是小車的控制中心,本設(shè)計(jì)采用Arduino系列單片機(jī) (4)電源模塊: 因設(shè)計(jì)需要,我們給小車單獨(dú)供電,設(shè)置獨(dú)立的電源模塊,使之穩(wěn)定運(yùn)行。 (5)超聲波避障模塊:本文使用Arduino連接 HC-SR04 超聲波測(cè)距傳感器,超聲波完成距離測(cè)定,并控制小車在前方障礙小于某一特定值時(shí),做出“停止”、“后退”等一系列動(dòng)作。 - #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調(diào)速)接
- int rightMotor1 =7;//定義I3接口
- int rightMotor2 =8;//定義I4接口
- int ENB=5;//定義EB(PWM調(diào)速)接口
- int IRR=14;//定義右側(cè)尋線傳感器接口
- int IRM=15;//定義中間尋線傳感器接口
- int IRL=16;//定義左側(cè)尋線傳感器接口
- 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); //設(shè)置PWM輸出,即設(shè)置速度
- analogWrite(ENB, value);
- switch(cmd){
- case FORWARD:
- Serial.println("FORWARD"); //輸出狀態(tài) 前進(jìn)
- digitalWrite(leftMotor1,HIGH );
- digitalWrite(leftMotor2,LOW );
- digitalWrite(rightMotor1,LOW );
- digitalWrite(rightMotor2,HIGH );
- break;
- case BACKWARD:
- Serial.println("BACKWARD"); //輸出狀態(tài) 后退
- digitalWrite(leftMotor1,LOW);
- digitalWrite(leftMotor2,HIGH);
- digitalWrite(rightMotor1,HIGH);
- digitalWrite(rightMotor2,LOW);
- break;
- case TURNLEFT:
- Serial.println("TURN LEFT"); //輸出狀態(tài) 左轉(zhuǎn)
- digitalWrite(leftMotor1, LOW);
- digitalWrite(leftMotor2, HIGH);
- digitalWrite(rightMotor1, LOW);
- digitalWrite(rightMotor2, HIGH);
- break;
- case TURNRIGHT:
- Serial.println("TURN RIGHT"); //輸出狀態(tài)右轉(zhuǎn)
- digitalWrite(leftMotor1, HIGH);
- digitalWrite(leftMotor2, LOW);
- digitalWrite(rightMotor1, HIGH);
- digitalWrite(rightMotor2, LOW);
- break;
- default:
- Serial.println("STOP"); //輸出狀態(tài) 停止
- digitalWrite(leftMotor1, LOW);
- digitalWrite(leftMotor2, LOW);
- digitalWrite(rightMotor1, LOW);
- digitalWrite(rightMotor2, LOW);
- }
- }
- float Distance_test()
- {
- digitalWrite(Trig,LOW); //產(chǎn)生一個(gè)10US的高脈沖去觸發(fā)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,在三岔路口小車可能會(huì)左右來回“抽風(fēng)”,讀者可以去掉嘗試一下。
- 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);}
- }
復(fù)制代碼
|