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 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. We will be providing battery mounts for this purpose.

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.

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 sensor_task) that executes once per 5 ms The associated sensor_step() function should:

  5. Implement the following function:

    void set_hovercraft_forces(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. Ramp up the central fan to a 50-70% duty cycle in 5 seconds (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)

    2. Wait in this state for 30 seconds.

    3. Ramp down the central fan to zero.

  7. Implement a new PeriodicAction (called control_task that executes once per 10 ms. The associated control_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_hovercraft_forces(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 29th at 11:59 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: Sat Mar 30 00:03:35 2019