人体感应追踪小车

新人帖
2016-4-5 13:44:47
39801
本帖最后由 dk99luo 于 2016-4-5 13:44 编辑

人体感应追踪小车

这里最关键的是用了两个人体感应传感器,充当小车的“眼”。先上个成品图。请忽略蓝牙模块,这是只是为了方便调试。
FlowingCar65.png FlowingCar67.png FlowingCar68.png
1.准备工作:
(1)Makeblock Starter遥控坦克机器人套件---三轮小车形态。原本使用的是坦克形态,但由于使用了坦克形态不够灵活,所以改用三轮小车。当然你也可以尝试用mbot小车(只是mbot比较小,把传感器架起来的话会不太稳)
FlowingCar191.png
(2)Makeblock 红外传感器,两个。
FlowingCar218.png

(3)支架
FlowingCar224.png FlowingCar227.png FlowingCar230.png
2.接线
如图示,46口接红外线传感器,8接超声波传感器(用来防止撞墙的)
FlowingCar274.png
FlowingCar276.png
3.原理
红外线传感器的探测角度为120度,如此,中间有60度探测盲区。当人处于此盲区时,小车保持直行。如果人在小车右120区域,小车右转,直到人体进入盲区,小车变成直行,靠近人体。相同地,人在左120区域时,小车左转,直到人体进入盲区,小车变成直行,靠近人体。
FlowingCar408.png
超声波传感器,设定距离少于15厘米时,小车后退,防止碰壁。这里超声波传感器有个小bug,就是当距离超过超声波传感器可测距离时,它的读数变成0。所以程序里加入了
distance = ultrasonic_8.distanceCm();
  if (distance < 3)
  {
    distance = 20;
  }
  delay(100 * 0.3);
  distance2 = ultrasonic_8.distanceCm();
  if (distance2 < 3)
  {
    distance2 = 20;
  }
这一段代码, 双重检测防止出错。


参考代码如下:
#include <Arduino.h>
#include <Wire.h>
#include <Servo.h>
#include <SoftwareSerial.h>
#include <Makeblock.h>


double angle_rad = PI / 180.0;
double angle_deg = 180.0 / PI;
double speed;
double distance;
double distance2;
bool people1;
bool people2;
MeUltrasonicSensor ultrasonic_8(PORT_8);
MePIRMotionSensor myPIRsensor_4(PORT_4);
MePIRMotionSensor myPIRsensor_6(PORT_6);
MeDCMotor motor_9(M1);
MeDCMotor motor_10(M2);



void setup() {
  speed = 200;
  distance = 0;
  distance2 = 0;
  people1 = false;
  people2 = false;
  //Serial.begin(9600);

}

void loop() {

  distance = ultrasonic_8.distanceCm();
  if (distance < 3)
  {
    distance = 20;
  }
  delay(100 * 0.3);
  distance2 = ultrasonic_8.distanceCm();
  if (distance2 < 3)
  {
    distance2 = 20;
  }
  people1 = myPIRsensor_4.isPeopleDetected();
  people2 = myPIRsensor_6.isPeopleDetected();

  if (1)
  {
    if ((((distance) > (15) || (distance2) > (15)) && ((((people1) == (false))) && (((people2) == (false))))) || (((distance) > (15)||(distance2) > (15)) && ((((people1) == (true))) && (((people2) == (true)))))) {
      motor_9.run(speed);
      motor_10.run(speed);
    } else {
      if ((distance) < (15)) {
         motor_9.run((speed) * (-1));
         motor_10.run((speed) * (-1));
         delay(1000 * 0.8);
      } else {
        if ((((people1) == (true))) & (((people2) == (false)))) {
          motor_10.run((150) * (-0.5));
          motor_9.run((150) * (0.5));
          delay(1000 * 0.1);
        }
        if ((((people1) == (false))) & (((people2) == (true)))) {
          motor_10.run((150) * (0.5));
          motor_9.run((150) * (-0.5));
          delay(1000 * 0.1);
        }
      }
    }
  }


}



4.缺点
A.最大的缺点就是只能有一个人在旁边,当人多了,它就不知道跟哪个人了。
B.当你站在它后面,它就一直往前走不会转过来找你了。
C.存在一些盲区,可能会被桌脚挡着走不动。
D.makeblock提供的红外线传感器应该叫做运动红外线传感器,就是说,要有人体运动它的值才会变成1,不动的话可能探测不到,所以请将传感器灵敏度调到最高。



收藏
1 条回帖
淡忘瞬间新手会员2016-11-28 13:46:32
人体感应 要是可以做到360度无死角就好了
需要登陆后才可进行回复 登录

返回顶部
现在加入我们,注册一个账号 账号登陆 QQ账号登陆 微博账号登陆