Проблемы с срабатыванием датчика PIR сами по себе

В настоящее время я работаю над своим первым проектом Arduino, и у меня возникли некоторые проблемы, с которыми я ищу помощи. Робот, которого я создаю, должен обладать возможностями слежения за человеком, и для этого я использую 3 датчика PIR (один спереди, один слева и один справа) и ультразвуковой датчик, чтобы робот не врезался в стену или человека, за которым он следует. Для работы с двигателями я использую моторный щит Adafruit (V. 1).

Я пытаюсь сделать так, чтобы это сработало следующим образом.

Основной датчик PIR робота-это датчик, прикрепленный спереди. Если этот датчик показывает ВЫСОКОЕ значение, робот будет двигаться вперед, проверяя расстояние до любых объектов перед ним, и в этом случае он останавливается и разворачивается до тех пор, пока между ним и объектом впереди не останется по крайней мере 30 см пространства. Радиус действия этого датчика пришлось уменьшить так, чтобы он считывал ВЫСОКИЕ значения только в том случае, если человек находится точно перед роботом. Это было сделано с помощью картонной бумаги и черной клейкой ленты. Два изображения этого были предоставлены ниже на случай, если это как-то связано с моей проблемой.

Другие 2 датчика PIR, прикрепленные по бокам, сообщат роботу, следует ли ему повернуть налево или направо. Если сработает левый PIR, робот начнет поворачивать налево и будет продолжать делать это до тех пор, пока передний PIR, наконец, не достигнет МАКСИМУМА, а затем он двинется вперед. То же самое делается с правильным PIR, за исключением того, что он движется вправо. Эти датчики PIR обрабатываются с помощью прерываний на плате Arduino Mega 2560, как видно из предоставленного кода.

Код, который я использую, можно найти ниже:

#include <AFMotor.h>
#include <NewPing.h>

#define trigPin 34
#define echoPin 32

NewPing sonar(trigPin, echoPin);
int minimumDistance = 30;
int currentDistance = 0;

int calibrationTime = 60;
int redLED = 22;
int greenLED = 24;

int PIR = 26;
volatile int PIR_val = 0;
int PIR_left = 19; // (interrupt 4)
int PIR_right = 18; // (interrupt 5)

AF_DCMotor motorL(1, MOTOR12_64KHZ);
AF_DCMotor motorR(2, MOTOR12_64KHZ);

void setup()
{
  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);

  pinMode(PIR, INPUT);
  pinMode(PIR_left, INPUT);
  pinMode(PIR_right, INPUT);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  digitalWrite(redLED, HIGH);
  // Calibration for PIR sensors
  for (int i = 0; i < calibrationTime; i++)
  {
    delay(1000);
  }
  digitalWrite(redLED, LOW);
  digitalWrite(greenLED, HIGH);

  attachInterrupt(4, turnLeft, RISING);
  attachInterrupt(5, turnRight, RISING);
}

void loop()
{
  delay(50);
  currentDistance = sonar.ping_cm();

  if (currentDistance < minimumDistance && currentDistance > 0)
  {
    moveBackward();
  }
  else
  {
    PIR_val = digitalRead(PIR);

    if (PIR_val == HIGH)
    {
      moveForward();
    }
  }
}

void moveForward()
{
  motorL.run(FORWARD);
  motorL.setSpeed(180);
  motorR.run(FORWARD);
  motorR.setSpeed(200);
}

void moveBackward()
{
  motorL.run(RELEASE);
  motorR.run(RELEASE);
  motorL.run(BACKWARD);
  motorL.setSpeed(190);
  motorR.run(BACKWARD);
  motorR.setSpeed(225);

  while (currentDistance < 30 && currentDistance > 0)
  {
    currentDistance = sonar.ping_cm();
  }

  motorL.run(RELEASE);
  motorR.run(RELEASE);
}

void turnLeft()
{
  motorL.run(BACKWARD);
  motorL.setSpeed(150);
  motorR.run(FORWARD);
  motorR.setSpeed(150);

  // While front PIR is reading LOW
  while (PIR_val == LOW)
  {
    PIR_val = digitalRead(PIR);
  }
  // After front PIR reads HIGH
  moveForward();
}

void turnRight()
{
  motorR.run(BACKWARD);
  motorR.setSpeed(150);
  motorL.run(FORWARD);
  motorL.setSpeed(150);

  // While front PIR is reading low
  while (PIR_val == LOW)
  {
    PIR_val = digitalRead(PIR);
  }
  // After front PIR reads HIGH
  moveForward();
}

Первая проблема, с которой я сталкиваюсь, заключается в том, что, как только датчики PIR завершат калибровку, робот начнет двигаться вперед сам по себе. Даже если я оставлю робота одного в комнате с закрытой дверью, по истечении времени калибровки робот автоматически двинется вперед самостоятельно.

Другая проблема, с которой я сталкиваюсь, также связана с передним датчиком PIR. В то время как робот поворачивается и ищет человека, как показано в методах "Поворот влево ()" и " Поворот вправо ()", робот иногда движется вперед в случайном направлении, а не ко мне.

Я уже дважды пытался заменить передний датчик PIR, и сам датчик, похоже, не является проблемой.

Датчики PIR, которые я использую, являются моделью "HC-SR501". Для всех датчиков PIR время задержки установлено на минимально возможное время (5 секунд), а чувствительность установлена на полную.

Я приветствую любой вклад или какие бы то ни было предложения. Если вы хотите, чтобы я предоставил какую-либо дополнительную информацию об этом проекте, пожалуйста, спросите, и я это сделаю.

, 👍2

Обсуждение

**http://arduinoprosto.ru/q/9965/detect-movement-on-moving-robot-pir-sensor** Вероятно, ответ на ваш другой вопрос также ответит на этот вопрос., @Paul


1 ответ


0

Пытаться:

  • выключайте датчик, когда робот движется
  • включите датчик, пока робот стоит на месте
  • поищи какую - нибудь добычу
  • повторите с 1 раза

Та же схема применяется при вращении :

  • поверните на какой-нибудь угол,
  • остановить вращение
  • обнаружить

xD Мне тоже было интересно об этом, но я только думал, еще не реализовано!

Я думаю, что лучше всего просто, но что-то продвинутое с более быстрой реакцией было бы лучше!

,

Не могли бы вы отредактировать этот ответ, чтобы в нем использовалась правильная грамматика? В настоящее время трудно понять, что вы пытаетесь сказать., @The Guy with The Hat