Pregunta

¿Alguien sabe, cómo construir una conexión Bluetooth entre Android y Lego-Mindstorm-NXT? La conexión entre dos NXTS funciona bien.Pero el otro tipo de conexión no le gusta, no tan fáciles. Estoy trabajando con el firmware de Lejos 0.85 y las herramientas SDK de Android (2.2 Froyo).

¿Fue útil?

Solución

Así que lo he resuelto y mostraremos a todos cómo funciona, porque he visto que muchas personas tienen problemas con eso.

La clase incluye 4 funciones:

  • Habilitar Bluetooth Si no está habilitado antes -> EnableBT ()
  • Conectar a 2 NXTS -> CONECTONTXTS ()
  • Escribir mensaje a uno de los NXTS -> Writemessage (MSG de byte, cadena NXT)
  • Leer mensaje de uno de los NXTS -> ReadMessage (String NXT)

    Aquí está el código para el dispositivo Android (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;
        }
      }
    }
    

    Para obtener mensajes del teléfono inteligente Android, debe tener una llamada de lectura en el lado NXT. Aquí está el código del lado de NXT, que aceptará la conexión desde el teléfono inteligente y lea los mensajes de él:

    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();
    }
    

    Espero que esto ayude a los demás ...

Otros consejos

Hay un documento que encontré muy útil http://wiki.tinyclr.com/images/d/df/lego_mindstorms_nxt_direct_commands.pdf

El paquete MINDDROID en GitHub es un lugar excelente para comenzar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top