CraCk писал(а): 12 авг 2019, 17:04
ecoins писал(а): 31 июл 2019, 18:49
По блоку SR04 viewtopic.php?p=73881#p73881.
Блоки действительно уникальны. Практически ни одного параметра не понял, как конфигурировать и за что отвечает.
Сам блок не компилируется требует библиотеку. За библиотеки нужно платить?
Зачем на блоке вход Echo? Это же номер пина. Почему не сделать настройкой?
С настройками: можно ничего не настраивать - подали на вход номер пина и если его значение>=0, на выходе значение в см.
Пин на входе: это политика ecoins - если в конкретном контроллере не получается использовать устройство - например не хватает пинов, как ESP8266 - выбирается пин=-1 и вся программа работает без изменений и осложнений.
-----
По поводу уникальности. Мы так пишем, нам не известно ничего подобного:
[spoiler]
Перед тем как создавать свою библиотеку, ecoins изучал и библиотеку NewPing. Её особенностью является использование прерываний каждые 50mcs. При этом обработка занимает (для AV328) -6-10mcs, т.к. обработчик использует и digitalRead, и работу тайм-аута с 32-разрядными числами:
// ---------------------------------------------------------------------------
// Standard ping methods
// ---------------------------------------------------------------------------
unsigned int NewPing::ping(unsigned int max_cm_distance) {
if (max_cm_distance > 0) set_max_distance(max_cm_distance); // Call function to set a new max sensor distance.
if (!ping_trigger()) return NO_ECHO; // Trigger a ping, if it returns false, return NO_ECHO to the calling function.
#if URM37_ENABLED == true
#if DO_BITWISE == true
while (!(*_echoInput & _echoBit)) // Wait for the ping echo.
#else
while (!digitalRead(_echoPin)) // Wait for the ping echo.
#endif
if (micros() > _max_time) return NO_ECHO; // Stop the loop and return NO_ECHO (false) if we're beyond the set maximum distance.
#else
#if DO_BITWISE == true
while (*_echoInput & _echoBit) // Wait for the ping echo.
#else
while (digitalRead(_echoPin)) // Wait for the ping echo.
#endif
if (micros() > _max_time) return NO_ECHO; // Stop the loop and return NO_ECHO (false) if we're beyond the set maximum distance.
#endif
return (micros() - (_max_time - _maxEchoTime) - PING_OVERHEAD); // Calculate ping time, include overhead.
}
Надо также иметь ввиду использование библиотекой NewPing таймеров: для AVR328 - это таймер 2 на котором сидят пины 3,11 ШИМ. При переходе на другой контроллер (ESP32,STM32), будут проблемы - они пока не прописаны в библиотеке.
-------
Более естественным для этой задачи (по мнению ecoins) является использование аппаратных прерываний, которые поддерживаются всеми контроллерами, включенных в Arduino IDE.
Мне пока известна только одна такая библиотека для SR04 (Амперка) - но она написана только для AVR328, MEGA и при этом захватывает все пины работающие с прерываниями (6шт.) - скоростной счетчик или энкодер уже не подключить.
Отчасти трудности связаны с особенностью оформления прерываний в Arduino IDE.
-------------
В библиотеке и блоке RT_HW_HC_SR04.h не без труда удалось разрешить эти проблемы и блок работает по аппаратным внешним прерываниям, используя прерывания только от подключенного пина.
-----------
По использованию одного пина. Потребовались исследования (осциллограф, испытания и т.п.), чтобы прийти к некому решению:
1. Замкнуть echo и trig - во многих случаях работает, но не всегда;
2. Резистор 2 ком между echo и trig , устойчиво работает, но иногда не очень (от партии SR04 зависит).
3. Резистор 510 ом - устойчивое решение. Если посмотреть осциллограммы, станет понятно почему.
----
По усреднению.
Это во многом от лукавого. Датчик ловит отражения, особенно при движении датчика чего-то не так измеряет. И перевод времени в мм не столь линеен, как представлялось до испытаний. Самое верное - получать на выходе время и далее пользователь ставит фильтр по выбору.
На выходе блока ecoins можно получать результат в mcs, мм, см, тоже самое усредненное, и еще библиотека отбрасывает случайные измерения (бывают и такие).
[/spoiler]
----
По простоте использования в базовом исполнении: входа EN,пин Echo - можно убрать EN; выходы дистанция и флаг наличия датчика (последний можно убрать и не использовать).
Эта простота (или не очень) результат работы, на который ушло более года.