/* Исходный текст (с) Jonathan Knudsen. Lego MindStorms: Programming with NQC http://www.oreillynet.com/pub/a/network/2000/02/25/mindstorms/NQC.html Перевод и модификация (с) Roboclub 2003 ------------------------------------------------------------- Робот с этой программой блуждает по комнате, меняя направление движения случайным образом при столкновении с препятствиями, и останавливается, найдя темное место. Датчик освещенности возвращает значение от 0 (темно) до 100 (светло). При движении по комнате значения обычно изменяются в диапазоне от 30 до 70. Можно было бы указать конкретное пороговое значение, чтобы робот "знал", что он попал в темное место. Однако программа в этом случае не всегда будет работать правильно, поскольку освещенность в комнате меняется в зависимости от времени суток и других причин. Поэтому применен другой алгоритм: программа при начале работы определяет базовое значение освещенности и сохраняет его в переменной baseline; программа считает, что робот попал в "темное место", если текущий уровень освещенности стал на 5% меньше базового. При столкновении с препятствием робот отъезжает от него и поворачивается в случайную сторону на случайный угол (поворот длится от 0.5 s до 2.5 s). Для удобства программа разбита на три задачи. Главная задача main устанавливает значение baseline и запускает остальные задачи. Задача avoid отвечает за отъезд от препятствий при нажатии на бампер. Задача dark останавливает моторы робота и программу, когда робот попадает в темное место. */ int baseline; task main() { // Initialize. baseline = SENSOR_2; // Start tasks. start avoid; start dark; } task avoid() { On(OUT_A + OUT_B); while (true) { if (SENSOR_1 == 1) { // Back away. Rev(OUT_A + OUT_B); Wait(50); // Turn a random direction. if (Random(1) == 0) { Fwd(OUT_A); Rev(OUT_B); } else { Rev(OUT_A); Fwd(OUT_B); } // Turn for a random duration. Wait(50 + Random(200)); // Go forward again. Fwd(OUT_A + OUT_B); } } } task dark() { until (SENSOR_2 <= baseline - 5) ; Off(OUT_A + OUT_B); stop avoid; }