PICでBluetooth SPP - UARTコンバータ
2013.06.30 · 1017 words · 3 minute read
BluetoothのSPPが使えるモジュール、技適マーク付きの物を買うと5000円以上したりします。
これを市販のUSBドングル型Bluetoothモジュールを使ってなんとかしようというネタ。
使うのはPIC24FJ64GB002というUSB OTGが使えるマイコンで、今のところ買えるのはRSやDigiKeyを除いて共立電子のみ。
回路はこんな感じでOK
USBコネクタ部分の配線がよく分からない順番になってますが、実際は
1 - VCC
2 - D- (図の茶色線)
3 - D+ (図の黄色線)
4 - GND
という感じでAメスコネクタと配線してください。
電圧は3.3V。
PicKit3から電源供給する際はプロジェクトのプロパティから電源供給をONに。(MPLAB X)
Arduinoのシールド化する際は3.3Vから引きます。
(本当はあんまり良くないけど)RX/TXは直でArduinoと接続しても問題なし。
実際に使う場合は、右上のFTDI breakooutが繋がってるRX、TX、GNDをUART通信したいデバイスに接続します。
Arduinoと接続してAndroidとSPPで通信している様子。
ここでは、ONと送るとArduinoの13番pinのLEDが点灯、OFFと送ると消灯というスケッチをArudinoに書き込んでいます。
PIC側のプログラムは、hrdakinori氏のPIC24F_btstackをベースに、UARTからの受信をBuetooth SPPに渡すコードを追加すればOKです。
具体的にはこんな感じで、まずbt_spp.cのbt_spp_recive_callbackを以下の様な感じに。
int bt_spp_recive_callback(uint16_t channel, uint8_t *packet, uint16_t size)
{
packet[size] = 0;
//SPP to UART
UART2PrintString(packet);
return 0;
}
更に、main.cのsw_processを以下の様な感じに。
static int sw_process(struct data_source *ds)
{
if(IFS1bits.U2RXIF == 1){
char text[100]={0};
int i = 0;
char c = 0;
while(1){
while(U2STAbits.URXDA) {
c = U2RXREG;
text[i] = c;
i++;
}
if (c == '\n') break;
else if(c == 0) break; // if UART no Connect, break while(1)
}
text[i] = 0; //
//UART2PrintString(text); //debug and callback
//Bluetooth Send
bt_spp_send((uint8_t*)text,strlen(text));
IFS1bits.U2RXIF = 0;
if ( U2STAbits.OERR) {
U2STAbits.OERR = 0;
}
}
return 0;
}
あと、コンパイル時にundefined reference to packet_handlerが出るので、btstackのhci.c内のstatic void packet_handlerをvoid packet_handlerに変更します。
PICとのシリアル通信は57600bpsで、Bluetooth側は特に制約は無い(はず)。
こんな感じでSwitch Scienceさんのバニラシールドに載せてしまえば、Arduino UNOやMEGAのシールドとして普通に使えます。