前提・実現したいこと
PICとBluetoothモジュール(BLE)を使用し、iPhone側で電子回路をBluetoothデバイスとして検出できるようにしたい。
(達成したい状態としては、LightBlueというiPhoneアプリで、電子回路をBluetoothデバイスとして発見できるようにしたい)
使用しているPIC:
PIC16F18877 (40-pin PDIP)
http://akizukidenshi.com/download/ds/microchip/pic16f18877.pdf
使用しているBluetoothモジュール:
RN4020-XB
http://akizukidenshi.com/download/ds/microchip/70005191A_JP.pdf
発生している問題・エラーメッセージ
LightBlueというiPhoneアプリで、電子回路をBluetoothデバイスとして発見できない。
該当のソースコード
回路の概要は以下のとおりです。
・電源は単三電池3本(直列)
・PICのVddピン(11番)は、電源(+側)と接続
・PICのVssピン(31番)は、電源(-側)と接続
・PICのRC6ピン(25番:TX)は、BluetoothモジュールのRXと書かれているピンと接続
・PICのRC7ピン(26番:RX)は、BluetoothモジュールのTXと書かれているピンと接続
・PICのRB1ピン(34番)は、LEDと抵抗に接続し、LEDと抵抗は、電源(-側)と接続
・Bluetoothモジュールの5Vと書かれているピンは、電源(+側)と接続
・BluetoothモジュールのGNDと書かれているピンは、電源(-側)と接続
PICに書き込んでいるプログラムは以下のとおりであり、RB1ピンに繋いだLEDは数秒後に点滅を開始することを確認しています。また、Bluetoothモジュールは点灯しています。
main.c
c
1#include "mcc_generated_files/mcc.h" 2#include <xc.h> 3#include <stdio.h> 4 5void send_command(uint8_t *cmd){ 6 while(*cmd!=0){ 7 EUSART_Write(*cmd++); 8 } 9 __delay_ms(1000); 10} 11 12void main(void) { 13 14 SYSTEM_Initialize(); 15 16 RB1 = 1; 17 18 // コマンド出力開始 19 send_command("+¥r"); 20 21 // 設定のリセット 22 send_command("SF,1¥r"); 23 24 // サービスを「Device Information」として設定 25 send_command("SS,80000000¥r"); 26 27 // iOSの制約を満たすように、interval, latency, timeoutを設定 28 send_command("ST,0010,0000,0064¥r"); 29 30 // Auto Advertise と iOS Mode の和 31 send_command("SR,20004000¥r"); 32 33 // デバイスを「MyDevice」と命名 34 send_command("SN,MyDevice¥r"); 35 36 // 設定を反映するために再起動 37 send_command("R,1¥r"); 38 39 // Auto Advertiseの設定にしているのでAは不要 40 // send_command("A¥r"); 41 42 while(1){ 43 RB1 = 1; 44 __delay_ms(1000); 45 RB1 = 0; 46 __delay_ms(1000); 47 } 48 49 return; 50} 51
補足情報
main.cでincludeしているmcc_generated_files/mcc.hファイルは以下のとおりです。(投稿文字数の都合上、コメント部分は削除しています)
mcc.h
h
1#ifndef MCC_H 2#define MCC_H 3#include <xc.h> 4#include "device_config.h" 5#include "pin_manager.h" 6#include <stdint.h> 7#include <stdbool.h> 8#include <conio.h> 9#include "eusart.h" 10void SYSTEM_Initialize(void); 11void OSCILLATOR_Initialize(void); 12void PMD_Initialize(void); 13#endif /* MCC_H */ 14
device_config.h
h
1#ifndef DEVICE_CONFIG_H 2#define DEVICE_CONFIG_H 3#define _XTAL_FREQ 1000000 4#endif /* DEVICE_CONFIG_H */
eusart.h
h
1 2#ifndef EUSART_H 3#define EUSART_H 4#include <xc.h> 5#include <stdbool.h> 6#include <stdint.h> 7 8#ifdef __cplusplus // Provide C++ Compatibility 9 10 extern "C" { 11 12#endif 13 14#define EUSART_DataReady (EUSART_is_rx_ready()) 15 16typedef union { 17 struct { 18 unsigned perr : 1; 19 unsigned ferr : 1; 20 unsigned oerr : 1; 21 unsigned reserved : 5; 22 }; 23 uint8_t status; 24}eusart_status_t; 25 26void EUSART_Initialize(void); 27bool EUSART_is_tx_ready(void); 28bool EUSART_is_rx_ready(void); 29bool EUSART_is_tx_done(void); 30eusart_status_t EUSART_get_last_status(void); 31uint8_t EUSART_Read(void); 32void EUSART_Write(uint8_t txData); 33void EUSART_SetFramingErrorHandler(void (* interruptHandler)(void)); 34void EUSART_SetOverrunErrorHandler(void (* interruptHandler)(void)); 35void EUSART_SetErrorHandler(void (* interruptHandler)(void)); 36 37#ifdef __cplusplus // Provide C++ Compatibility 38 39 } 40 41#endif 42 43#endif // EUSART_H 44
pin_manager.h
h
1#ifndef PIN_MANAGER_H 2#define PIN_MANAGER_H 3#include <xc.h> 4 5#define INPUT 1 6#define OUTPUT 0 7 8#define HIGH 1 9#define LOW 0 10 11#define ANALOG 1 12#define DIGITAL 0 13 14#define PULL_UP_ENABLED 1 15#define PULL_UP_DISABLED 0 16 17// get/set RB1 aliases 18#define RB1_TRIS TRISBbits.TRISB1 19#define RB1_LAT LATBbits.LATB1 20#define RB1_PORT PORTBbits.RB1 21#define RB1_WPU WPUBbits.WPUB1 22#define RB1_OD ODCONBbits.ODCB1 23#define RB1_ANS ANSELBbits.ANSB1 24#define RB1_SetHigh() do { LATBbits.LATB1 = 1; } while(0) 25#define RB1_SetLow() do { LATBbits.LATB1 = 0; } while(0) 26#define RB1_Toggle() do { LATBbits.LATB1 = ~LATBbits.LATB1; } while(0) 27#define RB1_GetValue() PORTBbits.RB1 28#define RB1_SetDigitalInput() do { TRISBbits.TRISB1 = 1; } while(0) 29#define RB1_SetDigitalOutput() do { TRISBbits.TRISB1 = 0; } while(0) 30#define RB1_SetPullup() do { WPUBbits.WPUB1 = 1; } while(0) 31#define RB1_ResetPullup() do { WPUBbits.WPUB1 = 0; } while(0) 32#define RB1_SetPushPull() do { ODCONBbits.ODCB1 = 0; } while(0) 33#define RB1_SetOpenDrain() do { ODCONBbits.ODCB1 = 1; } while(0) 34#define RB1_SetAnalogMode() do { ANSELBbits.ANSB1 = 1; } while(0) 35#define RB1_SetDigitalMode() do { ANSELBbits.ANSB1 = 0; } while(0) 36 37// get/set RC6 procedures 38#define RC6_SetHigh() do { LATCbits.LATC6 = 1; } while(0) 39#define RC6_SetLow() do { LATCbits.LATC6 = 0; } while(0) 40#define RC6_Toggle() do { LATCbits.LATC6 = ~LATCbits.LATC6; } while(0) 41#define RC6_GetValue() PORTCbits.RC6 42#define RC6_SetDigitalInput() do { TRISCbits.TRISC6 = 1; } while(0) 43#define RC6_SetDigitalOutput() do { TRISCbits.TRISC6 = 0; } while(0) 44#define RC6_SetPullup() do { WPUCbits.WPUC6 = 1; } while(0) 45#define RC6_ResetPullup() do { WPUCbits.WPUC6 = 0; } while(0) 46#define RC6_SetAnalogMode() do { ANSELCbits.ANSC6 = 1; } while(0) 47#define RC6_SetDigitalMode() do { ANSELCbits.ANSC6 = 0; } while(0) 48 49// get/set RC7 procedures 50#define RC7_SetHigh() do { LATCbits.LATC7 = 1; } while(0) 51#define RC7_SetLow() do { LATCbits.LATC7 = 0; } while(0) 52#define RC7_Toggle() do { LATCbits.LATC7 = ~LATCbits.LATC7; } while(0) 53#define RC7_GetValue() PORTCbits.RC7 54#define RC7_SetDigitalInput() do { TRISCbits.TRISC7 = 1; } while(0) 55#define RC7_SetDigitalOutput() do { TRISCbits.TRISC7 = 0; } while(0) 56#define RC7_SetPullup() do { WPUCbits.WPUC7 = 1; } while(0) 57#define RC7_ResetPullup() do { WPUCbits.WPUC7 = 0; } while(0) 58#define RC7_SetAnalogMode() do { ANSELCbits.ANSC7 = 1; } while(0) 59#define RC7_SetDigitalMode() do { ANSELCbits.ANSC7 = 0; } while(0) 60 61void PIN_MANAGER_Initialize (void); 62void PIN_MANAGER_IOC(void); 63 64#endif // PIN_MANAGER_H 65
マイコンの分野は初心者なので、必要な情報が欠けていたら申し訳ございません。ほかにも必要な情報があれば補足いたします。
なお、先にも書いたとおり、今回の質問では「Bluetoothデバイスとして検知できるようになる」ところまでを実現したいと考えています。
どうぞよろしくお願いいたします。
あなたの回答
tips
プレビュー