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を以下の様な感じに。
更に、main.cのsw_processを以下の様な感じに。
PICとのシリアル通信は57600bpsで、Bluetooth側は特に制約は無い(はず)。
こんな感じでSwitch Scienceさんのバニラシールドに載せてしまえば、Arduino UNOやMEGAのシールドとして普通に使えます。
これを市販の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のシールドとして普通に使えます。