Step 3: Arduino and PC Programming
On the Arduino we will need a serial interface that allows the PC to control the motors. We will also need a PWM servo drive system to send the correct signals to the Vex motors and make sure they go in the correct directions when given the right values. I also added some simple LED flashing, mainly for status indication but also because it looks cool.
On the PC we will need to open the serial port and send frames of data that the Arduino program will understand. The PC also needs to come up with motor values. An easy way to do this is to use a USB game pad or joystick, I'm using an Xbox 360 controller. Another option is to use a networked computer (either a netbook or a small mini ITX board) on the robot itself to drive wirelessly. With a netbook, you can even use the onboard webcam to stream back a video feed and drive your robot remotely. I used the Linux sockets system to do network programming for my setup. One program (the "joystick server") is run on a separate PC that has a controller plugged into it, and another program (the "client" ) is run on the netbook connected to the Arduino. This links the two computers and sends joystick information to the netbook, which then sends out serial packets to the Arduino that drives the robot.
To connect to the Arduino using a Linux PC (in C++) you must first open the serial port at the correct baud rate and then send the values using a protocol that you have also used on the Arduino's code. My serial format is simple and effective. I use 4 bytes per "frame" to send the two motor speeds (each is a single byte). The first and last bytes are hard-coded values that are used to keep the Arduino from sending the wrong byte to the PWM code and causing the motors to go crazy. This is the primary purpose of the RGB LED, it flashes red when the serial frame was incomplete. The 4 bytes are as follows:
255 (hard coded "start" byte),
To ensure reliable reception of the data, make sure you put enough delay between program loops. If you run your PC code too fast, it will flood the port and the Arduino may start dropping or even mis-reading bytes. Even if it doesn't drop information it can also overflow the Arduino's serial port buffer.
For the Vex motors, I used the Arduino Servo library. Since Vex motors are just continuous rotation motors, they use the exact same signaling that servos use. However, instead of 90 degrees being the center point, it is the stop point where the motor does not spin. Lowering the "angle" causes the motor to start spinning in one direction, while raising the angle makes it spin in the other direction. The farther away from the center point you are, the faster the motor will spin. While it is not going to break anything if you send values greater than 180 degrees to the motors, I would advise limiting the values from 0 to 180 degrees (which in this case are speed increments). Because I wanted more control and less out of control robot driving, I added a software "speed limit" to my program that doesn't allow the speed to increase above 30 "degrees" in either direction (range is 90 +/- 30). I plan on adding a serial port command that changes the speed limit, so that the computer can remove the limit on the fly if you want to go fast (I've been testing in small rooms so I don't want it to speed up and crash into the wall, especially with a netbook on it).
For more information, download the attached code at the end of this Instructable.