*Bluetooth RBT-001 [#nafd25b8] -RBT-001~ :技適取得済みのBluetooth2.0(SPP/GAP/SDAP)モジュール -データシート #ref(rbt-001_man.pdf)~ -RBT-001用シリアルレベルコンバータ~ :Arduinoは3.3/5V、RBT-001は3V駆動なのでこのコンバータで変換する~ [[SwitchScience:https://www.switch-science.com/catalog/1315/]] *Arduinoとの接続 [#x7fc3c97] -コンバータとArduinoを以下のように接続する。 |コンバータ|Arduino|備考| |5Vin|5V|コンバータ内で3Vに変換| |GND|GND|| |RX|任意のデジタルPIN(TX定義)|コードでTXピンに定義| |TX|任意のデジタルPIN(RX定義)|コードでRXピンに定義| *サンプルコード [#fe7e4814] -「ファイル」→「スケッチの例」→「SoftwareSerial」→「Bluetooth」 ***準備 [#kf0f003f] **準備 [#kf0f003f] -最初に以下を書く。 #include <SoftwareSerial.h> //////////////// // 定数 //////////////// #define PIN_BT_RX 7 // Arduino RX(Receive)pin7 - RBT-001 TX(Trans ) :Arduino7番ピンをRXピンとして定義 #define PIN_BT_TX 6 // Arduino TX(Trans )pin6 - RBT-001 RX(Receive) :Arduino7番ピンをTXピンとして定義 //////////////// // グローバル変数 //////////////// SoftwareSerial btSerial(PIN_BT_RX, PIN_BT_TX); // BT用シリアルオブジェクト -'''※Bluetooth通信はコード上はソフトウェアシリアル通信と同じ制御してやればOK。''' ****初期化 [#kf0f003f] ***初期化 [#kf0f003f] -setup()の中で一度だけ呼ぶ。 void setup() { // BT用ソフトウェアシリアル初期化 btSerial.begin(9600); } ****1文字受信 [#kf0f003f] ***1文字受信 [#kf0f003f] -以下のコードで受信データ1文字受信 char c; // 受信データ用 if (btSerial.available()){ // 受信データ有る? c = btSerial.read(); // 1文字受信 } -'''※複数文字受信する場合は上記動作を複数回繰り返す。''' ****HOST側ポートオープン時ごみデータ対策 [#kf0f003f] ***HOST側ポートオープン時ごみデータ対策 [#kf0f003f] -HOST(PC、タブレット)でポートオープン時にArduinoでごみデータを受信してしまう。 その対策として、初期化時にターミネータ(CR+LF)受信したら初期化完了とする事で回避できる。~ -'''※ターミネータ:改行文字(リターンボタン)''' -以下を定義 #define NUM_READ_BUFF (32) // BT受信バッファサイズ char g_ReadBuff[NUM_READ_BUFF] = ""; // 受信データ格納バッファ char g_ReadLine[NUM_READ_BUFF] = ""; // 1行読み込み済データバッファ int g_CountRead = 0; // データ受信数 -1行受信関数を作成。 /******************************************************************************* * 1行受信 * 0:読み取り途中、1:読み取り完了 *******************************************************************************/ char ReadLineStr(void) { char c; while (1) { // 1文字読み込み c = btSerial.read(); //////////////// // 受信データ処理 // 受信データ無し:読み取り途中 if (c == -1) { break; } // 'CR':1行読み込み済データバッファへデータコピー ⇒ 読み取り完了 else if (c == '\r') { g_ReadBuff[g_CountRead] = '\0'; strncpy(g_ReadLine, g_ReadBuff, NUM_READ_BUFF - 1); g_ReadLine[NUM_READ_BUFF - 1] = '\0'; g_CountRead = 0; return 1; } // LF:読み捨て ⇒ 受信続行 else if (c == '\n') { ; } // その他:バッファ保存 ⇒ 受信続行 else { if ((NUM_READ_BUFF - 1) > g_CountRead) { g_ReadBuff[g_CountRead] = c; g_CountRead++; } } } return 0; } -setup()の中にターミネータ(CR+LF)受信処理を追加。 void setup() { // BT用シリアル初期化 btSerial.begin(9600); // ターミネータ(CRLF)受信まで待つ ← HOST側ポートオープン時にごみデータ受信してしまうので // ※HOST側ポートオープン後必ず1回ターミネータ送ること while (1) { if (ReadLineStr() == 1) break; } } -'''HOST側でポートオープン後、ターミネータを送ってやるとsetup()ルーチンを抜けメインループに移る''' *参考資料 [#t393016d] [[Arduino+Bluetoothシリアル通信によるワイヤレスなLED制御:http://masanoriprog.blogspot.jp/2013/08/arduino-bluetooth-serial-led.html]]~ [[Bluetooth通信する(Bluetoothモジュール RN-42 使用):http://www.hiramine.com/physicalcomputing/arduino/bluetooth_rn42.html]]~ [[Arduino 日本語リファレンス:http://www.musashinodenpa.com/arduino/ref/]]~ ---- &size(12){Total:&counter(total); / Today:&counter(today); / Yesterday:&counter(yesterday);};