Добавить в избранное

Примеры на RobotC для LEGO Mindstorms

Примеры программ на языке RobotC для LEGO Mindstorms

В данном разделе размещены различные примеры программ на языке 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);
    }
}

Поделиться
Понравился материал?

Комментарии

Добавить комментарий