This lab combines lab2 Drive-by-wire with lab3 Cyclometer. The C3 Pilot computer requests the vehicle to drive a short distance at a given speed, and then stop. The wheels will be locked, so that we drive in a straight line or in a circle. Acceleration should follow a trapezoidal profile: ramp up the speed from zero until hitting the desired speed, then start to decelerate as the destination nears. It is tricky to avoid overshooting the target speed, while not taking too long to accelerate. Control Theory teaches formal methods to make this happen, but we will rely on intuition.

In addition to getting the control right, the other challenge of this lab is to establish communication between the processors. In lab2, the C2 drive-by-wire computer took analog inputs from the joystick. Instead, we will be taking the inputs from the C3 Pilot computer.

Table: DB25 connector between MegaShieldDB and MegaShieldTrio.

Pin Signal C2 destination C3/C4/C6 destination
1 LED6 D33 C6 D24
2 LED5 D31 C5 D13
3 LED4 D29 C4 D13
4 LED3 D27 C3 D13
5 LED1 D23 C6 D8
6 Cruise Steer A13 Cruise steer C6 A6, D6, C3 D6, (C6 D42 = C5 D6)
7 Cruise Brake A14 Cruise brake C6 A5, D5, C3 D5, (C6 D40 = C5 D5)
8 Cruise Throttle A15 Cruise Throttle C6 A7, D45, C3 D9, (C6 D48 = C5 D10)
9 Speed limit A8 C4 D9
10 Speed A12 C6 A13, C3 D11
11 Available D41 C6 D41, C4 D8, C5 D12
12 Available D39 C6 D39, C3 D12, C4 D10
13 Cruise Reverse D36 C3 D8, C6 D44, C5 D2
14 Available Jumper JP9 Pin 3
JP9-5 to D0 (RX0)
C6 D3 (INT1), X2
15 LED7 D35 C6 D22
16 LED8 D37 C6 D21
17 Move OK D4 C3 D10, C5 D10
18 Cruise Drive Command D15 (RX3) C3 D1 (TX), C6 D26
19 Available D14 (TX3) C6 D17 (RX2)
20 Vision In D17 (RX2) C6 D0 (RX0)
21 Wheel Click D3 (INT1) C6 D2 (INT0), X3
22 Vision Out D16 (TX2) C6 D1 (TX0)
23 Available A6 C6 D10
24 5V from brake servo none 5V
25 Ground Ground Ground

On the MegaShieldTrio board, C4 D1 (TX) goes to C3 D0 (RX) and to (C5 D0,RX = C6 D28). The board is most commonly built with three Arduinos: C3 Nano, C4 Nano, and C6 Mega. It is possible to build the board with four computers: C3 Nano, C4 Nano, C5 Nano and C6 Uno. It is safe to assume C5 does not exist.

C6 D16 (TX2) goes to C4 D0 (RX)

Thus the main serial path is C6 D16 (TX2) → C4 D0 (RX); C4 D1 (TX) → C3 D0 (RX); C3 D1 (TX) → C2 D15 (RX3); C2 D14 (TX3) → C6 D17 (RX2).

C6 acquires the speed and distance travelled from the wheel click interrupt. It transfers the information to C4, which passes it on to C3. C3 has been hard-coded with desired speed and distance. C3 will compute the appropriate values for throttle and brake, and send those to C2.

The standard serial libraries for Arduino assume that both the Rx and Tx lines are available. Even if the communication just goes one direction, there is handshaking information coming back on the other line. The Elcano communication is instead a round robin, but it has numerous digital lines that can be used as handshakes between processors.

Analog values for the throttle, brake and steering could be sent from C3 PWM pins D9, D5, and D6 through pins 6, 7, and 8 and received by C2 on analog inputs A15, A14, and A13. However, C3 cannot write a true analog, which would require C2 to measure the pulse width on each pin.

The preferred interface is to send a GameBots serial command from C3 to C2. This has the advantage that C2 can be replaced by the USARSim simulator. The subset of the Gamebots format used by the vehicle is:

DRIVE {Speed ComandedSpinSpeed} {FrontSteer ComandedSteerAngle}


{Speed ComandedSpinSpeed} ComandedSpinSpeed is a ‘float’ giving the spin speed for the rear wheel.

The value is the absolute spin speed, in radians per second.

{FrontSteer ComandedSteerAngle} ComandedSteerAngle is a ‘float’ that specifies the steer angle

of Elcano’s front wheels. The value is the absolute steer angle, in radians.

Example: DRIVE {Speed 2.59}{FrontSteer 0.0138}

A similar format will be used for sensed information from C6.

SENSOR {Speed SensedSpinSpeed}

SensedSpinSpeed is a ‘float’ giving the spin speed for the rear wheel.

The value is the speed in millimeters per second.


All these routines are in Lab4_Drive.


(8/14/14): Hardware is ready. Software serial communications have been established. A version of MotionPilot has been written that runs on the Arduino Mega, combining the processing designed for C6, C4 and C3. This code has been tested and is able to receive a wheel click, transmit a serial sensor speed, read and decode that message, look up desired speed, and send that over a serial link to C2. Still need to test how the MotionPilot interacts with C2_Drive.

The C2 PID controller needs to be tuned.  See A. O’Dwyer, “An overview of tuning rules for the PI and PID continuous time control of delay single input, single output (SISO) processes”, PID Control in the Third Millennium, Springer, London, p. 3-44, 2012.