AME 3623: Project 9: Finite State Machines

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

Project Outline

The goal for our hovercraft is to navigate through the environment shown below. The thick lines correspond to walls.

  1. At the beginning of a test run, your hovercraft will be placed in one of four configurations: A, B, C or D (both position and orientation are defined). Your program will not be given any direct information about which configuration it is in.

  2. On start up, your program should record the current orientation. (note that the orientation of the field will not change for the demonstration).

  3. Your program must wait for a button press before proceeding. With the button press, it must ramp up the middle fan to a point where the craft begins to turn (as measured by the gyro).

  4. Your hovercraft must then navigate from its initial configuration to a specific goal. In particular:

  5. Once your hovercraft has reached its goal, it must slowly ramp down the central fan and turn off the lateral fans.

Component 1: Hardware

Component 2: Finite State Machine

Design your FSM on paper.

Component 3: Software

Add a new variable type to "project.h":

typedef enum {
   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_last, heading_goal, heading_error, heading_error_clipped;
       int16_t rotation_rate, distance_left, distance_right;
       State state = START;   // NEW
       int16_t forward_thrust = 0; 

       #APPROPRIATE VARIABLE DECLARATIONS HERE#

       
       #APPROPRIATE INITIALIZATIONS HERE#

       timer0_config(TIMER0_PRE_1024);   // Prescale by 1024
       timer0_enable();  // Enable the timer 0 overflow interrupt
       sei();  // Enable global interrupts

       #INITIALIZE VARIABLES HERE#

       #RAMP UP MIDDLE THRUST TO HOVER#

       // Loop forever
       while(1) {
           // ////////////////////////////////////////////////
           //  Sensors
           heading = read_orientation();
           heading_error = compute_orientation_error(heading_goal, heading);
           heading_error_clipped = clip_error(heading_goal, #DB#, #SAT#);
           rotation_rate = get_rotation_rate();

           distance_left = get_distance(LEFT);
           distance_right = get_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
           pd_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#
           }else{
               #Indicate with LED display that everything is OK
           }

           // 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


What to Hand In

All components of the project are due by Tuesday, April 28th at 9:00 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.

References


andrewhfagg -- gmail.com

Last modified: Wed Apr 12 23:27:11 2017