Изучение циклических конструкций и функций работы с дисплеем при программировании роботов Vex IQ

№90-1,

педагогические науки

В статье рассматриваются циклические конструкции и функции по работе с дисплеем языка программирования роботов RobotC. Приводятся примеры использования операторов для решения задач в рамках кружковой деятельности по образовательной робототехнике.

Похожие материалы

Образовательная робототехника входит в жизнь современной школы, предлагая совершенно новый педагогический инструментарий. Зачастую скучное программирование обретает совершенно новый облик, ведь теперь ребенок пишет алгоритм управления робототехнической конструкцией. Школьник может научить работа ходить, ездить, перетаскивать грузы, путешествовать. Языком программирования становится специально разработанная для робототехники среда RobotC, широко используемая для управления моделями, созданными в большинстве робототехнических конструкторах.

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

Циклические конструкции становятся более простыми для понимания, так как в предложенном контексте именно они позволяют модели повторять определённые механические действия, не останавливается после ряда проведенных операций, а «вечно жить» в рамках запрограммированной среды в режиме диалога «робот — окружающий мир».

Операторы для изучения школьниками:

  • waitUntil — оператор останавливает выполнение программы до следующей строки кода до тех пор, пока не будет выполнено указанное условие. Синтаксис: waitUntil ( SensorValue [sensor] < target ).
  • wait — оператор задерживает выполнение программы, ожидая определенное количество времени, значения — миллисекунды, секунды и минуты.
  • while — оператор повторения действий, внутри своих фигурных скобок, пока выполняется условие. Синтаксис: while ( SensorValue [sensor] < target ) {}.
  • repeat — цикл повторения будет выполнять код внутри своих фигурных скобок, определенное количество раз. Синтаксис: repeat (n) {}.
  • repeat(forever) — цикл повторения будет выполнять код внутри своих скобок «навсегда».
  • repeatUntil — оператор повторения необходимого количества раз, пока не начнёт выполняться условие.

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

Мозговой центр робота (устройство управления роботом) использует технологии с широкими функциональными возможностями. Кроме ряда портов для подключения сенсорных датчиков и моторов, мозговой центр обладает LCD дисплеем. Дисплей позволяет отображать информацию не только служебного характера, определенную разработчиком, но программируемую пользователем.

Дисплей работает в двух режимах:

  1. В текстовом режиме отображает символы на одной из 6 возможных текстовых строк (0 — верхняя строка, 5 нижняя строка)
  2. В графическом режиме отображение объекта по координатам: 48 вертикальных пиксел (Y — yPos от 0 до 47) и 128 горизонтальных пиксел (X — xPos от 0 до 127), начало отсчета правый нижний угол.

Выделим первый набор функция для вывода текста на экран дисплея:

  • drawUserText(xPos, yPos,, FormatString) — выводит текст, указанный FormatStrings в месте, указанном xPos и yPos. Данная команда будет только перезаписывать длину строки, заданную FormatString. Любой дополнительный символ, уже находящийся в строке, не будет перезаписан.
  • displayString(NumberLine, FormatString) — отображает строку, начинающуюся в крайнем левом положении на дисплее. Если на строке были уже символы, то новые символы наложатся поверх.
  • displayString(NumberLine, FormatString) — отображает строку, начинающуюся в крайнем левом положении на дисплее. Если на строке были уже символы, то они будут замещены.
  • displayStringAt(xPos, yPos, FormatString) — отображает текстовую строку с координатой X, Y на LCD-дисплее.
  • displayBigStringAt(xPos, yPos, FormatString) — выводит текст большого шрифта (высотой 16 пикселей) из точки, определенной координатами.
  • displayCenteredBigTextLine(NumberLine, FormatString) — выводит горизонтально центрированный текст большого шрифта на одной из текстовых строк, определенной в NumberLine.
  • displayCenteredTextLine(NumberLine, FormatString) — выводит горизонтально центрированный текст большого шрифта на одной из текстовых строк.
  • displayClearTextLine(NumberLine) — очистка определенной строки.

Приведем практические примеры разработанных школьниками младших классов программ управления роботами.

Пример 1. Робот должен двигаться в течение трех секунд.

task main(){ setMultipleMotors(50, leftMotor, rightMotor); wait(3,seconds); stopMultipleMotors(leftMotor, rightMotor);}

Пример 2. Используя оператор цикла создайте программу автоматического движения робота. Робот останавливается перед преградой на расстоянии 30 см.

Решение:

task main(){ setMultipleMotors(20, leftMotor, rightMotor); waitUntil(getDistanceValue (DistanceSensor)==300); stopMultipleMotors(rightMotor, leftMotor);}

Замечание:

getDistanceValue — возвращает значение датчика расстояния, в миллиметрах (мм). Возвращаемое значение основано на настройке режима датчика расстояния (с помощью Motors and Sensors Setup). Объекты находящиеся дальше будут возвращать более высокие значения. Объекты находящиеся ближе возвратят более низкие значения. Возвращаемое значение будет по умолчанию равным расстоянию до самого сильного сигнала.

Другой вариант решения (через другую конструкцию цикла)

task main(){ repeatUntil(getDistanceValue(DistanceSensor) < 300)            {               setMotorSpeed(motor1, 20);               setMotorSpeed(motor6, 20);               } setMotorSpeed(motor1, 0);              setMotorSpeed(motor6, 0);}

Замечание. В первом решении моторы управлялись одной командой. Во втором решении приведен пример раздельного управления моторами.

Пример 3.

При приближении робота к объекту зеленого цвета, необходимо вывести на экран сообщении «Hello».

Решение:

task main(){ setMultipleMotors(20, leftMotor, rightMotor); waitUntil(getColorName(ColorSensor)==colorGreen); string printMe="Hello"; displayBigStringAt(10, 21, "%s ", printMe);}

Пример 4. Расширенная задача.

Объекты двух цветов. При приближении робота к объекту, необходимо вывести на экран сообщение о его цвете. Сенсор определения цвета подсоединён к 8-му порту.

Решение.

task main()
{
string colorOfObject;
setMultipleMotors(20, leftMotor, rightMotor);
repeat(forever)
{
if(getColorName(port8) == colorRed)
{
colorOfObject = "RED";
}
else if(getColorName(port8) == colorBlue)
{
colorOfObject = "BLUE";
}
}
displayBigStringAt(10, 21, "%s ", colorOfObject);
}

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

  1. setPixel(xPos, yPos) — установка точки с координатами.
  2. getPixel(xPos, yPos) — Эта команда проверяет, заполнен ли пиксель, заданный xPos, yPos или он пуст (очищен). Эта команда возвращает истинное значение (1), если пиксель заполнен, или ложное значение (0), если он пуст.
  3. drawLine(xPos, yPos, xPosTo, yPosTo) — рисование линии по координатам.
  4. drawCircle(centerX, centerY, radius) — прорисовка окружности.
  5. fillCircle(centerX, centerY, radius) — прорисовка закрашенной окружности.
  6. drawEllipse(left, top, right, bottom) — прорисовка эллипса. Эллипс задается по координаторам прямоугольника в который он вписывается.
  7. fillEllipse (left, top, right, bottom) — закрашенный эллипс.
  8. drawRect(left, top, right, bottom) — прямоугольник.
  9. fillRect(left, top, right, bottom) — закрашенный прямоугольник
  10. drawInvertCircle, drawInvertEllipse, drawInvertRect, invertLine — Инвертирование форм. Инвертирование формы проверяет каждый пиксель в области этой фигуры и «инвертирует» каждый из них. Если пиксель очищен, он будет заполнен. Если пиксель заполнен, он очищается.
  11. eraseCircle, eraseEllipse, eraseRect, eraseLine, eraseDisplay() — очистка заданных участков.

Пример 5. Нарисуйте окружность. Координаты цента 10, 20. Радиус — 5.

task main(){ drawCircle(10, 20, 5);}

Пример 6. Нарисуйте роботу глаза.

Решение:

task main(){ drawEllipse(1, 46, 63, 1); fillCircle(31, 23, 10); drawEllipse(64, 46, 126, 1); fillCircle(95, 23, 10);}

Таким образом, собирая роботов, ребенок параллельно начинает изучать базовые алгоритмические конструкции для управления моделью, при этом он сразу видит их практическое применение, эмпирически подбирая необходимые операторы и параметры, что повышает мотивацию ребенка и интерес к получению более высоких результатов.

Список литературы

  1. Introduction of Programming Vex IQ // URL: http://curriculum.cs2n.org/vexiq (дата обращения 10.09.2018).
  2. Robomatter is a Global Leader in STEM Education // URL: http://www.robomatter.com/stem-solutions/for-students/ (дата обращения 15.09.2018).
  3. ROBOTC for VEX Robotics 4.X - User’s Manual // URL: http://help.robotc.net/WebHelpVEX/index.htm#Resources/topics/Welcome.htm (дата обращения 14.09.2018).
  4. Векслер В.А. Программирование роботов VEX IQ // Информатика в школе. 2018. № 6 (139). С. 56-59.
  5. Робототехника VEX // URL: https://www.vexrobotics.com/vexiq (дата обращения 10.10.2018).