por para enviar encender datos crear controlar comunicacion codigo app android bluetooth arduino

android - para - encender led arduino bluetooth hc-05



Android+Arduino Bluetooth Data Transfer (7)

Puedo hacer que mi aplicación Android se conecte mediante Bluetooth a mi Arduino. Sin embargo, no se pueden transmitir datos entre ellos. Debajo está mi configuración y código:

HTC Android v2.2, módem Bluetooth mate de oro, Arduino Mega (ATmega1280)

Código Android de 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 ()).

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 manifiesto .xml

<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/


Acabo de resolver el problema para cualquier otra persona que haya encontrado esta página.

Parece que a mi Arduino no le gusta usar pines digitales para comunicación en serie, utilizo TX y RX 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 baudio en lugar de 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); }


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


Pude hacer que esto se ejecutara solo después de reemplazar 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 este:

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

donde ingresé 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?


Estaba obteniendo 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.


Para cualquier persona que encuentre esta página, pero está atrapada usando una dirección MAC codificada como la anterior, establezca la dirección MAC en NULL e inserte 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(); }

TAMBIÉN, no olvide permitir que eclipse incluya bibliotecas necesarias, y coloque su dirección mac en mac.txt en la raíz de la tarjeta SD, entonces simplemente puede darles a los usuarios un archivo de texto con su dirección MAC mientras aún permite que la aplicación ser descargado del mercado sin personalizar cada instancia.


@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é escudo BlueTooth estás usando para Arduino? HC-06?

EDITAR

Acabo de probarlo con Mega2560 (no tengo 1280) y funciona sin problemas.

Creo que el problema fue con el pinout.

Esperando sus comentarios


Si aún está buscando una respuesta, intente cambiar los pines de serie del software. 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.