Saturday, July 31, 2010

NXT Bluetooth Tutorial

This blog is the first of many as a tutorial on using the NXT with Bluetooth.  First, I’ll speak to the issue of programming the robot because it’s the easiest to understand.  The following program is intended to be run on the NXT.  This code will not run on your PC.

The steps for your NXT are quite simple

1.    Declare all of the class’s instance variables.
2.    Display a message on the NXT’s LCD display that the NXT is waiting for a connection.  I also like the NXT to sound two beeps in case the NXT is not near enough to read the LCD.
3.    Make a blocking call to wait for a Bluetooth connection from your PC.  I'll explain in future blogs how to make the PC initiate the Bluetooth connection.
4.    Once the connection is made, set up the input and output streams.  I also like the NXT to sound a tune so that I know that the connection is ready.
5.    Next, send the NXT into a while loop controlled by a Boolean flag.  The stuff inside the while loop is what you want the NXT to do. 
6.    When your PC signals the NXT that it is through with the Bluetooth connection, the NXT should set the Boolean flag mentioned in step 5 to false.  Consequently, the while loop will cease.
7.    Close the input and output buffers to close the Bluetooth connection.

Step 1:  Declare all of the class’s instance variables

import lejos.nxt.*;
import lejos.nxt.comm.*;
import lejos.robotics.navigation.*;


public class Robot {   
    public static void main(String [] args) throws Exception
      int[] command = new int[3];
      int[] reply = new int[8];
      boolean keepItRunning = true;
      String connected = "Connected";
      String waiting = "Waiting...";
      String closing = "Closing...";
      DataInputStream dis = null;
      DataOutputStream dos = null;
      BTConnection btc = null;
      UltrasonicSensor sonic = new UltrasonicSensor(SensorPort.S1);
      Pilot piloting = new TachoPilot(56.0f, 121.0f, Motor.C, Motor.A);

The two integer arrays are used to hold the commands sent by the PC to the NXT, and the reply is used to hold the NXT's reply to the command.

The Boolean flag is used to indicate if the while loop is to keep looping.

The strings are used to display status messages on the LCD screen.

The streams are used to facilitate communication between the PC and the NXT.

The ultrasonic sensor and pilot objects are used within the while loop to control the NXT.

Step 2:  Display a Message and Sound two Beeps


These simple commands put the words “Waiting…” on the NXT’s LCD and sounds two beeps.

Step 3:  Wait for a Bluetooth Connection

        btc = Bluetooth.waitForConnection();
Remember that this is a blocking method call.  The NXT will not go beyond this step until it makes a Bluetooth connection.  I’ll explain in future blog posts how the PC initiates the Bluetooth connection.  If you try to run this program on your NXT, it will stop at this point and go no further.

Step 4:  Set up the Streams

        dis = btc.openDataInputStream();
        dos = btc.openDataOutputStream();

With the Bluetooth connection established the streams can be opened.  I make the NXT play a tune as an audible reminder that a Bluetooth connection has been successfully made.

Steps 5 and 6:  Go into a while loop

        while (keepItRunning){
        // put your stuff here including code to change the Boolean
        // flag to false once the PC signals to end the connection

Step 7:  Close the Streams and the Bluetooth Connection

        Thread.sleep(100); // wait for data to drain
  } // end of main

} // end of class Robot

Closing the streams and the Bluetooth connection is very simple.  I also have status messages displayed on the NXT’s LCD.

In my next blog entry I’ll elaborate on Steps 5 and 6; that is, the “stuff” you want your NXT to do.

Go questions?  Post a comment.  I’ll reply.

No comments: