Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Робот для поиска людей на базе 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 для своевременной помощи людям, застрявшим при стихийных бедствиях (землетрясения, наводнения и т.д.). Робот передаёт динамическую информацию о людях в подземных зонах в центр управления, чтобы спасательные бригады могли оказать первую помощь и эвакуировать жертв. Весь процесс занимает секунды благодаря управлению Arduino.

Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков
Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков

Принцип работы:

Код

#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();
}

Схемы

Производственный процесс

  1. Интеграция Microsoft Kinect с Raspberry Pi для детекции людей в реальном времени на роботе Sonbi
  2. Интерактивная кукла «Игра в кальмара» на Arduino UNO: DIY-проект
  3. Передача данных температуры и влажности между двумя Arduino через Firebase
  4. Надежная система учета рабочего времени на Arduino с RFID и Python
  5. Надежный ИК-датчик пульса на Arduino: пошаговое руководство
  6. Android-управляемая робот-платформа на Raspberry Pi и Motor Shield
  7. Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
  8. Веб-сервер на Arduino Uno WiFi: управление LED через браузер
  9. Система мониторинга лесных пожаров в реальном времени с SMS-уведомлениями
  10. Подключение датчика пульса MAX30100 к Arduino: Пошаговое руководство