LEGO Mindstorms - Примеры по RobotC

Примеры на 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 задачи:

#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);
	}
}
Copyright © 2014-2022 Design by Skyer