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相手を相手に通信を行いました。 (下図は受信例ですが、逆方向の送信も確認しました。)
なお、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
備忘録
- ほんとにベタ移植で動いた、という段階なので、中身を確認して理解しないといけない。
- きれいにクラス化したい。
- ちゃんとコードに説明を書きたい。