BC-ANT-SERIAL communication library.

Dependents:   bc_ant-sample bc_ant-receiver

BeatcraftさんのBC-ANT-SERIAL を mbedで動かしてみました。

BC-ANT-SERIAL については、以下を参照ください。

http://labs.beatcraft.com/ja/index.php?ANT%2FBC-ANT-SERIAL%20%C0%E2%CC%C0%BD%F1

以下のような構成で、BC-ANT-SERIALを 9600bps に設定し、 BC-ANT-USB相手を相手に通信を行いました。 (下図は受信例ですが、逆方向の送信も確認しました。)

/media/uploads/MRSa/bc-ant_mbed2.jpeg

なお、BC-ANT-SERIALを9600bpsの設定にする場合は、BR2をショートさせます。 /media/uploads/MRSa/bc-ant-serial9600.jpg

本ライブラリは、@ryuchi さんの ANT/LPC1114用ライブラリ をベタに持って来てmbed用にしました。

(UARTを使っている部分をSerialクラスに置き換えた程度で動いちゃいました。。。あんまり中身を見ていません。。)

ライブラリ使用例

受信で使用する場合

受信で使用する場合のmain.cpp例

#include "mbed.h"
#include "bc_ant.h"
 
DigitalOut myled(LED1);               // LEDチカチカ
 
Serial pc(USBTX, USBRX);           // USBへのデータ通信
bc_ant antPort(p13, p14, p15);    // for BC-ANT-SERIALの接続。(9600bps, p13, p14, ctsにp15)

/** ANT用の定数定義 **/
#define MAX_BUFSIZE   64          // 受信バッファサイズ用の定義
#define ANT_CH         0               // チャンネル番号
#define DEVICE_NUMBER 65      // デバイス番号
 
/**
 *  BC-ANT-SERIALでデータを受信した時の処理
 */
void receivedFromAnt()
{
    // 受信データを受け取る領域の確保
    uint8_t receivedLength = 0;
    uint8_t receivedBuffer[MAX_BUFSIZE];

    // データを受信する
    receivedLength = antPort.BC_ANT_RecvPacket(receivedBuffer, MAX_BUFSIZE);
 
   // 受信したデータを printf()して、PCのターミナルに表示する。
    printf("RX(%3d):", receivedLength);
    for (int index = 0; index < receivedLength; index++)
    {
        printf("%02x ", receivedBuffer[index]);
    }
    printf("\r\n");
}

/**
 *   BC-ANT-SERIALの(受信)初期化処理
 */
int initialize_ANTport()
{
    antPort.ANT_ResetSystem();
    antPort.ANT_AssignChannel(ANT_CH, ANT_Bidirectional_Slave, 0);   // チャンネルタイプの設定
    antPort.ANT_SetChannelId(ANT_CH,  DEVICE_NUMBER, 1, 1);          // チャンネルIDの設定
    antPort.ANT_SetChannelPeriod_Hz(ANT_CH, 4);                                // チャンネルピリオドの設定
    antPort.ANT_SetChannelRFFreq(ANT_CH, 4);                                    // 通信周波数の設定: 2404 MHz
    antPort.ANT_OpenChannel(ANT_CH);

    // コールバック関数の設定 (データを受信したら receivedFromAnt() を呼び出してもらうよう設定する)
    antPort.attach(&receivedFromAnt);

    return (0);
}
 
/**
 *    メイン処理
 */
int main()
{
    pc.baud(9600);                    // mbed と PCの間の通信速度を 9600bpsに設定する。
    initialize_ANTport();             // BC-ANT-SERIALを受信用に初期化する。
    printf("--- READY ----\r\n");  // 準備が出来たことを PCのターミナルに通知する。

    // 以下は、LEDチカチカ。 (デフォルトで生成される処理をそのまま残してます)
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

送信で使用する場合

送信で使用する場合は、受信と比較して antPort.ANT_AssignChannel() と ANT_OpenChannel()のあとの処理が異なるぐらいです。

送受信で、antPort.ANT_SetChannelId(), antPort.ANT_SetChannelPeriod_Hz(), antPort.ANT_SetChannelRFFreq() の設定は合わせておく必要がありそうです。

送信で使用する場合のmain.cpp例

#include "mbed.h"
#include "bc_ant.h"

DigitalOut myled(LED1);               // LEDチカチカ

Serial pc(USBTX, USBRX);           // USBへのデータ通信
bc_ant antPort(p13, p14, p15);    // for BC-ANT-SERIALの接続。(9600bps, p13, p14, ctsにp15)

/** ANT用の定数定義 **/
#define MAX_BUFSIZE   64          // 受信バッファサイズ用の定義
#define ANT_CH         0               // チャンネル番号
#define DEVICE_NUMBER 65      // デバイス番号


/**
 *    PCのターミナルからキー入力された時の処理
 *    (キー入力の情報をAntポートに送る)
 */
void receivedPc()
{
    uint8_t buffer[MAX_BUFSIZE] =
    {
        0xff, 0xff, 0xff, 0xff, 0xff,
        0xff, 0xff, 0xff, 0xff, 0xff
    };
    while (pc.readable())
    {
        // データを取り出して、それをAntに送る
        unsigned char receivedChar =  (pc.getc() & 0xff);
        buffer[0] = receivedChar;
        antPort.ANT_SendAcknowledgedData(0, buffer);
    }
}

/**
 *   初期化処理
 */
int initialize_ANTport()
{
    antPort.ANT_ResetSystem();
    antPort.ANT_AssignChannel(ANT_CH, ANT_Bidirectional_Slave, 0);   // チャンネルタイプの設定
    antPort.ANT_SetChannelId(ANT_CH,  DEVICE_NUMBER, 1, 1);          // チャンネルIDの設定
    antPort.ANT_SetChannelPeriod_Hz(ANT_CH, 4);                                // チャンネルピリオドの設定
    antPort.ANT_SetChannelRFFreq(ANT_CH, 4);                                    // 通信周波数の設定: 2404 MHz
    antPort.ANT_OpenChannel(ANT_CH);
    {
        uint8_t buffer[MAX_BUFSIZE] =
        {
            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
        };
        antPort.ANT_SendBroadcastData(0, buffer);  // データ送信?
    }
    return (0);
}

/**
 *   メイン処理
 */
int main()
{
    pc.baud(9600);                                      // PCとの通信速度を 9600bps に設定する
    pc.attach(&receivedPc,Serial::RxIrq);    // PCからデータが送られてきた場合、receviedPc() 関数を呼び出す用に設定する

    initialize_ANTport()   // BC-ANT-SERIALの初期化を行う

    printf("--- READY ----\r\n");  // 準備が出来たことを PCのターミナルに通知する。
    
    // 以下は、LEDチカチカ。 (デフォルトで生成される処理をそのまま残してます)
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

参考:BC-ANT-USB側

動作確認をした BC-ANT-USB 側は、ANT/BCA_Lib のページにある BCA_Lib.zipのSendCB.exe, RecvCB.exe を 利用させて頂きました。

ただし、BCA_OpenChannel() の引数は以下のように変更しました。

SendCB.cppで変更した箇所(SendCB.cpp:52行目あたり)

	res = BCA_OpenChannel(dev,						//	device
						  0,						//	channel no
						  BCA_CHANNEL_TYPE_MASTER,	//	channel type
						  BCA_CHANNEL_NOSHARED,		//	shared channel
						  65,						//	device no
						  1,						//	device type
						  1,						//	trans type
						  4,						//	freq
						  4);						//	hz

RecvCB.cppで変更した箇所(RecvCB.cpp:54行目あたり)

	res = BCA_OpenChannel(dev,						//	device
						  0,						//	channel no
						  BCA_CHANNEL_TYPE_SLAVE,	//	channel type
						  BCA_CHANNEL_NOSHARED,     //	shared channel
						  0,						//	device no
						  0,						//	device type
						  0,						//	trans type
						  4,						//	freq
						  4.0);						//	hz

備忘録

  • ほんとにベタ移植で動いた、という段階なので、中身を確認して理解しないといけない。
  • きれいにクラス化したい。
  • ちゃんとコードに説明を書きたい。

no such method: tip