Программирование LEGO NXT роботов на языке NXC - Более интересная программа — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(Подводим итоги)
 
(не показано 6 промежуточных версий этого же участника)
Строка 5: Строка 5:
  
 
==Учимся делать повороты==
 
==Учимся делать повороты==
You can make your robot turn by stopping or reversing the direction of one of the two motors. Here is an
+
Вы можете заставить робота поворачиваться путём остановки или включении в обратном направлении одного из двух моторов. Вот пример того, как это можно сделать. Введите его, загрузите полученную программу в робота и запустите. Робот должен проехать немного вперед, после чего повернуться на 90 градусов вправо.
example. Type it in, download it to your robot and let it run. It should drive a bit and then make a 90-degree right
+
task main()
turn.
+
{
task main()
+
OnFwd(OUT_AC, 75);
{
+
Wait(500);
OnFwd(OUT_AC, 75);
+
OnRev(OUT_C, 75);
Wait(800);
+
Wait(360);
OnRev(OUT_C, 75);
+
Off(OUT_AC);
Wait(360);
+
}
Off(OUT_AC);
+
 
}
+
Вам может потребоваться попробовать немного другие числа, вместо 360 указанного во втором операторе Wait(), чтобы сделать 90
You might have to try some slightly different numbers than 500 in the second Wait() command to make a 90
+
градусный поворот. Это зависит от типа поверхности по которой перемещается робот. Чтобы не отыскивать в больших программах такие числа, которые могут потребовать настройки существует возможность дать этому числу имя и определить его в начале программы. В языке NXC вы можете определять постоянные значения (константы) так, как показано в следующей программе:
degree turn. This depends on the type of surface on which the robot runs. Rather than changing this in the
+
#define MOVE_TIME 500
program it is easier to use a name for this number. In NXC you can define constant values as shown in the
+
#define TURN_TIME 360
following program.
+
task main()
#define MOVE_TIME 1000
+
{
#define TURN_TIME 360
+
OnFwd(OUT_AC, 75);
task main()
+
Wait(MOVE_TIME);
{
+
OnRev(OUT_C, 75);
OnFwd(OUT_AC, 75);
+
Wait(TURN_TIME);
Wait(MOVE_TIME);
+
Off(OUT_AC);
OnRev(OUT_C, 75);
+
}
Wait(TURN_TIME);
+
 
Off(OUT_AC);
+
Первые две строки определяют две константы. Теперь их можно использовать везде в программе вместо этих чисел. Использование констант хорошо по двум причинам: оно делает программы более читаемыми и более удобно менять значения констант, чем искать во всей программе где еще у вас время поворота было прописано как 360 тысячных секунды. Обратите внимание, что BricxCC обозначает операторы define отдельным цветом. Как мы увидим в главе 6, вы можете подобным образом определять не только константы.
}
+
 
The first two lines define two constants. These can now be used throughout the program. Defining constants is
 
good for two reasons: it makes the program more readable, and it is easier to change the values. Note that
 
BricxCC gives the define statements its own color. As we will see in Chapter VI, you can also define things
 
other than constants.
 
 
==Повторяем команды==
 
==Повторяем команды==
Let us now try to write a program that makes the robot drive in a square. Going in a square means: driving
+
Теперь давайте попробуем написать программу, которая заставить робота проехать по квадрату. Проехать по квадрату означает: проехать вперед, повернуться на 90 градусов, снова проехать вперед, снова повернуть на 90 градусов и так далее. Мы можем просто написать 4 раза кусок указанного выше кода, но значительно проще это можно сделать с использованием оператора цикла (repeat).
forwards, turning 90 degrees, driving forwards again, turning 90 degrees, etc. We could repeat the above piece of
+
 
code four times but this can be done a lot easier with the repeat statement.
+
#define MOVE_TIME 500
 +
#define TURN_TIME 360
 +
task main()
 +
{
 +
  repeat(4)
 +
  {
 +
    OnFwd(OUT_AC, 75);
 +
    Wait(MOVE_TIME);
 +
    OnRev(OUT_C, 75);
 +
    Wait(TURN_TIME);
 +
  }
 +
  Off(OUT_AC);
 +
}
 +
 
 +
Число внутри скобок оператора цикла указывает сколько раз повторить операторы в следующих за оператором фигурных скобках. Обратите внимание, что в приведенной выше программе мы сместили операторы внутри цикла вправо. Это не является обязательным, но делает программу более легко читаемой.
 +
 
 +
В качестве окончательного примера давайте заставим робота 10 раз проехать по квадрату:
 +
#define MOVE_TIME 500
 +
#define TURN_TIME 360
 +
task main()
 +
{
 +
  repeat(10)
 +
  {
 +
    repeat(4)
 +
    {
 +
      OnFwd(OUT_AC, 75);
 +
      Wait(MOVE_TIME);
 +
      OnRev(OUT_C, 75);
 +
      Wait(TURN_TIME);
 +
    }
 +
  }
 +
  Off(OUT_AC);
 +
}
 +
Теперь у нас один оператор цикла внутри другого. Это называется “вложенный” оператор цикла. Вы можете делать операторы цикла любого уровня вложенности. Внимательно посмотрите на фигурные скобки и отступы, использованные в программе. Задача начинается с первой фигурной скобки и заканчивается последней. Первый оператор цикла начинается содержит операторы внутри второй и пятой фигурных скобок. Вложенный в него оператор цикла содержит операторы между третьей и четвертой фигурной скобкой. Как вы видите фигурные скобки всегда идут парами и кусок программы между ними выделяется отступом слева.
  
#define MOVE_TIME 500
 
#define TURN_TIME 500
 
task main()
 
{
 
repeat(4)
 
{
 
OnFwd(OUT_AC, 75);
 
Wait(MOVE_TIME);
 
OnRev(OUT_C, 75);
 
Wait(TURN_TIME);
 
}
 
Off(OUT_AC);
 
}
 
The number inside the repeat statement's parentheses indicates how many times the code inside its brackets
 
must be repeated. Note that, in the above program, we also indent the statements. This is not necessary, but it
 
makes the program more readable.
 
As a final example, let us make the robot drive 10 times in a square. Here is the program:
 
#define MOVE_TIME 1000
 
#define TURN_TIME 500
 
task main()
 
{
 
repeat(10)
 
{
 
repeat(4)
 
{
 
OnFwd(OUT_AC, 75);
 
Wait(MOVE_TIME);
 
OnRev(OUT_C, 75);
 
Wait(TURN_TIME);
 
}
 
}
 
Off(OUT_AC);
 
}
 
There is now one repeat statement inside the other. We call this a “nested” repeat statement. You can nest repeat
 
statements as much as you like. Take a careful look at the brackets and the indentation used in the program. The
 
task starts at the first bracket and ends at the last. The first repeat statement starts at the second bracket and ends
 
at the fifth. The nested repeat statement starts at the third bracket and ends at the fourth. As you see the brackets
 
always come in pairs and the piece between the brackets we indent.
 
 
==Добавляем комментарии==
 
==Добавляем комментарии==
To make your program even more readable, it is good to add some comment to it. Whenever you put // on a
+
Чтобы сделать вашу программу еще более читаемой, неплохо бы добавить в неё комментарии. Когда мы пишем в строке // всё что после этих символов компилятор будет считать комментарием и проигнорирует. Длинный комментарий на несколько строк можно размещать между символами /* и */. BricxCC выделяет комментарии отдельным цветом в текстовом редакторе. Полный код программы с комментариями выглядит так:
line, the rest of that line is ignored and can be used for comments. A long comment can be put between /* and
+
 
*/. Comments are syntax highlighted in the BricxCC. The full program could look as follows:
+
/* 10 SQUARES
- 12 -
+
This program make the robot run 10 squares
/* 10 SQUARES
+
*/
This program make the robot run 10 squares
+
#define MOVE_TIME 500 // Time for a straight move
*/
+
#define TURN_TIME 360 // Time for turning 90 degrees
#define MOVE_TIME 500 // Time for a straight move
+
task main()
#define TURN_TIME 360 // Time for turning 90 degrees
+
{
task main()
+
  repeat(10) // Make 10 squares
{
+
  {
repeat(10) // Make 10 squares
+
    repeat(4)
{
+
    {
repeat(4)
+
      OnFwd(OUT_AC, 75);
{
+
      Wait(MOVE_TIME);
OnFwd(OUT_AC, 75);
+
      OnRev(OUT_C, 75);
Wait(MOVE_TIME);
+
      Wait(TURN_TIME);
OnRev(OUT_C, 75);
+
    }
Wait(TURN_TIME);
+
  }
}
+
  Off(OUT_AC); // Now turn the motors off
}
+
}
Off(OUT_AC); // Now turn the motors off
+
 
}
 
 
==Подводим итоги==
 
==Подводим итоги==
In this chapter you learned the use of the repeat statement and the use of comment. Also you saw the function
+
В этой главе вы освоили использование операторов цикла и использование комментариев. Так же вы увидели зачем используются вложенные фигурные скобки и отступы. С имеющимися на этом этапе знаниями вы уже можете писать программы под управлением которых робот будет двигаться по практически каким угодно траекториям. Рекомендуется перед переходом к следующей главе попробовать самостоятельно запрограммировать робота для движения по разным интересным траекториям. Для этого можете попробовать варьировать программы из этой или предыдущей главы.
of nested brackets and the use of indentation. With all you know so far you can make the robot move along all
 
sorts of paths. It is a good exercise to try and write some variations of the programs in this chapter before
 
continuing with the next chapter.
 

Текущая версия на 15:31, 16 мая 2009

Автор: Daniele Benedettelli

Перевод: © Ботов Антон aka =DeaD=, 2009

Эксклюзивно для www.roboforum.ru
копирование на другие ресурсы и публикация перевода
без разрешения его автора запрещены

Более интересная программа

Наша первая программа была не сильно впечатляющая. Так что давайте попробуем сделать её более интересной. Мы будем делать это в несколько шагов, показывая некоторые важные возможности изучаемого языка программирования NXC.

Учимся делать повороты

Вы можете заставить робота поворачиваться путём остановки или включении в обратном направлении одного из двух моторов. Вот пример того, как это можно сделать. Введите его, загрузите полученную программу в робота и запустите. Робот должен проехать немного вперед, после чего повернуться на 90 градусов вправо.

task main()
{
OnFwd(OUT_AC, 75);
Wait(500);
OnRev(OUT_C, 75);
Wait(360);
Off(OUT_AC);
}

Вам может потребоваться попробовать немного другие числа, вместо 360 указанного во втором операторе Wait(), чтобы сделать 90 градусный поворот. Это зависит от типа поверхности по которой перемещается робот. Чтобы не отыскивать в больших программах такие числа, которые могут потребовать настройки существует возможность дать этому числу имя и определить его в начале программы. В языке NXC вы можете определять постоянные значения (константы) так, как показано в следующей программе:

#define MOVE_TIME 500
#define TURN_TIME 360
task main()
{
OnFwd(OUT_AC, 75);
Wait(MOVE_TIME);
OnRev(OUT_C, 75);
Wait(TURN_TIME);
Off(OUT_AC);
}

Первые две строки определяют две константы. Теперь их можно использовать везде в программе вместо этих чисел. Использование констант хорошо по двум причинам: оно делает программы более читаемыми и более удобно менять значения констант, чем искать во всей программе где еще у вас время поворота было прописано как 360 тысячных секунды. Обратите внимание, что BricxCC обозначает операторы define отдельным цветом. Как мы увидим в главе 6, вы можете подобным образом определять не только константы.

Повторяем команды

Теперь давайте попробуем написать программу, которая заставить робота проехать по квадрату. Проехать по квадрату означает: проехать вперед, повернуться на 90 градусов, снова проехать вперед, снова повернуть на 90 градусов и так далее. Мы можем просто написать 4 раза кусок указанного выше кода, но значительно проще это можно сделать с использованием оператора цикла (repeat).

#define MOVE_TIME 500
#define TURN_TIME 360
task main()
{
  repeat(4)
  {
    OnFwd(OUT_AC, 75);
    Wait(MOVE_TIME);
    OnRev(OUT_C, 75);
    Wait(TURN_TIME);
  }
  Off(OUT_AC);
}

Число внутри скобок оператора цикла указывает сколько раз повторить операторы в следующих за оператором фигурных скобках. Обратите внимание, что в приведенной выше программе мы сместили операторы внутри цикла вправо. Это не является обязательным, но делает программу более легко читаемой.

В качестве окончательного примера давайте заставим робота 10 раз проехать по квадрату:

#define MOVE_TIME 500
#define TURN_TIME 360
task main()
{
  repeat(10)
  {
    repeat(4)
    {
      OnFwd(OUT_AC, 75);
      Wait(MOVE_TIME);
      OnRev(OUT_C, 75);
      Wait(TURN_TIME);
    }
  }
  Off(OUT_AC);
}

Теперь у нас один оператор цикла внутри другого. Это называется “вложенный” оператор цикла. Вы можете делать операторы цикла любого уровня вложенности. Внимательно посмотрите на фигурные скобки и отступы, использованные в программе. Задача начинается с первой фигурной скобки и заканчивается последней. Первый оператор цикла начинается содержит операторы внутри второй и пятой фигурных скобок. Вложенный в него оператор цикла содержит операторы между третьей и четвертой фигурной скобкой. Как вы видите фигурные скобки всегда идут парами и кусок программы между ними выделяется отступом слева.

Добавляем комментарии

Чтобы сделать вашу программу еще более читаемой, неплохо бы добавить в неё комментарии. Когда мы пишем в строке // всё что после этих символов компилятор будет считать комментарием и проигнорирует. Длинный комментарий на несколько строк можно размещать между символами /* и */. BricxCC выделяет комментарии отдельным цветом в текстовом редакторе. Полный код программы с комментариями выглядит так:

/* 10 SQUARES
This program make the robot run 10 squares
*/
#define MOVE_TIME 500 // Time for a straight move
#define TURN_TIME 360 // Time for turning 90 degrees
task main()
{
  repeat(10) // Make 10 squares
  {
    repeat(4)
    {
      OnFwd(OUT_AC, 75);
      Wait(MOVE_TIME);
      OnRev(OUT_C, 75);
      Wait(TURN_TIME);
    }
  }
  Off(OUT_AC); // Now turn the motors off
}

Подводим итоги

В этой главе вы освоили использование операторов цикла и использование комментариев. Так же вы увидели зачем используются вложенные фигурные скобки и отступы. С имеющимися на этом этапе знаниями вы уже можете писать программы под управлением которых робот будет двигаться по практически каким угодно траекториям. Рекомендуется перед переходом к следующей главе попробовать самостоятельно запрограммировать робота для движения по разным интересным траекториям. Для этого можете попробовать варьировать программы из этой или предыдущей главы.