Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков
Компоненты и материалы
| Arduino UNO | 1 |
| Motor Control Shield (шIELD управления двигателями) | 1 |
| Микросервопривод SG90 | 1 |
| DC-двигатель 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 мкм). Работает от 5В DC.
- Ультразвуковой датчик HC-SR04 — детектирование препятствий, аналоговые сигналы на Arduino.
- Arduino запрограммирован на автоматическое маневрирование при обнаружении препятствий и передачу данных о людях в центр управления через Bluetooth.
- Данные принимаются на базовой станции (Control Center), анализируются, спасательная команда принимает решения.
Код
#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
- Блок-схема алгоритма работы системы
Производственный процесс
- Интеграция Microsoft Kinect с Raspberry Pi для детекции людей в реальном времени на роботе Sonbi
- Интерактивная кукла «Игра в кальмара» на Arduino UNO: DIY-проект
- Передача данных температуры и влажности между двумя Arduino через Firebase
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Надежный ИК-датчик пульса на Arduino: пошаговое руководство
- Android-управляемая робот-платформа на Raspberry Pi и Motor Shield
- Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
- Веб-сервер на Arduino Uno WiFi: управление LED через браузер
- Система мониторинга лесных пожаров в реальном времени с SMS-уведомлениями
- Подключение датчика пульса MAX30100 к Arduino: Пошаговое руководство