Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: bc_ant-sample bc_ant-receiver
Homepage
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相手を相手に通信を行いました。 (下図は受信例ですが、逆方向の送信も確認しました。)
なお、BC-ANT-SERIALを9600bpsの設定にする場合は、BR2をショートさせます。
本ライブラリは、@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
備忘録¶
- ほんとにベタ移植で動いた、という段階なので、中身を確認して理解しないといけない。
- きれいにクラス化したい。
- ちゃんとコードに説明を書きたい。