2012-04-26 22 views
18

Puedo obtener mi aplicación de Android para conectarse a través de Bluetooth a mi Arduino. Sin embargo, no se pueden transmitir datos entre ellos. A continuación se muestra mi configuración y el código:Android + transferencia de datos Bluetooth Arduino

v2.2

HTC Android, módem compañero de oro Bluetooth, Arduino Mega (ATmega1280)

código

Android Java:

package com.example.BluetoothExample; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.EditText; 
import android.widget.Button; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Set; 
import java.util.UUID; 

public class BluetoothExampleActivity extends Activity { 
    TextView myLabel; 
    EditText myTextbox; 
    BluetoothAdapter mBluetoothAdapter; 
    BluetoothSocket mmSocket; 
    BluetoothDevice mmDevice; 
    OutputStream mmOutputStream; 
    InputStream mmInputStream; 
    Thread workerThread; 
    byte[] readBuffer; 
    int readBufferPosition; 
    int counter; 
    volatile boolean stopWorker; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button openButton = (Button)findViewById(R.id.open); 
    Button sendButton = (Button)findViewById(R.id.send); 
    Button closeButton = (Button)findViewById(R.id.close); 
    myLabel = (TextView)findViewById(R.id.label); 
    myTextbox = (EditText)findViewById(R.id.entry); 

    //Open Button 
    openButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
     try { 
      findBT(); 
      openBT(); 
     } 
     catch (IOException ex) { } 
     } 
    }); 

    //Send Button 
    sendButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
     try { 
      sendData(); 
     } 
     catch (IOException ex) { 
      showMessage("SEND FAILED"); 
     } 
     } 
    }); 

    //Close button 
    closeButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
     try { 
      closeBT(); 
     } 
     catch (IOException ex) { } 
     } 
    }); 
    } 

    void findBT() { 
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    if(mBluetoothAdapter == null) { 
     myLabel.setText("No bluetooth adapter available"); 
    } 

    if(!mBluetoothAdapter.isEnabled()) { 
     Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBluetooth, 0); 
    } 

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
    if(pairedDevices.size() > 0) { 
     for(BluetoothDevice device : pairedDevices) { 
     if(device.getName().equals("FireFly-108B")) { 
      mmDevice = device; 
      break; 
     } 
     } 
    } 
    myLabel.setText("Bluetooth Device Found"); 
    } 

    void openBT() throws IOException { 
    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard //SerialPortService ID 
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);  
    mmSocket.connect(); 
    mmOutputStream = mmSocket.getOutputStream(); 
    mmInputStream = mmSocket.getInputStream(); 
    beginListenForData(); 
    myLabel.setText("Bluetooth Opened"); 
    } 

    void beginListenForData() { 
    final Handler handler = new Handler(); 
    final byte delimiter = 10; //This is the ASCII code for a newline character 

    stopWorker = false; 
    readBufferPosition = 0; 
    readBuffer = new byte[1024]; 
    workerThread = new Thread(new Runnable() { 
     public void run() { 
     while(!Thread.currentThread().isInterrupted() && !stopWorker) { 
      try { 
      int bytesAvailable = mmInputStream.available();    
      if(bytesAvailable > 0) { 
       byte[] packetBytes = new byte[bytesAvailable]; 
       mmInputStream.read(packetBytes); 
       for(int i=0;i<bytesAvailable;i++) { 
       byte b = packetBytes[i]; 
       if(b == delimiter) { 
        byte[] encodedBytes = new byte[readBufferPosition]; 
        System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); 
        final String data = new String(encodedBytes, "US-ASCII"); 
        readBufferPosition = 0; 

        handler.post(new Runnable() { 
        public void run() { 
         myLabel.setText(data); 
        } 
        }); 
       } 
       else { 
        readBuffer[readBufferPosition++] = b; 
       } 
       } 
      } 
      } 
      catch (IOException ex) { 
      stopWorker = true; 
      } 
     } 
     } 
    }); 

    workerThread.start(); 
    } 

    void sendData() throws IOException { 
    String msg = myTextbox.getText().toString(); 
    msg += "\n"; 
    //mmOutputStream.write(msg.getBytes()); 
    mmOutputStream.write('A'); 
    myLabel.setText("Data Sent"); 
    } 

    void closeBT() throws IOException { 
    stopWorker = true; 
    mmOutputStream.close(); 
    mmInputStream.close(); 
    mmSocket.close(); 
    myLabel.setText("Bluetooth Closed"); 
    } 

    private void showMessage(String theMsg) { 
     Toast msg = Toast.makeText(getBaseContext(), 
       theMsg, (Toast.LENGTH_LONG)/160); 
     msg.show(); 
    } 
} 

Código Arduino:

#include <SoftwareSerial.h> 

int bluetoothTx = 45; 
int bluetoothRx = 47; 

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx); 

void setup() { 
    //pinMode(45, OUTPUT); 
    //pinMode(47, INPUT); 
    pinMode(53, OUTPUT); 
    //Setup usb serial connection to computer 
    Serial.begin(9600); 

    //Setup Bluetooth serial connection to android 
    bluetooth.begin(115200); 
    bluetooth.print("$$$"); 
    delay(100); 
    bluetooth.println("U,9600,N"); 
    bluetooth.begin(9600); 
} 

void loop() { 
    //Read from bluetooth and write to usb serial 
    if(bluetooth.available()) { 
    char toSend = (char)bluetooth.read(); 
    Serial.print(toSend); 
    flashLED(); 
    } 

    //Read from usb serial to bluetooth 
    if(Serial.available()) { 
    char toSend = (char)Serial.read(); 
    bluetooth.print(toSend); 
    flashLED(); 
    } 
} 

void flashLED() { 
    digitalWrite(53, HIGH); 
    delay(500); 
    digitalWrite(53, LOW); 
} 

He intentado usar 115200 y 9600 para las velocidades en baudios, y he intentado configurar los bluetooth rx y tx pins como entrada/salida y salida/entrada. El Arduino está recibiendo datos en serie de la PC pero no puede enviarlos a Android (puedo ver esto debido al método flashLED()).

El Android no puede enviar ningún dato al Arduino. Sin embargo, ambos están conectados porque la luz verde del módem se enciende y se apaga, y el LED rojo parpadea cuando cierro la conexión. El método sendData() no arroja una excepción porque, de lo contrario, muestra el mensaje ("ENVIÓ FALLÓ"); aparecería

también tengo esto en mi .xml manifiesta

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> 

Cualquier ayuda sería muy apreciada!

Código tomado de:

http://bellcode.wordpress.com/2012/01/02/android-and-arduino-bluetooth-communication/

+0

Su código funciona bien, eche un vistazo a los pasos: primero envía una solicitud de conexión a un dispositivo externo una vez que la señal es aceptada devolverá la señal y la conexión correctamente pero no podemos obtener los datos entrantes periódicamente. algún tiempo de conexión exitosa. Entonces, ¿podría decirme cómo obtener datos entrantes periódicos de otro dispositivo externo? Gracias por adelantado ... –

+0

bueno Hi.I tiene dispositivo de Arduino y me envía Modbus RTU data.How puedo leer esos datos a través de Bluetooth? He terminado con el emparejamiento de Bluetooth. Pero cuando escribo "mmInputStream.available()", me devuelve el valor '0'. Por favor ayúdenme lo más pronto posible. Gracias por adelantado. – Lawrance

Respuesta

11

acabamos de resolver el problema para cualquier otra persona que vino a través de esta página.

parece que mi Arduino no le gusta que el uso de los pines digitales para la comunicación serial, utilizo TX y RX lugar con este código tomado de http://jondontdoit.blogspot.com.au/2011/11/bluetooth-mate-tutorial.html, también parece que 9600 es un buen lugar de baudios 115200.

/*********************** 
Bluetooth test program 
***********************/ 
//TODO 
//TEST THIS PROGRAM WITH ANDROID, 
//CHANGE PINS TO RX AND TX THO ON THE ARDUINO! 
//int counter = 0; 
int incomingByte; 

void setup() { 
    pinMode(53, OUTPUT); 
    Serial.begin(9600); 
} 

void loop() { 
    // see if there's incoming serial data: 
    if (Serial.available() > 0) { 
    // read the oldest byte in the serial buffer: 
    incomingByte = Serial.read(); 
    // if it's a capital R, reset the counter 
    if (incomingByte == 'g') { 
     digitalWrite(53, HIGH); 
     delay(500); 
     digitalWrite(53, LOW); 
     delay(500); 
     //Serial.println("RESET"); 
     //counter=0; 
    } 
    } 

    //Serial.println(counter); 
    //counter++; 

    //delay(250); 
} 
-1

Creo que podría ser un error en Bluetooth ... es mejor volver a instalar sus controladores .. como el código anterior parece correcto.

0

que era capaz de conseguir esto para ejecutar sólo después de cambiar esta sección:

Set<BluetoothDevice> pairedDevices = BluetoothAdapter.getBondedDevices(); 
if(pairedDevices.size() > 0) 
    { 
     for(BluetoothDevice device : pairedDevices) 
     { 
      if(device.getName().startsWith("FireFly-")) 
      { 
       mmDevice = device; 
       Log.d("ArduinoBT", "findBT found device named " + mmDevice.getName()); 
       Log.d("ArduinoBT", "device address is " + mmDevice.getAddress()); 
       break; 
      } 
     } 
    } 

con esto:

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
mmDevice = mBluetoothAdapter.getRemoteDevice("00:06:66:46:5A:91"); 
if (pairedDevices.contains(mmDevice)) 
    { 
     statusText.setText("Bluetooth Device Found, address: " + mmDevice.getAddress()); 
     Log.d("ArduinoBT", "BT is paired"); 
    } 

cuando entré en la dirección de mi dispositivo Bluetooth. El código original encuentra el dispositivo y devuelve la dirección correcta, pero mmSocket.connect(); genera una excepción "java.io.IOException: descubrimiento de servicio fallido"

Sugerencias?

+0

no estoy seguro lo siento :( –

3

Me estaba dando lo mismo. Entré en 'Configuración' -> 'Conexiones inalámbricas y redes' -> 'Configuración de Bluetooth' y emparejé el dispositivo. Cuando volví y volví a ejecutar mi código, se conectó, sin excepción. Puse controles en mi UI para mostrar los dispositivos emparejados, voy a ver si puedo codificar para administrar los dispositivos de emparejamiento desde mi UI.

0

Para cualquier persona que encuentre esta página, pero se ha quedado atascado el uso de una dirección MAC codificada como arriba, ponga la dirección MAC a NULL, e insertar este código en onResume()

try{ 
File f = new File(Environment.getExternalStorageDirectory()+"/mac.txt"); 
FileInputStream fileIS = new FileInputStream(f); 
buf = new BufferedReader(new InputStreamReader(fileIS)); 
String readString = new String(); 
while((readString = buf.readLine())!= null){ 
address = readString; 
} 
} catch (FileNotFoundException e) { 
e.printStackTrace(); 
} catch (IOException e){ 
e.printStackTrace(); 
} 

Además, no se olvide permita que eclipse incluya las bibliotecas necesarias y coloque su dirección mac en mac.txt en la raíz de la tarjeta SD, luego simplemente puede darles a los usuarios un archivo de texto con su dirección MAC mientras permite que la aplicación se descargue del mercado sin personalizarla cada instancia.

0

@Backwards_Dave solo para un curioso, intente conectarse a 45 y 46 pines y use este código simple. Lo uso y no tengo ningún problema. Podrá enviar datos desde Arduino Serial Monitor y leerlos allí.

/* 
Pinout: 
45 --> BT module Tx 
46 --> BT module Rx 
*/ 
#include <SoftwareSerial.h> 

SoftwareSerial mySerial(45, 46); // RX, TX 

void setup() 
{ 
    // Open serial communications and wait for port to open: 
    Serial.begin(9600); 


    Serial.println("I am ready to send some stuff!"); 

    // set the data rate for the SoftwareSerial port 
    mySerial.begin(9600); 
} 

void loop() // run over and over 
{ 
    if (mySerial.available()) 
    Serial.write(mySerial.read()); 
    if (Serial.available()) 
    mySerial.write(Serial.read()); 
} 

Además, ¿qué protector BlueTooth está utilizando para Arduino? HC-06?

EDITAR

Sólo probamos con Mega2560 (no tienen 1280) y funciona sin ningún problema.

Creo que el problema fue con el pinout.

espera de su respuesta

0

Si usted todavía está buscando una respuesta, trate de cambiar los pines de serie de programas. Esta es una limitación bien conocida de la biblioteca que está utilizando.

No todos los pines del Mega soporte cambian interrupciones, por lo que solo se puede utilizar para RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69). Refs

Espero que esto ayude.

Cuestiones relacionadas