В данном разделе размещены различные примеры программ на языке RobotC для LEGO Mindstorms. Примеры полезнее будут обладателям наборов LEGO Mindstorms NXT, поскольку разработчики RobotC так и не реализовали полную поддержку LEGO Mindstorms EV3.
Работа с моторами
К контроллеру подключаются только моторы (от 1 до 3). Датчики не используются.
Управление моторами осуществляется кнопками на самом контроллере. Нажатие стрелок влево и вправо позволяет соответственно уменьшить и увеличить подаваемую на двигатели мощность. А при нажатии на центральную оранжевую кнопку все моторы останавливаются. Значение подаваемой на двигатели мощности отображается на дисплее контроллера.
task main()
{
int k = 50;
motor[motorA] = k;
motor[motorB] = k;
motor[motorC] = k;
while(true)
{
eraseDisplay();
switch(nNxtButtonPressed)
{
case kLeftButton: k -= 5; break;
case kEnterButton: k = 0; break;
case kRightButton: k += 5; break;
}
if (k > 100)
k = 100;
if (k < -100)
k = -100;
displayCenteredBigTextLine(3, "%d", k);
motor[motorA] = k;
motor[motorB] = k;
motor[motorC] = k;
wait1Msec(250);
}
}
Работа с датчиками касания
К порту 1 подключается датчик касания, а к порту 2 - датчик освещенности.
При нажатии на кнопку (датчик касания) контроллер фиксирует нажатие и меняет значение переменной в памяти. В зависимости от значения переменной на дисплее отображаются надписи ON или OFF, а также меняется режим работы датчика освещенности с активного на пассивный и наоборот. Когда датчик освещенности работает в активном режиме встроенный светодиод включается (излучает красный свет). В пассивном режиме светодиод выключен.
#pragma config(Sensor, S1, touch, sensorTouch)
#pragma config(Sensor, S2, light, sensorLightActive)
task main()
{
int k = 1;
eraseDisplay();
displayCenteredBigTextLine(3, "ON");
while(true)
{
if (SensorValue[touch] == 1)
{
eraseDisplay();
k = 1 - k;
if (k == 1)
{
SensorType[light] = sensorLightActive;
displayCenteredBigTextLine(3, "ON");
}
else
{
SensorType[light] = sensorLightInactive;
displayCenteredBigTextLine(3, "OFF");
}
}
while (SensorValue[touch] == 1);
motor[motorB] = k * 100;
motor[motorC] = k * 100;
wait1Msec(50);
}
}
Работа с многозадачностью
При разработке сложных роботов, зачастую возникает необходимость одновременного запуска нескольких задач. Например, робот может управлять моторами для перемещения и в то же время опрашивать датчики или управлять поворотной башней. Контроллеры «LEGO MINDSTORMS NXT» поддерживают одновременное выполнение до 10 задач. Ресурсы процессора распределяются между задачами, для каждой из которых устанавливается время, в течение которого задача будет активна.
К порту 1 подключается датчик касания, к порту 3 - датчик цвета, 4 - датчик расстояния (сонар). Также один мотор подключается к порту А.
На контроллере одновременно выполняется 4 задачи:
- Первая задача управляет мотором. Вал мотора поочерёдно поворачивается на 180 градусов по и против часовой стрелки.
- Вторая задача опрашивает датчик касания. Если кнопка нажата то воспроизводится звуковой сигнал (пока кнопка в нажатом состоянии).
- Третья задача опрашивает датчик цвета. Полученное с датчика значение выводится на экран.
- Четвертая задача опрашивает ультразвуковой датчик расстояния. Измеренное расстояние выводится на экран (в см). Фильтрация отсутствует.
#pragma config(Sensor, S1, touch, sensorTouch)
#pragma config(Sensor, S3, color, sensorColorNxtFULL)
#pragma config(Sensor, S4, sonar, sensorSONAR)
int k = 50; // скорость мотора
// задача 1
task TOne(){
while(true)
{
displayClearTextLine(0);
displayBigTextLine(0, "1");
nMotorEncoder[motorA] = 0;
motor[motorA] = k;
k = -k;
while(abs(nMotorEncoder[motorA]) < 180);
wait1Msec(300);
}
return;
}
// задача 2
task TTwo(){
while(true)
{
displayClearTextLine(2);
displayBigTextLine(2, "2");
while(SensorValue(touch) == 1)
{
playSound(soundBeepBeep);
while(bSoundActive)
{
wait1Msec(5);
}
}
wait1Msec(300);
}
}
// задача 3
task TThree(){
while(true)
{
displayClearTextLine(4);
switch(SensorValue[color])
{
case BLACKCOLOR: displayBigTextLine(4, "3 black"); break;
case BLUECOLOR: displayBigTextLine(4, "3 blue"); break;
case GREENCOLOR: displayBigTextLine(4, "3 green"); break;
case YELLOWCOLOR: displayBigTextLine(4, "3 yellow"); break;
case REDCOLOR: displayBigTextLine(4, "3 red"); break;
case WHITECOLOR: displayBigTextLine(4, "3 white"); break;
}
wait1Msec(300);
}
}
// задача 4
task TFour(){
while(true)
{
displayClearTextLine(6);
displayBigTextLine(6, "4 %d", SensorValue[sonar]);
wait1Msec(300);
}
}
task main(){
startTask(TOne);
startTask(TTwo);
startTask(TThree);
startTask(TFour);
while(true)
{
wait1Msec(500);
}
}