Анализ кода инфракрасного датчика 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. Блок-схема алгоритма кода ИК датчика
Анализ кода ультразвукового датчика HC—SR04
Для ультразвукового датчика, производители предлагают библиотеку «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. Блок-схема алгоритма кода УЗ датчика
Список литературы
- ИК-датчик препятствий для роботов-машин YL-63 (FC-51) [сайт]. URL: http://zi-zi.ru/docs/modules/info_FC-51.pdf (22.11.2019)
- Ультразвуковой датчик HC-SR04 [сайт]. URL: http://arduino-kit.ru/userfiles/image/HC-SR04 _.pdf(28.11.2019)
- Ультразвуковой датчик расстояния и Arduino [сайт]. URL: http://arduino-diy.com/arduino-ultrazvukovoy-datchik-..(6.12.2019)
- Ultrasonic ranging module: HC-SR04 [сайт]. URL: ftp://itead.cc/Modules/IM120628012_HC_SR04/DS_IM1206280..(13.03.2017)
- Ultrasonic Ranging Module HC — SR04 [сайт]. URL: http://www.micropik.com/PDF/HCSR04.pdf(10.12.2019)