web-dev-qa-db-fra.com

Transfert de données Bluetooth Android + Arduino

Je peux obtenir que mon application Android se connecte via Bluetooth à mon Arduino. Cependant, aucune donnée ne peut être transmise entre eux. Ci-dessous ma configuration et mon code:

HTC Android v2.2, modem Bluetooth mate or, Arduino Mega (ATmega1280)

Code Java Android:

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

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

J'ai essayé d'utiliser 115200 et 9600 pour les vitesses de transmission, et j'ai essayé de régler les broches bluetooth rx et tx comme entrée/sortie et sortie/entrée. L'Arduino reçoit des données série du PC mais ne peut pas l'envoyer à Android (je peux le voir à cause de la méthode flashLED ()).

Android ne peut envoyer aucune donnée à l'Arduino. Cependant, ils sont tous les deux connectés, car le voyant vert du modem s’allume et s’éteint et le voyant rouge clignote lorsque je ferme la connexion. La méthode sendData () ne lève pas d'exception car sinon showMessage ("SEND FAILED"); Apparaitrait.

J'ai aussi cela dans mon manifeste .xml

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

Toute aide serait grandement appréciée!

Code pris de:

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

19
Backwards_Dave

Vient de résoudre le problème pour quiconque est venu sur cette page.

On dirait que mon Arduino n'aime pas que j'utilise des broches numériques pour la communication série. J'utilise plutôt TX et RX avec ce code extrait de http://jondontdoit.blogspot.com.au/2011/11/bluetooth-mate-tutorial .html , semble également que 9600 est un bon baud au lieu 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);
}
13
Backwards_Dave

J'avais la même chose. Je suis allé dans "Paramètres" -> "Sans fil et réseaux" -> "Paramètres Bluetooth" et ai couplé l'appareil. Quand je suis revenu et que j'ai relancé mon code, il s'est connecté, sans exception. Je mets des commandes dans mon interface utilisateur pour afficher les périphériques couplés. Je vais voir si je peux coder pour gérer les périphériques couplés à partir de mon interface utilisateur.

5
Bill Merryman

@Backwards_Dave juste pour un curieux, essayez de vous connecter à 45 et 46 broches et utilisez ce code simple. Je l'utilise et n'ai aucun problème. Vous pourrez envoyer des données à partir de Arduino Serial Monitor et les lire.

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

En outre, quel bouclier BlueTooth utilisez-vous pour Arduino? HC-06? 

MODIFIER

Je viens de le tester avec Mega2560 (ne pas avoir 1280) et cela fonctionne sans problème.

Je crois que le problème était avec le brochage.

En attente de vos commentaires

1
Martynas

Pour tous ceux qui trouvent cette page mais sont bloqués en utilisant une adresse MAC codée en dur comme ci-dessus, définissez l'adresse mac sur NULL et insérez ce code dans 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();
}

AUSSI, n'oubliez pas de permettre à Eclipse d'inclure les bibliothèques nécessaires et de placer votre adresse mac dans le fichier mac.txt situé à la racine de la carte SD. Vous pouvez simplement donner aux utilisateurs un fichier texte avec leur adresse mac être téléchargés du marché sans personnaliser chaque instance.

1
dmattox10

Je n'ai pu l'exécuter qu'après avoir remplacé cette section:

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

avec ça:

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

où j'ai entré l'adresse de mon périphérique Bluetooth . Le code d'origine trouve le périphérique et renvoie l'adresse correcte, mais mmSocket.connect (); génère une exception "Java.io.IOException: la découverte du service a échoué"

Suggestions?

1
Dan

Si vous cherchez toujours une réponse, essayez de changer les broches série du logiciel. Ceci est une limitation bien connue de la bibliothèque que vous utilisez. 

Toutes les broches du support Mega support ne sont pas interrompues. Par conséquent, seuls les éléments suivants peuvent être utilisés pour les Récepteurs: A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69). Refs

J'espère que cela t'aides.

1
UserK

Je pense que cela pourrait être une faute de Bluetooth .. il vaut mieux réinstaller ses pilotes .. car le code ci-dessus semble correct.

0