Несколько ультразвуковых датчиков с Arduino
Я пытаюсь создать робота, используя три ультразвуковых датчика HC-SR04 и мой Arduino Pro Mini, но столкнулся с несколькими проблемами. Короче говоря, функция робота заключается в следующем:
- Робот двухколесный, с H-мостом (SN754410), приводящим каждое колесо в движение.
- На каждой стороне робота есть один датчик HC-SR04, левый активирует левый мотор, когда обнаруживает руку перед ним, и наоборот для правой стороны.
То есть, чтобы заставить робота двигаться вперед, мы помещаем руки рядом с левой и правой стороной робота, чтобы он повернул направо, мы убираем правую руку и держим левую на месте, наоборот, для поворота влево и т. д.
- Третий HC-SR04 расположен сверху робота, так что он активирует третий двигатель, когда рука пользователя зависает над роботом.
Мой тестовый код выглядит следующим образом:
#include <NewPing.h>
#define SONAR_NUM 3 // Number of sensors.
#define MAX_DISTANCE 20 // Maximum distance (in cm) to ping.
NewPing sonar[SONAR_NUM] = { // Sensor object array.
NewPing(4, 5, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping.
NewPing(6, 7, MAX_DISTANCE),
NewPing(8, 9, MAX_DISTANCE)
};
#define ena1 10 //trigger for left motor H-bridge
//#define ena2 11 //trigger for right motor
//#define ena3 12 //for top motor
long sensors[3]; //array to store sensor distances
void setup() {
Serial.begin (115200);
pinMode(ena1, OUTPUT);
//pinMode(ena2, OUTPUT);
//pinMode(ena3, OUTPUT);
}
void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
sensors[i] = sonar[i].ping_cm();
}
Serial.println(sensors[0]);
if (sensors[0] > 0 && sensors[0] <= 20){
Serial.println("detected");
digitalWrite(ena1, HIGH);
}else{
Serial.println("NA");
digitalWrite(ena1,LOW);
}
}
Как вы можете видеть, я использую библиотеку NewPing.h для сбора данных датчика. После каждой итерации цикла for расстояния, обнаруженные датчиками, сохраняются в массиве датчиков. Когда рука находится на расстоянии 15-20 см от датчика, arduino отправляет цифровой триггерный сигнал "HIGH" на соответствующий H-мост, приводя в действие соответствующий двигатель (у меня только один из этих контактов, "ena1", включен в моем коде два других закомментированы для теста).
Чтобы проверить мой код, я просто подключил пусковой вывод H-моста "ena1" к светодиоду, этот вывод активируется датчиком, данные о расстоянии которого хранятся в переменной "sensor [0]". Однако после того, как я скомпилировал и загрузил свой код, я заметил, что светодиод просто слабо мерцает, когда я кладу руку перед датчиком. Как будто светодиод включается и выключается очень быстро.
Вывод с последовательного монитора выглядит следующим образом:
15
detected
0
NA
16
detected
0
NA
14
detected
Как вы можете видеть, поместив мою руку примерно на 15 см перед датчиком, датчик возвращает правильное расстояние, а вывод "ena1" установлен на высокое значение (о чем свидетельствует "обнаруженный" вывод на экран).
Однако датчик всегда возвращает значение "0" на следующей итерации основного цикла (в то время как моя рука все еще находится перед датчиком), впоследствии снова устанавливая вывод "ena1" на НИЗКИЙ, что может объяснить, почему светодиод Быстро включается и выключается.
Я не уверен, почему это происходит... Интересно, что, удаляя строки digitalWrite из кода, датчик возвращает правильные значения (т. Е. Значение "0", когда моя рука находится перед датчиком).
Любые идеи о том, как я могу это исправить?
Заранее спасибо!
1 ответ
Это может быть аппаратная ошибка. Я видел случаи, когда, если контакты HC-SR04 были медного (золотистого) цвета, датчик имел тенденцию выбрасывать 0 для расстояния.
Мое предложение состоит в том, чтобы получить другой ультразвуковой датчик, желательно с более серебристыми контактами.
Ваш код выглядит хорошо, хотя!
Удачи!