HC-SR04 машина
- Войдите на сайт для отправки комментариев
Чт, 22/08/2013 - 17:24
Здравствуйте!
Помогите составить код для машинки аля объезжайка, используется платформа от РУ машины, драйвер двигателей на L298N (готовый). Есть 2 сонара, а можно сделать с 1, но на сервоприводе? Вообщем спасибо заранее =)
Сам пробовал написать, но машина "сама по себе" =( То объедет, то врежется в ту же стенку.
UP
Могу помочь кодом для двухмоторной машинки
Видео
Могу помочь кодом для двухмоторной машинки
Видео
Я не откажусь от любой помощи. А машинка, та что на видео - класс!
Я не откажусь от любой помощи. А машинка, та что на видео - класс!
Будут вопросы, задавай
#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_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 ультразвукового сонара
randomSeed(A6_Read); //Получить случайное значение
for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000)); //звуковое оповещение готовности робота
wdt_enable (WDTO_500MS); //Сторожевая собака 0,5сек.
}
void loop()
{Start
uint16_t dist=GetDistance(); //производим замер дистанции
if( dist < 10) {rotation(stat, 255);} else //если 10см максимальный угол разворота
if( dist < 20) {rotation(stat, 200);} else //если 20см средний угол разворота
if( dist < 40) {rotation(stat, 130);} else //если 40см минимальный угол разворота
{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);
}
}
Схема
Спасибо всем, буду разбираться!