基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南
组件与物料
| Arduino UNO | ×1 |
| 电机驱动扩展板 | ×1 |
| SG90 微型舵机 | ×1 |
| 12V 直流减速电机 | ×4 |
| 超声波测距模块 HC-SR04 | ×1 |
| DHT11 温湿度传感器 (4针) | ×1 |
| 9V 电池 | ×1 |
| 杜邦线 (若干) | ×1 |
| PIR 人体红外传感器 (7米) | ×1 |
所需工具
- 多功能螺丝刀
- 电烙铁
- 焊锡膏
- 无铅焊锡丝
- 热熔胶枪
应用与在线服务
- Arduino IDE
- Microsoft Windows 10
- Control Center Android App (手机控制端)
项目简介
本系统设计一款基于 Arduino 的移动救援机器人,用于地震、洪水等自然灾害中被困人员的搜救。系统能实时、准确地将灾区地下区域的人员动态情况传回控制中心,使专家救援队和医生能在几秒内到达受害者位置进行初步救治并转移至安全地带或医院。整个过程由 Arduino 单元控制,响应迅速。
PIR 传感器 是无源红外传感器,通过检测周围物体发出的红外辐射 (热量) 变化来感知人体移动。人体辐射峰值波长约 10 微米,PIR 传感器接收并处理该信号以检测人员。工作电压 5V DC。通过监测周围红外模式的突变来判断人体运动。
超声波避障传感器 检测障碍物并将模拟信号送至 Arduino。Arduino 根据障碍物情况自动控制机器人行进,并通过蓝牙技术将人员信息发送至远程控制中心 (基站)。救援队分析数据后采取相应救援行动。
代码
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 连接电路图
系统工作流程图
制造工艺
- 在 Sonbi 机器人上集成 Microsoft Kinect 与树莓派实现实时人体检测
- 自制《鱿鱼游戏》主题互动娃娃——Arduino UNO DIY项目
- 两块 Arduino 通过 Firebase 传递温湿度数据
- 基于 Arduino 与 Python 的可靠 RFID 考勤系统
- Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
- Android 手势遥控车:Raspberry Pi + Arduino 101 + 电机扩展板,I2T 协同控制
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- Arduino Uno WiFi 网页服务器:通过浏览器控制 LED 开关
- 实时森林火灾监测系统:短信报警方案
- MAX30100脉搏血氧传感器与Arduino接入指南:获取PPG波形与SpO2
- 分步指南:将 YL-39/YL-69 土壤湿度传感器连接到 Arduino UNO
- 构建基于 PHP 的 Web 界面控制 Arduino Uno