Анализ стандартного кода для датчиков YL-63, HC-SR04

22 мая 3:56

Анализ кода инфракрасного датчика YL-63

Проанализируем представленный стандартный код для инфракрасного датчика обнаружения препятствий YL-63:

IK.ino Исходный код

void setup(){

Serial.begin (9600);

pinMode (12, INPUT);

}

void loop(){

Serial.print (“Signaal: “);

Serial.println (digitalRead(12));

delay (500);

}

Проанализируем функцию void setup(), она отвечает за первоначальные настройки при подаче питания на МК. В ней содержатся в данном коде содержатся 2 строки:

Serial.begin (9600); – задающая скорость общения МК с компьютером в бодах, для данного случая 9600 бод.

pinMode (12, INPUT); – задающая 12 вывод на МК, как вход для данных.

В функции void setup() приведенном коде все довольно просто и не требует подробного описания.

Проанализируем функцию void loop(), она содержит в себе основной код программы и выполняется в бесконечном цикле. Функция содержит в себе:

Serial.print (“Signaal: “); — функция выводящее в окно общения с компьютером то что написано в “”. В данном случае выводится «Signaal:».

Serial.println (digitalRead(12)); — функция считывает показания с датчика и выводит их на экран. Отличие от предыдущей функции в том, что после вывода будет осуществлен переход на следующую строку.

delay (500); — функция осуществляет задержку, в данном случае задержка установлена на полсекунды.

После загрузки и просмотра работы кода, удалось выделить его недостаток в будущей перспективе, он не предусматривает защиту от переполнения памяти при постоянном выводе, если данный код добавить к какому-либо проекту, который выводит информацию на экран.

Формальное описание алгоритма:

Имеется робот с «глазами» в виде инфракрасного датчика препятствий, он должен уметь определять препятствие и выполнять какие-либо действия (вывод на экран, обходной маневр, и т.д.)

 Цель алгоритма – цикличное считывание состояния датчика и вывода результата на экран или передача информации другим частям кода, для выполнения последующих действий.

Рисунок 1. Блок-схема алгоритма кода ИК датчика

 

Анализ кода ультразвукового датчика HCSR04

Для ультразвукового датчика, производители предлагают библиотеку «NewPing», по словам производителя, данная библиотека, оптимизирована в скорости работы и делает меньше погрешности в расчетах, чем другая библиотека «Ultrasonic».

Первое что настораживает при использовании данной библиотеки, так это следующая фраза:

«Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без технической поддержки и без каких-либо гарантий, явных и подразумеваемых, относительно работоспособности»

Никто не может гарантировать работоспособность чего-либо на 100%, некоторые даже и на 50%. Это абсолютно естественно и нормально.

То, что нет технической поддержки плохо, поскольку при возникновении какой-либо ошибки, приходится читать огромное количество форумов, для получения нужной информации, чтобы решить ту или иную проблему. Большинство форумов, где предоставляется большое количество информации англоязычные.

Как у любой библиотеки, у «NewPing» есть свои положительные стороны:

  • Работает с большинством ультразвуковых датчиков: SR04, SRF05, SRF06, DYP-ME007, URM37 и Parallax PING.
  • Совместим со всей линейкой (и клонами) Arduino, и микроконтроллерами семейства Teensy и не – AVR.
  • Интерфейс всех датчиков SRF06, использует, только один вывод Arduino.
  • Не отстает на секунду, если не был получен эхо-ответ.
  • Обеспечивает стабильную и надежную работу до 30 раз в секунду.
  • Присутствует метод прерывания по таймеру для управления событиями.
  • Встроенный цифровой метод фильтрации ping_median () для легкой коррекции ошибок.
  • Используются портовые регистры для более быстрой работоспособности и меньшего размера кода.
  • Можно использовать сразу несколько датчиков.
  • Более точный расчет расстояния.
  • Не использует pulsein, поскольку у него медленная скорость работы, и дает неверные результаты с некоторыми моделями датчиков.
  • Активно развивается с добавлениями новых функций и устранением ошибок/проблем.

Библиотека «NewPing» имеет 1 конструктор и 11 методов:

КОНСТРУКТОР:

NewPing sonar (trigger_pin, echo_pin [, max_cm_distance])

Trigger_pin & echo_pin — контакты Arduino, подключенные к триггеру датчика и эхо.

ПРИМЕЧАНИЕ.

Чтобы использовать один и тот же вывод для триггера и эхо-сигнала, нужно указать один и тот же для обоих значений.

 Max_cm_distance — [Дополнительно] Максимальное расстояние, которое вы хотите установить. По умолчанию = 500cm.

МЕТОДЫ:

  • ping ([max_cm_distance]) — отправить пинг и получить эхо-ответ в микросекундах, а [Max_cm_distance] позволяет установить новое максимальное расстояние.
  • ping_in ([max_cm_distance]) — отправить пинг и получить расстояние в дюймах. [Max_cm_distance] позволяет установить новое максимальное расстояние.
  • ping_cm ([max_cm_distance]) — Отправьте пинг и получите расстояние в сантиметрах. [Max_cm_distance] позволяет установить новое максимальное расстояние.
  • ping_median (iterations [, max_cm_distance]) — делает несколько пингов (по умолчанию = 5), так же позволяет отбрасывать пинг из диапазона и возвращать медиану в микросекундах.
  • NewPing :: convert_in (echoTime) — конвертировать echoTime из микросекунд в дюймы (округление до ближайшего дюйма).
  • NewPing :: convert_cm (echoTime) — преобразование echoTime из микросекунд в сантиметры (округление до ближайшего cm).
  • ping_timer (function [, max_cm_distance]) — отправляет функцию ping и call, чтобы проверить, завершена ли команда ping.
  • check_timer () — проверить, вернулся ли ping в пределах установленного расстояния.
  • NewPing :: timer_us (частота, функция) — вызов функции c определенной частой микросекунд.
  • NewPing :: timer_ms (частота, функция) — вызов функции с определенной частатой миллисекунды.
  • NewPing :: timer_stop () — остановка таймера

Пример кода приведенный в библиотеке «NewPing»

 

#include <NewPing.h>

#define TRIGGER_PIN 12

#define ECHO_PIN 4

#define MAX_DISTANCE 500

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {

 Serial.begin(9600);

}

void loop(){

 delay(200);

 unsigned int uS = sonar.ping();

 Serial.print(“Ping: “);

 Serial.print(sonar.convert_cm(uS));

 Serial.println(“cm”);

}

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

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

Формальное описание алгоритма:

По мимо определения есть препятствие или нет, порой нужно знать дистанцию до какого-либо объекта или же до самого препятствия. Цель алгоритма – в цикличной функции подавать сигнал на протяжении определенного времени, после чего прекращать подачу сигнала, и слушать его эхо (отражение), после прослушивания эхо нужно осуществить пересчет в сантиметры, дюймы или другую единицу измерения расстояния.

Рисунок 2. Блок-схема алгоритма кода УЗ датчика

Список литературы

  1. ИК-датчик препятствий для роботов-машин YL-63 (FC-51) [сайт]. URL: http://zi-zi.ru/docs/modules/info_FC-51.pdf (22.11.2019) 
  2. Ультразвуковой датчик HC-SR04 [сайт]. URL: http://arduino-kit.ru/userfiles/image/HC-SR04 _.pdf(28.11.2019) 
  3. Ультразвуковой датчик расстояния и Arduino [сайт]. URL: http://arduino-diy.com/arduino-ultrazvukovoy-datchik-..(6.12.2019) 
  4. Ultrasonic ranging module: HC-SR04 [сайт]. URL: ftp://itead.cc/Modules/IM120628012_HC_SR04/DS_IM1206280..(13.03.2017) 
  5. Ultrasonic Ranging Module HC — SR04 [сайт]. URL: http://www.micropik.com/PDF/HCSR04.pdf(10.12.2019)