AME 3623: Project 5: Rate Gyroscopes and Damping Control

Key to successful control in embedded systems is the ability to integrate information about the external state of your system into the control decisions that are being made. In this project, we will finally close a loop between sensing and actuation. We will add one more component to your circuit: an inertial measurement unit (IMU). The IMU contains three distinct sensors (with three degrees of freedom each): an accelerometer, a rate gyroscope and a magnetometer. The gyroscope will be used in this project to dampen rotational disturbances. In project 6, we will use all nine degrees-of-freedom to estimate the orientation of the hovercraft.

At the end of this project, you should be able to:

Component 0: Library Installation

The new IMU Utils library provides the following functions:

Component 1: Hardware and Circuit

In order for your hovercraft to lift off the floor, it must be balanced. Move your circuit board into a position such that your craft is balanced front-to-back and left-to-right.

Every hovercraft should have a battery platform just behind the central fan (and it should be affixed to the hovercraft body). We have provided Velcro tape to use for affixing your battery to the platform. We recommend a large strip of "hooks" on the platform and small sections of "loops" on the batteries.

Inertial Measurement Unit

The IMU is a MPU-9250. Mount the Inertial Measurement (IMU) on the mast that we provide. The advantage of the mast is that your sensor will be less subject to magnetic interference from the hovercraft motors and wires, as well as sources buried in the floor. Make sure that your mast is intact and be gentle with it (don't crush it and don't grab your hovercraft by it).

Connect the IMU to your circuit. The pins are:

Central Fan

Component 2: Software

  1. Copy the following function from project 1:
  2. Copy the functions that you developed in project 4 into your current project.

  3. Add the following code to the top of your program

    PWMServo fan;  // create servo object to control the fan
    const int CENTRAL_FAN_PWM = ???;
         
    void fan_setup() {
         fan.attach(CENTRAL_FAN_PWM);  // attaches the fan to specified
                                       //   Arduino pin to the object
         delay(100);
         fan.write(20);  // write low throttle
         delay(3000);
    }
         

    Make sure to call this new function from setup()

  4. Implement a new PeriodicAction (called imu_task) that executes once per 5 ms The associated imu_step() function should:

  5. Implement the following function:

    void set_forces_and_torques(float fx, float fy, float torque)

    This function accepts as input desired forces to be applied to hovercraft chassis, translates these desired forces into an appropriate thrust level for each of the lateral fans, and changes the thrust state of these fans. Note that the precise units of these forces are not really known (don't worry, the units will "wash away" once we introduce our control gains).

  6. Implement a new finite state machine in fsm_step(). This state machine will:
    1. Wait for the switch to be pressed.

    2. Set the central fan to a 25-40% duty cycle (use the smallest level that brings the craft off the ground).

      You can set the duty cycle of the central fan using:

      fan.write(duty)

      where the duty parameter is a value between 0 and 255 (corresponding to zero to 100% duty cycle)

    3. Wait in this state for 30 seconds.

    4. Turn off the central fan.

    5. Return to waiting for the switch.

  7. Implement a new PeriodicAction (called pd_task that executes once per 10 ms. The associated pd_step() function will implement a damping rotation controller. Specifically:
    float fx = 0.0;
    float fy = 0.0;
    float torque = Kv * IMU.gz;   // gz = gyro about the Z axis (right-handed coord frame)
    set_forces_and_torques(fx, fy, torque);
           

  8. Add each of your tasks to your loop() function.

Component 3: Testing


What to Hand In

All components of the project are due by Friday, March 27th at 3:30 pm

Grading

Personal programming credit: Group grade distribution:

Group Grading Rubric

Grades for individuals will be based on the group grade, but weighted by the assessed contributions of the group members to the non-personal programming items.


andrewhfagg -- gmail.com

Last modified: Tue Mar 31 14:15:59 2020