极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26050|回复: 7

求助,3个超声波的避障小车,只有中间的超声波起作用

[复制链接]
发表于 2017-10-10 14:13:03 | 显示全部楼层 |阅读模式
目前车子情况:能正常跑,但是只有中间的超声波有效果,2侧的都无效,也可以理解为IO 接口只有8和9有效。
我把3个超声波的VCC都接到了一起,接入板子的5V;把超声波GND也接到了一起,接入板子的GND; TRIGPIN 和ECHOPIN 都是按照程序上的接口接的,不会有错。

超声波接线:
  1. #define TRIGPIN_LEFT 10
  2. #define ECHOPIN_LEFT 11                  //左侧超声波
  3. #define TRIGPIN_MID 8
  4. #define ECHOPIN_MID 9                          //中间超声波
  5. #define TRIGPIN_RIGHT 12
  6. #define ECHOPIN_RIGHT 13                  //右侧超声
复制代码



主控:Arduino UNO R3
电机控制板:L298N
小车配置:两个直流电机控制左右各一个电机,后面带一个万向轮
供电:
4节5号电池 给L298N
一个9V电池给 UNO R3
传感器:左、中、右共3个HC SR04超声波传感器,分别检测来自左前方、前方、右前方的障碍

一下是复制来的程序:

  1. #include "Arduino.h"

  2. class Detector {                                //HC SR04超声波传感器封装
  3.   private:
  4.     uint8_t _trigPin, _echoPin;
  5.   public:
  6.     float _dangerDistance;
  7.     bool _state = false;                //危险状态标记(单次)
  8.     bool _stateAve = false;              //危险状态标记(多次)
  9.     //构造函数,初始化超声波测距传感器,缺省危险距离为30cm
  10.     Detector(uint8_t trigPin, uint8_t echoPin, float dangerDistance = 30.0)        {
  11.       _trigPin = trigPin;
  12.       _echoPin = echoPin;
  13.       _dangerDistance = dangerDistance;
  14.       pinMode(_trigPin, OUTPUT);
  15.       pinMode(_echoPin, INPUT);
  16.     }
  17.     void setDangerDistance(float dangerDistance) {
  18.       _dangerDistance = dangerDistance;
  19.     }
  20.     float distance() { //一次取样获取距离参数
  21.       digitalWrite(_trigPin, LOW);
  22.       delayMicroseconds(2);
  23.       digitalWrite(_trigPin, HIGH);
  24.       delayMicroseconds(10);
  25.       digitalWrite(_trigPin, LOW);
  26.       float dist = pulseIn(_echoPin, HIGH) / 58.0;
  27.       if (dist < _dangerDistance)
  28.         _state = true;
  29.       else
  30.         _state = false;
  31.       return dist;
  32.     }
  33.     float distanceAve(uint8_t n = 5) { //n次取样后取平均值,缺省5次
  34.       float distTemp[n];
  35.       float sum = 0;
  36.       for (int i = 0; i < n; i++) {
  37.         distTemp[i] = distance();
  38.         sum += distTemp[i];
  39.         delay(5); //间隔5ms取样一次,共n次
  40.       }
  41.       float dist = sum / n;
  42.       if (dist < _dangerDistance)
  43.         _stateAve = true;
  44.       else
  45.         _stateAve = false;
  46.       return sum / n;
  47.     }

  48. };

  49. #define TRIGPIN_LEFT 10
  50. #define ECHOPIN_LEFT 11                  //左侧超声波
  51. #define DANGERDISTANCE_LEFT 24.0    //设定左侧危险距离
  52. #define TRIGPIN_MID 8
  53. #define ECHOPIN_MID 9                          //中间超声波
  54. #define DANGERDISTANCE_MID 28.0     //设定中间危险距离
  55. #define TRIGPIN_RIGHT 12
  56. #define ECHOPIN_RIGHT 13                  //右侧超声波
  57. #define DANGERDISTANCE_RIGHT 24.0   //设定右侧危险距离
  58. Detector sensorMid(TRIGPIN_MID, ECHOPIN_MID, DANGERDISTANCE_MID);
  59. Detector sensorLeft(TRIGPIN_LEFT, ECHOPIN_LEFT, DANGERDISTANCE_LEFT);
  60. Detector sensorRight(TRIGPIN_RIGHT, ECHOPIN_RIGHT, DANGERDISTANCE_RIGHT);

  61. //------------------------------------------------------------------------------------------------------------
  62. class Car {
  63.   private:
  64.     uint8_t _ENL, _L1, _L2, _Lspeed;
  65.     //ENL/L1/L2分別為左輪PWM使能和2個正負方向調節參數,_Lspeed为左轮速度
  66.     uint8_t _ENR, _R1, _R2, _Rspeed;
  67.     //ENR/R1/R2分別為右輪PWM使能和2個正負方向調節參數,_Rspeed为右轮速度

  68.   public:
  69.     //构造函数,小车初始化,并且停止不动
  70.     Car(uint8_t ENL, uint8_t L1, uint8_t L2, uint8_t Lspeed,
  71.         uint8_t ENR, uint8_t R1, uint8_t R2, uint8_t Rspeed) {
  72.       //定义各针脚
  73.       _ENL = ENL;        _L1 = L1; _L2 = L2;        _Lspeed = Lspeed;
  74.       _ENR = ENR;        _R1 = R1; _R2 = R2;        _Rspeed = Rspeed;

  75.       onForward = 0;

  76.       pinMode(_ENL, OUTPUT); pinMode(_L1, OUTPUT); pinMode(_L2, OUTPUT);
  77.       pinMode(_ENR, OUTPUT); pinMode(_R1, OUTPUT); pinMode(_R2, OUTPUT);

  78.       analogWrite(_ENL, 0);
  79.       analogWrite(_ENR, 0);
  80.     }

  81.     void forward(int interval = 0) {
  82.       analogWrite(_ENL, _Lspeed);
  83.       digitalWrite(_L1, HIGH);
  84.       digitalWrite(_L2, LOW);
  85.       analogWrite(_ENR, _Rspeed);
  86.       digitalWrite(_R1, HIGH);
  87.       digitalWrite(_R2, LOW);
  88.       delay(interval);
  89.       onForward();
  90.     }
  91.     void backward(int interval = 500) {
  92.       analogWrite(_ENL, 255);
  93.       digitalWrite(_L1, LOW);
  94.       digitalWrite(_L2, HIGH);
  95.       analogWrite(_ENR, 255);
  96.       digitalWrite(_R1, LOW);
  97.       digitalWrite(_R2, HIGH);
  98.       delay(interval);
  99.     }
  100.     void leftForward(int interval = 250) {
  101.       analogWrite(_ENL, 0);
  102.       analogWrite(_ENR, 255);
  103.       digitalWrite(_R1, HIGH);
  104.       digitalWrite(_R2, LOW);
  105.       delay(interval);
  106.     }
  107.     void rightForward(int interval = 250) {
  108.       analogWrite(_ENL, 255);
  109.       digitalWrite(_L1, HIGH);
  110.       digitalWrite(_L2, LOW);
  111.       analogWrite(_ENR, 0);
  112.       delay(interval);
  113.     }
  114.     void leftRotate(int interval = 500) {
  115.       analogWrite(_ENL, 255);
  116.       digitalWrite(_L1, LOW);
  117.       digitalWrite(_L2, HIGH);
  118.       analogWrite(_ENR, 255);
  119.       digitalWrite(_R1, HIGH);
  120.       digitalWrite(_R2, LOW);
  121.       delay(interval);
  122.     }
  123.     void rightRotate(int interval = 500) {
  124.       analogWrite(_ENL, 255);
  125.       digitalWrite(_L1, HIGH);
  126.       digitalWrite(_L2, LOW);
  127.       analogWrite(_ENR, 255);
  128.       digitalWrite(_R1, LOW);
  129.       digitalWrite(_R2, HIGH);
  130.       delay(interval);
  131.     }
  132.     void stop(int interval = 10) {
  133.       analogWrite(_ENL, 0);
  134.       analogWrite(_ENR, 0);
  135.     }

  136.     //event
  137.     void (*onForward)();
  138. };

  139. #define ENL 3
  140. #define L1 2
  141. #define L2 4
  142. #define LSPEED 188                        //左侧电机
  143. #define ENR 5
  144. #define R1 6
  145. #define R2 7
  146. #define RSPEED 215                        //右侧电机

  147. Car thisCar(ENL, L1, L2, LSPEED, ENR, R1, R2, RSPEED);

  148. void onForward_do() {
  149.   float distLeft = sensorLeft.distanceAve(3);
  150.   bool stateLeft = sensorLeft._stateAve;
  151.   float distMid = sensorMid.distanceAve(3);
  152.   bool stateMid = sensorMid._stateAve;
  153.   float distRight = sensorRight.distanceAve(3);
  154.   bool stateRight = sensorRight._stateAve;
  155.   uint8_t state = (4 * stateLeft) + (2 * stateMid) + stateRight;
  156.   switch (state)
  157.   {
  158.     case 0x00 :                                        //000左中右无障碍,直行
  159.       break;
  160.     case 0x01 :                                        //001右侧障碍,左前方行驶
  161.       thisCar.leftForward();
  162.       break;
  163.     case 0x02 :                                        //010中间障碍,退后若干,挑左右两边较空旷方向行驶
  164.       thisCar.backward();
  165.       if (distLeft >= distRight)
  166.         thisCar.leftForward();
  167.       else
  168.         thisCar.rightForward();
  169.       break;
  170.     case 0x03 :                                        //011中右有障碍,后退若干,再左前方行驶
  171.       thisCar.backward();
  172.       thisCar.leftForward();
  173.       break;
  174.     case 0x04 :                                        //100左前方障碍,往右前方行驶
  175.       thisCar.rightForward();
  176.       break;
  177.     case 0x05 :                                        //101左右两侧有障碍,中间无障碍,不要进窄缝,转个圈圈往回走
  178.       thisCar.leftRotate();
  179.       break;
  180.     case 0x06 :                                        //110左中有障碍,后退若干,再右前方行驶
  181.       thisCar.backward();
  182.       thisCar.rightForward();
  183.       break;
  184.     case 0x07 :                                        //111左中右都是障碍,转个圈圈往回走
  185.       thisCar.rightRotate();
  186.       break;
  187.     default :
  188.       break;
  189.   }
  190. }
  191. //-------------------------------------------------------------------------------------------------------------
  192. void setup() {
  193.   Serial.begin(9600);
  194.   thisCar.onForward = onForward_do;
  195. }

  196. void loop() {
  197.   thisCar.forward();
  198. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2017-10-10 17:20:44 | 显示全部楼层
最好上一下实物图以及程序,以上看不出任何问题出在哪里
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-11 11:11:55 | 显示全部楼层
董董soul 发表于 2017-10-10 17:20
最好上一下实物图以及程序,以上看不出任何问题出在哪里

麻烦你再帮我看看,我资料重新整理了下。
谢谢
回复 支持 反对

使用道具 举报

发表于 2017-10-15 18:02:50 | 显示全部楼层
换个端口试试
回复 支持 反对

使用道具 举报

发表于 2017-10-17 15:09:31 | 显示全部楼层
上半年我作了一个用三个超声波探测距离的避障小车参赛,不过程序是用米思奇写的,这种句子还真看不懂
如你需要可加我QQ:37151169,我把他编泽成语句

回复 支持 反对

使用道具 举报

发表于 2017-10-18 01:44:26 | 显示全部楼层
感觉描述的不是很清楚,是超声波传感器没有输出,还是小车不闪避左右的障碍物?
建议先单独测试3个超声波传感器,排除下硬件问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 09:53:38 | 显示全部楼层
通幽境 发表于 2017-10-18 01:44
感觉描述的不是很清楚,是超声波传感器没有输出,还是小车不闪避左右的障碍物?
建议先单独测试3个超声波 ...

不是硬件问题,我现在3个超声波,直接接板子的5V,5V,3.3V,和板子的3个GND,居然2个5V的超声波可以运作。只剩余3.3V的不能运作。
所以超声波不能直接并联,并联后,只有一个有效。
但是不会解决这个问题。
回复 支持 反对

使用道具 举报

发表于 2017-10-18 13:53:55 | 显示全部楼层
marine77 发表于 2017-10-18 09:53
不是硬件问题,我现在3个超声波,直接接板子的5V,5V,3.3V,和板子的3个GND,居然2个5V的超声波可以运作。 ...

那就是说可以确定是软件问题,大致看了下代码,loop里是不是写错了? 改成thisCar.onForward();
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 16:14 , Processed in 0.041291 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表