Yvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
0
02:30, 05 мая 2010

Навигейшн

Чем мне нравится НХТ, так это тем, что вместо никому не нужного "Хелло ворлд" мы получаем вполне реальное действие от программы. В планах было реализовать бота, который бы перемещался в пространстве не напарываясь на преграды.

Язык БрикСи является обрезанным Си для этой серии Лего, поэтому разобраться в нем не составило никакого труда.

Алгоритм программы таков.

Бесконечный цикл
{
Сканируем пространство:
-Считываем показатель ультразвука
-Сохраняем параметр
-Поворачиваем на 45 градусов
Производим действие 8 раз ( 8 х 45 = 360)
Находим максимум из полученного массива.
Передвигаемся дальше:
-Разворачиваемся до указанного максимума
-Едем вперед
}

Сам код

#define US_PORT S4 //Переменная для номера порта с сенсором ультразвка
task main() // Тело программы
{
int max = 0; //Назначаем переменные
int maxnumber = 0;
unsigned int maxnumbert = 0;
long variation[];
ArrayInit(variation, 0, 8);
SetSensorLowspeed(US_PORT); //Говорим голове, где находится сенсор
//Открываем цикл
while(1)
{
//Скидываем значения
maxnumber = 0;
//Собираем информацию
for(int i = 0; i < 8; i++)
{
variation[i] = SensorUS(US_PORT);
Wait(50);
OnRev(OUT_B, 75);
Wait(1000);
Off(OUT_B);
Wait(1000);
}
// Находим максимум в массиве
for(int i = 0; i < 8; i++) { if(variation[i] > maxnumber)
{
maxnumber = variation[i];
maxnumbert = i;
}
}
//Разворачиваем перед открытым пространством
OnFwd(OUT_B, 75);
Wait((7 - maxnumbert) * 1000);
Off(OUT_B);
//Едем вперед
OnFwd(OUT_BC, 75);
Wait(3000);
Off(OUT_BC);
}
}

Мы не индусы и нам не платят за строчку, поэтому упрощаем основную часть до такого вида:

for(int i = 0; i < 8; i++)
{
variation[i] = SensorUS(US_PORT);
if(variation[i] > maxnumber)
{
maxnumber = variation[i];
maxnumbert = i;
}
Wait(50);
OnRev(OUT_B, 75);
Wait(1000);
Off(OUT_B);
Wait(1000);
}

Очень много тонкостей, над которыми нужно поработать. Например, сохранение в файл для записи пути, чтобы в экстренный случай вернуться обратно, быстрые повороты и т.д.

0
163
0