Робот на ультразвуке
- Войдите на сайт для отправки комментариев
Пт, 03/01/2014 - 22:34
Доброго времени суток!
Подключаю сонар по этой схеме (у меня 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; // //фильтруем показания датчика и переводим в см |
В чем может быть проблема?
Скачайте библиотеку CyberLib.h
Скачайте библиотеку CyberLib.h
Эту библиотеку я уже скачал и закинул в :\Program Files\Arduino\libraries
как понять отсутствует?
Я вот сейчас снова обновил библиотеку 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); } }снова ошибка.
P.S. Удалил из скетча строчку "for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000)); //звуковое оповещение готовности робота" и скетч залился, но ни чего не происходит, платформа ни куда не двигается и датчик ни как не реагирует.....
Странно..... залилскетч второй раз без той же строчки....робот поехал, НО едет всегда налево, т.е. постоянно крутится правое колесо, датчик реагирует на расстоянии примерно 10-15 см, но ни чего не меняется, робот также едет налево с единственным отличием-едет он рывками, как бы дергается видимо косяк в скетче......помогите пожалуйста! если надо могу видео скинуть?!
Попробуйте его
Возможно что у Вас драйвер моторов не правильно подключен
#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; }Попробуйте его
Возможно что у Вас драйвер моторов не правильно подключен
#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; }Тоже самое, единственное отличие что в самом начале крутятся оба колеса в разные стороны, где то секунду, а потом снова крутится одно правое колесо и робот едет налево, тоесть кротится вокруг левого колеса...
Скажите, а есть какой нибудь скетч для проверки сонара? Или тут не в нем проблема?
Похоже что проблем а в сонаре
Похоже что проблем а в сонаре
а как его можно проверить?
А питание робота как и от чего осуществляется?
А питание робота как и от чего осуществляется?
Питание платформы осуществляется от 4х Li-ion АА-аккумуляторов по 3,7v каждый, соедененных по 2 последовательно и 2по2 параллельно, на выходе ~7,5v.
Питание ардуины реализованно от 9v батарейки типа "крона"
Сонар подключен через L293D Motor Drive Shield может в этом проблема, может его надо напрямую к дуине цеплять? тогда возникает вопрос как в таком случае подключать Motor Shield ?
Похоже что проблем а в сонаре
а как его можно проверить?
Найдите, что у вас за модель, в вики производителя должна быть инструкция и примеры кодов.
Например: http://www.seeedstudio.com/wiki/Grove_-_Ultrasonic_Ranger
Потом ещё на этом форуме можно, тоже кучу всего найдете.
Похоже что проблем а в сонаре
а как его можно проверить?
Найдите, что у вас за модель, в вики производителя должна быть инструкция и примеры кодов.
Например: http://www.seeedstudio.com/wiki/Grove_-_Ultrasonic_Ranger
Потом ещё на этом форуме можно, тоже кучу всего найдете.
Модель сонара у меня HC-SR04
Воспользуйтесь поиском по сайту, вот например нашлось:
http://arduino.ru/forum/obshchii/dalnomer-hc-sr04
http://arduino.ru/forum/programmirovanie/sketch-dlya-ultrasonic-hc-sr04
И так далее:)