Exemple #1
0
        /// <summary> 
        /// [Native] Sync two motors as driving motors, specifying whether to brake or coast and the turn ratio.
        /// </summary>
        /// <param name="port">The ports of the selected motors.  Exactly two motors must be selected.</param>
        /// <param name="power">The power at which to move the motors, between -100 and 100.</param>
        /// <param name="stop">Whether to brake or coast during operation.  Braking uses far more power.</param>
        /// <param name="turnratio">The turn ratio of the two motors, between -100 and 100.  A ratio of zero will make both motors move straight.
        ///   A negative ratio will move the left motor more and a positive ratio would move the right motor more.</param>
        public void MoveMotors(MotorPortSyncable port, int power, MotorStop stop, int turnratio)
        {
            int[] pow = new int[] { power, power };

            //Arc and Point rotation

            //Both arc and point rotation may be used for joystick control
            double ratio = (double)turnratio;
            double powr = (double)power;
            //pow = new int[] { Convert.ToInt32(Math.Floor(((50 - diff) / 100) * powr)),
            //Convert.ToInt32(Math.Floor(((50 + diff) / 100) * powr)) };
            //pow = new int[] { Convert.ToInt32(Math.Floor(((50 - diff) / 100) * powr)),
            //Convert.ToInt32(Math.Floor(((50 + diff) / 100) * powr)) };

            //slave motor power = master power * turn ratio

            //find which motor is the master
            if (turnratio != 0)
            {
                bool masterleft = true;
                if (power < 0)
                {
                    if (turnratio < 0)
                    {
                        masterleft = true;
                    }
                    else
                    {
                        masterleft = false;
                    }
                }
                else
                {
                    if (turnratio <= 0)
                    {
                        masterleft = false;
                    }
                    else
                    {
                        masterleft = true;
                    }
                }
                double equ = ((-2 * Math.Abs(ratio)) + 100) / 100 * powr;
                if (masterleft == true)
                {
                    pow = new int[] { power, Convert.ToInt32(Math.Floor(equ)) };
                }
                else
                {
                    pow = new int[] { Convert.ToInt32(Math.Floor(equ)), power };
                }
            }

            MotorMode mode = MotorMode.MotorOn;
            if (stop == MotorStop.Coast)
            {
                mode = MotorMode.On_Regulated;
                if ((power < 75) && (power > -75))
                {
                    mode = MotorMode.MotorOn;
                }
            }
            if (stop == MotorStop.Brake)
            {
                mode = MotorMode.On_Brake_Regulated;
                if ((power < 75) && (power > -75))
                {
                    mode = MotorMode.On_Brake;
                }
            }

            Motor[] motors = new Motor[] { };
            if (port == MotorPortSyncable.AB) { motors = new Motor[] { Motor.A, Motor.B }; }
            if (port == MotorPortSyncable.AC) { motors = new Motor[] { Motor.A, Motor.C }; }
            if (port == MotorPortSyncable.BC) { motors = new Motor[] { Motor.B, Motor.C }; }
            if (port == MotorPortSyncable.BA) { motors = new Motor[] { Motor.B, Motor.A }; }
            if (port == MotorPortSyncable.CA) { motors = new Motor[] { Motor.C, Motor.A }; }
            if (port == MotorPortSyncable.CB) { motors = new Motor[] { Motor.C, Motor.B }; }
            SetOutputState(motors[0], (sbyte)pow[0], mode,
                MotorReg.Speed, (sbyte)turnratio, MotorState.Running, (uint)0);
            SetOutputState(motors[1], (sbyte)pow[1], mode,
                MotorReg.Speed, (sbyte)turnratio, MotorState.Running, (uint)0);

            return;
        }
Exemple #2
0
 /// <summary> 
 /// [Native] Smoothly start or stop motors, specifying whether to brake or coast.
 /// </summary>
 /// <param name="port">The ports of the selected motors.</param>
 /// <param name="power">The power at which to move the motors, between -100 and 100.</param>
 /// <param name="stop">Whether to brake or coast during operation.  Braking uses far more power.</param>
 /// <param name="smooth">Whether to smoothly spin up or down the motors.</param>
 /// <param name="degrees">The number of degrees the motor revolves until is it fully spun up or down.  Smaller values 
 ///  make the motors move more smoothly.  Set degrees to zero to run infinitely.</param>
 public void MoveMotors(MotorPort port, int power, MotorStop stop, MotorSmooth smooth, int degrees)
 {
     MotorMode mode = MotorMode.On_Regulated;
     if (stop == MotorStop.Coast)
     {
         mode = MotorMode.On_Regulated;
         if ((power < 75) && (power > -75)) { mode = MotorMode.MotorOn; }
     }
     if (stop == MotorStop.Brake)
     {
         mode = MotorMode.On_Brake_Regulated;
         if ((power < 75) && (power > -75)) { mode = MotorMode.On_Brake; }
     }
     if (port != MotorPort.AB && port != MotorPort.AC && port != MotorPort.BC)
     {
         SetOutputState((Motor)((byte)port), (sbyte)power, mode,
             MotorReg.Speed, 0, MotorState.Running, 0);
     }
     else
     {
         MotorState state = MotorState.Rampup;
         if (smooth == MotorSmooth.Smooth_Stop)
         {
             state = MotorState.RampDown;
         }
         Motor[] motors = new Motor[] { };
         if (port == MotorPort.AB) { motors = new Motor[] { Motor.A, Motor.B }; }
         if (port == MotorPort.AC) { motors = new Motor[] { Motor.A, Motor.C }; }
         if (port == MotorPort.BC) { motors = new Motor[] { Motor.B, Motor.C }; }
         SetOutputState(motors[0], (sbyte)power, mode,
             MotorReg.Sync, 0, state, (uint)degrees);
         SetOutputState(motors[1], (sbyte)power, mode,
             MotorReg.Sync, 0, state, (uint)degrees);
     }
     return;
 }