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.*;

import java.io.*;


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

        LCD.drawString(waiting,0,0);
        LCD.refresh();
       
        Sound.twoBeeps();

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();
       
        Sound.beepSequenceUp();

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

        dis.close();
        dos.close();
        Thread.sleep(100); // wait for data to drain
        LCD.clear();
        LCD.drawString(closing,0,0);
        LCD.refresh();
        btc.close();
        LCD.clear();
  } // 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.

Monday, July 26, 2010

Still Fixing my Code

This weekend, I was fixing up my code for my Monte Carlo localization project.  Unfortunately, the Lejos API was changed so much so that much of the functionality was broken.

While it didn't take long to change the code over, now I have to test it to ensure that the new libraries that I'm accessing produce similar results.

I'll probably get back to more fixing of my code this weekend coming up.

Tuesday, July 20, 2010

API Changes have broken my code

Since I've been away, changes have been made to the Lejos API. Unfortunately, the removal of some classes, and the changes in other classes have broken my code. This code used Bluetooth, and I wanted to illustrate the use of my code to you.

In my next blog entry, I'll demonstrate why changing a public interface in an API can adversely affect users.

Sunday, July 18, 2010

Back in Business

After a long time away from blogging about the NXT and LEJOS programming in the Java programming language, I'm back.


I'm a software developer at Research in Motion, the makers of the BlackBerry smartphone.


My major interest with the NXT is using Bluetooth to use the PC and the NXT together.  The PC is dedicated to do complex calculations, while the NXT is used as, essentially, a mobile sensor platform.  I am particularly interested in the Monte Carlo localization.


Go questions. Send me a reply to this post.


Stay tuned for new blog posts.