Доброго времени суток, уважаемые Коты и Кошечки!
Имеется проблема с довольно известным ультразвуковым сонаром 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.
Заранее спасибо за ответы!
Общение с ультразвуковым сонаром HC-SR04
- slavokhire5
- Прорезались зубы
- Сообщения: 202
- Зарегистрирован: Пн сен 26, 2011 13:48:25
- Откуда: Харьков
Re: Общение с ультразвуковым сонаром HC-SR04
Ну, если просто длину импульса замерять - так это просто. Заводим необходимый сигнал от сонара на ногу МК AVR, разрешаем прерывание по PIN Change для этого вывода и ждем:)
прерывание сработало - запускаем таймер, смотрим что пришло, 0 или 1.
если 1, ждем следующего прерывания от PIN Change и смотрим что натикало в таймере
если 0, останавливаем и обнуляем таймер, ждем 1.
прерывание сработало - запускаем таймер, смотрим что пришло, 0 или 1.
если 1, ждем следующего прерывания от PIN Change и смотрим что натикало в таймере
если 0, останавливаем и обнуляем таймер, ждем 1.
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
--------------------------
Пишу на Си за еду
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: Общение с ультразвуковым сонаром HC-SR04
маленький лайфхак - все сонары можно через диод привести на ОДНУ ногу прерывания, длительногсть которого и будете мерять , ногу подтянуть резюком к земле
А вот триггеры каждого сонара дергать по очереди -
но учтите - сонары очень любопытные вещи...и ничего общего с дальностью до стены у вас не получится - не забывайте про отражение звука .....если перед нами в метре стена под углом 45 градусов - вы не увидите её сонаром....в общем я вам даю свой исходник под мегу 8 и экран 44780 - там оконный фильтр и все ошибки обрабатываются и в сантиметры переводится - поиграйтесь сначала чтобы понять что да как
А вот триггеры каждого сонара дергать по очереди -
но учтите - сонары очень любопытные вещи...и ничего общего с дальностью до стены у вас не получится - не забывайте про отражение звука .....если перед нами в метре стена под углом 45 градусов - вы не увидите её сонаром....в общем я вам даю свой исходник под мегу 8 и экран 44780 - там оконный фильтр и все ошибки обрабатываются и в сантиметры переводится - поиграйтесь сначала чтобы понять что да как
- Вложения
-
- 68_sonar.rar
- Исходник сонара
- (333.44 КБ) 991 скачивание
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
Re: Общение с ультразвуковым сонаром HC-SR04
slavokhire5, да, так и надо. Чего то не получилось в первые разы этого у меня просто, но буду мучать дальше.
clawham, да да да, помоему "диодное или" называется такой способ, я так кнопки делал 8 штук на одну ногу прерывания
Про отражение звука знаю, сонары - всего лишь один из типов датчиков на роботе. Кнопки соприкосновения со стеной так же будут установлены. Кстати, пробовал баловаться с сонаром когда в BASCOM напрограммировал, отражение при угле чуть больше 45 градусов есть, но на очень небольшом расстоянии. За исходники отдельное огромное спасибо! Изучу, опробую.
clawham, да да да, помоему "диодное или" называется такой способ, я так кнопки делал 8 штук на одну ногу прерывания
Re: Общение с ультразвуковым сонаром HC-SR04
что-то не получается с этим модулем.
алгоритм такой:
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
такую хрень он мне выводит. что я не так делаю?
алгоритм такой:
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
такую хрень он мне выводит. что я не так делаю?
Re: Общение с ультразвуковым сонаром HC-SR04
не выходит разобраться с этим модулем чертовым.
основа отсюда: http://extremeelectronics.co.in/avr-tut ... -tutorial/
получаем время импульса (мк работает 16 МГц):
#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.
основа отсюда: 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.
Re: Общение с ультразвуковым сонаром HC-SR04
clawham писал(а):.в общем я вам даю свой исходник под мегу 8
спасибо. модуль ожил и стал работать
Re: Общение с ультразвуковым сонаром HC-SR04
Здравствуйте!
А можно мне тоже рабочий пример с этим измерителем, а то вожусь второй день, а толку немного)
А можно мне тоже рабочий пример с этим измерителем, а то вожусь второй день, а толку немного)