Пример #1
0
task main(){

  nxtDisplayCenteredTextLine(0, "Dexter Ind.");
  nxtDisplayCenteredBigTextLine(1, "IMU");
  nxtDisplayCenteredTextLine(3, "Test 1");
  nxtDisplayCenteredTextLine(5, "Connect sensor");
  nxtDisplayCenteredTextLine(6, "to S1");
  wait1Msec(2000);
  eraseDisplay();

  // Fire up the gyro and initialize it. Only needs to be done once.
  //DIMUconfigGyro(DIMU, DIMU_GYRO_RANGE_500);
  if (!DIMUconfigAccel(DIMU, DIMU_ACC_RANGE_2G))
    PlaySound(soundException);

  if(!DIMUconfigGyro(DIMU, DIMU_GYRO_RANGE_250, true))
    PlaySound(soundException);

  for (int i = 0; i < 500; i++){

		// Read the GYROSCOPE
    // There are 3 ways to do this:

    // All at once, very convenient if you need all 3
    DIMUreadGyroAxes(DIMU, xvals[i], yvals[i], zvals[i]);
    wait1Msec(5);
  }

  for (int i = 0; i< 500; i++) {
    writeDebugStream("%f, %f",  xvals[i], yvals[i]);
    writeDebugStreamLine(", %f", zvals[i]);
    wait1Msec(2);
  }
}
/**
 * The main task
 */
task main(){

  nxtDisplayCenteredTextLine(0, "Dexter Ind.");
  nxtDisplayCenteredBigTextLine(1, "IMU");
  nxtDisplayCenteredTextLine(3, "Test 3");
  nxtDisplayCenteredTextLine(5, "Connect sensor");
  nxtDisplayCenteredTextLine(6, "to S1");
  wait1Msec(2000);
  eraseDisplay();

  // If configuration fails, the program ends.
  if (!DIMUconfigAccel(DIMU, DIMU_ACC_RANGE_2G))
  {
		PlaySound(soundException);
		while(bSoundActive){}
		StopAllTasks();
  }

  while(nNxtButtonPressed == kNoButton)
  {
		z_val = DIMUreadAccelZAxis10Bit(DIMU);
		x_val = DIMUreadAccelXAxis10Bit(DIMU);

		// Since the axes are constantly 90 degrees apart, we can use the sum of forces law,
		// which looks like the pythagorean theorem, to discover the total force along both axes.
		Gforce = sqrt(pow(z_val, 2) + pow(x_val, 2));

		// Then we divide both values received by the total force to get numbers on the interval [-1,1].
		// This way we can input them into the arcsine and arccosine functions.
		z_val = z_val/Gforce;
		x_val = x_val/Gforce;

		pXrads[0] = asin(x_val);
		pXrads[1] = PI-pXrads[0]; //other possible X tilt value.
		pZrads[0] = acos(z_val);
		pZrads[1] = -1*pZrads[0]; //other possible Z tilt value.

		normalize();
		displayArrow(radiansToDegrees(match()));

		// This stops the screen from flashing.
		wait1Msec(100);
  }
}
task main(){

  float x_val, y_val, z_val;      // Gyro axis values

  nxtDisplayCenteredTextLine(0, "Dexter Ind.");
  nxtDisplayCenteredBigTextLine(1, "IMU");
  nxtDisplayCenteredTextLine(3, "Test 1");
  nxtDisplayCenteredTextLine(5, "Connect sensor");
  nxtDisplayCenteredTextLine(6, "to S1");
  wait1Msec(2000);
  eraseDisplay();

  // Fire up the gyro and initialize it. Only needs to be done once.
  //DIMUconfigGyro(DIMU, DIMU_GYRO_RANGE_500);
  if (!DIMUconfigAccel(DIMU, DIMU_ACC_RANGE_2G))
    PlaySound(soundException);

  if(!DIMUconfigGyro(DIMU, DIMU_GYRO_RANGE_500))
    PlaySound(soundException);

  while (true){

		// Read the GYROSCOPE
    // There are 3 ways to do this:

    // All at once, very convenient if you need all 3
    DIMUreadGyroAxes(DIMU, x_val, y_val, z_val);

    // Via a single command with the axis specified as one of the arguments
		//x_val = DIMUreadGyroAxis(DIMU, DIMU_GYRO_X_AXIS);    // Get x-axis in dps.
		//y_val = DIMUreadGyroAxis(DIMU, DIMU_GYRO_Y_AXIS);    // Get y-axis in dps.
		//z_val = DIMUreadGyroAxis(DIMU, DIMU_GYRO_Z_AXIS);    // Get z-axis in dps.

    // Using a macro that calls the above function with the right argument
    // x_val = DIMUreadGyroXAxis(DIMU);    // Get x-axis in dps.
		// y_val = DIMUreadGyroYAxis(DIMU);    // Get y-axis in dps.
		// z_val = DIMUreadGyroZAxis(DIMU);    // Get z-axis in dps.

		nxtDisplayTextLine(1, "%f", x_val);
		nxtDisplayTextLine(2, "%f", y_val);
		nxtDisplayTextLine(3, "%f", z_val);

		// Read the accelerometer
		// Again, there are multiple ways to do this:

		// All at once, in either 8 bit or 10 bit format
		// DIMUreadAccelAxes8Bit(DIMU, x_val, y_val, z_val);
		// DIMUreadAccelAxes10Bit(DIMU, x_val, y_val, z_val);

		// One by one, specifying the axis as an argument, available in 8 and 10 bit.
		//
		// 8 bit
		//x_val = DIMUreadAccelAxis8Bit(DIMU, DIMU_ACC_X_AXIS);
		// y_val = DIMUreadAccelAxis8Bit(DIMU, DIMU_ACC_Y_AXIS);
		// z_val = DIMUreadAccelAxis8Bit(DIMU, DIMU_ACC_Z_AXIS);
		//
		// 10 bit
		x_val = DIMUreadAccelAxis10Bit(DIMU, DIMU_ACC_X_AXIS);
		y_val = DIMUreadAccelAxis10Bit(DIMU, DIMU_ACC_Y_AXIS);
		z_val = DIMUreadAccelAxis10Bit(DIMU, DIMU_ACC_Z_AXIS);

		// Function that doesn't require a specified axis, this is just a macro
		// x_val = DIMUreadAccelXAxis8Bit(DIMU);
    // y_val = DIMUreadAccelYAxis8Bit(DIMU);
    // z_val = DIMUreadAccelZAxis8Bit(DIMU);

    // x_val = DIMUreadAccelXAxis10Bit(DIMU);
    // y_val = DIMUreadAccelYAxis10Bit(DIMU);
    // z_val = DIMUreadAccelZAxis10Bit(DIMU);

		nxtDisplayTextLine(5, "%f", x_val);
		nxtDisplayTextLine(6, "%f", y_val);
		nxtDisplayTextLine(7, "%f", z_val);
		wait1Msec(50);
  }
}