开启左侧

自律小车-宇文小峰

[复制链接]
发表于 2017-10-26 13:14:15 | 显示全部楼层 |阅读模式
作品简介:

该作品主要由Arduino UNO、Arduino扩展板、超声波模块、红外测距模块、L298N电机驱动模块、舵机、电机等组成。

作品功能:

在有障碍物的家庭、办公环境中自由穿梭,自动避障。

作品照片

  1. //在原有超声感应基础上加入红外测距模块
  2. #include <Servo.h> //舵机库
  3. Servo myservo; //舵机
  4. const int Sonar_TrigPin=10; //超声波触发引脚
  5. const int Sonar_EchoPin=11; //接受超声传感器返回数据引脚
  6. const int leftPin1=8; //AIN1
  7. const int leftPin2=7; //AIN2
  8. const int rightPin3=4; //BIN1
  9. const int rightPin4=3; //BIN2
  10. const int leftSpeed=6; //控制左侧时速
  11. const int rightSpeed=5;//控制右侧时速
  12. const int SpeedPWM=100;//PWM速度设定值
  13. const int LeftValue = 13; //红外模块(左)
  14. const int RightValue = 12;//红外模块(有)
  15. //int delayTime= 500; //行走动作延时
  16. int Measure_DisTance();//超声波测距函数,隶属于Look_Around()函数
  17. char Look_Around();//舵机控制超声波测距传感器,0-90-180度测距

  18. void setup()
  19. {
  20.         myservo.attach(9); //舵机端口9
  21.         pinMode(leftPin1, OUTPUT);
  22.         pinMode(leftPin2, OUTPUT);
  23.         pinMode(rightPin3, OUTPUT);
  24.         pinMode(rightPin4, OUTPUT);
  25.         analogWrite(leftSpeed,SpeedPWM);//左侧行走速度
  26.         analogWrite(rightSpeed, SpeedPWM);//右侧行走速度
  27.         pinMode(Sonar_TrigPin, OUTPUT);//超声波触发引脚
  28.         pinMode(Sonar_EchoPin, INPUT);//接受超声传感器返回数据引脚
  29.         pinMode(LeftValue, INPUT);//接收小车左侧红外信号
  30.         pinMode(RightValue, INPUT);//接收小车右侧红外信号
  31.         Serial.begin(9600);//debug
  32. }
  33. //超声波测距函数,函数返回值是距离,隶属于Look_Around()函数
  34. int Measure_DisTance(){
  35.         digitalWrite(Sonar_TrigPin,LOW);//声纳触发引脚拉低电平
  36.         delayMicroseconds(2);// 低电平保持2ms
  37.         digitalWrite(Sonar_TrigPin, HIGH);//高电平触发声纳传感器工作
  38.         delayMicroseconds(10);//高电平保持10ms
  39.         digitalWrite(Sonar_TrigPin, LOW);//触发引脚复位
  40.         return pulseIn(Sonar_EchoPin, HIGH)/58 ;//函数返回超声波测得距离数据
  41. }
  42. //舵机控制超声波传感器旋转测距0-180度
  43. char Look_Around(){
  44.         int R,L;//声明左右两侧距离的数据
  45.         myservo.write(0);//右转头
  46.         delay(1000);//延时等待舵机旋转的时间
  47.         R=Measure_DisTance();//调用测距函数返回数值给R
  48.         Serial.print("R:");Serial.println(R);//debug
  49.         myservo.write(180);//左转头
  50.         delay(1000);//延时等待舵机旋转的时间
  51.         L=Measure_DisTance();//调用测距函数返回数值给L
  52.         Serial.print("L:");Serial.println(L);//debug
  53.         myservo.write(90);//声纳传感器头朝前
  54.         if((R>L) && (R>25))//如果右侧距离>左侧距离(&&同时满足)右侧距离>25cm
  55.         return 'R';        //函数返回字符'R'
  56.         else if((R<L) && (L>25))//如果右侧距离<左侧距离(&&同时满足)左侧距离>25cm
  57.         return 'L';        //函数返回字符'L'
  58.         else return 'N';   //以上都不符合,返回空'N'
  59. }
  60. void loop()
  61. {
  62.         //同时满足(前方距离>20cm)&&(左侧红外无障碍)&&(右侧红外无障碍),方可前行
  63.         if((Measure_DisTance()>20)&&(digitalRead(LeftValue)==HIGH)&&(digitalRead(RightValue)==HIGH))
  64.         forward();//直行
  65.         else{     //如不满足前行条件
  66.                 pasue();//刹车停止
  67.                 switch (Look_Around()) { //调用Look_Around()函数环顾四周采集距离信息
  68.                         case 'R':            //Look_Around()函数如果返回'R',证明右侧可以通行
  69.                         rotateRight();delay(1000);//原地右转,延时1s用于完成转向过程
  70.                         Serial.println("Rreceive");//debug
  71.                         break;
  72.                         case 'L':           //Look_Around()函数如果返回'L',证明左侧可以通行
  73.                         rotateLeft(); delay(1000);//原地左转,延时1s用于完成转向过程
  74.                         Serial.println("Lreceive");//debug
  75.                         break;
  76.                         default:            //如果Look_Around()函数返回值不满足以上两个case,有可能左右相等;有可能左右两侧都小于20cm
  77.                         backward(); delay(22000);//倒车,延时2s完成倒车
  78.                         break;
  79.                 }
  80.         }
  81.         
  82. }
  83. //前行函数
  84. void forward(){
  85.         digitalWrite(leftPin1, 1);
  86.         digitalWrite(leftPin2, 0);
  87.         digitalWrite(rightPin3, 1);
  88.         digitalWrite(rightPin4, 0);
  89. }
  90. //倒车函数
  91. void backward(){
  92.         digitalWrite(leftPin1, 0);
  93.         digitalWrite(leftPin2, 1);
  94.         digitalWrite(rightPin3, 0);
  95.         digitalWrite(rightPin4, 1);
  96. }
  97. //右转
  98. void turnRight(){
  99.         digitalWrite(leftPin1, 0);
  100.         digitalWrite(leftPin2, 0);
  101.         digitalWrite(rightPin3, 1);
  102.         digitalWrite(rightPin4, 0);
  103. }
  104. //左转
  105. void turnLeft(){
  106.         digitalWrite(leftPin1, 1);
  107.         digitalWrite(leftPin2, 0);
  108.         digitalWrite(rightPin3, 0);
  109.         digitalWrite(rightPin4, 0);
  110. }
  111. //原地左转
  112. void rotateLeft(){
  113.         digitalWrite(leftPin1, 0);
  114.         digitalWrite(leftPin2, 1);
  115.         digitalWrite(rightPin3, 1);
  116.         digitalWrite(rightPin4, 0);
  117. }
  118. //原地右转
  119. void rotateRight(){
  120.         digitalWrite(leftPin1, 1);
  121.         digitalWrite(leftPin2, 0);
  122.         digitalWrite(rightPin3, 0);
  123.         digitalWrite(rightPin4, 1);
  124. }
  125. //停车
  126. void pasue(){
  127.         digitalWrite(leftPin1, 0);
  128.         digitalWrite(leftPin2, 0);
  129.         digitalWrite(rightPin3, 0);
  130.         digitalWrite(rightPin4, 0);
  131. }
复制代码


控制系统

控制系统

传感器布局

传感器布局

52e2d0006e60807f0c4f4a469fee0f30.mp4

12.53 MB, 下载次数: 0

实际避障行走

Homework_Ira.ino

4.63 KB, 下载次数: 0

源代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩课程推荐

关于我们

帮助中心

商务合作

点击这里给我发消息

关注微信公众号

Copyright © 2016-2017 i创学院 - 上海享渔教育科技有限公司 Powered by Discuz!     ( 沪ICP备16033954号-1 )