Tuesday, February 22, 2011

Software Serial on Arduino for Debugging and Displaying Serial Data in a Terminal Window

In order to debug the code for my remote car starter project I wanted to be able to output information via serial to display on my computer. Unfortunately the Arduino Uno has only one hardware serial port which was already in use to communicate with the Motorola c168i. To solve this problem I used a TTL serial to USB cable connected to a standard I/O pin on the Arduino. I then used the software serial library to output the data.

The Arduino IDK has a serial monitor tool built in but I would have had to change the selected serial port back and forth from one port to another to program or view the debugging data. To get around this I just used terminal to display the data.

Below is the Arduino sketch used in the example.
#include <softwareserial.h>
#define rxPin 2
#define txPin 3
int count = 1; 
SoftwareSerial PCserial = SoftwareSerial(rxPin, txPin); 
void setup() { 
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
void loop() { 
PCserial.println("This is output via software serial.");
PCserial.print("Count: ");

Monday, February 21, 2011

Remote Car Starter - Controlling the Motorola c168i with Arduino

I have began making progress on my remote car starter project. The basic concept is to build a home brew version of the Viper SmartStart system. My version will utilize text messages to relay the commands from my cell phone to the car via the Motorola c168i pay-as-you-go phone.

The first steps to getting this project started are learning the ropes of communicating with the c168i via the TTL serial port in the 3/32" headset jack on the top of the phone. The phone uses what are called "AT commands." Many phones can be controlled using these commands but each phone will not necessarily work with every command. There are also other quirks to account for such at the excessive power management of the c168i that requires sending something over the serial connection to wake the phone up before sending an actual command.

To connect your Arduino to the c168i you will need a 3/32" headset plug. I used part 274-0298 from Radio Shack. The connection uses three wires: ground, TX (transmit) and RX (receive). The tip on the 3/32" headset plug is the TX signal and connects to pin 1 on the Arduino, the ring is connected to the RX signal or pin 0 and the shield is connected to ground.

Below you will find the basic test sketch I used. Every line except for the repeated delay commands is commented to explain what it does. Eventually the delays will be removed and I will program the Arduino to listen for an ok response or error from the phone before proceeding to the next command.
void setup() {

pinMode(13, OUTPUT); // Initialize pin 13 as digital out (LED)
Serial.begin(4800); // Open serial connection at baud rate of 4800
delay(500); // Wait half a second
Serial.println("AT"); // Sends AT command to wake up cell phone
Serial.println("AT+CMGF=1"); // Puts phone into SMS mode
delay(1000); // Wait a second
Serial.println("AT+CMGW=\"+15555555555\""); // Creates new message to number
Serial.print("This message was generated by Arduino!"); // Message contents
Serial.println(26, BYTE); // equivalent (signals end of message)
Serial.println("AT+CMSS=1"); // Sends message at index of 1
Serial.println("AT+CMGD=1"); // Deletes message at index of 1


void loop(){

digitalWrite(13, HIGH); // set the LED on
delay(250); // wait for 1/4 a second
digitalWrite(13, LOW); // set the LED off
delay(250); // wait for 1/4 a second

Useful Resources