Образовательная робототехника: основы программирования конструкторов VEX IQ на языке RobotC

№75-2,

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

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

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

VEX IQ — это уникальная линейка конструкторов, сочетающая в себе разнообразие металлических конструкторов VEX и простоту использования пластиковых конструкторов. В комплекты VEX IQ входит большое количество пластиковых деталей, сенсоров, контроллеров. Огромное количество шестеренок, колес и других соединительных механизмов позволяет конструировать разнообразных мобильных роботов. Школьники в возрасте от 8 лет могут легко собирать роботов с помощью этой легкой интуитивно понятной платформой.

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

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

Учителям предоставляется совершенно бесплатная образовательная программа VEX IQ, позволяющая дать ученикам ценные знания и навыки, необходимые в современном быстроразвивающемся мире. Бесплатное графическое программное обеспечение (похожее на Scretch), созданное компанией Modkit, дает пользователю возможность создавать программы для роботов, датчики восприятия этих команд и многое другое. Программа Robotc 4.0, разработанная для VEX IQ компанией Robomatter Inc. и одобренная Академией Робототехники Карнеги-Меллона, позволяет писать полноценные программы для робота на языке С.

Рассмотрим использование основ программирования на примере стандартной конструкции VEX IQ Clawbot при обучении в кружке по образовательной робототехнике.

После установки среды RobotC и сборки стандартной модели, необходимо произвести настройки среды. Зайдите в контекстное меню «File» и выберите пункт New… -> New file.

Подключим робота к компьютеру через USB порт, включим его и в программной среде установим:

  1. Конфигурацию для работы с роботами данной серии. Для этого выберем Robot — Platform Type — Vex Robotics — Vex IQ. Так как наш робот является физическим устройством определим в меню Robot-Compiler Target — Physical Robot.
  2. Дополнительную прошивку нажав кнопку «Firmware download». В результате в программном меню мозгового центра робота мы увидим две новые папки. В папку «Auto Pgms» будут устанавливаться по умолчанию программы, созданные пользователем.

Для программирования действий робота, необходимо изначально определить в какие порты мозгового центра подключены датчики и сервоматоры. Для этого нажмем кнопку «Motor and Sensor Setup». Так как наш робот является стандартной моделью, мы можем не прописывать все настройки на вкладыше «Standart Model» выбрать конфигурацию «Clawbot IQ With Sensor».

В результате мы получим:

Motor Ports (порты к которым подключены моторы):

VEX IQ Port 1: leftMotor (имена моторов)

VEX IQ Port 6: rightMotor

VEX IQ Port 10: armMotor

VEX IQ Port 11: clawMotor

Sensor Ports (порты к которым подсоединены датчики):

VEX IQ Port 2: touchLED (Touch LED)

VEX IQ Port 3: colorDetector

(Color Sensor/Hue Mode)

VEX IQ Port 4: gyroSensor (Gyro)

VEX IQ Port 7: distanceMM (Distance)

VEX IQ Port 8: bumpSwitch (Bumper Switch)

Редактировать настройку портов мы можем на вкладыше «Motors» (настройка подключения моторов) и «Devices» (настройка подключения датчиков). Обратите внимание, что на вкладке «Motors» для мотора управляющего правыми колесами включен вариант реверса. В данном окне вы увидите 12 строк, каждая из которых обозначает порты контроллера. В каждой строке доступны такие параметры, как: Port — номер порта, к которому подключается привод; Name — имя порта (присваивается для удобства работы с программой); Type — тип привода (обычный или шаговый); Reversed — выбор: обычное движение привода или инвертированное (при установленном флаге.

После сохранение настроек, среда сформирует первую часть кода, отвечающую за настройку портов.

#pragma config(StandardModel, "Clawbot IQ With Sensors")
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//

Теперь обратим внимание на структуру исходного кода. Главная задача, с которой начинается выполнение программы в RobotC, называется task main(). Тело задачи располагается между двумя фигурными скобками: открывающей и закрывающей. Все команды должны быть размещены между ними.

Первая функция, с которой нам стоит ознакомится displayTextLine. Данная функция форматирует текстовую строку и отображает ее на одной из 5 возможных текстовых строк: 0 — верхняя строка, 5 — нижняя строка. Остальная часть линии дополняется пробелами Эта команда перезапишет всю строку ЖК-экрана. Среди подаваемых параметров на первом месте указывают номер строки экрана для вывода, после этого форматируемую строку.

task main()
{
  string s1 = "Hello, World!»;   // определяем строку для вывода
  displayTextLine(3, "%s", s1); // выводим строку на третьей линии
}

Реализуем задачу: Ехать вперед 3 секунды.

task main()
{
         motor[motor1] = 127;
         motor[motor6] = 127;
         wait1Msec(3000);
}

Команда motor[] представляет собой массив управляющий элементами моторами. Действие «полный вперед» задается числом 127, «полный назад» — числом –127, остановка — числом 0. Действие этой команды можно считать мгновенным. После ее выполнения мотор включается и продолжает работать до тех пор, пока не будет остановлен другой аналогичной командой. Команда wait1Msec() задает время ожидания в миллисекундах (1 мс = 1/1000 с). Таким образом, wait1Msec(3000) означает «ждать 3 секунды».

Изменим нашу программу:

Нам требуется ехать вперед на полной скорости 1 секунду. Постоять 2 секунды и поехать назад на полной скорости 1 секунду.

Получим следующую программу:

task main()
{
         motor[motor1] = 127;
         motor[motor6] = 127;
         wait1Msec(1000);
         motor[motor1] = 0;
         motor[motor6] = 0;
         wait1Msec(2000);
         motor[motor1] = -127;
         motor[motor6] = -127;
         wait1Msec(1000);
}

Упростим запись программы используя вызов функции управляющей движением.

void move (int nspeed, int ntime)
{
         motor[motor1] = nspeed;
         motor[motor6] = nspeed;
         wait1Msec(ntime);
}
task main()
{
  move (127, 1000);
  move (0, 2000);
  move (-127, 1000);
}

Команда nMotorEncoder[] — это обращение к датчику оборотов мотора, который возвращает значение в градусах. Каждый из трех элементов этого массива имеет 16-битное значение, что дает возможность хранить число в диапазоне –32768...32767, это соответствует 95 полным (360 градусов) оборотам моторов.

В длительно работающих программах следует время от времени обнулять значения массива во избежание переполнения.

nMotorEncoder[motorA] = 0;

Этим же действием датчик оборотов инициализируется для начала измерений.

Следующая программа обеспечит передвижение нашего робота на два полных оборота т.е. 720 градусов. Дополнительно применена конструкция цикла while, позволяющая зациклить проверку датчика оборотов мотора.

task main()
{
         motor[motor1] = 127;
         motor[motor6] = 127;
         while (nMotorEncoder[motor1]         < 720 && nMotorEncoder[motor6]   < 720)
         {}
}

Рассмотрим еще один вариант использования данной функции.

task main()
{
 //Сброс
 nMotorEncoder(port1) = 0;
 nMotorEncoder(port6) = 0;
 //Проверка датчиков
 while(nMotorEncoder(port1) < 720 &&  nMotorEncoder(port6) < 720)
 {
  //Движение вперед
  motor[port1] = 50;
  motor[port6] = 50;
 }
 //Остановить моторы
 motor[port1] = 0;
 motor[port6] = 0;
}

Рассмотрим использование нескольких дополнительных функций:

Функция getMotorCurrent возвращает количество тока, потребляемого указанным двигателем в мА (миллиампер): Values range from 0 (0 amps) to +3723 (3.723 amps).

setMotorSpeed — эта команда так же задает скорость двигателя. Двигатель будет продолжать вращаться с заданной скоростью и направлением до тех пор, пока не будет присвоено новое значение скорости двигателю.

task main()
{
   //Установить скорость motor1 до 50
   setMotorSpeed(motor1, 50);
   //Выводим количество тока, потребляемое данным двигателем
   while(true)
   { displayTextLine(2, "%d", getMotorCurrent(motor1));}
}

Рассмотрим работу с датчиком цвета (VEX IQ Port 3: colorDetector (Color Sensor/Hue Mode)). Робот должен двигаться вперед пока не увидит объект красного цвета. Для определения цвета используем функцию getColorName. При этом будет возвращено одно из двенадцати разных имен цветов в зависимости от цвета обнаруженного объекта. Если цвет не обнаружен, будет возвращен colorNone.

Цвета: colorNone, colorRedViolet, colorRed, colorDarkOrange, colorDarkYellow, colorYellow, colorLimeGreen, colorGreen, colorBlueGreen, colorBlue, colorDarkBlue, colorViolet.

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

task main()
{
string colorOfObject;
repeat(forever)
{
     if(getColorName(port3) == colorRed)
        {colorOfObject = "RED";}
     else if(getColorName(port3) == colorBlue)
          {colorOfObject = "BLUE"; }
displayTextLine(2, "%s", colorOfObject);
}
}

Рассмотрим решение поставленной выше задачи.

void move (int nspeed, int ntime)
{
         motor[motor1] = nspeed;
         motor[motor6] = nspeed;
         wait1Msec(ntime);
}
task main()
{
  move (127, 1000);
  waitUntil(getColorName(port3) == colorRed);
  move (0, 2000);
}

В обоих программах использовались циклы repeat(forever) и waitUntil. Учащиеся при обучении программированию в образовательной робототехнике наглядно видят использование таких конструкций как ветвления и циклы, применение логических и арифметических операций. Программирование разнообразных задач по передвижению робота и взаимодействию его с окружающей средой позволяют поднять мотивацию и интерес учащегося к изучению программирования.

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

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

  1. Филиппов С.А. Робототехника для детей и родителей. – СПб.: Наука, 2013. 319 с.
  2. Горнов О.А. Основы робототехники и программирования с Vex EDR. - М: Издательство «Экзамен», 2016. – 160 с.
  3. VEX Robotics // URL: http://robotgeeks.ru/collection/vex-iq (дата доступа 01.12.2017)
  4. Революция STEM-образования // Vex IQ. URL: http://vex.examen-technolab.ru/vexiq/ (дата обращения 10.11.2017)