Общение с ультразвуковым сонаром HC-SR04

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Suicide
Родился
Сообщения: 13
Зарегистрирован: Вт сен 18, 2012 08:46:06
Контактная информация:

Общение с ультразвуковым сонаром HC-SR04

Сообщение Suicide »

Доброго времени суток, уважаемые Коты и Кошечки!

Имеется проблема с довольно известным ультразвуковым сонаром HC-SR04. Проблема чисто программная, а так как по поиску на данном форуме ничего не отыскалось, пришлось создать новую тему в данном разделе.

Что имеется: плата с МК AVR AtMega8A и 4 УЗ сонара HC-SR04, робота-пылесоса.

Робота пылесоса я переделал под свои нужды, выкинув абсолютно всю его внутрянку и вставив свою. Ездить я его научил (где то тут даже была моя проблемная тема про Н-Мост на мосфетах). Теперь нужно сделать "глаза" этому несчастному роботу. Сначала он поворачивал при касаниях с чем либо (стояли 3 кнопки спереди робота), теперь нужно кнопки заменить УЗ сонарами. Вот, вкратце, предыстория.

Принцип работы довольно прост - посылаем лог.1 длительностью 10мкс на вход Trig сонара, и слушаем от него ответ с ноги Echo длительностью от 150мкс до 25мс. Всё просто, вроде бы.

Суть проблемы - не знаю как общаться с УЗ сонарами на языках C/C++. Совсем не знаю. Вообще. Перепробовал вагон и маааааленькую тележку примеров - все (ну не все, 98% только) сводятся к использованию сонара на внешних прерываниях (или работе данного УЗ сонара с ардуино) и не работают в моём случае (хотя я вроде с внешними прерываниями разобрался и всё просто обязано работать). Ни свободных внешних прерываний, ни какой либо ардуино не располагаю (да и ардуино мне не нужна абсолютно).

Вначале думал что спалил все 4 УЗ сонара, чуть не расстроился уже. Но вчера, в рамках эксперимента, скачал демоверсию BASCOM AVR, и попробовал там написать программу для общения с данными УЗ сонарами. И что же вы думаете? Всё работает, все 4 штуки.

Дело в том, что в BASCOM AVR есть расчудеснейшая команда pulseIn, которая измеряет длинну пришедшего на ногу МК сигнала. И она же есть для Arduino. Я пытался её реализовать сам, выдрав из хидеров от ардуино и переделав все тамошние функции на свои. Всё равно не работает. Осцилографом не располагаю, ближайший от меня где то в 55-60 км.

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

зыЖ схему приводить не буду, т.к. она рабочая 100% - BASCOM AVR это показала. Но на этот самый BASCOM переходить очень не хочется - языки С/С++ мне гораздо ближе к душЕ и сердцу, нежели basic.

Заранее спасибо за ответы!
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Re: Общение с ультразвуковым сонаром HC-SR04

Сообщение slavokhire5 »

Ну, если просто длину импульса замерять - так это просто. Заводим необходимый сигнал от сонара на ногу МК AVR, разрешаем прерывание по PIN Change для этого вывода и ждем:)
прерывание сработало - запускаем таймер, смотрим что пришло, 0 или 1.
если 1, ждем следующего прерывания от PIN Change и смотрим что натикало в таймере
если 0, останавливаем и обнуляем таймер, ждем 1.
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: Общение с ультразвуковым сонаром HC-SR04

Сообщение clawham »

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

А вот триггеры каждого сонара дергать по очереди -

но учтите - сонары очень любопытные вещи...и ничего общего с дальностью до стены у вас не получится - не забывайте про отражение звука .....если перед нами в метре стена под углом 45 градусов - вы не увидите её сонаром....в общем я вам даю свой исходник под мегу 8 и экран 44780 - там оконный фильтр и все ошибки обрабатываются и в сантиметры переводится - поиграйтесь сначала чтобы понять что да как
Вложения
68_sonar.rar
Исходник сонара
(333.44 КБ) 991 скачивание
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Suicide
Родился
Сообщения: 13
Зарегистрирован: Вт сен 18, 2012 08:46:06
Контактная информация:

Re: Общение с ультразвуковым сонаром HC-SR04

Сообщение Suicide »

slavokhire5, да, так и надо. Чего то не получилось в первые разы этого у меня просто, но буду мучать дальше.

clawham, да да да, помоему "диодное или" называется такой способ, я так кнопки делал 8 штук на одну ногу прерывания :) Про отражение звука знаю, сонары - всего лишь один из типов датчиков на роботе. Кнопки соприкосновения со стеной так же будут установлены. Кстати, пробовал баловаться с сонаром когда в BASCOM напрограммировал, отражение при угле чуть больше 45 градусов есть, но на очень небольшом расстоянии. За исходники отдельное огромное спасибо! Изучу, опробую.
kentik
Грызет канифоль
Сообщения: 252
Зарегистрирован: Пт апр 05, 2013 09:55:02

Re: Общение с ультразвуковым сонаром HC-SR04

Сообщение kentik »

что-то не получается с этим модулем.

алгоритм такой:

8 МГц частота МК
предделитель таймера 8
прерывание по совпадению. OCR1A=1; // т.е. частота прерываний 1 МГц
DDRC = 0xff;
DDRB=0x00;
далее так:

void send_pulse(){
PORTC.7=1 ;
delay_ms(10); // start pulse
PORTC.7=0;
}


interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if (PINB.2==0)
{
TCCR1B &= ~(1<<CS10);
TIMSK &= ~(1 << OCIE1A);
TCNT1=0;
count_ultra=0;
}
else{
count_ultra++;
}

}

ну и выводим на экран значение count_ultra

такую хрень он мне выводит. что я не так делаю?
kentik
Грызет канифоль
Сообщения: 252
Зарегистрирован: Пт апр 05, 2013 09:55:02

Re: Общение с ультразвуковым сонаром HC-SR04

Сообщение kentik »

не выходит разобраться с этим модулем чертовым.

основа отсюда: http://extremeelectronics.co.in/avr-tut ... -tutorial/

получаем время импульса (мк работает 16 МГц):
Спойлер#define US_PORT PORTB
#define US_PIN PINB
#define US_POS PORTB.2

//PORTA0
void getPulseWidth(){
long i;

//Wait for the rising edge
for(i=0;i<600000;i++)
{
if(!(US_PIN & (1<<US_POS))) continue; else break;
}

if(i==600000)
meter= 0xffff; //Indicates time out

//High Edge Found

//Setup Timer1
TCCR1A=0x00;
TCCR1B=(1<<CS11); //Prescaler = Fcpu/8
TCNT1=0x00; //Init counter

//Now wait for the falling edge
for(i=0;i<600000;i++)
{
if(US_PIN & (1<<US_POS))
{
if(TCNT1 > 60000) break; else continue;
}
else
break;
}

if(i==600000)
meter = 0xffff; //Indicates time out

//Falling edge found

meter=TCNT1;

//Stop Timer
TCCR1B=0X00;

if(meter > 60000)
meter =0xfffe; //No obstacle
else
meter = (meter>>1);
}

void send_pulse(){
PORTC.7=1 ;
delay_ms(10); // start pulse
PORTC.7=0;
}



ну и в цикле main

send_pulse();
getPulseWidth();
meter=meter/58;
sprintf(a,"%u",meter);
print(a,50,100) ;


итог: ноль внимания. фунт презрения. все время одно и тоже значение 1129.
kentik
Грызет канифоль
Сообщения: 252
Зарегистрирован: Пт апр 05, 2013 09:55:02

Re: Общение с ультразвуковым сонаром HC-SR04

Сообщение kentik »

clawham писал(а):.в общем я вам даю свой исходник под мегу 8

спасибо. модуль ожил и стал работать
medveddd
Родился
Сообщения: 5
Зарегистрирован: Пт фев 01, 2013 06:34:31

Re: Общение с ультразвуковым сонаром HC-SR04

Сообщение medveddd »

.
goga770
Родился
Сообщения: 1
Зарегистрирован: Чт фев 13, 2014 10:29:10

Re: Общение с ультразвуковым сонаром HC-SR04

Сообщение goga770 »

Здравствуйте!
А можно мне тоже рабочий пример с этим измерителем, а то вожусь второй день, а толку немного)
Ответить

Вернуться в «Периферия»