質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

0回答

895閲覧

PIC & BluetoothモジュールをBluetoothデバイスとしてiPhone側で検出したい

akadashi

総合スコア19

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

1グッド

0クリップ

投稿2020/05/31 21:20

編集2022/01/12 10:55

前提・実現したいこと

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デバイスとして検知できるようになる」ところまでを実現したいと考えています。
どうぞよろしくお願いいたします。

ozwk👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/06/01 01:29

RN4020-XBのデータシート29ページにiOS向けの設定(STコマンド)があるのですが、そちらは設定されていますでしょうか。ソースを見る限りSTコマンドは実行されていないように見られました。
akadashi

2020/06/01 14:52

ご指摘ありがとうございます。STコマンドを設定しました。また、その他のコマンドの引数についても、初心者ながら正しいと思う値に見直しました(コメントも付記しました)。 ただ、デバイスは依然として検出できません。 現在のmain.cについて、どこかおかしい点などご指摘いただくことは可能でしょうか。お手数をおかけしますが、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問