Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Робототехника

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.05.2013, 11:44   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Ультразвуковой дальномер HC-SR04

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

Пример кода для Arduino
PHP код:
#include <CyberLib.h>
#define size_buff 5 //размер массива
#define range 1  //предел допустимых значений
uint16_t sensor[size_buff]; //массив
//sizeof(sensor)/2

void setup() 
{
  
D14_OutD14_Low//пин trig ультразвукового сонара
   
D15_In//пин echo  ультразвукового сонара
  
Serial.begin(115200);
}
 
void loop() 
 {
 for (
uint8_t i 0size_buff; ++i) { sensor[i]=GetDistance();}//производим несколько замеров
     
uint16_t cm find_similar(sensorsize_buffrange); //фильтруем показания датчика
     
       
Serial.println(cmDEC); 
 }
 
 
uint16_t GetDistance() 
{
  
D14_Highdelay_us(10);  D14_Low;  //запустить измерение
   
uint16_t duration pulseIn(15,HIGH); //считываем длительность времени прохождения эха  
   
delay_ms((50000-duration)/1000); //задержка между посылками
  
return duration/58// переводим в см

Admin вне форума   Ответить с цитированием
Старый 02.04.2014, 19:59   #2
nsklital
Junior Member
 
Регистрация: 02.04.2014
Сообщений: 1
Вес репутации: 0
nsklital is an unknown quantity at this point
По умолчанию Re: Ультразвуковой дальномер HC-SR04

D14_Out;
D15_In;
это на ардуино нано?
nsklital вне форума   Ответить с цитированием
Старый 02.04.2014, 20:23   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Ультразвуковой дальномер HC-SR04

для Ардуино Нано и Ардуино Уно
Admin вне форума   Ответить с цитированием
Старый 21.05.2014, 14:27   #4
Aref
Junior Member
 
Регистрация: 21.05.2014
Сообщений: 3
Вес репутации: 0
Aref is an unknown quantity at this point
По умолчанию Re: Ультразвуковой дальномер HC-SR04

Цитата:
Сообщение от Admin Посмотреть сообщение
для Ардуино Нано и Ардуино Уно
У меня ардуино Мега; как я понял по форуму - тут http://www.cyber-place.ru/showpost.p...7&postcount=85 для Меги выкладывали специальную версию библиотеки. А там есть эти фильтры ложных срабатываний и заработает все как надо? Просто эта библиотека ускорения слишком сложная для меня и я сам вряд ли разберусь, помогите.

Последний раз редактировалось Aref; 21.05.2014 в 14:30.
Aref вне форума   Ответить с цитированием
Старый 21.05.2014, 16:04   #5
Aref
Junior Member
 
Регистрация: 21.05.2014
Сообщений: 3
Вес репутации: 0
Aref is an unknown quantity at this point
По умолчанию Re: Ультразвуковой дальномер HC-SR04

Вот что компилятор выдает на код из первого сообщения этой темы.
Цитата:
sketch_may21a.ino: In function 'void setup()':
sketch_may21a:10: error: 'D14_Out' was not declared in this scope
sketch_may21a:10: error: 'D14_Low' was not declared in this scope
sketch_may21a:11: error: 'D15_In' was not declared in this scope
sketch_may21a.ino: In function 'uint16_t GetDistance()':
sketch_may21a:25: error: 'D14_High' was not declared in this scope
sketch_may21a:25: error: 'D14_Low' was not declared in this scope
Видимо, библиотека у меня почему-то не подключается. Этот фильтр можно реализовать вне библиотеки? Если не трудно, напишите код.
Aref вне форума   Ответить с цитированием
Старый 21.05.2014, 16:27   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Ультразвуковой дальномер HC-SR04

Библиотека писалась для Atmega328
Admin вне форума   Ответить с цитированием
Старый 21.05.2014, 17:24   #7
Aref
Junior Member
 
Регистрация: 21.05.2014
Сообщений: 3
Вес репутации: 0
Aref is an unknown quantity at this point
По умолчанию Re: Ультразвуковой дальномер HC-SR04

Да, но там отправитель писал:
Цитата:
Сообщение от ys1797 Посмотреть сообщение
Вот немного поправил CyberLib.h для своего mega2560.
Может кому пригодиться
У меня как раз mega2560, но не работает. В общем, ладно.



Из-за неточностей дальномеров часто приходится наблюдать первую часть видео, да и проект застрял :\

Последний раз редактировалось Aref; 21.05.2014 в 17:36.
Aref вне форума   Ответить с цитированием
Старый 22.05.2014, 00:43   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Ультразвуковой дальномер HC-SR04

Добавте функцию find_similar()
PHP код:
uint16_t find_similar(uint16_t *bufuint8_t size_buffuint8_t range
{
 
uint8_t maxcomp=0//счётчик максимального колличества совпадений
 
uint16_t mcn;    //максимально часто встречающийся элемент массива
 
uint16_t comp;    //временная переменная
 
range++;    //допустимое отклонение

    
for (uint8_t i=0i<size_buffi++) 
    {
        
comp=buf[i];    //кладем элемент массива в comp
        
uint8_t n=0;    //счётчик совпадении
        
for (uint8_t j=0j<size_buffj++)    { if (buf[j]>comp-range && buf[j]<comp+rangen++;} // ищем повторения элемента comp в массиве buf    
        
if (maxcomp//если число повторов больше чем было найдено ранее
        
{
            
maxcomp=n//сохраняем счетяик повторов
            
mcn=comp//сохраняем повторяемый элемент
        
}        
    }
 return 
mcn;

Admin вне форума   Ответить с цитированием
Старый 27.10.2014, 15:34   #9
kulverstukas
Junior Member
 
Регистрация: 27.10.2014
Сообщений: 26
Вес репутации: 0
kulverstukas is an unknown quantity at this point
По умолчанию Re: Ультразвуковой дальномер HC-SR04

ЗАгрузил CyberLyb, пишет ошибки. Никогда раньше не работал с uin8_t хотя так понимаю это как CHAR. Ошибки:
PHP код:
CyberUltra:6errorexpected ',' or '...' before numeric constant
CyberUltra
:8errorexpected ',' or '...' before numeric constant
CyberUltra
.inoIn function 'uint16_t find_similar(uint16_t*, uint8_t)':
CyberUltra:13errorlvalue required as increment operand 
Текст полностью с этой темы.

PHP код:
#include "CyberLib.h"

#define size_buff 5 //размер массива
#define range 1  //предел допустимых значений
uint16_t sensor [size_buff]; //массив
//sizeof(sensor)/2

uint16_t find_similar(uint16_t *bufuint8_t size_buffuint8_t range
{
 
uint8_t maxcomp=0//счётчик максимального колличества совпадений
 
uint16_t mcn;    //максимально часто встречающийся элемент массива
 
uint16_t comp;    //временная переменная
 
range++;    //допустимое отклонение

    
for (uint8_t i=0i<size_buffi++) 
    {
        
comp=buf[i];    //кладем элемент массива в comp
        
uint8_t n=0;    //счётчик совпадении
        
for (uint8_t j=0j<size_buffj++)    { if (buf[j]>comp-range && buf[j]<comp+rangen++;} // ищем повторения элемента comp в массиве buf    
        
if (maxcomp//если число повторов больше чем было найдено ранее
        
{
            
maxcomp=n//сохраняем счетяик повторов
            
mcn=comp//сохраняем повторяемый элемент
        
}        
    }
 return 
mcn;
}  

void setup() 
{
  
D14_OutD14_Low//пин trig ультразвукового сонара
   
D15_In//пин echo  ультразвукового сонара
  
Serial.begin(115200);
}
 
void loop() 
 {
 for (
uint8_t i 0size_buff; ++i) { sensor[i]=GetDistance();}//производим несколько замеров
     
uint16_t cm find_similar(sensorsize_buffrange); //фильтруем показания датчика
     
       
Serial.println(cmDEC); 
 }
 
 
uint16_t GetDistance() 
{
  
D14_Highdelay_us(10);  D14_Low;  //запустить измерение
   
uint16_t duration pulseIn(15,HIGH); //считываем длительность времени прохождения эха  
   
delay_ms((50000-duration)/1000); //задержка между посылками
  
return duration/58// переводим в см

Склеил только код первого сообщения и функцию симиляр.

Очень понравилась Ваша библиотека, хоть я еще ее и не использовал, почитал ее описание, пример с ускорением ардуино. Не скажу что мне все понятно (не разбираюсь в вайринг и библитеки для меня, само написание, темный лес)
П.С. Удивительно что все пользуются нефильтрованными значениями и не жалуются не попробовав добиться внятных результатов. Спасибо за труд! Нашел так же для оптического датчика с фильтром http://robot-develop.org/archives/1043

Последний раз редактировалось kulverstukas; 27.10.2014 в 15:42.
kulverstukas вне форума   Ответить с цитированием
Старый 27.10.2014, 16:06   #10
kulverstukas
Junior Member
 
Регистрация: 27.10.2014
Сообщений: 26
Вес репутации: 0
kulverstukas is an unknown quantity at this point
По умолчанию

Почитал другие Ваши темы, наткнулся на использование этого датчика "Робот объезжающий препятствия" и код заработал. Не понял почему не работало до этого (наверно из-за подряд описанных uin16_t) но вот так работает:
PHP код:
#include <CyberLib.h>


#define size_buff 5 //размер массива sensor
uint16_t sensor[size_buff]; //массив для хранения замеров дальномера
uint8_t stat=0//направление разворота

void setup()  
{

  
D2_OutD2_Low//пин trig ультразвукового сонара
  
D3_In;     //пин echo  ультразвукового сонара
 
}

void loop()
{
Start  
  uint16_t dist
=GetDistance(); //производим замер дистанции

End;}

//***************************************************
uint16_t GetDistance() 
{
 
uint16_t dist;
 for (
uint8_t i 0size_buff; ++i//производим несколько замеров
  

    
D2_Highdelay_us(10);  D2_Low;  //запустить измерение
   
dist pulseIn(3HIGH2400); //считываем длительность времени прохождения эха, ограничить время ожидания
   
if(dist==0dist=2400;  
   
sensor[i]=dist;  //сохранить в массиве
   
delay_ms(40); //задержка между посылками

  
}
  
dist=(find_similar(sensorsize_buff58))/58// //фильтруем показания датчика и переводим в см
  
return dist;

Из текста все повыбрасывал про моторы, повороты, собаку :-)

Получил значения в МониторПорта. Больше 77 см не удалось получить, могли бы подсказать почему? (значения 2400 конечно же менял до 12к. так как лонг я так понимаю диапазон велик)
Хотел бы сделать построение карты пространства на основе этого датчика. Вы пишите что поставили датчик шарп потому что долго нужно считывать значения если они равны 5 м, но этот датчик вобще до 1.5 м и выполнить мою задачу в комнате можно только при объезде комнаты и невозможно, с места начала движения. Я производил замеры с указанного Вами оптического датчика (можно это переместить куда посчитает нужным) и он так же не идеален.

Последний раз редактировалось kulverstukas; 27.10.2014 в 17:27.
kulverstukas вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 22:56. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика