sensores que programar piezas nombre las ev3 componentes caracteristicas android bluetooth lego mindstorms nxt

que - Conexión Bluetooth entre Android y Lego Mindstorm NXT



que es lego mindstorms ev3 (2)

¿Alguien sabe cómo construir una conexión bluetooth entre Android y LEGO-Mindstorm-NXT? La conexión entre dos NXT funciona bien. Pero los otros tipos de conexión no son tan fáciles. Estoy trabajando con LeJOS Firmware 0.85 y las herramientas de Android SDK (2.2 Froyo).



Así que lo he resuelto y mostraré cómo funciona, porque he visto que mucha gente tiene problemas con eso.

La clase incluye 4 funciones:

  • Habilitar Bluetooth si no está habilitado antes -> habilitarBT ()
  • Conéctese a 2 NXTs -> connectToNXTs ()
  • Escribir mensaje a uno de los NXTs -> writeMessage (byte msg, String nxt)
  • Lea el mensaje de uno de los NXT -> 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 recibir mensajes del teléfono inteligente Android, debe tener una llamada de lectura en el lado NXT. Aquí está el código del lado NXT que aceptará la conexión desde el teléfono inteligente y leerá mensajes de este:

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 otros ...