Exemple #1
0
        public PhidgetMotor(MotorCallback p, int motorIndex = 0)
        {
            try
            {
                pCallback                          = p;
                motoControl                        = new MotorControl();
                m_motorIndex                       = motorIndex;
                motoControl.Attach                += new AttachEventHandler(motoControl_Attach);
                motoControl.Detach                += new DetachEventHandler(motoControl_Detach);
                motoControl.Error                 += new ErrorEventHandler(motoControl_Error);
                motoControl.CurrentChange         += new CurrentChangeEventHandler(motoControl_CurrentChange);
                motoControl.InputChange           += new InputChangeEventHandler(motoControl_InputChange);
                motoControl.VelocityChange        += new VelocityChangeEventHandler(motoControl_VelocityChange);
                motoControl.BackEMFUpdate         += new BackEMFUpdateEventHandler(motoControl_BackEMFUpdate);
                motoControl.EncoderPositionChange += new EncoderPositionChangeEventHandler(motoControl_EncoderPositionChange);
                motoControl.SensorUpdate          += new SensorUpdateEventHandler(motoControl_SensorUpdate);


                NewMaxLength = 0;
                NewMinLength = 0;

                openCmdLine(motoControl);
            }
            catch (Exception err)
            {
                throw (new SystemException(err.Message));
            }
        }
Exemple #2
0
        //When the form is being close, make sure to stop all the motors and close the Phidget.
        public void stopMotorControl()
        {
            /*
             * motoControl.Attach -= motoControl_Attach;
             * motoControl.Detach -= motoControl_Detach;
             * motoControl.Error -= motoControl_Error;
             *
             * motoControl.InputChange -= motoControl_InputChange;
             * motoControl.CurrentChange -= motoControl_CurrentChange;
             * motoControl.VelocityChange -= motoControl_VelocityChange;
             * motoControl.BackEMFUpdate -= motoControl_BackEMFUpdate;
             * motoControl.EncoderPositionChange -= motoControl_EncoderPositionChange;
             * motoControl.SensorUpdate -= motoControl_SensorUpdate;
             */
            if (motoControl.Attached)
            {
                foreach (MotorControlMotor motor in motoControl.motors)
                {
                    motor.Velocity = 0;
                }
            }

            //run any events in the message queue - otherwise close will hang if there are any outstanding events
            //Application.DoEvents();

            motoControl.close();

            motoControl = null;
        }
        /// <summary>
        /// Metoda pro otaceni obrazkem motoru 
        /// </summary>
        /// <param name="parameters">struktura s parametry otaceni</param>
        public void rotateImage(MotorControl.RotParameters parameters)
        {
            rotParameters = parameters;

            rotateTimer.Interval = rotParameters.speed; // nastaveni intervalu timeru podle rychlosti otaceni

            if (rotParameters.sectors == false)
            {
                // pokud se ma otacet po krocich ( ne po sektorech )
                rotate();   // otoceni o jeden krok a spusteni otaceni pres timer
                rotParameters.steps--;  // otoceno o jeden krok - dekrementace
            }
            else
            {
                // otaci se po sektorech
                if (rotParameters.direction == MotorControl.Direction.Left)
                {
                    // toci se vlevo
                    sectorSteps = (50 * (rotParameters.steps - 1)) + (50 - (position % 50));
                    rotParameters.steps = sectorSteps;
                }
                else
                {
                    // toci se vpravo
                    sectorSteps = (50 * (rotParameters.steps - 1)) + ((position % 50) == 0 ? 50 : (position % 50));
                    rotParameters.steps = sectorSteps;
                }

                rotate();   // otoceni o jeden krok a spusteni otaceni pres timer
                rotParameters.steps--;  // otoceno o jeden krok - dekrementace
            }
        }
Exemple #4
0
        public MotorControl motoControl = null;       //Declare a MotorControl object



        public void setMotorState(Boolean state)
        {
            if (state == true)
            {
                if (motoControl == null)
                {
                    //loadMotorControl();
                    motoControl = new MotorControl();
                    motoControl.open(-1);
                }

                int i = 0, k = 0;
                for (i = 0; i < 999999; i++)
                {
                    k++;
                }
                k--;

                setVelocity(100);
            }
            else
            {
                if (motoControl != null)
                {
                    //resetEncoder();
                    //stopMotorControl();
                    foreach (MotorControlMotor motor in motoControl.motors)
                    {
                        motor.Velocity = 0;
                    }
                    motoControl.close();
                    motoControl = null;
                }
            }
        }
Exemple #5
0
        //When the form is being close, make sure to stop all the motors and close the Phidget.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            motoControl.Attach -= motoControl_Attach;
            motoControl.Detach -= motoControl_Detach;
            motoControl.Error  -= motoControl_Error;

            motoControl.InputChange           -= motoControl_InputChange;
            motoControl.CurrentChange         -= motoControl_CurrentChange;
            motoControl.VelocityChange        -= motoControl_VelocityChange;
            motoControl.BackEMFUpdate         -= motoControl_BackEMFUpdate;
            motoControl.EncoderPositionChange -= motoControl_EncoderPositionChange;
            motoControl.SensorUpdate          -= motoControl_SensorUpdate;

            if (motoControl.Attached)
            {
                foreach (MotorControlMotor motor in motoControl.motors)
                {
                    motor.Velocity = 0;
                }
            }

            //run any events in the message queue - otherwise close will hang if there are any outstanding events
            Application.DoEvents();

            motoControl.close();

            motoControl = null;
        }
Exemple #6
0
        private void _close()
        {
            try
            {
                m_runmotor                         = false;
                motoControl.Attach                -= motoControl_Attach;
                motoControl.Detach                -= motoControl_Detach;
                motoControl.Error                 -= motoControl_Error;
                motoControl.InputChange           -= motoControl_InputChange;
                motoControl.CurrentChange         -= motoControl_CurrentChange;
                motoControl.VelocityChange        -= motoControl_VelocityChange;
                motoControl.BackEMFUpdate         -= motoControl_BackEMFUpdate;
                motoControl.EncoderPositionChange -= motoControl_EncoderPositionChange;
                motoControl.SensorUpdate          -= motoControl_SensorUpdate;

                if (motoControl.Attached)
                {
                    foreach (MotorControlMotor motor in motoControl.motors)
                    {
                        motor.Velocity = 0;
                    }
                }
                Thread.Sleep(0);
                //run any events in the message queue - otherwise close will hang if there are any outstanding events
                motoControl.close();
                motoControl = null;
            }
            catch (Exception err)
            {
                throw (new SystemException(err.Message));
            }
        }
 private Navigation()
 {
     board     = new CentralBoard();
     motor     = new MotorControl();
     dynamixel = DX.i;
     running   = false;
     Moving    = false;
     Speed     = 0;
 }
Exemple #8
0
        private static void CheckMotorControl(BlockConfigModalParameters parameters, GameObject blockObject)
        {
            MotorControl motorControl = blockObject.GetComponent <MotorControl>();

            if (motorControl != null)
            {
                parameters.panelParametersList.Add(new MotorBlockConfigPanelParameters(motorControl));
            }
        }
        public MotorController()
        {
            _motorControl = new MotorControl();
            _motorControl.open();

            _leftmotor = new Motor();
            _leftmotor.index = 0;
            _leftmotor.MotorSide = Side.Left;
            _leftmotor.Location = MotorControllerLocation.Front;

            _rightmotor = new Motor();
            _rightmotor.index = 1;
            _rightmotor.MotorSide = Side.Right;
            _rightmotor.Location = MotorControllerLocation.Front;
        }
Exemple #10
0
        //MotorControl Detach event handler...Clear all the fields and disable all the controls
        void motoControl_Detach(object sender, DetachEventArgs e)
        {
            MotorControl detached = (MotorControl)sender;

            attachedTxt.Text = detached.Attached.ToString();
            nameTxt.Clear();
            serialTxt.Clear();
            versiontxt.Clear();
            numMotorsTxt.Clear();
            numInputsTxt.Clear();
            numEncodersTxt.Clear();
            numSensorsTxt.Clear();

            //Shrink window and hide some groups
            this.Bounds = new Rectangle(this.Location, new Size(this.Width, 535));
            digitalInputsGroup.Visible = false;
            encodersGroup.Visible      = false;
            sensorsGroup.Visible       = false;

            //Clear everything in the motor group
            motorCmb.Items.Clear();
            vMaxTxt.Clear();
            vCurrentTxt.Clear();
            AccelTxt.Clear();
            brakingTxt.Clear();
            cChangeTxt.Clear();
            backEmfTxt.Clear();
            backEmfSensingCheck.Checked = false;
            velocityTrk.Value           = 0;
            accelTrk.Value   = accelTrk.Minimum;
            brakingTrk.Value = 0;

            supplyVoltageTimer.Stop();
            voltageTxt.Clear();

            for (int i = 0; i < 4; i++)
            {
                ((CheckBox)digitalInputsGroup.Controls["input" + i + "Chk"]).Visible = false;
            }

            //Disable everything
            motorCmb.Enabled            = false;
            backEmfSensingCheck.Enabled = false;
            velocityTrk.Enabled         = false;
            accelTrk.Enabled            = false;
            brakingTrk.Enabled          = false;
        }
Exemple #11
0
        //initialize the MotorConrol object and hook the event handlers
        private void Form1_Load(object sender, EventArgs e)
        {
            motoControl = new MotorControl();

            motoControl.Attach += new AttachEventHandler(motoControl_Attach);
            motoControl.Detach += new DetachEventHandler(motoControl_Detach);
            motoControl.Error  += new ErrorEventHandler(motoControl_Error);

            motoControl.CurrentChange         += new CurrentChangeEventHandler(motoControl_CurrentChange);
            motoControl.InputChange           += new InputChangeEventHandler(motoControl_InputChange);
            motoControl.VelocityChange        += new VelocityChangeEventHandler(motoControl_VelocityChange);
            motoControl.BackEMFUpdate         += new BackEMFUpdateEventHandler(motoControl_BackEMFUpdate);
            motoControl.EncoderPositionChange += new EncoderPositionChangeEventHandler(motoControl_EncoderPositionChange);
            motoControl.SensorUpdate          += new SensorUpdateEventHandler(motoControl_SensorUpdate);

            openCmdLine(motoControl);
        }
Exemple #12
0
        public override void Init(BlockConfigPanelParameters parameters)
        {
            base.Init(parameters);
            var panelParameters = parameters as MotorBlockConfigPanelParameters;

            motorControl = panelParameters.motorControl;

            motorControl.MotorVelocityChanged  += UpdateTextFields;
            motorControl.MotorForceChanged     += UpdateTextFields;
            motorControl.FreespinChanged       += UpdateTextFields;
            motorControl.Reverced              += UpdateTextFields;
            motorControl.ForwardAxisKeyChanged += UpdateTextFields;
            motorControl.BackAxisKeyChanged    += UpdateTextFields;
            motorControl.IsFixableValueChanged += UpdateTextFields;
            motorControl.MotorDamperChanged    += UpdateTextFields;

            UpdateTextFields();
        }
Exemple #13
0
        void MotorSettings_SaveSettings(object sender, MotorSettingsEventArgs e)
        {
            if (_selectedMotorControl == null)
            {
                return;
            }

            MotorSettings.SaveSettings -= MotorSettings_SaveSettings;

            _selectedMotorControl.MotorMovementType   = e.MotorMovementType;
            _selectedMotorControl.DegreeMovement      = e.DegreeMovement;
            _selectedMotorControl.PowerRatingMovement = e.PowerRatingMovement;
            _selectedMotorControl.TimeToMoveInSeconds = e.TimeToMoveInSeconds;

            _selectedMotorControl.UpdateUx();

            _selectedMotorControl = null;
        }
Exemple #14
0
        //initialize the MotorConrol object and hook the event handlers
        public void loadMotorControl()
        {
            motoControl = new MotorControl();

/*
 *          motoControl.Attach += new AttachEventHandler(motoControl_Attach);
 *          motoControl.Detach += new DetachEventHandler(motoControl_Detach);
 *          motoControl.Error += new ErrorEventHandler(motoControl_Error);
 *
 *          motoControl.CurrentChange += new CurrentChangeEventHandler(motoControl_CurrentChange);
 *          motoControl.InputChange += new InputChangeEventHandler(motoControl_InputChange);
 *          motoControl.VelocityChange += new VelocityChangeEventHandler(motoControl_VelocityChange);
 *          motoControl.BackEMFUpdate += new BackEMFUpdateEventHandler(motoControl_BackEMFUpdate);
 *          motoControl.EncoderPositionChange += new EncoderPositionChangeEventHandler(motoControl_EncoderPositionChange);
 *          motoControl.SensorUpdate += new SensorUpdateEventHandler(motoControl_SensorUpdate);
 *          openCmdLine(motoControl);
 */
            motoControl.open(-1);
        }
		private void MotorSettingClicked(object sender, RoutedEventArgs routedEventArgs)
		{
			var control = sender as MotorControl;

			if (control != null)
			{
				MotorSettings.SaveSettings += MotorSettings_SaveSettings;

				_selectedMotorControl = control;

				MotorSettings.Show(
					control.BrickInputPort,
					_brick.Ports[control.BrickInputPort].Type,
					control.MotorMovementType,
					control.DegreeMovement,
					control.PowerRatingMovement,
					control.TimeToMoveInSeconds);
			}
		}
Exemple #16
0
        private void MotorSettingClicked(object sender, RoutedEventArgs routedEventArgs)
        {
            var control = sender as MotorControl;

            if (control != null)
            {
                MotorSettings.SaveSettings += MotorSettings_SaveSettings;

                _selectedMotorControl = control;

                MotorSettings.Show(
                    control.BrickInputPort,
                    _brick.Ports[control.BrickInputPort].Type,
                    control.MotorMovementType,
                    control.DegreeMovement,
                    control.PowerRatingMovement,
                    control.TimeToMoveInSeconds);
            }
        }
Exemple #17
0
        //MotorControl Attach event handler...populate the fields and controls
        void motoControl_Attach(object sender, AttachEventArgs e)
        {
            MotorControl attached = (MotorControl)sender;

            attachedTxt.Text    = attached.Attached.ToString();
            nameTxt.Text        = attached.Name;
            serialTxt.Text      = attached.SerialNumber.ToString();
            versiontxt.Text     = attached.Version.ToString();
            numMotorsTxt.Text   = attached.motors.Count.ToString();
            numInputsTxt.Text   = attached.inputs.Count.ToString();
            numEncodersTxt.Text = attached.encoders.Count.ToString();
            numSensorsTxt.Text  = attached.sensors.Count.ToString();

            //Re-size according to capabilities
            if (attached.inputs.Count > 0)
            {
                this.Bounds = new Rectangle(this.Location, new Size(this.Width, 585));
                digitalInputsGroup.Visible = true;
                for (int i = 0; i < attached.inputs.Count; i++)
                {
                    ((CheckBox)digitalInputsGroup.Controls["input" + i + "Chk"]).Visible = true;
                }
            }
            if (attached.encoders.Count > 0)
            {
                this.Bounds           = new Rectangle(this.Location, new Size(this.Width, 641));
                encodersGroup.Visible = true;

                encoderPosition.Text = motoControl.encoders[0].Position.ToString();
            }
            if (attached.sensors.Count > 0)
            {
                this.Bounds          = new Rectangle(this.Location, new Size(this.Width, 695));
                sensorsGroup.Visible = true;

                ratiometricCheck.Checked = motoControl.Ratiometric;
            }

            //Set accel range (varies according to controller)
            accelTrk.SetRange((int)Math.Round(attached.motors[0].AccelerationMin), (int)attached.motors[0].AccelerationMax);
            accelTrk.TickFrequency = ((int)attached.motors[0].AccelerationMax - (int)Math.Round(attached.motors[0].AccelerationMin)) / 10;
            accelTrk.Value         = accelTrk.Minimum;

            //Enable everything
            motorCmb.Enabled    = true;
            velocityTrk.Enabled = true;
            accelTrk.Enabled    = true;

            if (attached.ID == Phidget.PhidgetID.MOTORCONTROL_1MOTOR)
            {
                backEmfSensingCheck.Enabled = true;
                brakingTrk.Enabled          = true;
            }

            supplyVoltageTimer.Start();

            for (int i = 0; i < attached.motors.Count; i++)
            {
                motorCmb.Items.Add(i);
            }

            motorCmb.SelectedIndex = 0;
        }
 public void InitializeMotor(String portName)
 {
     modCom       = new ModbusCommunication(portName);
     motorControl = new MotorControl(modCom);
     USBConnected = true;
 }
 public void CloseController()
 {
     _motorControl.close();
     _motorControl = null;
 }
		void MotorSettings_SaveSettings(object sender, MotorSettingsEventArgs e)
		{
			if (_selectedMotorControl == null)
				return;

			MotorSettings.SaveSettings -= MotorSettings_SaveSettings;

			_selectedMotorControl.MotorMovementType = e.MotorMovementType;
			_selectedMotorControl.DegreeMovement = e.DegreeMovement;
			_selectedMotorControl.PowerRatingMovement = e.PowerRatingMovement;
			_selectedMotorControl.TimeToMoveInSeconds = e.TimeToMoveInSeconds;

			_selectedMotorControl.UpdateUx();

			_selectedMotorControl = null;
		}
 public MotorBlockConfigPanelParameters(MotorControl motorControl)
 {
     this.motorControl = motorControl;
 }
Exemple #22
0
        // osetreni udalosti stisku tlacitka otaceni motorem
        private void rotateMotor(MotorControl.RotParameters rotParameters)
        {
            FtCommunication.Connection connection = ftCom.getConnection();

            // pokud pripojene zarizeni neni dostupne, vypise chybove hlaseni a aktualizuje seznam zarizeni
            if (!ftCom.getConnection(lbDevice.SelectedItem.ToString()))
            {
                MessageBox.Show("Zařízení '" + lbDevice.SelectedItem + "' není dostupné!", "Chyba připojení", MessageBoxButtons.OK, MessageBoxIcon.Error);
                btFindDevice_Click(btFindDevice,EventArgs.Empty);  // vola event stisknuti tlacitka najit zarizeni - aktualizuje seznam zarizeni
                return;
            }

            // pokud zarizeni prave pracuje, nebo jsou hodnoty kroku nulove pozadavek na otoceni se neposle
            if ((deviceWorkingState == true) || (rotParameters.steps == 0))
            {
                return;
            }
            else
            {
                changeWorkingState(true);   // signalizuje, ze soustava pracuje
                connection.ftStatus = new FTDI.FT_STATUS[1];
                connection.ftStatus[0] = ftCom.rotateMotor(rotParameters);  // vola metodu pro odeslani parametru otoceni motorem seriovou linkou

                // pokud odeslani probehlo OK
                if (connection.ftStatus[0] == FTDI.FT_STATUS.FT_OK)
                {
                    rotateMotorImage(rotParameters);    // vola metodu pro otaceni obrazky motoru podle zadanych parametru
                }
                else
                {
                    changeWorkingState(false); // signalizuje, ze zarizeni nepracuje
                    MessageBox.Show("Chyba komunikace se zařízením '" + connection.ftStatus[0].ToString() + "'.", "Chyba komunikace", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                addLog("Otočení motorem " + rotParameters.motorNum.ToString(), connection.ftStatus[0].ToString());
            }
        }
        static void Main(string[] args)
        {
            try
            {
                //Initiallize the MotorControl object
                motoControl = new MotorControl();

                //Hook the basic event handlers
                motoControl.Attach += new AttachEventHandler(motoControl_Attach);
                motoControl.Detach += new DetachEventHandler(motoControl_Detach);
                motoControl.Error += new ErrorEventHandler(motoControl_Error);

                //Hook the phidget specific event handlers
                motoControl.CurrentChange += new CurrentChangeEventHandler
                                                    (motoControl_CurrentChange);
                motoControl.InputChange += new InputChangeEventHandler
                                                    (motoControl_InputChange);
                motoControl.VelocityChange += new VelocityChangeEventHandler
                                                    (motoControl_VelocityChange);

                //open the object for MotorControl device connections
                motoControl.open();

                //Wait for a MotorControl device to be attached
                Console.WriteLine("Waiting for MotorControl to be attached....");
                motoControl.waitForAttachment();

                //Set the acceleration to 100 for this example and intialize the velocity
                //to 0.00 (stopped)
                motoControl.motors[0].Acceleration = 100.00;
                motoControl.motors[0].Velocity = 0.00;

                //Prompt for user inpu to continue
                Console.WriteLine("Press any button to continue...");
                Console.Read();

                //Slowly speed the motor to full speed going one direction
                double i;
                for (i = 0.00; i < 100; i++)
                {
                    Thread.Sleep(100);
                    motoControl.motors[0].Velocity = i;
                }

                //Slowly speed down and start accelerating in the other direction
                for (i = 100; i > -100; i--)
                {
                    Thread.Sleep(100);
                    motoControl.motors[0].Velocity = i;
                }

                //Stop the motor
                motoControl.motors[0].Velocity = 0.00;

                //Prompt the user for input to terminate
                Console.WriteLine("Press any key to end...");
                Console.Read();

                //User input was read so we can terminate, close the MotorControl object
                motoControl.close();

                //Set the MotorControl object to null to get it out of memory
                motoControl = null;

                //If no exceptions were thrown by this point it is ok to terminate
                Console.WriteLine("ok");
            }
            catch (PhidgetException ex)
            {
                Console.WriteLine(ex.Description);
            }
        }
Exemple #24
0
        void motoControl_Attach(object sender, AttachEventArgs e)
        {
            MotorControl attached = (MotorControl)sender;

            pCallback("motoControl_Attach", "");
        }
        //initialize the MotorConrol object and hook the event handlers
        private void Form1_Load(object sender, EventArgs e)
        {
            motoControl = new MotorControl();

            motoControl.Attach += new AttachEventHandler(motoControl_Attach);
            motoControl.Detach += new DetachEventHandler(motoControl_Detach);
            motoControl.Error += new ErrorEventHandler(motoControl_Error);

            motoControl.CurrentChange += new CurrentChangeEventHandler(motoControl_CurrentChange);
            motoControl.InputChange += new InputChangeEventHandler(motoControl_InputChange);
            motoControl.VelocityChange += new VelocityChangeEventHandler(motoControl_VelocityChange);
            motoControl.BackEMFUpdate += new BackEMFUpdateEventHandler(motoControl_BackEMFUpdate);
            motoControl.EncoderPositionChange += new EncoderPositionChangeEventHandler(motoControl_EncoderPositionChange);
            motoControl.SensorUpdate += new SensorUpdateEventHandler(motoControl_SensorUpdate);

            openCmdLine(motoControl);
        }
Exemple #26
0
        // metoda pro otaceni obrazky motoru podle zadanych parametru
        private void rotateMotorImage(MotorControl.RotParameters rotParameters)
        {
            switch (rotParameters.motorNum)
            {
                case MotorControl.MotorNum.Motor1:
                    motorVisualization1.rotateImage(rotParameters);
                    break;

                case MotorControl.MotorNum.Motor2:
                    motorVisualization2.rotateImage(rotParameters);
                    break;

                case MotorControl.MotorNum.Motor3:
                    motorVisualization3.rotateImage(rotParameters);
                    break;

                case MotorControl.MotorNum.Motor4:
                    motorVisualization4.rotateImage(rotParameters);
                    break;
            }
        }
        /// <summary>
        /// Metoda pro otaceni motorem podle zadanych parametru, seriovou linkou posle tri bajty s parametry otaceni
        /// </summary>
        /// <param name="rotParameters">Struktura s nastavenymi parametry otaceni</param>
        /// <returns>Ft status</returns>
        public FTDI.FT_STATUS rotateMotor(MotorControl.RotParameters rotParameters)
        {
            ftDevice.Purge(FTDI.FT_PURGE.FT_PURGE_RX & FTDI.FT_PURGE.FT_PURGE_TX);  // vycisti prijmaci a vysilacu buffer zarizeni

            // 1. bajt = hlavicka
            // 2. bajt = cislo ovladace, smer otaceni, zpusob otaceni
            // 3. bajt = rychlost otaceni, dolni polovina
            // 4. bajt = rychlost otaceni, horni polovina
            // 5. bajt = pocet kroku nebo sektoru, dolni polovina
            // 6. bajt = pocet kroku nebo sektoru, horni polovina
            // 7. bajt = stop bajt, obshuje kontrolni soucet soucet
            byte[] dataToWrite = new byte[7];
            uint bytesWriten = 0;

            string dataToRead;
            uint bytesRead = 0;

            // sestaveni dat pro odeslani
            // halvicka v prvnim bajtu
            dataToWrite[0] = (byte)'H';

            // pridani informace o cisle ovladace motoru do druheho bajtu
            switch (rotParameters.motorNum)
            {
                case MotorControl.MotorNum.Motor1:
                    dataToWrite[1] = 0x00;  // data = 0b00000000
                    break;

                case MotorControl.MotorNum.Motor2:
                    dataToWrite[1] = 0x40;  // data = 0b01000000
                    break;

                case MotorControl.MotorNum.Motor3:
                    dataToWrite[1] = 0x80;  // data = 0b10000000
                    break;

                case MotorControl.MotorNum.Motor4:
                    dataToWrite[1] = 0xc0;  // data = 0b11000000
                    break;
            }

            // pridani informace o smeru otaceni motorem, 0 = vlevo, 1 vpravo do druheho bajtu
            if (rotParameters.direction == MotorControl.Direction.Left)
            {
                dataToWrite[1] = (byte)(dataToWrite[1] & 0xdf); // data = 0bxx0xxxxx
            }
            else
            {
                dataToWrite[1] = (byte)(dataToWrite[1] | 0x20); // data = 0bxx1xxxxx
            }

            // pridani informace o zpusobu otaceni, po krocich vs. sektorech do druheho bajtu
            // pokud je pocet kroku i pocet sektoru = 0, nedela nic a vrati OK
            if (rotParameters.steps == 0)
            {
                return FTDI.FT_STATUS.FT_OK;
            }
            else
            {
                // jinak pokud je pocet sektoru = 0 , nastavi info bit na 0
                if (rotParameters.sectors == false)
                {
                    // otaceni po krocich
                    dataToWrite[1] = (byte)(dataToWrite[1] & 0xef); // data = 0bxxx0xxxx
                }
                else
                {
                    // otaceni po sektorech , nastavi info bit na 1
                    dataToWrite[1] = (byte)(dataToWrite[1] | 0x10); // data = 0bxxx1xxxx
                }
            }

            // pridani informace o rychlosti otaceni motorem do tretiho a ctvrteho bajtu
            dataToWrite[2] = (byte)(rotParameters.speed);   // dolni byte rychlosti
            dataToWrite[3] = (byte)(rotParameters.speed >> 8);  // horni polovina rychlosti

            // prida pocet kroku nebo sektoru o ktery se bude motorem otacet do pateho a sesteho bajtu
            dataToWrite[4] = (byte)(rotParameters.steps);   // dolni polovina poctu kroku/sektoru
            dataToWrite[5] = (byte)(rotParameters.steps >> 8);  // horni polovina poctu kroku/sektoru

            // pridani kontrolniho souctu do 7 bajtu
            for (int i = 0; i < 6; i++)
            {
                dataToWrite[6] += (byte)(dataToWrite[i]);
            }

            EventWaitHandle waitRxChar = new EventWaitHandle(false, EventResetMode.AutoReset);   // handle udalosti cekani na prijeti znaku seriovou linkou
            ftDevice.SetEventNotification(FTDI.FT_EVENTS.FT_EVENT_RXCHAR, waitRxChar);  // nastaveni hlaseni udalosti od prijeti znaku seriovou linkou
            thread = new Thread(waitingThread);
            // vypocet a ulozeni potrebne minimalni doby cekani na prijeti stavu opto nez skonci otaceni
            threadDelay = (rotParameters.sectors == true ? rotParameters.steps * rotParameters.speed * 50 : rotParameters.steps * rotParameters.speed) + 3000;

            ftDevice.Write(dataToWrite, 7, ref bytesWriten);    // zapise sestavene bajty na seriovou linku

            // ceka na prijeti znaku seriovou linkou, pokud se nedocka, vraci ERROR
            if (waitRxChar.WaitOne(1000, true) == false)
            {
                return FTDI.FT_STATUS.FT_IO_ERROR;
            }
            else
            {
                ftDevice.Read(out dataToRead, 3, ref bytesRead);    // precte odpoved
                thread.Start();  // spousti vlakno cekajci prichozi data

                // Kontrola komunikace, pokud odeslani a zpracovani dat probelo OK tak..
                if (dataToRead == "OK\n")
                {
                    return FTDI.FT_STATUS.FT_OK;
                }
                else
                {
                    // prijaty znak neni OK
                    thread.Abort();
                    return FTDI.FT_STATUS.FT_IO_ERROR;
                }
            }
        }
        //When the form is being close, make sure to stop all the motors and close the Phidget.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            motoControl.Attach -= motoControl_Attach;
            motoControl.Detach -= motoControl_Detach;
            motoControl.Error -= motoControl_Error;

            motoControl.InputChange -= motoControl_InputChange;
            motoControl.CurrentChange -= motoControl_CurrentChange;
            motoControl.VelocityChange -= motoControl_VelocityChange;
            motoControl.BackEMFUpdate -= motoControl_BackEMFUpdate;
            motoControl.EncoderPositionChange -= motoControl_EncoderPositionChange;
            motoControl.SensorUpdate -= motoControl_SensorUpdate;

            if (motoControl.Attached)
            {
                foreach (MotorControlMotor motor in motoControl.motors)
                {
                    motor.Velocity = 0;
                }
            }

            //run any events in the message queue - otherwise close will hang if there are any outstanding events
            Application.DoEvents();

            motoControl.close();

            motoControl = null;
        }
Exemple #29
0
        static void Main(string[] args)
        {
            try
            {
                //Initiallize the MotorControl object
                motoControl = new MotorControl();

                //Hook the basic event handlers
                motoControl.Attach += new AttachEventHandler(motoControl_Attach);
                motoControl.Detach += new DetachEventHandler(motoControl_Detach);
                motoControl.Error  += new ErrorEventHandler(motoControl_Error);

                //Hook the phidget specific event handlers
                motoControl.CurrentChange += new CurrentChangeEventHandler
                                                 (motoControl_CurrentChange);
                motoControl.InputChange += new InputChangeEventHandler
                                               (motoControl_InputChange);
                motoControl.VelocityChange += new VelocityChangeEventHandler
                                                  (motoControl_VelocityChange);

                //open the object for MotorControl device connections
                motoControl.open();

                //Wait for a MotorControl device to be attached
                Console.WriteLine("Waiting for MotorControl to be attached....");
                motoControl.waitForAttachment();

                //Set the acceleration to 100 for this example and intialize the velocity
                //to 0.00 (stopped)
                motoControl.motors[0].Acceleration = 100.00;
                motoControl.motors[0].Velocity     = 0.00;

                //Prompt for user inpu to continue
                Console.WriteLine("Press any button to continue...");
                Console.Read();

                //Slowly speed the motor to full speed going one direction
                double i;
                for (i = 0.00; i < 100; i++)
                {
                    Thread.Sleep(100);
                    motoControl.motors[0].Velocity = i;
                }

                //Slowly speed down and start accelerating in the other direction
                for (i = 100; i > -100; i--)
                {
                    Thread.Sleep(100);
                    motoControl.motors[0].Velocity = i;
                }

                //Stop the motor
                motoControl.motors[0].Velocity = 0.00;

                //Prompt the user for input to terminate
                Console.WriteLine("Press any key to end...");
                Console.Read();

                //User input was read so we can terminate, close the MotorControl object
                motoControl.close();

                //Set the MotorControl object to null to get it out of memory
                motoControl = null;

                //If no exceptions were thrown by this point it is ok to terminate
                Console.WriteLine("ok");
            }
            catch (PhidgetException ex)
            {
                Console.WriteLine(ex.Description);
            }
        }