コード例 #1
0
ファイル: Program.cs プロジェクト: ozrien/HERO_TestExamples
        public static void Main()
        {
            /* Current setup is a CTRE MAG Encoder and a 128 CPR Opitcal Encoder, where printf's can be used to compare accuracy */
            magTalon.ConfigSelectedFeedbackSensor(CTRE.Phoenix.MotorControl.FeedbackDevice.PulseWidthEncodedPosition, 0, kTimeout);
            anaTalon.ConfigSelectedFeedbackSensor(CTRE.Phoenix.MotorControl.FeedbackDevice.QuadEncoder, 0, kTimeout);
            magTalon.ConfigSelectedFeedbackCoefficient(0.125f, 0, kTimeout); /* Mag Encoder 4096 CPR * 0.125 = 128 == 128 CPR Opitcal Encoder, could scale up */
            anaTalon.ConfigSelectedFeedbackCoefficient(1, 0, kTimeout);

            anaTalon.SetSensorPhase(false);
            magTalon.SetInverted(true);
            magTalon.SetSensorPhase(true);

            /* Reduce the velocity averaging to generate useful plots in Vehicle spy */
            magTalon.ConfigVelocityMeasurementWindow(1, kTimeout);
            magTalon.ConfigVelocityMeasurementPeriod(CTRE.Phoenix.MotorControl.VelocityMeasPeriod.Period_1Ms, kTimeout);

            anaTalon.ConfigVelocityMeasurementWindow(1, kTimeout);
            anaTalon.ConfigVelocityMeasurementPeriod(CTRE.Phoenix.MotorControl.VelocityMeasPeriod.Period_1Ms, kTimeout);

            /* Increase the rate of the CAN frame */
            magTalon.SetStatusFramePeriod(CTRE.Phoenix.MotorControl.StatusFrameEnhanced.Status_2_Feedback0, 4, kTimeout);
            anaTalon.SetStatusFramePeriod(CTRE.Phoenix.MotorControl.StatusFrameEnhanced.Status_2_Feedback0, 4, kTimeout);

            /* For PWM test, scale down motor so optical has a chance to keep up? */
            float peakOutput    = 1f;
            float nominalOutput = 0;

            magTalon.ConfigPeakOutputForward(peakOutput, kTimeout);
            magTalon.ConfigPeakOutputReverse(-peakOutput, kTimeout);
            magTalon.ConfigNominalOutputForward(nominalOutput, kTimeout);
            magTalon.ConfigNominalOutputReverse(-nominalOutput, kTimeout);

            differenceDisplay = displayModule.AddLabelSprite(gFont, CTRE.Gadgeteer.Module.DisplayModule.Color.Orange, 0, 0, 100, 15);
            statusDisplay     = displayModule.AddLabelSprite(gFont, CTRE.Gadgeteer.Module.DisplayModule.Color.Green, 0, 20, 100, 15);
            errorDisplay      = displayModule.AddLabelSprite(gFont, CTRE.Gadgeteer.Module.DisplayModule.Color.Red, 0, 60, 100, 15);

            statusDisplay.SetText("Gamepad Mode");
            errorDisplay.SetText("None");

            /* Clear Position */
            SetPositon(0);


            /* Variables to test various features */
            bool  lastBtn  = false;
            bool  lastBtn3 = false;
            bool  state    = false;
            float output   = 0;

            while (true)
            {
                /* CTRE Output enable */
                if (gamepad.GetConnectionStatus() == CTRE.Phoenix.UsbDeviceConnection.Connected)
                {
                    CTRE.Phoenix.Watchdog.Feed();
                }

                /* Encoder Postion taring */
                bool btn  = gamepad.GetButton(2);
                bool btn3 = gamepad.GetButton(3);
                if (btn && !lastBtn)
                {
                    SetPositon(0);
                    errorDisplay.SetText("Error: " + 0);
                }
                if (btn3 && !lastBtn3)
                {
                    state = !state;
                    if (state)
                    {
                        stopwatch.Start();
                        statusDisplay.SetText("Sine Mode");
                    }
                    else
                    {
                        statusDisplay.SetText("Gamepad Mode");
                    }
                }
                lastBtn  = btn;
                lastBtn3 = btn3;

                if (!state)
                {
                    /* Joypad value */
                    output = gamepad.GetAxis(1);

                    /* Reduce speed if right trigger is held down */
                    if (gamepad.GetButton(6))
                    {
                        output *= 0.50f;
                    }
                }
                else
                {
                    float amplitude   = 1;
                    float frequencyHZ = 0.2f;
                    float time        = stopwatch.Duration;
                    output = amplitude * (float)System.Math.Sin((2 * System.Math.PI) * frequencyHZ * time);
                }

                byte[] Frame = new byte[8];
                Frame[0] = (byte)((int)(output * 1000) >> 8);
                Frame[1] = (byte)((int)(output * 1000) & 0xFF);
                ulong data = (ulong)BitConverter.ToUInt64(Frame, 0);
                CTRE.Native.CAN.Send(0x09, data, 8, 0);

                /* (scale for maximum rpm @3000 - 6900ish) */
                output *= (1 / 5f);

                /* Talon with CTRE Mag Encoder drives the Talon */
                magTalon.Set(CTRE.Phoenix.MotorControl.ControlMode.PercentOutput, output);

                /* Telemetry */
                int magTemp    = magTalon.GetSelectedSensorPosition(0);
                int anaTemp    = anaTalon.GetSelectedSensorPosition(0);
                int difference = magTemp - anaTemp;

                Debug.Print("mag: " + magTemp + " ana: " + anaTemp + " dif: " + difference);
                differenceDisplay.SetText("Dif: " + difference);

                if (output > -0.05 && output < 0.05)
                {
                    /* We are slow enough to check */
                    if (System.Math.Abs(difference) > 50)
                    {
                        /* Disruption in position */
                        state = false;
                        statusDisplay.SetText("Bad Postion");
                        errorDisplay.SetText("Error: " + difference);
                    }
                }
                else if (System.Math.Abs(difference) > 500)
                {
                    /* Disruption in position */
                    state = false;
                    statusDisplay.SetText("Bad Postion");
                    errorDisplay.SetText("Error: " + difference);
                }

                /* Allow some breathing room for the CAN Frames */
                Thread.Sleep(5);
            }
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: ozrien/HERO_TestExamples
        public static void Main()
        {
            /* On/Off count */
            uint count = 0;
            /* Timing */
            long switchTime = 0;
            long now        = DateTime.Now.Ticks;
            long stateTime  = kAdjustableTime * TimeSpan.TicksPerSecond;
            /* swtich variable */
            bool switchState = true;

            /* Display elemnts */
            Font bigFont = Properties.Resources.GetFont(Properties.Resources.FontResources.NinaB);

            _firstline  = _display.AddLabelSprite(bigFont, CTRE.Gadgeteer.Module.DisplayModule.Color.Green, 0, 0, 120, 20);
            _secondline = _display.AddLabelSprite(bigFont, CTRE.Gadgeteer.Module.DisplayModule.Color.Green, 0, 20, 120, 20);

            while (true)
            {
                /* Update time */
                now = DateTime.Now.Ticks;

                /* State decider */
                switch (switchState)
                {
                case true:
                    if (now - switchTime > stateTime)
                    {
                        switchState = false;
                        switchTime  = now;
                    }
                    break;

                case false:
                    if (now - switchTime > stateTime)
                    {
                        switchState = true;
                        switchTime  = now;
                        count++;
                    }
                    break;

                default:
                    break;
                }

                /* State implementer */
                if (switchState)
                {
                    /* On */
                    Pin5.Write(true);
                    Pin6.Write(true);
                    Pin7.Write(true);
                    Pin8.Write(true);
                }
                else
                {
                    Pin5.Write(false);
                    Pin6.Write(false);
                    Pin7.Write(false);
                    Pin8.Write(false);
                }

                /* Show stuff on display and sleep a lil */
                _firstline.SetText(switchState ? "On" : "Off");
                _secondline.SetText("Count: " + count);
                Thread.Sleep(5);
            }
        }