Добрый день. Решил подключить к arduino, 3 ультразвуковых дальномера hc-sr04 и несколько двигателей (не серво) для робота, что бы он объезжал препятствия, ориентировался в пространстве. Нигде не могу найти информацию как и через что можно подключить эти дальномеры не напрямую, желательно через SPI. Везде используются 74HC595 или 74HC165, но только для управления и насколько я понял их использовать для получения адекватной информации с дальномеров не получиться. Может кто подскажет в какую сторону смотреть?
В дальномере надо измерять время через которое пришло эхо от звука. Собирая данные через SPI у Вас будет повышенная "дискретность" сигнала, плюс неизвестный джиттер. Если хотите сэкономить пины, то можно попробовать через внешний мультиплексор/демультиплексор. Уйдет 4 пина: 2 на адрес, 1 на демультиплексор (импульс на начало измерения), один с демультиплексора (эхо). Можно поставить эксперимент и посмотреть реагирует ли сонар на "чужие" импульсы. Если нет, то можно упростить схему: запускающий сигнал выдавать с декодера 2->4, а эхо ловить объединив выходы дальномера через транзисторы/ОК, тогда на все уйдет 3 пина
Для тех кого эта проблема тоже может заинтересовать. Решил её с использованием 2-х мультиплексоров cd4051. Использование общего тригера не привело к положительному результату, из 5-и сенсоров отвечали только 3. Картинка проекта ссылка на проект во фритзинг А вот и код рабочей программы: Код (Text): // // Ultrasonic HR-SC04 sensor test // // #include "Ultrasonic.h" #define DIGITAL_PIN 8 #define OUT_A A0 #define OUT_B A1 #define OUT_C A2 // sensor connected to: // Trig - 7, Echo - 8 Ultrasonic ultrasonic(7, 8); int center_us = 0; int left_us = 0; int h_left_us = 0; int h_right_us = 0; int right_us = 0; void setup() { pinMode(OUT_A, OUTPUT); pinMode(OUT_B, OUTPUT); pinMode(OUT_C, OUTPUT); Serial.begin(9600); // start the serial port } void loop() { for (int i = 0b000; i <= 0b100; i++) { digitalWrite(OUT_A, bitRead(i, 0)); digitalWrite(OUT_B, bitRead(i, 1)); digitalWrite(OUT_C, bitRead(i, 2)); delay(40); float dist_cm = ultrasonic.Ranging(CM); delay(10); if (i == 0){center_us = dist_cm;} if (i == 1){left_us = dist_cm;} if (i == 2){h_left_us = dist_cm;} if (i == 3){h_right_us = dist_cm;} if (i == 4){right_us = dist_cm;} Serial.println(); Serial.print("center_us"); Serial.print(" = "); Serial.print( center_us ) ; Serial.println(); Serial.print("left_us"); Serial.print(" = "); Serial.print(left_us); Serial.println(); Serial.print("half_left_us"); Serial.print(" = "); Serial.print(h_left_us); Serial.println(); Serial.print("right_us"); Serial.print(" = "); Serial.print(right_us); Serial.println(); Serial.print("half_right_us"); Serial.print(" = "); Serial.print(h_right_us); Serial.println(); delay(100); // arbitary wait time. } }
Господа, есть вариант развития вопроса: Специфика ситуации, в том, что нужно показать принцип работы для дальнейшей полноценной. Кому интересно - некоторое время игрался с датчиками оценивая точность измерения ( с шагом 1 см). Итог: - в 90% случаев, начиная от 4 см погрешность ~ -1 см. Т.е как-бы с запасом. - если датчики рядом друг с другом и есть пересечение направлений работы - данные скачут - если расстояние до цели больше 60-70 см резко увеличивается частота появления нулевых результатов. Это для меня стало понятно не сразу, но оказалось причиной "зависания" - т.е. сенсор долго ждет сигнала, что воспринимается как зависание, а не получив его выдает 0 Есть задача: Нужно подключить около 50-ти таких датчиков. В связи с чем, не обладая глубокими познаниями, пока что пытаюсь решить следующие вопросы: 1) Т.к. нужно много входов - берется Arduino Mega. Возможен ли такой вариант работы: каждый выход Echo на каждом датчике получает свой вход на ардуине. В то же время, для экономии выходов - все входы Trig получают сигнал от одного выхода на ардуине. Пробовал с 2-мя датчиками - работает. Жду прихода остальных 48 - к каким проблемам готовиться? В итоге на 50 датчиков: занят 50 входов + 1 выход. 2) Предполагаю, что на такое количество датчиков будет нужно доп питание для сенсоров - из каких пропорций исходить? Что посоветуете? 3) Уже потратил время на входные сдвиговые регистры. Принцип работает, но с датчиками типа 0/1. Для hs-sr04 в таком виде не подходит - выдает 0 (при минимальном расстоянии)/1. НО! Т.к. при стандартном подключении используются цифровые входы - предполагаю что и в случае со сдвиговыми регистрами есть способ заставить это работать... при наличии головы)) Так ли это? 4) выше решение найдено через мультиплексоры. Вопрос - почему через стандартный способ подключения, используя цифровые входы на сдвиговых регистрах не работает/не понятно как делать, а на аналоговых - работает? 5) какие минусы решение за счет увеличения количества портов (-> mega 2560) имеет по сравнению с использованием мультиплексоров/СР... или можно так работать? благодарю!
С двумя - тремя датчиками такой принцип (общий trig) работать будет, с бОльшим количеством у меня не получилось, видимо либо УЗ сигнал от датчиков мешает друг другу либо напряжение на trig начинает просидать при большОм количестве датчиков. В общем, я не вижу необходимости использовать мегу для этого. Лучше применить связку мультиплексор (например cd4051) + сдвиговый регистр 74hc595.
Да, количество будет иметь критическое значение другой вопрос - как будет влиять подключение через мультиплексоры и сдвиговые регистры на точность результата? - различные смещения по времени, очереди - не приведут ли они к ошибкам?
Нужно конечно смотреть даташиты , но могу предположить что не повлияют т. к. сначала выбирается канал, потом посылается сигнал, ожидается эхо, потом переключается на следующий канал и т.д. В момент опроса датчика он будет подключен почти напрямую. Датчики конечно опрашиваются по очереди.
Прошу уточнить - у Вас на схеме используется 2 мультиплексора - один на Echo (вход), другой на Trig (выход) датчиков. почему Вы выбрали для своей системы 2 мультиплексора, но советуете мультиплексор (на чтение) + сдвиговый регистр (отправка импульса)? Если я правильно понял - сдвиговый регистр дает задержку по времени, что критично в работе с дальномером, работа которого основана на времени возврата эха. Именно поэтому Вы использовали 2 мультиплексора, которые такой проблемы не имеют(!?). Я ни в коем случае не придираюсь, но мне непонятно. И еще вопрос - какие резисторы Вы используете?
Я имел ввиду, что для чтения данных с датчиков нужны мутиплексоры, а для их коммутации в таком количестве, например к ардуино уно, я бы использовал сдвиговые регистры в связи с отсутствием такого количества портов на ардуине. По поводу резисторов я взял по моему 200 КОм, других под рукой не было, а так и меньше можно (около нескольких КОм) , они только для подтяжки нужны.
ОК! Стало понятнее, но не до конца)) В Вашем примере используются только мультиплексоры, которые позволяют работать почти напрямую ардуине и датчиками. Действительно ли нужно использовать сдвиговые регистры для коммутации? Всё-таки то самое проталкивание байтов будет занимать время, а для дистанций 20-30см это может быть критично. Или здесь вопрос о количестве портов занимаемых мультиплексором - 4 против 3 у СР? Мультиплексор работает только с аналоговыми выходами, которых меньше чем цифровых и поэтому приходится разделять - прием на аналоговых, а коммутация (с потерей времени)на цифровых? Другими словами - для чего мы жертвуем скоростью используя сдвиговые регистры? (если Ваш работающий пример корректен - я не понимаю зачем в нем менять мультиплексор на сдвиговый регистр) Или я не правильно понял эту формулировку: - это относится к Вашему примеру, т.е. это иллюстрация того, что мультиплексор на коммутацию не дает нужного результата (т.е. Ваш пример не совсем корректен) и именно поэтому Вы предлагаете использовать сдвиговые регистры?
В моем случае я использовал только мультиплексоры, т.к. у меня всего 5 датчиков (хотя возможно установить до 8) В случае использования совместно со сдвиговыми регистрами мы жертвуем только скоростью переключения УЗ датчиков, а точнее скоростью коммутации разъемов trig и echo . При этом программно можно учесть это время на коммутацию. В Вашем случае я вижу следующий алгоритм работы схемы: 1) выбираем сдвиговыми регистрами порты trig и echo в первой паре мультиплексоров 2) мультиплексорами опрашиваем все их каналы 3) выбираем сдвиговыми регистрами порты trig и echo в следующей паре мультиплексоров 4) мультиплексорами опрашиваем все их каналы и т.д. пока не будут опрошены все нужные датчики. Т.е. используется схема предложенная мной ранее с добавлением сдвиговых регистров для переключения портов trig и echo у пар мультиплексоров. P.S. Для trig использовать 74HC595, для echo - 74HC165
Добрый день! Подскажите, пж-та, а зачем в этой схеме резистор? Мои познания в электронике близки к нулю, сам не могу сообразить Я собрал вариант на CD4067BE (16 каналов) - все работает без резистора...
Спасибо, прочитал. Правильно я понял, что это нужно для того, чтобы обеспечить на TRIG низкий уровень? Зачем тогда подтяжка для ECHO? Какой из трех случаев, описанных в вики, применим? Если работает без подтяжки, значит ли это, что резистор можно не ставить или все же лучше поставить (20кОм подойдет?)? Прошу прощения, что так много нубовских вопросов
эта подтяжка уже может быть распаяна на плате модуля. А может и не распаяна, китайцы он такие. Поэтому пусть будет, хуже не станет.