Conexión Bluetooth entre Android y LEGO MINDSTORM NXT
-
12-11-2019 - |
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).
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.