2012-04-26 26 views
18

Androidアプリを入手して、Bluetooth経由でArduinoに接続できます。ただし、それらの間でデータを送信することはできません。以下は私のセットアップとコードです:Android + Arduino Bluetoothデータ転送

HTCのAndroid v2.2では、ブルートゥースメイト金モデム、Arduinoのメガ(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はPCからシリアルデータを受信して​​いますが、Androidに送ることはできません(flashLED()メソッドのためにこれを見ることができます)。

AndroidはArduinoに全くデータを送信できません。しかし、モデムの緑色のライトが点灯して消灯し、接続を閉じると赤色のLEDが点滅するため、両方とも接続されています。 sendData()メソッドは例外をスローしません。それ以外の場合はshowMessage( "SEND FAILED");表示されます。

私はまた、任意の助けをいただければ幸いです

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

私のマニフェストの.xmlでこれを持っています!取ら

コード:

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

+0

あなたのコードは正常に動作していますステップの外観を持っています:最初に外部デバイスに接続要求を受け取りますそれは受け入れ信号と接続が成功した後に送信されますが、我々は定期的に受信データを取得することはできません。成功した接続のいくつかの時間。他の外部デバイスから定期的に着信データを取得する方法を教えてください。ありがとうございます... –

+0

こんにちは。私はArduinoデバイスを持っており、Modbus RTUデータを送信しています。私はブルートゥース経由でそのデータを読み取ることができますか?私はBluetoothペアリングを完了しました。しかし、私が "mmInputStream.available()"と書くと、返り値は「0」になります。できるだけ早く私を助けてください。前もって感謝します。 – Lawrance

答えて

11

はちょうどこのページに出くわした他の誰のための問題を解決しました。

は私のArduinoのシリアル通信のためのデジタル・ピンを使用して私を好きではないようだ、私はhttp://jondontdoit.blogspot.com.au/2011/11/bluetooth-mate-tutorial.htmlから取られたこのコードを代わりにTXとRXを使用し、また、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'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); 
} 
良いボーようです
-1

私はそれがBluetoothのいくつかの欠陥かもしれないと思う..そのドライバを再インストールする方がいいです..上記のコードが正しいように見えます。

0

私はこれが唯一のこのセクションを交換した後に実行してもらうことができました。これで

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:サービスの検出に失敗しました"を生成します

提案ですか?

+0

不明申し訳ありません:( –

3

私は同じことをしていました。私は「設定」 - >「ワイヤレスとネットワーク」 - >「Bluetooth設定」に行き、デバイスをペア設定しました。私が戻って私のコードを再実行したとき、それは接続されていて例外ではありません。ペアリングされたデバイスを表示するためにUIにコントロールを配置し、自分のUIからペアリングデバイスを管理するためのコードを作成できるかどうかを確認します。また、このページを発見したが、上記のようにハードコードされたMACアドレスを使用して立ち往生している、NULLにMACアドレスを設定し、(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(); 
} 

については

0

に忘れてはいけませんeclipseが必要なライブラリをインクルードできるようにし、SDカードのルートにあるmac.txtにあなたのmacアドレスを置きます。そして、ユーザーにmacアドレスのテキストファイルを渡して、カスタマイズしないでマーケットからダウンロードできるようにしますすべてのインスタンス。

0

@Backwards_Daveちょっと不思議なことに、45ピンと46ピンに接続し、この簡単なコードを使用してみてください。私はそれを使用し、問題はありません。あなたはArduinoシリアルモニターからデータを送信し、そこで読むことができます。

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

また、ArduinoにはどのBlueToothシールドを使用していますか? HC-06?

EDITジャストMega2560(1280年を持っていない)でそれをテストし、それが問題なく動作します。

ピン配置が問題だったと思います。あなたはまだ答えを探しているなら

ご意見

0

を待っている、ソフトウェアのシリアルピンを変更してみてください。これは、使用しているライブラリのよく知られた制限です。

メガサポートのすべてのピンが割り込みを変更するわけではないので、RXには10,11,12,13,14,15,50,51,52,53、A8(62)、A9 (63)、A10(64)、A11(65)、A12(66)、A13(67)、A​​14(68)、A15(69) Refs

これが役立ちます。

関連する問題