Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bluetooth-connection between Android and Lego Mindstorm NXT

Does anybody know, how to build a bluetooth connection between Android and LEGO-Mindstorm-NXT? The connection between two NXTs works fine. But the other Connection-type likes not so easy. I am working with the LeJOS Firmware 0.85 and the Android SDK Tools (2.2 Froyo).

like image 971
joen Avatar asked Feb 11 '11 12:02

joen


People also ask

How do you connect Lego Mindstorms NXT with Bluetooth?

Pair Bluetooth Devices On your Phone select Bluetooth (to configure devices). On your Phone, select 'Search for Devices' and ensure that your NXT or EV3 appears at the end of search. ('NXT' as in adjacent picture). Once the search is finished, select your device to pair.

Does Lego NXT have Bluetooth?

The Lego NXT already has built in Bluetooth capabilities. Turn on your LEGO NXT and navigate Main Menu > Bluetooth >Visibility > Visible and Enter on the brick (orange button).

Why is my Lego Mindstorms not connecting?

Make sure that one end of your USB cable is firmly inserted into a USB port on the computer and the other end is connected to the EV3 Brick. If you still can't see the EV3 drive, try a different port on the computer. If that doesn't work then maybe your cable is faulty or you need to reset the EV3 Brick.

How do I connect my phone to my EV3 Bluetooth?

On your Android device, open System settings and make sure Bluetooth is turned on. Go back to Settings and open Bluetooth and select your EV3 to pair it. Confirm the passkey on both devices when requested. On the EV3, find your Android in the list of Bluetooth devices and and select it.


2 Answers

So i've solved it and will show all how does it works, because i've seen that a lot of people have problems with that.

The class includes 4 functions:

  • Bluetooth enable if not enabled before -> enableBT()
  • Connect to 2 NXTs -> connectToNXTs()
  • Write Message to one of the NXTs -> writeMessage(byte msg, String nxt)
  • Read Message from one of the NXTs -> readMessage(String nxt)

Here is the code for the android device (BT_comm.java):

package de.joen.android.CubeScan;


import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.UUID;


import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;

import android.util.Log;

public class BT_Comm {

  //Target NXTs for communication
  final String nxt2 = "00:16:53:04:52:3A";
  final String nxt1 = "00:16:53:07:AA:F6";

  BluetoothAdapter localAdapter;
  BluetoothSocket socket_nxt1, socket_nxt2;
  boolean success = false;

  // Enables Bluetooth if not enabled
  public void enableBT(){
    localAdapter = BluetoothAdapter.getDefaultAdapter();
    // If Bluetooth not enable then do it
    if (!localAdapter.isEnabled()) {
      localAdapter.enable();
      while(!(localAdapter.isEnabled()));
    }
  }

  // Connect to both NXTs
  public boolean connectToNXTs() {

    // Get the BluetoothDevice of the NXT
    BluetoothDevice nxt_2 = localAdapter.getRemoteDevice(nxt2);
    BluetoothDevice nxt_1 = localAdapter.getRemoteDevice(nxt1);
    // Try to connect to the nxt
    try {
      socket_nxt2 = nxt_2.createRfcommSocketToServiceRecord(UUID
          .fromString("00001101-0000-1000-8000-00805F9B34FB"));

      socket_nxt1 = nxt_1.createRfcommSocketToServiceRecord(UUID
          .fromString("00001101-0000-1000-8000-00805F9B34FB"));

      socket_nxt2.connect();    
      socket_nxt1.connect();      

      success = true;

    } catch (IOException e) {
      Log.d("Bluetooth","Err: Device not found or cannot connect");
      success=false;
    }
    return success;    
  }


  public void writeMessage(byte msg, String nxt) throws InterruptedException {
    BluetoothSocket connSock;

    // Swith nxt socket
    if (nxt.equals("nxt2")) {
      connSock=socket_nxt2;
    } else if(nxt.equals("nxt1")) {
      connSock = socket_nxt1;
    } else {
      connSock=null;
    }

    if (connSock!=null) {
      try {

        OutputStreamWriter out = new OutputStreamWriter(connSock.getOutputStream());
        out.write(msg);
        out.flush();

        Thread.sleep(1000);

      } catch (IOException e) {
        // TODO: Auto-generated catch block
        e.printStackTrace();
      }
    } else {
      // Error
    }
  }

  public int readMessage(String nxt) {
    BluetoothSocket connSock;
    int n;

    // Swith nxt socket
    if (nxt.equals("nxt2")) {
      connSock=socket_nxt2;
    } else if (nxt.equals("nxt1")) {
      connSock=socket_nxt1;
    } else {
      connSock=null;
    }

    if (connSock!=null) {
      try {

        InputStreamReader in = new InputStreamReader(connSock.getInputStream());
        n = in.read();
        return n;

      } catch (IOException e) {
        // TODO: Auto-generated catch block
        e.printStackTrace();
        return -1;
      }
    } else {
      // Error
      return -1;
    }
  }
}

To get messages from the Android Smartphone you must have a read call on the NXT-side. Here is the code from the NXT-side wich will accept the connection from the Smartphone and read messages from it:

Boolean isrunning = true;

// Main loop   
while (true)
{
  LCD.drawString(waiting,0,0);
  LCD.refresh();

  // Listen for incoming connection

  NXTConnection btc = Bluetooth.waitForConnection();

  btc.setIOMode(NXTConnection.RAW);

  LCD.clear();
  LCD.drawString(connected,0,0);
  LCD.refresh();  


  // The InputStream for read data 
  DataInputStream dis = btc.openDataInputStream();


  // Loop for read data  
  while (isrunning) {
    Byte n = dis.readByte();
    LCD.clear();
    LCD.drawInt(n, 4, 4);
  }

  dis.close();

  // Wait for data to drain
  Thread.sleep(100); 

  LCD.clear();
  LCD.drawString(closing,0,0);
  LCD.refresh();

  btc.close();

  LCD.clear();
}

Hope this will help others...

like image 195
joen Avatar answered Oct 04 '22 06:10

joen


There is a document I found very useful http://wiki.tinyclr.com/images/d/df/LEGO_MINDSTORMS_NXT_Direct_commands.pdf

The MINDdroid package on github is a fine place to start.

like image 39
user462990 Avatar answered Oct 04 '22 07:10

user462990