模块应用:Arduino避障小车

一直在熟悉Arduino周边的传感器,不过这应该是第一次将传感器应用到实践上。避障小车是arduino的入门作业,用到的传感器并不多,只是需要较强的动手能力。

材料清单

  1. Arduino UNO;
  2. 双驱小车底盘(带两个130电机和俩车轮);
  3. 双路H桥电机控制器
  4. 9g舵机;
  5. 超声波模块;
  6. 超声波模块固定支架;
  7. LED灯板;
  8. 红外避障传感器;
  9. 10K电位器;
  10. 小型继电器;
  11. 蓝牙模块;
  12. 9V电源×2;
  13. 稳压模;
  14. 迷你面包板;
  15. 面包线;
  16. M3铜柱;

小车拼装

买回来的小车底盘到手就后悔,当时考虑到四驱独立电机相同电压可能存在转速差走不了直线的问题,所以就买了双驱的,到手看到后面拖的那个万向轮真是惨不忍睹。感觉配重要是不平衡了分分钟翻车,所以还是推荐买四驱底盘,也就是多一个电机控制器和多十几行代码的事。

亚克力上面的不透明覆撕掉了,裸裸的镂空质感比较好看,然而后面就不想吐槽这块板子了,开口完全不准,传感器完全靠自己想办法往上固定,最后又看了看那个四驱的板子,孔位好像想要的都有。
比如这个鸡肋的舵机,硬生生是扎带固定上去的,而四驱的有舵机预留孔位。

舵机固定好以后,将超声波模块塞进传感器支架,然后用扎带将其固定在舵机的90度方向。
在舵机后方粘贴迷你面包板,方便蓝牙模块、继电器、电位器的连接;
依次连接固定电机控制器、车前LED灯板、后置红外避障模块。

模块应用:Arduino避障小车_第1张图片

关于供电方面,Arduino板和电机驱动板要独立供电,Arduino板接受的电压范围相对较宽(5-12V),所以一节9V电池给DC口供电刚好。而电机接受电压范围3-6V,考虑电机转速和扭矩,所以在底盘加上稳压模块,将9V降压到5-6V。

演示效果视频:
http://player.youku.com/embed/XMjc5NjU3NzkzMg==

源代码

#include 
//转向舵机
Servo head;
//超声波
const int Echo = A0;
const int Trig = A1;
//左路电机
const int IA1 = 4;
const int IB1 = 5;
//右路电机
const int IA2 = 6;
const int IB2 = 7;
//后置红外避障
const int MHsensor = 9;
int MHdata;
//LIGHT
const int JDQ = 11;
//初始化距离数据
float echoDistance;
int leftDistance = 0;
int rightDistance = 0;
int forwardDistance = 0;
int backDistance = 0;
//FLAG
int flag = 1;
void setup(){
  Serial.begin(9600);
  head.attach(8);
  pinMode(Trig,OUTPUT);
  pinMode(Echo,INPUT);
  pinMode(MHsensor,INPUT);
  pinMode(IA1,OUTPUT);
  pinMode(IB1,OUTPUT);
  pinMode(IA2,OUTPUT);
  pinMode(IB2,OUTPUT);
  pinMode(JDQ,OUTPUT);
  stop();
}
void loop(){
  while (Serial.available() > 0) {
      char inform=Serial.read();
      Serial.print("Bluetooth:");
      Serial.println(inform);
      if(inform == 's'){
        stop();
        flag = 1;
        }
      else if(inform == 'g'){
        flag = 0;
      }
      else if(inform == 'l'){
        digitalWrite(JDQ,HIGH);
      }
      else if(inform == 'c'){
        digitalWrite(JDQ,LOW);
      }
    }
    if(flag == 0){
      head.write(90);
      delay(500);
      forwardDistance = testDistance();
      if(forwardDistance<=40){
        stop();
        head.write(5);
        delay(500);
        leftDistance = testDistance();
        head.write(90);
        delay(500);
        head.write(175);
        delay(500);
        rightDistance = testDistance();
        head.write(90);
        if(leftDistance>rightDistance && leftDistance>40){
          turnLeft();
          delay(100);
        }
        else if(rightDistance>leftDistance && rightDistance>40){
          turnRight();
          delay(100);
        }
        else{
          //后置红外避障
          back();
          if(backTest()==0){
            forward();
          }
        }
      }
      else{
        forward();
      }
    }
}
int testDistance(){
  //激发超声波模块
  digitalWrite(Trig,LOW);
  delayMicroseconds(2);
  digitalWrite(Trig,HIGH);
  delayMicroseconds(20);
  digitalWrite(Trig,LOW);
  echoDistance = pulseIn(Echo,HIGH);
  echoDistance /= 58;
  return (int)echoDistance;
}
int backTest(){
  MHdata = digitalRead(MHsensor);
  return MHdata;
}
void forward(){
  digitalWrite(IA1,HIGH);
  digitalWrite(IB1,LOW);
  digitalWrite(IA2,HIGH);
  digitalWrite(IB2,LOW);
}
void turnLeft(){
  digitalWrite(IA1,LOW);
  digitalWrite(IB1,HIGH);
  digitalWrite(IA2,HIGH);
  digitalWrite(IB2,LOW);
}
void turnRight(){
  digitalWrite(IA1,HIGH);
  digitalWrite(IB1,LOW);
  digitalWrite(IA2,LOW);
  digitalWrite(IB2,HIGH);
}
void back(){
  digitalWrite(IA1,LOW);
  digitalWrite(IB1,HIGH);
  digitalWrite(IA2,LOW);
  digitalWrite(IB2,HIGH);
}
void stop(){
  digitalWrite(IA1,LOW);
  digitalWrite(IB1,LOW);
  digitalWrite(IA2,LOW);
  digitalWrite(IB2,LOW);  
}

你可能感兴趣的:(Arduino)