it-swarm.com.de

Android + Arduino Bluetooth-Datenübertragung

Ich kann meine Android-App dazu bringen, sich per Bluetooth mit meinem Arduino zu verbinden. Es können jedoch keine Daten zwischen ihnen übertragen werden. Unten ist mein Setup und Code:

HTC Android v2.2, Bluetooth-Mate-Goldmodem, Arduino Mega (ATmega1280)

Android Java-Code:

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

Arduino-Code:

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

Ich habe versucht, 115200 und 9600 für die Baudraten zu verwenden, und ich habe versucht, die Bluetooth-Pins für rx und tx als Eingabe/Ausgabe und Ausgabe/Eingabe einzustellen. Das Arduino empfängt serielle Daten vom PC, kann diese jedoch nicht an das Android senden (ich kann dies aufgrund der flashLED () -Methode sehen).

Das Android kann keine Daten an den Arduino senden. Beide sind jedoch miteinander verbunden, da die grüne LED am Modem leuchtet und erlischt und die rote LED blinkt, wenn ich die Verbindung schließe. Die sendData () -Methode löst keine Ausnahme aus, da ansonsten showMessage ("SEND FAILED"); würde auftauchen.

Ich habe dies auch in meinem Manifest .xml

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

Jede Hilfe wäre sehr dankbar!

Code entnommen aus:

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

19
Backwards_Dave

Das Problem wurde für alle anderen gelöst, die auf diese Seite gestoßen sind.

Anscheinend mag mein Arduino keine digitalen Pins für die serielle Kommunikation. Ich verwende stattdessen TX und RX, wobei dieser Code aus http://jondontdoit.blogspot.com.au/2011/11/bluetooth-mate-tutorial entnommen wird .html , scheint auch, dass 9600 ein guter Baud anstelle von 115200 ist.

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

Ich habe dasselbe bekommen. Ich ging zu 'Einstellungen' -> 'Drahtlos und Netzwerke' -> 'Bluetooth-Einstellungen' und koppelte das Gerät. Als ich zurückkam und meinen Code erneut lief, war er verbunden, keine Ausnahme. Ich füge Steuerelemente in meine Benutzeroberfläche ein, um die gekoppelten Geräte anzuzeigen. Ich werde sehen, ob ich Code zum Verwalten von Gerätepaaren über meine Benutzeroberfläche eingeben kann.

5
Bill Merryman

@Backwards_Dave Nur für Neugierige, versuchen Sie, eine Verbindung zu 45 und 46 Pins herzustellen, und verwenden Sie diesen einfachen Code. Ich benutze es und habe kein Problem. Sie können Daten vom Arduino Serial Monitor senden und dort lesen.

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

Welches BlueTooth-Schild verwenden Sie für Arduino? HC-06? 

EDIT

Ich habe es gerade mit Mega2560 (keine 1280) getestet und funktioniert problemlos.

Ich glaube, das Problem lag bei der Pinbelegung.

Warte auf ihr Feedback

1
Martynas

Für alle, die diese Seite finden, aber wie oben beschrieben eine hartcodierte MAC-Adresse verwenden, setzen Sie die MAC-Adresse auf NULL und fügen diesen Code in OnResume () ein.

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

Vergessen Sie auch nicht, Eclipse die erforderlichen Bibliotheken zuzulassen, und geben Sie Ihre MAC-Adresse in mac.txt im Stammverzeichnis der SD-Karte ein. Dann können Sie den Benutzern einfach eine Textdatei mit ihrer MAC-Adresse geben, während die App trotzdem zugelassen wird vom Markt heruntergeladen werden, ohne jede Instanz anpassen zu müssen.

1
dmattox10

Ich konnte dies erst nach dem Ersetzen dieses Abschnitts ausführen:

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

mit diesem:

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

wo ich die Adresse meines Bluetooth-Geräts eingegeben habe .. Der ursprüngliche Code findet das Gerät und gibt die korrekte Adresse zurück, aber mmSocket.connect (); generiert eine Ausnahme "Java.io.IOException: Diensterkennung fehlgeschlagen"

Vorschläge?

1
Dan

Wenn Sie immer noch nach einer Antwort suchen, ändern Sie die seriellen Pins der Software. Dies ist eine bekannte Einschränkung der verwendeten Bibliothek. 

Da nicht alle Pins der Mega Support Interrupts wechseln, können für RX nur die folgenden verwendet werden: 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). Referenzen

Hoffe das hilft.

1
UserK

Ich denke, es könnte ein Fehler in Bluetooth sein. Es ist besser, die Treiber erneut zu installieren, da der oben angegebene Code richtig aussieht.

0