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); } }