Android + Arduino Bluetooth Datenübertragung
Ich kann meine Android-app zum herstellen einer Verbindung über Bluetooth zu meinem Arduino. Jedoch kann keine übertragung von Daten zwischen Ihnen. Unten ist mein setup und code:
HTC Android v2.2, Bluetooth mate gold-modem, 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, mit 115200 und 9600 der Baudraten, und ich habe versucht, die Einstellung der bluetooth-rx und tx-pins als input/output und output/input. Der Arduino empfängt serielle Daten vom PC, kann aber nicht senden Sie es an die Android - (ich kann das sehen, weil der flashLED () - Methode).
Android können nicht senden Sie alle Daten an allen (an den Arduino. Allerdings sind Sie beide verbunden, weil die grüne Leuchte am modem leuchtet auf und erlischt und die rote led blinkt, wenn ich die Verbindung schließen. Die sendData () - Methode nicht eine exception zu werfen, weil sonst showMessage("SENDEN FEHLGESCHLAGEN"); erscheinen würde.
Außerdem habe ich in meiner manifest .xml -
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" />
Jede Hilfe wäre sehr geschätzt werden!
Code entnommen aus:
http://bellcode.wordpress.com/2012/01/02/android-and-arduino-bluetooth-communication/
InformationsquelleAutor der Frage Backwards_Dave | 2012-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur das problem gelöst, für alle anderen, die kam über diese Seite.
Scheint, dass mein Arduino nicht wie ich mit den digitalen pins für die serielle Kommunikation nutze ich TX und RX statt mit diesem code entnommen http://jondontdoit.blogspot.com.au/2011/11/bluetooth-mate-tutorial.html, scheint auch, die 9600 ist eine gute baud statt 115200.
InformationsquelleAutor der Antwort Backwards_Dave
War ich immer der gleiche. Ich ging in 'Einstellungen'->'Drahtlos und Netzwerke'->'Bluetooth-Einstellungen' und gekoppelten Gerät. Wenn ich ging zurück und wieder ran mein code, es verbunden ist, keine Ausnahme. Ich legte Bedienelemente in meiner Benutzeroberfläche zum anzeigen der gekoppelten Geräte, die ich sehen werde, wenn ich kann code zu verwalten koppeln von Geräten aus meiner UI.
InformationsquelleAutor der Antwort Bill Merryman
War ich in der Lage, um dieses zu erhalten, führen Sie nur nach dem Austausch dieser Abschnitt:
mit dabei:
wo ich betrat die Adresse von meinem Bluetooth-Gerät.
Der ursprüngliche code findet das Gerät und gibt die richtige Adresse, aber
mmSocket.connect();
generiert eine Ausnahme "java.io.IOException: Service discovery failed"
Vorschläge?
InformationsquelleAutor der Antwort Dan
Für jeden, der findet auf dieser Seite, aber hängen geblieben ist über eine fest codierte mac-Adresse wie oben, setzen Sie die mac-Adresse auf NULL, und fügen Sie diesen code in OnResume()
AUCH, vergessen Sie nicht zu erlauben, eclipse, um die erforderlichen Bibliotheken, und legen Sie Ihre mac-Adresse in mac.txt auf der root der SD-Karte, dann können Sie einfach den Benutzern eine text-Datei mit Ihrem mac-Adresse, solange noch die app heruntergeladen werden, ohne den Markt anpassen jedes Beispiel.
InformationsquelleAutor der Antwort dmattox10
@Backwards_Dave nur für neugierig, versuchen, eine Verbindung zu 45 und 46 pins und verwenden Sie diese einfachen code. Ich benutze es und habe damit kein problem. Sie werden in der Lage sein, zu senden der Daten von Arduino-Serial-Monitor und Lesen Sie es dort.
Auch, welche BlueTooth-shield sind Sie für den Arduino? HC-06?
BEARBEITEN
Es gerade getestet mit Mega2560(nicht 1280) und es funktioniert ohne Probleme.
Ich glaube, dass problem wurde mit der Pinbelegung.
Warten auf Ihre Rückmeldung
InformationsquelleAutor der Antwort Martynas
Wenn Sie noch auf der Suche für eine Antwort, versuchen Sie, die software-serial-pins. Dies ist eine bekannte Einschränkung der Bibliothek, die Sie verwenden.
Nicht alle pins des Mega-support-change interrupts, so dass nur die folgenden verwendet werden kann für 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
Hoffe, das hilft.
InformationsquelleAutor der Antwort UserK
Ich denke, es könnte einige Fehler in der Bluetooth - .. es ist besser, zu re-installieren Sie die Treiber.. wie der code oben korrekt aussieht.
InformationsquelleAutor der Antwort Bluetooth Module