Project 9  Stepper Motor
Neff Site
Protocol Documentation

This module implements a command line interface for the A4988 stepper motor driver.

Implementing a protocol for a command line interface is not easy. One has to know what a protocol and a state machine is and how they work. Please see the following modules for more information:

Refer to Module 5.3.3 for an implementation example with a Visual Studio and a Code::Blocks solution.

Protocol Definition
Protocol Implementation
The protocol is implemented by the following finite state machine:
protocol.png

The description of the states is:

State Description
C Parse command.
A1 Parse first digit of advance argument.
A2 Parse second digit of advance argument.
D Parse argument of direction command.
M Parse argument of motor state command.
T Parse terminal character.
E Execute command.

The transitions are:

State Condition Transition Description
C token = A A1 Command is Advance. → Parse first digit of argument.
token = T D Command is Turn. → Parse argument.
token = M M Command is Motor State. → Parse argument.
token = S T Command is Step. → No argument required, parse terminal.
A1 token = digit A2 First digit parsed. → Parse second digit.
A2 token = digit T Second digit parsed. → Parse terminal.
D token = R T Argument parsed. → Parse terminal.
token = L T Argument parsed. → Parse terminal.
M token = O T Argument parsed. → Parse terminal.
token = F T Argument parsed. → Parse terminal.
T token = space E Terminal parsed. → Execute.
E - C Command executed. → Parse next command.

Every parsing function gets the new token and returns the subsequent state. Some functions return extra information (command, argument) via a reference parameter. The basic workflow is as follows:

while (1)
{
switch (state) {
token = new_token();
state = cli_parse_command(token, &command);
break;
case CLI_STATE_GET_ARGUMENT:
token = new_token();
state = cli_parse_argument(token, &argument);
break;
token = new_token();
state = cli_parse_terminal(token);
break;
state = cli_execute(command, argument);
break;
}
}
Contact