Подтвердить что ты не робот

Android + Arduino Bluetooth Передача данных

Я могу заставить приложение Android подключиться через Bluetooth к моему Arduino. Однако между ними не могут передаваться никакие данные. Ниже приведены мои настройки и код:

HTC Android v2.2, модем Bluetooth mate gold, Arduino Mega (ATmega1280)

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

Код 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);
}

Я пробовал использовать 115200 и 9600 для скорости передачи данных, и я пробовал настраивать контакты bluetooth rx и tx в качестве ввода/вывода и вывода/ввода. Arduino получает последовательные данные с ПК, но не может отправить его на Android (я вижу это из-за метода flashLED()).

Android не может отправлять какие-либо данные на Arduino. Однако они оба подключены, потому что зеленый свет на модем включается и гаснет, а красный светодиод мигает, когда я закрываю соединение. Метод sendData() не генерирует исключение, потому что иначе showMessage ( "SEND FAILED" );.

У меня также есть это в моем манифесте .xml

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

Любая помощь будет принята с благодарностью!

Код, взятый из:

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

4b9b3361

Ответ 1

Просто решил проблему для всех, кто попадал на эту страницу.

Кажется, что мой Arduino не любит меня использовать цифровые контакты для последовательной связи, вместо этого я использую TX и RX с этим кодом, взятым из http://jondontdoit.blogspot.com.au/2011/11/bluetooth-mate-tutorial.html, также кажется, что 9600 - хороший бод вместо 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 incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it 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);
}

Ответ 2

Я получал то же самое. Я зашел в "Настройки" → "Беспроводные сети" → "Настройки Bluetooth" и спарил устройство. Когда я вернулся и перезапустил свой код, он подключился, никаких исключений. Я помещаю элементы управления в свой пользовательский интерфейс для отображения сопряженных устройств, я собираюсь посмотреть, могу ли я кодировать для управления устройствами сопряжения из моего интерфейса.

Ответ 3

Мне удалось запустить его только после замены этого раздела:

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

с этим:

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

где я ввел адрес своего устройства Bluetooth. Исходный код находит устройство и возвращает правильный адрес, но   mmSocket.connect(); генерирует исключение "java.io.IOException: сбой службы обнаружен"

Предложения?

Ответ 4

Для тех, кто находит эту страницу, но застрял с использованием жесткокодированного mac-адреса, как указано выше, установите для MAC-адреса значение NULL и вставьте этот код в 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();
}

ТАКЖЕ, не забудьте разрешить eclipse включать необходимые библиотеки и поместить ваш mac-адрес в mac.txt в корень SD-карты, тогда вы можете просто предоставить пользователям текстовый файл с их MAC-адресом, все еще позволяя приложение для загрузки с рынка без настройки каждого экземпляра.

Ответ 5

@Backwards_Dave просто для любопытных, попробуйте подключиться к 45 и 46 выводам и использовать этот простой код. Я использую его и не имею никаких проблем. Вы сможете отправлять данные из Arduino Serial Monitor и читать его там.

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

Кроме того, какой щит BlueTooth вы используете для Arduino? HC-06?

ИЗМЕНИТЬ

Просто протестировал его с помощью Mega2560 (не имеет 1280), и он работает без проблем.

Я считаю, что проблема заключалась в распиновке.

Ожидание обратной связи

Ответ 6

Если вы все еще ищете ответ, попробуйте изменить серийные контакты программного обеспечения. Это известное ограничение библиотеки, которую вы используете.

Не все контакты на Mega поддерживают прерывания, поэтому для 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

Надеюсь, что это поможет.

Ответ 7

Я думаю, что это может быть какая-то ошибка в Bluetooth.. его лучше переустановить драйверы, так как приведенный выше код выглядит правильно.