Несколько ультразвуковых датчиков с Arduino

Я пытаюсь создать робота, используя три ультразвуковых датчика HC-SR04 и мой Arduino Pro Mini, но у меня возникло несколько проблем. Вкратце функции робота заключаются в следующем:

  1. Робот двухколесный, каждое колесо приводится в движение Н-образным мостом (SN754410).
  2. На каждой стороне робота есть по одному датчику HC-SR04, левый активирует мотор левого колеса, когда обнаруживает руку перед ним, и наоборот для правой стороны.

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

  1. Третий 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» к светодиоду, этот контакт активируется датчиком, данные о расстоянии которого хранятся в переменной «сенсоры [0]». Однако после компиляции и загрузки кода я заметил, что светодиод просто слабо мигает, когда я кладу руку перед датчиком. Как будто светодиод включается и выключается очень быстро.

Выходные данные монитора последовательного порта выглядят следующим образом:

15
detected 
0
NA
16
detected
0
NA
14
detected

Как вы можете видеть, если положить руку примерно на 15 см перед датчиком, датчик вернет правильное расстояние, а вывод «ena1» будет установлен на высокий уровень (о чем свидетельствует вывод «обнаружено» на экран).

Однако датчик всегда возвращает значение «0» на следующей итерации основного цикла (пока моя рука все еще находится перед датчиком), впоследствии снова устанавливая вывод «ena1» на НИЗКИЙ, что может объяснить, почему светодиод горит. включается и выключается так быстро.

Я не уверен, почему это происходит ... Интересно, что, удалив строки digitalWrite из кода, датчик вернет правильные значения (т.е. нет значения «0», когда моя рука находится перед датчиком).

Есть идеи, как я могу это исправить?

Заранее спасибо!


person user7384236    schedule 06.01.2017    source источник


Ответы (1)


Это может быть аппаратная ошибка. Я видел случаи, когда, если контакты HC-SR04 были латунного (золотистого) цвета, датчик имел тенденцию выдавать 0 для расстояния.

Я предлагаю приобрести другой ультразвуковой датчик, желательно с большим количеством контактов серебристого цвета.

Хотя ваш код выглядит хорошо!

Удачи!

person Dat Ha    schedule 13.01.2017