Робот на ультразвуке

yanbaev72
Offline
Зарегистрирован: 08.11.2013

Доброго времени суток!

Подключаю сонар по этой схеме (у меня Arduino UNO, Motor Shield L293D на четыре мотора, двухколесное шасси, сонар HC-SR04, динамика нету)

заливаю этот скетч

Но при попытке залить скетч выскакивает ошибка

motor_IR_forum.ino: In function 'uint16_t GetDistance()':
motor_IR_forum:62: error: 'find_similar' was not declared in this scope
и выделяется строчкав скетче
1 dist=(find_similar(sensor, size_buff, 58))/58; // //фильтруем показания датчика и переводим в см

В чем может быть проблема?

 

carduino.ru
Offline
Зарегистрирован: 06.12.2011
maksim
Offline
Зарегистрирован: 12.02.2012

yanbaev72 пишет:

В чем может быть проблема?

В том что функция(?) find_similar() отсутствует.

yanbaev72
Offline
Зарегистрирован: 08.11.2013

carduino.ru пишет:

Скачайте библиотеку CyberLib.h

Эту библиотеку я уже скачал и закинул в :\Program Files\Arduino\libraries

yanbaev72
Offline
Зарегистрирован: 08.11.2013

maksim пишет:

yanbaev72 пишет:

В чем может быть проблема?

В том что функция(?) find_similar() отсутствует.

как понять отсутствует?

Я вот сейчас снова обновил библиотеку CyberLib.h,снова попробовал залить скетч,

#include <CyberLib.h>
#include <avr/wdt.h> 

#define motors_init {D4_Out; D5_Out; D6_Out; D7_Out;}
#define robot_go {D4_Low; D5_High; D6_High; D7_Low;}
#define robot_stop {D4_Low; D5_Low; D6_Low; D7_Low;}
#define robot_rotation_left {D4_Low; D5_High; D6_Low; D7_High;}
#define robot_rotation_right {D4_High; D5_Low; D6_High; D7_Low;}

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

void setup()  
{
  motors_init;  //инициализация выходов моторов
  D11_Out; //динамик
  D14_Out; D14_Low; //пин trig ультразвукового сонара
  D15_In; //пин echo  ультразвукового сонара
  for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000)); //звуковое оповещение готовности робота
  wdt_enable (WDTO_500MS);    //Сторожевая собака 1сек.
}

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

    if( dist < 10) {rotation(stat, 255);} else   
    if( dist < 20) {rotation(stat, 200);} else 
    if( dist < 40) {rotation(stat, 130);} else
                   {robot_go; stat=~stat;}           //поехали!!!
      
     wdt_reset(); //покормить собаку
End;}

//***************************************************
void rotation(uint8_t arr, uint8_t dur) 
{
    switch (arr) 
    {
    case 0:    robot_rotation_right;
      break;
    case 255:    robot_rotation_left; 
      break;    
    } 
    delay_ms(dur);    
    robot_stop;
}
//***************************************************
uint16_t GetDistance() 
{
 uint16_t dist;
 for (uint8_t i = 0; i < size_buff; ++i) //производим несколько замеров
  { 
    D14_High; delay_us(10);  D14_Low;  //запустить измерение
   dist = pulseIn(15, HIGH, 2400); //считываем длительность времени прохождения эха, ограничить время ожидания
   if(dist==0) dist=2400;  
   sensor[i]=dist;
   delay_ms(40); //задержка между посылками
   wdt_reset(); //покормить собаку, что бы она не сбежала 
  }
  dist=(find_similar(sensor, size_buff, 58))/58; // //фильтруем показания датчика и переводим в см
  return dist;
} 
//***************************************************  
void beep(uint8_t dur, uint16_t frq)
{
  dur=(1000/frq)*dur;  //расчет длительности бипа
  for(byte i=0; i<dur; i++)
  {
    D11_High; 
    delay_us(frq); 
    D11_Low;
    delay_us(frq);
  } 
} 

снова ошибка.

sketch_jan04a.ino: In function 'void setup()':
sketch_jan04a:20: error: call of overloaded 'beep(int, long int)' is ambiguous
D:\Program Files\Arduino\libraries\CyberLib/CyberLib.h:230: note: candidates are: void beep(uint16_t, uint16_t)
sketch_jan04a.ino:16: note:                 void beep(uint8_t, uint16_t)
 
и выделенная строка
  for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000)); //звуковое оповещение готовности робота
 

P.S. Удалил из скетча строчку "for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000)); //звуковое оповещение готовности робота" и скетч залился, но ни чего не происходит, платформа ни куда не двигается и датчик ни как не реагирует.....

 

Странно..... залилскетч второй раз без той же строчки....робот поехал, НО едет всегда налево, т.е. постоянно крутится правое колесо, датчик реагирует на расстоянии примерно 10-15 см, но ни чего не меняется, робот также едет налево с единственным отличием-едет он рывками, как бы дергается видимо косяк в скетче......помогите пожалуйста! если надо могу видео скинуть?!

carduino.ru
Offline
Зарегистрирован: 06.12.2011







Вот последняя версия скетча

Попробуйте его

Возможно что у Вас драйвер моторов не правильно подключен






#include <CyberLib.h>

#define motors_init {D4_Out; D5_Out; D6_Out; D7_Out;}
#define robot_go {D4_Low; D5_High; D6_High; D7_Low;}
#define robot_back {D4_High; D5_Low; D6_Low; D7_High;}
#define robot_stop {D4_Low; D5_Low; D6_Low; D7_Low;}
#define robot_rotation_left {D4_Low; D5_High; D6_Low; D7_High;}
#define robot_rotation_right {D4_High; D5_Low; D6_High; D7_Low;}

#define size_buff 5 
uint16_t sensor[size_buff]; 
uint8_t stat=0; 

void setup()  
{
  motors_init;  
  D11_Out;  D11_Low;    
  D14_Out; D14_Low; //пин trig  
  D15_In;     //пин echo   
  randomSeed(A6_Read); //  
  for(uint8_t i=0; i<12; i++) beep(70, random(100, 2000)); //   
  wdt_enable(WDTO_500MS);    //Сторожевая собака 0,5сек.
}

void loop()
{Start  
  uint16_t dist=GetDistance(); //  

    if( dist < 10) {rotation(stat, 255);} else   //    
    if( dist < 20) {rotation(stat, 200);} else   //     
    if( dist < 40) {rotation(stat, 130);} else   //     
                   {robot_go; stat=~stat;}       //    
     wdt_reset(); //покормить собаку
End;}
//***************************************************
void rotation(uint8_t arr, uint8_t dur) 
{
    switch (arr) //смотрим в  
    {
    case 0:    robot_rotation_right;
      break;
    case 255:    robot_rotation_left; 
      break;    
    } 
    delay_ms(dur);    //угол разворота
    robot_stop;      //стоп мотор!
}
//***************************************************
uint16_t GetDistance() 
{
 uint16_t dist;
 for (uint8_t i = 0; i < size_buff; ++i) //производим несколько замеров
  { 
    D14_High; delay_us(10);  D14_Low;  // 
   dist = pulseIn(15, HIGH, 2400); //      
   if(dist==0) dist=2400;  
   sensor[i]=dist;  //сохранить в массиве
   delay_ms(40); //задержка между посылками
   wdt_reset(); //покормить собаку, что бы она не сбежала 
  }
  dist=(find_similar(sensor, size_buff, 58))/58; // // 
  return dist;
} 

 

 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

carduino.ru пишет:








Вот последняя версия скетча

Попробуйте его

Возможно что у Вас драйвер моторов не правильно подключен






#include <CyberLib.h>

#define motors_init {D4_Out; D5_Out; D6_Out; D7_Out;}
#define robot_go {D4_Low; D5_High; D6_High; D7_Low;}
#define robot_back {D4_High; D5_Low; D6_Low; D7_High;}
#define robot_stop {D4_Low; D5_Low; D6_Low; D7_Low;}
#define robot_rotation_left {D4_Low; D5_High; D6_Low; D7_High;}
#define robot_rotation_right {D4_High; D5_Low; D6_High; D7_Low;}

#define size_buff 5 
uint16_t sensor[size_buff]; 
uint8_t stat=0; 

void setup()  
{
  motors_init;  
  D11_Out;  D11_Low;    
  D14_Out; D14_Low; //пин trig  
  D15_In;     //пин echo   
  randomSeed(A6_Read); //  
  for(uint8_t i=0; i<12; i++) beep(70, random(100, 2000)); //   
  wdt_enable(WDTO_500MS);    //Сторожевая собака 0,5сек.
}

void loop()
{Start  
  uint16_t dist=GetDistance(); //  

    if( dist < 10) {rotation(stat, 255);} else   //    
    if( dist < 20) {rotation(stat, 200);} else   //     
    if( dist < 40) {rotation(stat, 130);} else   //     
                   {robot_go; stat=~stat;}       //    
     wdt_reset(); //покормить собаку
End;}
//***************************************************
void rotation(uint8_t arr, uint8_t dur) 
{
    switch (arr) //смотрим в  
    {
    case 0:    robot_rotation_right;
      break;
    case 255:    robot_rotation_left; 
      break;    
    } 
    delay_ms(dur);    //угол разворота
    robot_stop;      //стоп мотор!
}
//***************************************************
uint16_t GetDistance() 
{
 uint16_t dist;
 for (uint8_t i = 0; i < size_buff; ++i) //производим несколько замеров
  { 
    D14_High; delay_us(10);  D14_Low;  // 
   dist = pulseIn(15, HIGH, 2400); //      
   if(dist==0) dist=2400;  
   sensor[i]=dist;  //сохранить в массиве
   delay_ms(40); //задержка между посылками
   wdt_reset(); //покормить собаку, что бы она не сбежала 
  }
  dist=(find_similar(sensor, size_buff, 58))/58; // // 
  return dist;
} 

 

 

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

 

Скажите, а есть какой нибудь скетч для проверки сонара? Или тут не в нем проблема?

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Похоже что проблем а в сонаре

yanbaev72
Offline
Зарегистрирован: 08.11.2013

carduino.ru пишет:

Похоже что проблем а в сонаре

а как его можно проверить?

carduino.ru
Offline
Зарегистрирован: 06.12.2011

А питание робота как и от чего осуществляется?

 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

carduino.ru пишет:

А питание робота как и от чего осуществляется?

 

Питание платформы осуществляется от 4х Li-ion АА-аккумуляторов по 3,7v каждый, соедененных по 2 последовательно и 2по2 параллельно, на выходе ~7,5v.

Питание ардуины реализованно от 9v батарейки типа "крона"

Сонар подключен через L293D Motor Drive Shield может в этом проблема, может его надо напрямую к дуине цеплять? тогда возникает вопрос как в таком случае подключать Motor  Shield ?

Vasia.Z
Vasia.Z аватар
Offline
Зарегистрирован: 30.11.2013

yanbaev72 пишет:

carduino.ru пишет:

Похоже что проблем а в сонаре

а как его можно проверить?

Найдите, что у вас за модель, в вики производителя должна быть инструкция и примеры кодов.
Например: http://www.seeedstudio.com/wiki/Grove_-_Ultrasonic_Ranger

Потом ещё на этом форуме можно, тоже кучу всего найдете.

 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

Vasia.Z пишет:

yanbaev72 пишет:

carduino.ru пишет:

Похоже что проблем а в сонаре

а как его можно проверить?

Найдите, что у вас за модель, в вики производителя должна быть инструкция и примеры кодов.
Например: http://www.seeedstudio.com/wiki/Grove_-_Ultrasonic_Ranger

Потом ещё на этом форуме можно, тоже кучу всего найдете.

 

Модель сонара у меня HC-SR04

Vasia.Z
Vasia.Z аватар
Offline
Зарегистрирован: 30.11.2013

Воспользуйтесь поиском по сайту, вот например нашлось:

http://arduino.ru/forum/obshchii/dalnomer-hc-sr04

http://arduino.ru/forum/programmirovanie/sketch-dlya-ultrasonic-hc-sr04

И так далее:)