Проблемы с срабатыванием датчика 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 секунд), а чувствительность установлена на полную.
Я приветствую любой вклад или какие бы то ни было предложения. Если вы хотите, чтобы я предоставил какую-либо дополнительную информацию об этом проекте, пожалуйста, спросите, и я это сделаю.
@Imayan, 👍2
Обсуждение1 ответ
Пытаться:
- выключайте датчик, когда робот движется
- включите датчик, пока робот стоит на месте
- поищи какую - нибудь добычу
- повторите с 1 раза
Та же схема применяется при вращении :
- поверните на какой-нибудь угол,
- остановить вращение
- обнаружить
xD Мне тоже было интересно об этом, но я только думал, еще не реализовано!
Я думаю, что лучше всего просто, но что-то продвинутое с более быстрой реакцией было бы лучше!
Не могли бы вы отредактировать этот ответ, чтобы в нем использовалась правильная грамматика? В настоящее время трудно понять, что вы пытаетесь сказать., @The Guy with The Hat
- Объединение кода для нескольких датчиков в одной программе
- Использование аналогового входа для чтения кнопки
- Преобразование строки в массив символов
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- (Код ультразвукового датчика: такого файла или каталога нет)
- Несколько неблокирующих таймеров обратного отсчета?
- Датчик HC-SR505 PIR выдает только HIGH уровень
**http://arduinoprosto.ru/q/9965/detect-movement-on-moving-robot-pir-sensor** Вероятно, ответ на ваш другой вопрос также ответит на этот вопрос., @Paul