RN42-Bluetoothモジュールを使ってみた

マイコンボードとRN42をUARTでつなげる

PCとRN42との接続が確認できたので、次はUARTでマイコンボードとRN42をつなげます。この時に注意したいのが、結線方法で、下図のようにクロスさせてTX,RXにつなげます。

マイコンボードはFRDM-K64Fを使用しますが、UARTの設定手順については、別記事で説明予定ですので、参考にしてください。今回はUART3をBluetooth通信用に設定しました。

メインのサンプルコードを下に載せました。UARTの設定手順でのサンプルコードからTEST_UARTをBT_UARTに差し替えただけですので、中身はほぼほぼ一緒です。

これはつまり、モジュールをつなげば、普通のUARTと同じようにプログラムするだけでイケルということです。

/*
	FRDM-K64F RN42 sample

 */

#include "board.h"
#include "fsl_uart.h"

#include "pin_mux.h"
#include "clock_config.h"

//Function for Debug Console
#include "fsl_debug_console.h"

/*******************************************************************************
 * Definitions
 ******************************************************************************/
/* UART instance and clock */
#define BT_UART UART3
#define BT_UART_CLKSRC UART3_CLK_SRC
#define BT_UART_CLK_FREQ CLOCK_GetFreq(UART3_CLK_SRC)
#define BT_UART_IRQn UART3_RX_TX_IRQn
#define BT_UART_IRQHandler UART3_RX_TX_IRQHandler

/* UART via Debug probe*/
#define DEBUG_UART UART0
#define DEBUG_CLKSRC UART0_CLK_SRC
#define DEBUG_CLK_FREQ CLOCK_GetFreq(UART0_CLK_SRC)

/*! @brief Ring buffer size (Unit: Byte). */
#define BUFFER_SIZE 16

/*******************************************************************************
 * Prototypes
 ******************************************************************************/

/*******************************************************************************
 * Variables
 ******************************************************************************/

uint8_t Title_String[] =
    "SAMPLE PROGRAM FOR RN42 STARTS\r\n";

//UART Ring buffer for data receive
uint8_t ReadBuffer[BUFFER_SIZE];

volatile uint16_t txIndex; /* Index of the data to send out. */
volatile uint16_t rxIndex; /* Index of the memory to save new arrived data. */

//LPTMR counter
volatile uint32_t lptmrCounter = 0U;

//Signal from BT
uint8_t SigBT;

/*******************************************************************************
 * Code
 ******************************************************************************/
/*!
 * @brief FlexCAN Call Back function
 */
void BT_UART_IRQHandler(void)
{
    uint8_t data;

    /* If new data arrived. */
    if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(BT_UART))
    {
        data = UART_ReadByte(BT_UART);
        rxIndex++;
        rxIndex %= BUFFER_SIZE;

        ReadBuffer[rxIndex] = data;
    }

#if defined __CORTEX_M && (__CORTEX_M == 4U)
    __DSB();
#endif
}

/*!
 * @brief Main function
 */
int main(void)
{

    BOARD_InitPins();
    BOARD_BootClockRUN();

    // UART Parameters definition
    uart_config_t config,debug_config;

    // GET UART default values
    UART_GetDefaultConfig(&config);

    // Overwrite setting for UART
    config.baudRate_Bps = BOARD_BT_UART_BAUDRATE;
    config.enableTx     = true;
    config.enableRx     = true;

    memcpy(&debug_config,&config,sizeof(config));
    debug_config.baudRate_Bps=BOARD_DEBUG_UART_BAUDRATE;

    // UART Initialization
    UART_Init(BT_UART, &config, BT_UART_CLK_FREQ);
    UART_Init(DEBUG_UART, &debug_config,DEBUG_CLK_FREQ);

    // Enable RX interrupt
    UART_EnableInterrupts(BT_UART, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable);
    EnableIRQ(BT_UART_IRQn);

    // Send firmware title out
    UART_WriteBlocking(BT_UART, Title_String, sizeof(Title_String)-1);

    while (1)
    {
        /* main loop */
        while ((kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(BT_UART)) && (rxIndex != txIndex))
        {
            txIndex++;
            txIndex %= BUFFER_SIZE;
            UART_WriteByte(DEBUG_UART, ReadBuffer[txIndex]);
        }

    }
}

プログラム内で、UART3のボーレートを9600bpsに変更してあります。AE-RN-42ではボーレートをdefault値からの変更を有効にする際には、下のSW4をOnにしておきます。

通信した結果をTera Termで確認してみました。左がPCからの入力で、右がマイコンで受け取った結果になります。

以上で、無事Bluetoothが実現できました。

次は、ターミナルソフトではなく、Window上のアプリケーションから信号を送ってみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Social Share Buttons and Icons powered by Ultimatelysocial