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.
- All components of the project are due by Thursday, March 29th
at 1:30 pm.
- Groups are the same as for project 1.
- Discussion within groups is fine.
- Discussion across groups may not be about the specifics of the
solution (general programming/circuit issues are fine to
discuss).
At the end of this project, you should be able to:
- extract rotation rate information from an inertial measurement unit, and
- use the sensory data to dampen out rotational disturbances.
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.
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:
- BLACK Ground
- +3.3V power: connect to the 3.3V supplied by the Teensy
- SDA: connect to SDA0 of the Teensy (Arduino pin 18)
- SCL: connect to SCL0 of the Teensy (Arduino pin 19)
Component 2: Software
-
Copy the following function from project 1:
- void display_heading_velocity(int16_t velocity)
-
Copy the functions that you developed in project 4 into your current project.
- Implement a new PeriodicAction (called sensor_task)
that executes once per 5 ms
The associated sensor_step() function should:
- Call imu_update().
- Display the rotation velocity of the craft.
-
Implement the following function:
- void set_hovercraft_acceleration(float ddx, float ddy, float ddtheta)
This function accepts as input a desired acceleration of the
hovercraft, translates this desired acceleration into an
appropriate thrust level for each of the lateral fans, and
changes the thrust state of these fans.
- Implement a new finite state machine in fsm_step(). This state
machine will:
- Ramp up the central fan to a ~70% duty cycle in 5 seconds.
- Wait in this state for 30 seconds.
- Ramp down the central fan to zero.
- 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 ddx = 0.0;
float ddy = 0.0;
float ddtheta = -Kv * IMU.gz; // gz = gyro about the Z axis
set_hovercraft_acceleration(ddx, ddy, ddtheta);
Project Template
Below is your starting point for your project.
#include "PeriodicAction.h"
#include "ImuUtils.h"
// Promise that we will implement this function later
void control_step();
// Create a task that will be executed once per 10 ms
PeriodicAction control_task(10, control_step);
// Promise that we will implement this function later
void sensor_step();
// Create a task that will be executed once per 5 ms
PeriodicAction sensor_task(5, sensor_step);
void setup() {
// Initialize the USB serial connection
Serial.begin(115200);
// Initialize the IMU
imu_setup();
// Add your project-specific setup code here
}
/*
* Take one step in querying the sensors
*/
void sensor_step()
{
imu_update();
}
/**
* No changes necessary to the loop (except to add new tasks)
*/
void loop() {
// Check to see if it is time to execute the various tasks
sensor_task.step();
fsm_task.step();
control_task.step();
}
Component 3: Testing
- Perform initial testing while holding the lip of the Hovercraft
with two hands (I recommend not sticking fingers in the fans).
- Start with a conservative Kv (i.e., a small value).
- Slowly increase the gain until the craft
resists the rotations.
- At this point, you can place the craft on the floor (or a
table, if you are careful).
- If the craft tends to oscillate while on the ground, then
decrease your Kv.
What to Hand In
All components of the project are due by Thursday, March 29th at
1:30 pm
- Demonstration/Code Review: All group
members must be present. Given time, this can be done during
class. The demonstration must be completed by Tuesday April 4th.
- Check in the following to your project 5 area of your Dropbox:
- Personal report: Catme will request that you fill out a
survey about the project. These must be completed by Tuesday
April 4th in order to receive credit for the project.
Grading
Personal programming credit:
- Each person must accumulate at least three personal programming
credits over the course of the semester.
- To receive credit, you must be the primary designer,
implementer and debugger of the component. This does
not mean that your other group members should not be looking
over your shoulder. But: you must do the "driving."
Group grade distribution:
- 35%: Project implementation
- 30%: Demonstration of working project (to either
of the TA or the instructor)
- 35%: Documentation
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: Wed Mar 28 15:09:50 2018