AME 3623: Project 9: Finite State Machines
- All components of the project are due by Thursday, April 28th
at 9:00 am
- 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:
- design a finite state machine (FSM) for mission-level control,
- translate a FSM design into C code
- connect FSM events to sensor events,
- connect FSM actions to control actions, and
- debug both FSM designs and code.
Project Outline
Your hovercraft will be placed at a location and orientation on the
field. Your craft will take the following steps:
- Wait for the switch to be pressed.
- Record the current orientation. This will be your goal
orientation.
- After a 5-second delay, ramp up the middle fan to a
point where the craft begins to turn (as measured by the gyro).
- Slightly drop the middle fan thrust.
- Move forward until a wall is detected.
- Stop
- Make a 90 degree turn to the left
- Move forward until another wall is detected.
- Stop, including shutting down all fans.
Component 1: Hardware
- If you have removed the distance sensors from your circuit,
please add them back. Remember that the distance sensors
should be positioned such that the minimum distance to an
obstacle is 6-7cm. Also, make sure to orient your sensors so
that they are useful for the task described above.
Component 2: Finite State Machine
Design your FSM on paper. This FSM must accomplish all of the above
steps, including handling the start from the switch press and the
stopped state.
Component 3: Software
Add a new variable type to "project.h":
typedef enum {
STATE_START,
#LIST YOUR OTHER STATES HERE#
} State;
Modify your main function such that it is structured as follows
(you will, of course, need to add other code). Here is an outline for
the code ("NEW" lines are explicitly indicated):
int main(void) {
int16_t counter = 0;
int16_t heading, heading_goal, heading_error;
int16_t rotation_rate, distance_left, distance_right;
State state = STATE_START; // NEW
int16_t forward_thrust = 0;
#APPROPRIATE VARIABLE DECLARATIONS HERE#
#APPROPRIATE HARDWARE INITIALIZATIONS HERE#
timer0_config(TIMER0_PRE_1024); // Prescale by 1024
sei(); // Enable global interrupts
#INITIALIZE VARIABLES HERE#
// NEW: place enable right above while()
timer0_enable(); // Enable the timer 0 overflow interrupt
// Loop forever
while(1) {
// ////////////////////////////////////////////////
// Sensors
heading = read_rotation();
heading_error = compute_rotation_error(heading_goal, heading);
rotation_rate = read_rotation_rate();
distance_left = read_distance(DISTANCE_LEFT);
distance_right = read_distance(DISTANCE_RIGHT);
// Display
#APPROPRIATE CODE FOR DISPLAYING SENSOR STATES WITH YOUR LEDS#
// ////////////////////////////////////////////////
// Finite state machine
switch(state) { // NEW
case STATE_START:
:
break;
case STATE_NAVIGATE_1:
:
break;
:
:
default:
// this should never happen: but take safety steps
// if it does
#Shut down craft#
while(1){};
break;
}
// ////////////////////////////////////////////////
// Control
// NOTE: forward_thrust and heading_goal should be set by your FSM
// Compute heading_error again in case heading_goal has changed
heading_error = compute_rotation_error(heading_goal, heading);
// Note that position_derivative_control() performs the error clipping
position_derivitive_control(forward_thrust, heading_error, rotation_rate);
// ////////////////////////////////////////////////
// Handle loop timing
// Increment time
++counter;
if(flag_timing) {
// Error condition: your code body is taking too much
// time.
#Indicate this with an LED display of some form#
}
// Wait for the flag to be set (happens once every ~50 ms)
while(flag_timing == 0) {};
// Clear the flag for next time.
flag_timing = 0;
}
}
Notes
- Implement your FSM incrementally: get one piece working well
first and then grow it.
- Draw your FSM before you implement it in code. If you
change your implementation, make the change on the diagram
first, then work on the code.
- You can do a lot of testing with your craft being held by a
group member. This will help you separate the problems of
debugging high- and low-level code (but, in the end, it must
all work together).
- Introduce STATE_STOPPING and STATE_STOPPED early into your
design/implementation.
- Your hovercraft can easily accumulate a lot of momentum. You
can "burn" this off using a number of techniques. Reducing
middle fan thrust in general can cause the craft to drag a
little against the ground, effectively giving you a form of
damping. You can also explicitly have states in your FSM
dedicated to powering down the middle fan to stop the craft
before continuing with the next phase of the task.
- This is an involved project. Start early.
- Keep your batteries charged.
- By rotating your lateral fans slightly inward, you can
generate more rotation and less forward acceleration.
What to Hand In
All components of the project are due by Tuesday, April 28th at
9:00 pm.
- Demonstration/Code Review: All group
members must be present. Given time, this can be done during
class. The demonstration must be completed by Monday, May 2nd.
- Check in the following to your project 9 area of your
subversion tree:
- Personal report: There is no personal report due for
this project.
Grading
Personal programming credit:
- Each person must accumulate at least three personal programming
credits over the course of the semester. This project offers
one.
- 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.
References
andrewhfagg -- gmail.com
Last modified: Wed Apr 20 23:52:59 2016