LoginSignup
2
4

More than 5 years have passed since last update.

AndroidとArduinoでBluetooth通信(Arduino側)

Last updated at Posted at 2017-06-11

環境

Freaduino UNOV1.8.1
FreaduinoセンサシールドV1.2 (XBeeインタフェース付)
BluetoothBee(HC-06) BluetoothV2.0(baudrate:9600)
※技適のものを使用しないと法律違反になるようです。
Android6.0.1
ArduinoJson5.0.7

概要

Android端末とBluetoothで通信し、jsonデータでやり取りを行いました
その時のArduino側の手順です

ジャンパピン、スイッチの状態

Freaduino_bluetoothbe.png

ArduinoJsonライブラリの追加

・ArduinoIDEを開き、メニューの「スケッチ」>「ライブラリをインクリード」>「ライブラリの管理」を押す
・「LibraryManager」ダイアログの上部右側の「FilterYourSearch」に「json」と入れる
・リストから「ArduinoJson」を選択し、バージョンを選択して(例:Version5.0.7)、「インストール」を押す

BluetoothBeeのボーレートの確認

自分のBluetoothBeeに設定されているボーレードを確認する
SoftwareSerialのbegin関数で試したいボーレードを引数に入れ、print関数で"AT"と送る
"OK"と返ってきたら、その値(大体ここらへん「9600,19200,38400」)
ATコマンドや引数に入れるボーレートの値は以下を参照
http://wiki.seeedstudio.com/wiki/Bluetooth_Bee_v2.0#AT_Commands

スケッチ

ArduinoJsonはjson化した時に使用したバッファを保持しているようで、何回か通信するとバッファ不足でjson化に失敗します
その為にクリアをしたいのですがメソッドが無いようです

#include <SoftwareSerial.h>
#include <ArduinoJson.h>

#define RxD 2
#define TxD 3
static SoftwareSerial _blueToothSerial( RxD,TxD );
#define TIMEOUT 1000
#define BLUETOOTBUFFER_SIZE 256
#define RECVBUFFER_SIZE BLUETOOTBUFFER_SIZE
#define SENDBUFFER_SIZE BLUETOOTBUFFER_SIZE
static char _recvBuffer[ RECVBUFFER_SIZE ];

#define JSONBUFFER_SIZE 256
static StaticJsonBuffer<JSONBUFFER_SIZE> _jsonBuffer;
static char _jsonOutputBuffer[ SENDBUFFER_SIZE ];

enum CommandType
{
    Command_None,
    Command_Echo,
};


void setup()
{
    Serial.begin( 9600 );
    pinMode( RxD, INPUT );
    pinMode( TxD, OUTPUT );

    if( setupBluetooth() == false )
        exit( -1 );
    Serial.println( "Setup Complete-----" );
}

void loop()
{
    RecvCommand();
}

void RecvCommand()
{
    if( _blueToothSerial.available() <= 0 )
        return;
    if( bluetoothRecv( TIMEOUT ) < 0 )
        return;
    parseCommand();
}

void parseCommand()
{
    JsonObject& root = _jsonBuffer.parseObject( _recvBuffer );
    CommandType commandType = (CommandType)(const int)root[ "type" ];
    switch( commandType )
    {
    case Command_Echo:
        {
            const char* pMesasge = (const char*)root[ "message" ];
            Serial.print( "EchoMessage:" );
            Serial.println( pMesasge );
            root.printTo( _jsonOutputBuffer, sizeof( _jsonOutputBuffer ) );
            bluetoothSend( _jsonOutputBuffer, true );
            break;
        }
    default:
        {
            Serial.print( "NotDefineCommand:" );
            Serial.println( (int)commandType );
            break;
        }
    }

    ClearJsonBuffer( _jsonBuffer );
}

template<typename T> void ClearJsonBuffer( T& instance )
{
    instance = T();
}

bool setupBluetooth()
{
    _blueToothSerial.begin( 9600 );
    delay(100);
    bluetoothSend( "AT", false );
    return ( bluetoothRecv( TIMEOUT ) >= 0 ) ? true : false;
}

int bluetoothSend( const char* pStr, bool isLn )
{
    Serial.print( "Send:" );
    Serial.println( pStr );
    if( isLn == true )
        _blueToothSerial.println( pStr );
    else
        _blueToothSerial.print( pStr );
    return 0;
}

int bluetoothRecv( int timeOut )
{
    int t = timeOut;
    int sleepTime = 50;
    while( t > 0 )
    {
        delay( sleepTime );//todo なぜかここにないとメッセージを一度に取得できない
        if( _blueToothSerial.available() > 0 )
            break;
        t -= sleepTime;
    }
    if( t <= 0 )
    {
        Serial.println( "Receive Timeout" );
        return -1;
    }
    int i = 0;
    do
    {
        if( i > RECVBUFFER_SIZE )
        {
            Serial.println( "Receive BufferOver" );
            return -2;
        }
        _recvBuffer[ i ] = char( _blueToothSerial.read() );
        i++;
    }while( _blueToothSerial.available() > 0 );
    _recvBuffer[ i ] = '\0';
    Serial.print( "Receive:" );
    Serial.println( _recvBuffer );
    return 0;       
}
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4