Не работает ультразвуковой дальномер HC-SR04

tran
Offline
Зарегистрирован: 20.10.2012

Здравсвуйте! Столкнулся с проблемой - ультразвуковой дальномер не работает. Загрузил скетч из стандартной библиотеки и в монитор порта постоянно отсылает 0. Но если дотронуться до ножки одного из излучателя начинает отсылать случайные значения. Что это может быть?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

нет контакта где он должен быть или неисправность дальномера :(

Скай
Offline
Зарегистрирован: 05.02.2015

Добрый день. 
возникла проблема с hc-sr04
ПОдключаю один дальномер - работает как надо. 
подключаю второй отдельно - работает как надо. 
подключаю два, первый на пины 2(Trig) и 3(Echo), второй на пины 5(Trig) и 6(Echo).

И тут начинается непонятка. Первый  работает как следует, положенные 3 метра показывает. Второй - отсылает 0 в монитор порта. 
Вначале грешил на быдлокод. Но, как оказалось, всё там нормально, а если всовывать-высовывать контакт 6(Echo), то он начинает показывать правильное расстояние. 

Если поменять порты, допустим, с 5 и 6 на 8 и 9, то наблюдается та же картина. Пока не начнёшь совать - ни фига не заработает. 
Господа, подскажите, как подключить два датчика одновременно?

Плата Arduino DUE. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

код-то дайте... 

Скай
Offline
Зарегистрирован: 05.02.2015
Не уверен, что проблема в коде, но вот, пжлста:
const int Trig1 = 2;
const int Trig2 = 5;

const int Echo1 = 3;
const int Echo2 = 6;


void setup() 
{ 
pinMode(Trig1, OUTPUT);
pinMode(Trig2, OUTPUT);

pinMode(Echo1, INPUT);
pinMode(Echo2, INPUT);

pinMode(ledPin, OUTPUT); 
  
Serial.begin(9600); 
}

unsigned int time_us1=0;
unsigned int time_us2=0;

unsigned int distance_sm1=0;
unsigned int distance_sm2=0;

void loop() 
{ 
digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера 
delayMicroseconds(10); // Удерживаем 10 микросекунд 
digitalWrite(Trig1, LOW); // Затем убираем 

digitalWrite(Trig2, HIGH);
delayMicroseconds(10);  
digitalWrite(Trig2, LOW);

time_us1=pulseIn(Echo1, HIGH);
time_us2=pulseIn(Echo2, HIGH);

distance_sm1=time_us1/58+0.8; // Пересчитываем в сантиметры 
distance_sm2=time_us2/58+0.8;

Serial.println(distance_sm1); // Выводим на порт
delay(100);
Serial.println(distance_sm2);
delay(100); 
}

 

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

pulseIn() - пока она выполняется МК глух и нем...

строку 37 в 32, строку 38 в 36

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ну, ещё скопируйте строку 46 в 39

nevkon
Offline
Зарегистрирован: 20.01.2015

Попробуйте расчет поменять местами:

const int Trig1 = 2;
const int Trig2 = 5;
 
const int Echo1 = 3;
const int Echo2 = 6;
 
 
void setup()
{
pinMode(Trig1, OUTPUT);
pinMode(Trig2, OUTPUT);
 
pinMode(Echo1, INPUT);
pinMode(Echo2, INPUT);
 
pinMode(ledPin, OUTPUT);
  
Serial.begin(9600);
}
 
unsigned int time_us1=0;
unsigned int time_us2=0;
 
unsigned int distance_sm1=0;
unsigned int distance_sm2=0;
 
void loop()
{
digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig1, LOW); // Затем убираем
 
time_us1=pulseIn(Echo1, HIGH);

digitalWrite(Trig2, HIGH);
delayMicroseconds(10); 
digitalWrite(Trig2, LOW);
 
time_us2=pulseIn(Echo2, HIGH);
 
distance_sm1=time_us1/58+0.8; // Пересчитываем в сантиметры
distance_sm2=time_us2/58+0.8;
 
Serial.println(distance_sm1); // Выводим на порт
Serial.println(distance_sm2);
delay(100);
}

 

Скай
Offline
Зарегистрирован: 05.02.2015

Спасибо огромное, помогло. 
не знал, про глухоту МК во время pulseIn.
 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

delay() - тоже блокирующая

Скай
Offline
Зарегистрирован: 05.02.2015

Ещё такой вопрос:
реально ли сделать схему один излучатель - три приёмника?
допустим, выпаять излучатель, через провод его припаять назад, чтобы он был далеко, подключить ещё, допустим, 2 дальномера, но в них не подключать выход Trig, а только  Echo? И поставить рядом 3 приёмника, излучатель на метр отнести, и снимать данные с 3 приёмников?

или Echo без Trig вообще работать не собирается?

std
Offline
Зарегистрирован: 05.01.2012

const int echo2=6, а прерывание на ноге D6 есть?

UNO прерывания:

Int0 - D2

Int1 - D3

Поменяйте echo провода на выводы 2 и 3.

 

UPD. По ходу чтения темы - наверно бесполезно.

Про 3 приёмника непонятно. Надо одновременно давать Trig на все три, а принимать отдельно, или как?

Скай
Offline
Зарегистрирован: 05.02.2015

не. 
Ну, допустим есть квадрат. В вершинах - дальномеры без подключённого Trig. В одном выпаян излучатель, соединён проводами с дальномером, и помещён в центр. Всё это счастье подсоединено к Ардуино.Trig включается только один - на том дальномере, из которого выпаян излучатель. Echo - на всех 4-х. То есть, 5 пинов всего юзаем. 

Ну так вот: реально ли в такой схеме получать в порт последовательно значения с дальномеров 1 2 3 4 соответственно?

А почему рядом предложил поставить - чтобы все приёмники в угол распространения попали.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

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

можно стартануть 4 датчика посредством http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

на 1 заклеить приёмник ( не обязательно ), на 2,3,4 заклеить излучатели, тогда приёмники 2,3,4 будут принимать сигнал от 1

НО, зафиксировать длину импульса через пульсеИн можно только с одного приёмника :( , это придётся решать через счётчики и прерывания....

зачем вам это ? какая практическая польза ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

получать в порт последовательно значения с дальномеров 1 2 3 4 соответственно

да, можно, если последовательно

старт 1,2 - слушаем 2   ,   старт 1,3 - слушаем 3   ,   старт 1,4 - слушаем 4

зачем выпаивать ?!!!!!! лейкопластырь есть ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

телеметрия-триангуляция-тригонометрия ? :)

Скай
Offline
Зарегистрирован: 05.02.2015

Да вот задание есть, с помощью этих дальномеров установить (с какой-то погрешностью) координаты Х У излучател на проводе. 
Практическое - есть какой-то прибор, допустим, дефектоскоп в руке. 
В него влепить этот излучатель и принимать координаты и показания n раз в секунду.
сохранить в файл и построить потом 3-д картину дефекта. 

сопсно, чтобы можно было рукой водить и получать координаты. 

Да не надо мне заклеить. Мне надо, чтобы он был на расстоянии метра от платы. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

2D !!!!!!!!! если стороны квадрата по 3 м - расчётное положение излучателя ( объекта )  будет находиться в эллипсе 25 х 35 см,

вас такая точность устроит ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Скай пишет:

Да не надо мне заклеить. Мне надо, чтобы он был на расстоянии метра от платы. 

отнести датчик в сборе от ардуины на 4-ёх проводках или покурочить датчик и вынести пьезоголовку от датчика и ардуины на 2-ух проводках ? хозяин - барин :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не на 4-ёх - на ТРЁХ !!!!!!! эхо с 1 датчика не используется

Скай
Offline
Зарегистрирован: 05.02.2015

"3-д" - имелось в виду, что по оси Z будет показания дефектоскопа. 
я бы плюнул, и посадил всё на двигатели, честно. 
но, блин, ТЗ))

сторона квадрата порядка метра, максимум 1.20м
Пластырь, наклеенный на излучатель просто удваивает расстояние)))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

приклейте кружок оргстекла S=1 cm :)

какая точность по X, Y нужна ? 

Скай
Offline
Зарегистрирован: 05.02.2015

 
точность вроде как полсантиметра. 
Но блин, оно такое точное только если излучатель и приёмник на одной прямой. А там углы, все дела...
какая вообще достижима точность определения расстояния в случае произвольных направлений? 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Скорее всего датчик ловит первое ( самое раннее, самое ближнее эхо) , а остальные игнорирует.

Если вам надо ловить еще и другие, а поймать их вы сможете сняв сигнал с выхода усилителя, вы увидите еще дальние отражения. Учтите, там пачка из 8-ми импульсов.

Но проблемма в том, что угол излучения сигнала и угол приёма эха достаточно широкий. Поэтому повернув весь датчик вправо-влево на достаточно большой угол( я думаю на 10-15-20 градусов) вы всё равно поймаете то-же самое препятствие, ближнее к вам.

Да, и ещё: нельзя одновременно запускать второй  дальномер пока не пришло эхо от первого

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Скай пишет:

 
точность вроде как полсантиметра. 
Но блин, оно такое точное только если излучатель и приёмник на одной прямой. А там углы, все дела...
какая вообще достижима точность определения расстояния в случае произвольных направлений? 

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

какая вообще достижима точность определения расстояния в случае произвольных направлений? 

такая как даташите

точность вроде как полсантиметра. 

для достижения такой точности забудьте про эти датчики.... надо на лазер переходить :)

Скай
Offline
Зарегистрирован: 05.02.2015

лады, спасибо за совет да инфу, пойду веселиться дальше.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

проект из долгого ящика... дети давно придумали, но мне некогда :)

"Отслеживание положения кота в спортзале"

может вас заинтересует ?

Скай
Offline
Зарегистрирован: 05.02.2015

а можно немного условных обозначений и исходные условия? посвободнее стану - попробую сделать)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

справа - приёмопередатчик на спину коту ( на дефектоскоп ) , круговой - 6 приёмников облучения лазерной указкой, 6 IR-излучателей , Nano и батарейка ( хватит по 2 каждого ) - при освещении любого приёмника лазерной указкой ардуинка формирует короткий импульс для излучения IR-ками.

синий прямугольник - ардуина с IR-приёмником, к ней ещё подключены два-три СКАБа ( сканирующий барабан - аббревиатура из ТО Су-27 :)    ) - жёлтые , два-три репера - приёмники облучения лазерной указкой - зелёные.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

СКАБ постоянно вращается ( хоть кулер от компа ) , на крыльчатке установлена лазерная указка ( не точка, а линия ! , её ориентируем вертикально ) , излучение включается от ардуины. Как передать питание на указку - кольцевой токосъёмник и два скользящих контакта.

Измерения :

Тоборот СКАБа - вычисляем по импульсам на репере, Тalpha = Трепер - Тobj , Тobj получаем от IR-передатчика объекта.

из этого запаздывания Тobj  от Трепер и перида вращения СКАБа - получаем угол-"азимут" от репера на объект.

Указки на СКАБах включаем по очереди - можно раз 100 и больше в секунду ( не считал ).

Далее - сплошная тригонометрия : стороны треугольника установки СКАБов, углы этого треугольника, углы ориентации реперов и т.д.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

два СКАБа и три маркерные точки на гермошлеме пилота - определение положения головы пилота ( вернее ГШ ) в 3D....

адекватен или уже лицом в приборах ? - затея оттуда :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

дефектоскоп - какая точность по Z ? неужели рукой можно выдержать нужный уровень ? почему нельзя посадить ДС на каретку, как в плоттере ?

Скай
Offline
Зарегистрирован: 05.02.2015

хз. Плоттер я уже сделал.
и там всё очень просто. Дефектоскоп - как пример. Главное - получить координаты руки

 

tavrel_max
Offline
Зарегистрирован: 15.09.2015

Всем добрый вечер, недавно (раньше такого не было, возможно партия датчиков с каким-то браком) столкнулся с проблемой с дальномером HC-SR04: при подаче питания на схему, датчики (их 2 в схеме), в 10% включениях, не работают (молчат, не слышно потрескивание при измерениях, частота измерений порядка 10штук в 1 секунду), но стоит немного стукнуть хотя бы один из датчиков, то они начинают работать... собственно вопрос, в чем может быть дело???

На схеме ноги TRIG подключены напрямую к МК, ноги ECHO - к МК и подтянуты резистором 10КОм к земле (чтобы исключить срабатывание схемы, когда датчики не подключены).

Код следуюущий:

Echo_1();  //измерение на 1ом датчике
if (length_1<=range_echo_1) led_down();
delay_ms(30);
      
Echo_2();  //измерение на 2ом датчике
delay_ms(30);                                      
if (length_2<=range_echo_2) led_up();
 
Подпрограмма самого измерения:
void Echo_1(void)      
 {
 unsigned char g_1=250;
 length_1=250; 
 Trig1=1;
 delay_us(20);
 Trig1=0;
 delay_us(550);  // ожидаем пока датчик измеряет расстояние, а начнет выдавать импульс на ECHO
 if (Echo1==1)
   {
   for (g_1=1; g_1<=250; g_1++)  // считаем длину ипульса, уже в сантиметрах
     {
     delay_us(40);
     if (Echo1==0) 
       {
       length_1=g_1;
       g_1=252;                // выход из счетчика
       };
     }; 
   }
 else length_1=250;
 
 if (length_1<=range_echo_1)    // делаем повторное измерение, чтобы убедиться что измеренное расстояние меньше чем range_echo_1
   {
   delay_ms(50);
   Trig1=1;
   delay_us(20);
   Trig1=0;
   delay_us(550); 
   if (Echo1==1)
     {
     for (g_1=1; g_1<=250; g_1++)
       {
       delay_us(40);
       if (Echo1==0) 
         {
         length_1=g_1; 
         g_1=252;    
         };    
       }; 
     }
   else length_1=250;  
   };                                                                 
 }
Т.е. в программе отслеживается, если расстояние становится меньше заданного (range_echo_1) то зажигаем светодиоды
ua3msi
Offline
Зарегистрирован: 07.05.2017
gurf
Offline
Зарегистрирован: 30.11.2015

Скай пишет:

Добрый день. 
возникла проблема с hc-sr04
...

Плата Arduino DUE. 

Скажите, а тот факт, что hc-sr04 имеет 5 В логику, а плата Arduino Due - 3.3 В  - это никаких проблем не создавало?