本小车基于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);}
- }
复制代码
|