Без описания |
Поиск в теме | Версия для печати |
fortekom |
Отправлено: 31 Октября, 2014 - 18:00:57
|
Маршал
Сообщений всего: 148
Дата рег-ции: Окт. 2012
|
Нам понадобилась программа, под ардуину, для прохождения лабиринта, но почему то ни чего готового не нашел кроме - http://www.myrobot.ru/articles/l..._mazesolving.php
Пришлось написать самим, может кому нибудь пригодится. (таким начинающим как мы)
CODE:#define SPEED_LEFT 5 // ШИМ для левой стороны
#define SPEED_RIGHT 9 // ШИМ для правой стороны
#define DIR_LEFT 6 // цифровой выход для левой стороны
#define DIR_RIGHT 10 // цифровой выход для правой стороны
#define CENTR 4 // датчик растояния спереди
#define RIGHT 12 // датчик растояния с правой стороны
int SPEED = 20; // скорость движения, если уменьшать то будет быстрее ехать
int prym = 714; //714 - 7,2В 437 - 11,1 проезд 30см
// параметр отвечает за проезд вперед на один шаг
// к примеру ставим 1000 и робот проезжает на 42см, тогда 1000*30/42=714
int prym1 = 250; // когда кончится стена с право, проехать до середины
int pov = 400; //250 поворот на 90гр
void runForward()
{
analogWrite(SPEED_LEFT, SPEED);
analogWrite(SPEED_RIGHT, SPEED);
digitalWrite(DIR_LEFT, 1);
digitalWrite(DIR_RIGHT, 1);
}
void runVPERED()
{
analogWrite(SPEED_LEFT, SPEED);
analogWrite(SPEED_RIGHT, SPEED);
digitalWrite(DIR_LEFT, 1);
digitalWrite(DIR_RIGHT, 1);
delay (prym);
digitalWrite(DIR_LEFT, 0);
digitalWrite(DIR_RIGHT, 0);
analogWrite(SPEED_LEFT, 0);
analogWrite(SPEED_RIGHT, 0);
}
void runVPERED1()
{
analogWrite(SPEED_LEFT, SPEED);
analogWrite(SPEED_RIGHT, SPEED);
digitalWrite(DIR_LEFT, 1);
digitalWrite(DIR_RIGHT, 1);
delay (prym1);
digitalWrite(DIR_LEFT, 0);
digitalWrite(DIR_RIGHT, 0);
analogWrite(SPEED_LEFT, 0);
analogWrite(SPEED_RIGHT, 0);
}
void runPOVR()
{
analogWrite(SPEED_LEFT, SPEED);
analogWrite(SPEED_RIGHT, (255-SPEED));
digitalWrite(DIR_LEFT, 1);
digitalWrite(DIR_RIGHT, 0);
delay (pov);
analogWrite(SPEED_RIGHT, 0);
digitalWrite(DIR_LEFT, 0);
analogWrite(SPEED_LEFT, 0);
}
void runPOVL()
{
analogWrite(SPEED_LEFT, (255-SPEED));
analogWrite(SPEED_RIGHT, SPEED);
digitalWrite(DIR_LEFT, 0);
digitalWrite(DIR_RIGHT, 1);
delay (pov);
digitalWrite(DIR_RIGHT, 0);
analogWrite(SPEED_LEFT, 0);
analogWrite(SPEED_RIGHT, 0);
}
void setup()
{
pinMode(SPEED_LEFT, OUTPUT);
pinMode(SPEED_RIGHT, OUTPUT);
pinMode(DIR_LEFT, OUTPUT);
pinMode(DIR_RIGHT, OUTPUT);
}
void loop()
{
if (digitalRead(RIGHT) == 0 and digitalRead(CENTR) == 1){
runForward();// едем прямо пока стена не кончится
}
else {
if (digitalRead(RIGHT) == 0 and digitalRead(CENTR)== 0){
runPOVL();// если справо и спереди стена, то поворот на лево
}
else {// иначе делаем поворот на право и шаг вперед
runVPERED1(); // немного вперед
runPOVR(); // повернуть на право
runVPERED(); //проехать 30 см вперед
if (digitalRead(RIGHT) == 1){//если справо нет стены, то делаем
// ещё один поворот на право и шаг вперед
runPOVR();
runVPERED();
}
}
}
delay (100);
}
|
|
|
fortekom |
Отправлено: 31 Октября, 2014 - 21:14:59
|
Маршал
Сообщений всего: 148
Дата рег-ции: Окт. 2012
|
Лабиринт размером 120см на 240см составленный из квадратов 30*30, очень быстро меняется маршрут.
Вот тут правило - http://wroboto.ru/rules/freecat/.../svobcat_62.html
Даже я засветился на фото
(Добавление)
С датчиков берем только три состояния.
1- впереди пусто, а с право стена
2- впереди пусто, а с право кончилась стена
3- впереди стена
При повороте на право, может быть два состояния
1- мы повернули и с право стена
2- мы повернули, а с право нет стены, значит делаем ещё поворот на 90гр.
Вот и весь алгоритм.
С начало мы сделали, чтобы робот делал шаг (то есть проезжал ровно 30см), но наш самодельный лабиринт был не идеальным. Поэтому вместо шага, он у нас двигается вдоль стены, пока датчик не увидит проход с право, а дальше нужно проехать до центра квадрата, повернуть на 90гр. и ещё проехать 30см на следующий квадрат, если с право нет стены, то сделать ещё поворот на 90гр. А дальше цикл повторяется.
30см настраивали так- ставили линейку и давали проехать роботу за 1000мс (1сек) из полученного результата с помощью пропорции находили нужное время для прохождения ровно 30см.
Увеличивая напряжение скорость увеличивалась, но он вставал на дыбы и переворачивался, пришлось выбрать оптимальное напряжение 7,4В.
Хотя если добавить плавность набора скорости, можно улучшить результат. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (6): « 1 2 3 [4] 5 6 » |
« Делаем роботов » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|