本チュートリアルではiPhoneやアンドロイドからブルートゥース4.0メッセージを受信する方法を説明する。

ブルートゥース・ローエナジーについて

ブルートゥース・ローエナジー(BLE)は近年普及している無線プロトコルである。新型機器の多くはBLE対応である。

REOボードのブルートゥースモジュールはファームウェアがロード済みなので、即使用可能である。

  • iPhoneやタブレットとの接続は自動的にされ、作業の必要は無い。
  • シリアルポートのように使用可能。本チュートリアルでは1バイトのメッセージを受信しLEDを制御してみよう。

メッセージ

ここでは、赤と緑のLED2つを使用する。モーター各種も同様にメッセージ受信により制御が可能である。

LEDを2つ使用するので、LED1は1ビット、LED2は2ビットと決定する。0x01受信によりLED1、0x02受信によりLED2、0x03受信により両方のLEDを点ける。そして、0x00により両方を消す。

アンドロイド/iOSアプリケーション

本チュートリアルの目的はメッセージ受信方法の説明だが、メッセージ送信の方法も必要である。送信方法は存在し、無料でダウンロード可能である。

アンドロイドでは、BLE Toolと呼ばれるダウンロード可能な無料アプリケーションがあり、任意のメッセージが16進数で送信可能である。iOSにもBLExplrと呼ばれるツールがあり(300円前後)、他の無償アプリケーションも存在する。

プログラム

当プログラムの新たな点は、UARTの初期化である。REOボードのブルートゥースモジュールにはフローコントロールが必要である。

初期化のソースコードは以下の通り:

--------------------

void BTUartInit(void){
    P8SEL |= 0x0C;              //    Config P8.2 & P8.3 for UART
    P8DIR |= BT_CTS;            //    Config P8.0 for output
    P8DIR &= ~BT_RTS;           //    Config P8.1 for input
    P5DIR |= BT_RESET;          //    Configure bluetooth reset pin
    UCA1CTL1 |= UCSWRST;        //    Put state machine in reset
    UCA1CTL1 |= UCSSEL_2;       //    CLK = SMCLK
    UCA1BRW = 208;              //    24MHz / 115.2k
    UCA1CTL1 &= ~UCSWRST;       //    Initialize USCI state machine
    UCA1IE |= UCRXIE;           //    Enable interrupts
    P5OUT &= ~BT_RESET;         //    Reset bluetooth
    Delay(10);                  //    Delay
    P5OUT |= BT_RESET;          //    Free reset. Ready to go.
    P8OUT &= ~BT_CTS;           //    Clear to send
}--------------------

この初期化はテキサスインスツルメンツ社のサンプルソースコードを使用し作成したものである。フローコントロールのみが追加してある。UARTの初期化には、ビットレートの設定が必要だ。クロック周波数をビットレートで割ることで、UARTモジュールにクロック数が設定され、適切なレートで受信する。受信割込みも必要である。

割込みルーチンは基本的に他の割込みと同様な定義である。受信内容によりポート2の状態を変更する指令の「void func(void)」タイプである。

アプリケーション使用

下は、BLExplrを使用した画面コピーである。

BLExplrを開くと、画面にLeoBot(REOボードの旧称)が現れる。この項目をクリックすると、REOボードのブルートゥースモジュールの青色 LEDが点く。LeoBot20の下のUnknown項目をクリックし、次の画面の2つ目のUnknown項目をクリックすると “Write HEX, Write String and Enable Indicate” メニュー付きパネルが現れる。Write HEXを選択し、00を書き込むとLED は消える。01を書き込むと1つのLED が点き、02を書き込むと別のLED が点き最初のは消える。 03を書き込むと両方のLED が点く。

 

IMG 0956

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ソースコード

--------------------

#include <msp430F5659.h>
#include "F5659Utils.h"

#define    GREEN_LED    0x01
#define    RED_LED      0x02
#define    LEDS         0x03
#define    BT_RTS       0x02
#define    BT_CTS       0x01
#define    BT_RESET     0x40

void ConfigLEDs(void);
void BTUartInit(void);

int main(void) {
    WDTCTL = WDTPW + WDTHOLD;            //    Stop WDT
    SetCoreVoltage(VCORE19);             //    Set the core to 1.9V
    SetFLL(24);                          //    Set master clock to 24 MHz
    ConfigLEDs();                        //    Config port 2 for LEDs
    BTUartInit();                        //    Config UART for BlueTooth
    __bis_SR_register(LPM0_bits + GIE);  //    Enter LPM0, enable interrupts
}

void ConfigLEDs(void) {
    P2DIR |= LEDS;        //    Enable LEDs
    P2OUT |= LEDS;
}

void BTUartInit(void){
    P8SEL |= 0x0C;                       //    Config P8.2 & P8.3 for UART
    P8DIR |= BT_CTS;                     //    Config P8.0 for output
    P8DIR &= ~BT_RTS;                    //    Config P8.1 for input
    P5DIR |= BT_RESET;                   //    Configure bluetooth reset pin
    UCA1CTL1 |= UCSWRST;                 //    Put state machine in reset
    UCA1CTL1 |= UCSSEL_2;                //    CLK = SMCLK
    UCA1BRW = 208;                       //    24MHz / 115.2k
    UCA1CTL1 &= ~UCSWRST;                //    Initialize USCI state machine
    UCA1IE |= UCRXIE;                    //    Enable interrupts
    P5OUT &= ~BT_RESET;                  //    Reset bluetooth
    Delay(10);                           //    Delay
    P5OUT |= BT_RESET;                   //    Free reset. Ready to go.
    P8OUT &= ~BT_CTS;                    //    Clear to send
}

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void) {
    uint8 val;
    _DINT();
    val = UCA1RXBUF;
    P2OUT = val;                         //    Set the message to LED output
    _EINT();
}

--------------------