亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南

组件与物料

Arduino UNO ×1
电机驱动扩展板 ×1
SG90 微型舵机 ×1
12V 直流减速电机 ×4
超声波测距模块 HC-SR04 ×1
DHT11 温湿度传感器 (4针) ×1
9V 电池 ×1
杜邦线 (若干) ×1
PIR 人体红外传感器 (7米) ×1

所需工具

应用与在线服务

项目简介

本系统设计一款基于 Arduino 的移动救援机器人,用于地震、洪水等自然灾害中被困人员的搜救。系统能实时、准确地将灾区地下区域的人员动态情况传回控制中心,使专家救援队和医生能在几秒内到达受害者位置进行初步救治并转移至安全地带或医院。整个过程由 Arduino 单元控制,响应迅速。

PIR 传感器 是无源红外传感器,通过检测周围物体发出的红外辐射 (热量) 变化来感知人体移动。人体辐射峰值波长约 10 微米,PIR 传感器接收并处理该信号以检测人员。工作电压 5V DC。通过监测周围红外模式的突变来判断人体运动。

超声波避障传感器 检测障碍物并将模拟信号送至 Arduino。Arduino 根据障碍物情况自动控制机器人行进,并通过蓝牙技术将人员信息发送至远程控制中心 (基站)。救援队分析数据后采取相应救援行动。

基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南
基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南

代码

Human Detection.ino (Arduino)
#include <NewPing.h>
#include <AFMotor.h>
#include <Servo.h>

#define TRIG_PIN A0
#define ECHO_PIN A1
#define MAX_DISTANCE 400
#define MAX_SPEED 255
#define MAX_SPEED_OFFSET -8
#define COLL_DIST 20
#define TURN_DIST COLL_DIST + 10
#define ACT_TIME 250

int calibrationTime = 30;
long unsigned int lowIn;
long unsigned int pause = 5000;
boolean lockLow = true;
boolean takeLowTime;
int pirPin = A3;
int ledPin = A2;

NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
AF_DCMotor motorR(1, MOTOR12_1KHZ);
AF_DCMotor motorL(4, MOTOR12_1KHZ);
Servo myservo;

String motorSet = "";
int curDist = 0, pos, speedSet = 0;

void setup() {
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);
  Serial.print("calibrating sensor ");
  for (int i = 0; i < calibrationTime; i++) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println(" done");
  Serial.println("SENSOR ACTIVE");
  delay(50);
  myservo.attach(9);
  myservo.write(90);
  delay(2000);
  motorSet = "FORWARD";
  moveForward();
}

void loop() {
  checkPath();
  if (digitalRead(pirPin) == HIGH) {
    digitalWrite(ledPin, HIGH);
    if (lockLow) {
      lockLow = false;
      Serial.println("---");
      Serial.print("motion detected at ");
      Serial.print(millis() / 1000);
      Serial.println(" sec");
      delay(50);
    }
    takeLowTime = true;
  }
  if (digitalRead(pirPin) == LOW) {
    digitalWrite(ledPin, LOW);
    if (takeLowTime) {
      lowIn = millis();
      takeLowTime = false;
    }
    if (!lockLow && millis() - lowIn > pause) {
      lockLow = true;
      Serial.print("motion ended at ");
      Serial.print((millis() - pause) / 1000);
      Serial.println(" sec");
      delay(50);
    }
  }
}

void checkPath() {
  int curLeft = 0, curRight = 0, curFront = 0;
  curDist = 0;
  checkForward();
  myservo.write(135);
  delay(100);
  for (pos = 135; pos >= 45; pos -= 45) {
    myservo.write(pos);
    delay(170);
    curDist = readPing();
    if (curDist < COLL_DIST) { checkCourse(); break; }
    if (curDist < TURN_DIST) { changePath(); }
  }
}

int readPing() {
  int cm = 0;
  while (cm < 2) {
    int uS = sonar.ping();
    cm = uS / US_ROUNDTRIP_CM;
  }
  return cm;
}

void checkForward() {
  if (motorSet == "FORWARD") {
    motorR.run(FORWARD);
    motorL.run(FORWARD);
  }
}

void changePath() {
  if (pos < 90) veerLeft();
  if (pos > 90) veerRight();
}

void veerRight() {
  motorR.run(BACKWARD);
  motorL.run(FORWARD);
  delay(ACT_TIME);
  motorR.run(FORWARD);
  motorL.run(FORWARD);
  motorSet = "FORWARD";
}

void veerLeft() {
  motorL.run(BACKWARD);
  motorR.run(FORWARD);
  delay(ACT_TIME);
  motorL.run(FORWARD);
  motorR.run(FORWARD);
  motorSet = "FORWARD";
}

void checkCourse() {
  moveBackward();
  delay(ACT_TIME);
  moveStop();
  setCourse();
}

void setCourse() {
  if (pos < 90) turnRight();
  if (pos > 90) turnLeft();
}

void moveBackward() {
  motorSet = "BACKWARD";
  motorR.run(BACKWARD);
  motorL.run(BACKWARD);
  for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) {
    motorL.setSpeed(speedSet);
    motorR.setSpeed(speedSet + MAX_SPEED_OFFSET);
    delay(5);
  }
}

void moveForward() {
  motorSet = "FORWARD";
  checkForward();
  for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) {
    motorL.setSpeed(speedSet);
    motorR.setSpeed(speedSet + MAX_SPEED_OFFSET);
    delay(4);
  }
}

void moveStop() {
  motorR.run(RELEASE);
  motorL.run(RELEASE);
}

void turnRight() {
  motorSet = "RIGHT";
  motorR.run(FORWARD);
  motorL.run(BACKWARD);
  delay(ACT_TIME);
  motorSet = "FORWARD";
  checkForward();
}

void turnLeft() {
  motorSet = "LEFT";
  motorR.run(BACKWARD);
  motorL.run(FORWARD);
  delay(ACT_TIME);
  motorSet = "FORWARD";
  checkForward();
}

原理图

传感器与 Arduino 接口框图

基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南

各传感器与 Arduino Uno 连接电路图

基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南

系统工作流程图

基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南

制造工艺

  1. 在 Sonbi 机器人上集成 Microsoft Kinect 与树莓派实现实时人体检测
  2. 自制《鱿鱼游戏》主题互动娃娃——Arduino UNO DIY项目
  3. 两块 Arduino 通过 Firebase 传递温湿度数据
  4. 基于 Arduino 与 Python 的可靠 RFID 考勤系统
  5. Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
  6. Android 手势遥控车:Raspberry Pi + Arduino 101 + 电机扩展板,I2T 协同控制
  7. 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
  8. Arduino Uno WiFi 网页服务器:通过浏览器控制 LED 开关
  9. 实时森林火灾监测系统:短信报警方案
  10. MAX30100脉搏血氧传感器与Arduino接入指南:获取PPG波形与SpO2
  11. 分步指南:将 YL-39/YL-69 土壤湿度传感器连接到 Arduino UNO
  12. 构建基于 PHP 的 Web 界面控制 Arduino Uno