BL652(smartBasic)

  BL652ブレークアウトボードを秋月電子通商から取り寄せました。ボードに乗っているモジュールBL652-SA-01(ARMマイコン[nRF52832]+BLEラジオ)が小さいことに興味を持ちました。ここでは、このボードとパーソナル・コンピュータPC(OS:Windows10)をBLE(Bluetooth Low Energy)で接続します。 そして、Android携帯や他のBL652ブレークアウトボードとも接続します。

注意:Windows10用アプリケーション・ソフトウェアをVisual Studioに読み込んだ時に、必要なバージョンの.NET Frameworkがなければ警告がでますので指示にしたがってインストールしてください。

目次


BL652ブレークアウトボード

下図はボードの配線要領です。

1.図中、電源の所には3.3Vあるいは5.0Vの電源を適切に(電圧を間違わないように)配線します。

2.図中、UART接続の所にはUSB-UART変換器(信号線は必ず3.3V入出力とする)を接続します。CTSとRTSもきちんと接続します。変換器のUSB側はパーソナル・コンピュータ(OS:Windows10)と接続します。USB-UART変換器として市販のものを使用する場合、市販のUSB-UART変換器:DTR信号線の有無の節を参考にしてください。ただ、ここではPIC16F1455を用いた自作USB-UART変換器を使用した場合ということで説明を進めて行きます

注意:BL652の基本ファームウェアをバージョンアップする際、CTSとRTSを使用する必要があります。これらを使用しないでバージョンアップを試みたところ、バージョンアップ自体に失敗し、さらにBL652の動作がおかしくなりました。冷や汗ものです。それでも、その後CTSとRTSをきちんと配線し直して、再度バージョンアップを試みたところ、問題なくバージョンアップできました。

3.図中、J7にはタクトスイッチ(キットには付属していない)を接続しました(下の写真を参照)。ファームウェアを書き込むときに、まず、このタクトスイッチを押しながらボードのリセットボタンを押します。その後リセットボタンを離し、最後にタクトスイッチを離します。

注意:BL652は基本ファームウェア(Laird社が配布:smartBASIC runtime engine firmware)の上に、smartBasicで作成してコンパイルする我々の応用ファームウェアを乗せて動作させます。以下、単にファームウェアという時には、後者の応用ファームウェアのことを意味するものとします。基本ファームウェアはバージョンアップがあった時だけ書き換えます。

4.BL652用のファームウェアを開発するためにUwTerminalX(UwTerminalX_v1.17_Windows_SSL.zip)BL600-Applicationsをダウンロードします。また、PC用のアプリケーション・ソフトウェアを開発するためにVisual Studio Comunity 2022もダウンロードしインストールします。

  今回、使用した回路の写真です。自作USB-UART変換器の詳細は、以下の自作USB-UART変換器の節に書きました。


サンプルコードの実行

1.秋月電子通商にサンプルコードがあります。これ(zipファイル)をダウンロードして解凍します。AE-BL652-BO_sampleフォルダーの中の$autorun$.led_btn_sample.sbを使用します。

2.UwTerminalXを実行すると、以下の画面が現れます。

ここで、Acceptボタンを押すと、Configタブ画面が現れますので、USB-UART変換器に対応する仮想COMポート番号を選択します。

OKボタンを押下すると、以下のようなTerminalタブ画面が現れます。

3.J7に接続したタクトスイッチを押しながらボードのリセットボタンを押します。その後リセットボタンを離し、最後にタクトスイッチを離します。これで、ファームウェアを書き込める状態になります。LED1とLED2が両方とも薄く光っているはずです。ここで、上のTerminalタブ画面のように、黒い箇所をクリックして、at(+エンター)と打ち込みます。00が返ってくれば正常です。

なお、ファームウェアを書き込める状態にしなければ、at関連の命令を実行できません。逆にat命令を実行しても00が返って来なければ、ファームウェアを書き込める状態になっていないことになります。ファームウェアを書き込める状態にしましょう。

4.Terminalタブ画面の黒い箇所を、右クリックして以下のサブメニューを表示させます。

ここで、Clear moduleを選択します。現れるClear module画面でYesボタンを押すと黒画面にat&f*命令が入力され実行されます。直前にBluetooth関連のファームウェアを使っていた場合には必ずこの操作を行います。なお、黒画面の所で、直接at&f*命令をタイプ入力してもかまいません。00が返ってくれば正常です。ところで、at&f*に関する説明は、Walkthrough - Applications in smartBASIC (BL600 and BL620).pdfの7ページに書いてあります(Webページ下方のDocumentation項目の中にあります)。

5.パーソナル・コンピュータをインターネットに接続しておきます。再びTerminalタブ画面の黒い箇所を、右クリックしてサブメニューを表示させます。そこで、XCompile + Load + Runを選択すると、ファイル選択ダイアログが現れるので、$autorun$.led_btn_sample.sbを選択します。これでファームウェアがコンパイルされ、BL652に書き込まれ、実行されます。BTN1を押すとLED1が光り、離すと消えます。BTN2も同様です。UwTerminalXの黒画面上にも以下のようにメッセージが表示されます。

6.サンプルコードとは全く関係がありませんが、ファームウェアを書き込める状態にして、ati 49406 命令を実行してLicense codeを表示させ、それを控えておくことを強く勧めます。License codeはBL652それぞれで異なります。


LEDとSWの操作

  目的は、BL652とPC(OS:Windows10)との間でデータのやり取りをすることです。このために使えそうなBL652のファームウェアはBL600-Applicationsの中のbtnled.gatt.server.sbと考えました。というのは、BL652ブレークアウトボード上の2つのLED(LED1とLED2)を点けるためには、PCからBL652へ何らかのデータ(実際は2バイトのデータ)を送る必要があるはずで、またボード上の2つのスイッチ(BTN1とBTN2)の状態を読み取るためには、BL652からPCへ何らかのデータ(実際は2バイトのデータ)を送っているに違いないからです。

1.もともとのbtnled.gatt.server.sbが対象としているボードとBL652ブレークアウトボードは若干異なるので、BL652ブレークアウトボードに合わせて以下の部分だけ手直ししました。

#define GPIO_BTN0 11
#define GPIO_BTN1 15
#define GPIO_LED0 17
#define GPIO_LED1 19

手直ししたファームウェアはLED_BTN1.zip(コンソール.NET Coreアプリケーション)を解凍して出てくるLED_BTN1フォルダーの中の$autorun$.btnled.gatt.server.sbです。まず、J7に接続したタクトスイッチを押しながらボードのリセットボタンを押します。その後リセットボタンを離し、最後にタクトスイッチを離します。LED1とLED2が両方とも薄く光っているはずです。これで、ファームウェアを書き込める状態になります。次に、UwTerminalX上でat&f*を実行し、その後このファームウェアをコンパイルしてBL652に書き込み実行します。

2.PCとBL652をBLEで接続します。接続方法は接続方法に書いてあります。接続が完了すると

を経て

のようになるはずです。

3.LED_BTN1フォルダーの中に、PC用のアプリケーション・ソフトウェアがあります。これをコンパイルして実行すると

のようになります。下から2行目はBTN1を押した場合、最下位行はBTN1を離した場合、BL652ブレークアウトボードからPCに送られてくるデータをもとに0、1表現したものです。実際にスイッチ(BTN1とBTN2)を押したり離したりしてみると理解できます。一方、BL652ブレークアウトボード上のLEDの設定は固定で、ファイルProgram.csの18行目で

static byte[] LEDdata = { 1, 0 };// LED1 ON : LED2 OFF

としています。このデータがPCからBL652ブレークアウトボードに送られ、ボード上のLED1を点灯させ、LED2を消灯させます。{ 1, 0 }を{ 0, 1 }に変えれば、ボード上のLED1を消灯させ、LED2を点灯させることになります。

ところで、このファームウェアのGATTデータベースはLED_BTN.xlsxの様になっています。ファームウェア中のCreateSvc()サブルーチンを参照すると良いでしょう。

注意:PC用アプリケーション・ソフトウェアを実行した後、終了したとします。すぐさま再実行した場合、アプリケーション・ソフトウェアが10秒ほど動かない場合があります。放っておくと正常に動き出しますので、その間待ちます。なお、アプリケーション・ソフトウェア終了後、10秒ほどたった後で再実行した場合は、すぐ動き出します。理由は接続方法に書いてあります。


データの送受信

  上節(LEDとSWの操作)で、2バイトだけですがBL652とパーソナル・コンピュータPC(OS:Windows10)との間でデータのやり取りが実現できることが分かりました。 ここでは、20バイト(L2CAPデータ列は23バイトで、ここからATT命令の種別1バイトとハンドルの2バイトを引くと、送受信できる最大データ長は20バイトとなる)までデータを送受信できるようにします。

1.BLE用のファームウェアを別のものに書き換えるときは、まず、PCとBL652のBLE接続を解除します。以下のような画面(初めは「デバイスの削除」ボタンはありません)をクリックすると、「デバイスの削除」ボタンが現れるので、それを押して、その後の指示に従うと接続を解除できます。

2.BL652ブレークアウトボードに書き込むファームウェアはLED_BTN_MODIFY2.zip(コンソール.NET Coreアプリケーション)やGattWriteIndicate.zip(フォーム.NET Coreアプリケーション)を解凍して出てくるフォルダーの中の$autorun$.btnled.gatt.server.sb(両者同じもの)です。 まず、J7に接続したタクトスイッチを押しながらボードのリセットボタンを押します。その後リセットボタンを離し、最後にタクトスイッチを離します。LED1とLED2が両方とも薄く光っているはずです。これで、ファームウェアを書き込める状態になります。次に、UwTerminalX上でat&f*を実行し、その後このファームウェアをコンパイルしてBL652に書き込み実行します。

なお、このファームウェアと、上節のLED_BTN1フォルダーの中の$autorun$.btnled.gatt.server.sbとをファイル比較ソフト(例えば、WinMerge)で比較すると、手直し部分が分かります。

3.PCとBL652をLEDとSWの操作の節で説明した要領にて接続します。

4. アプリケーション・ソフトウェア

  4ー1. コンソール.NET Coreアプリケーション

  LED_BTN_MODIFY2フォルダーの中にアプリケーション・ソフトウェアがあります。コンパイルして実行すると

のようになります。PCからBL652に送信している20バイトの固定データは、ファイルProgram.csの100行目で与えています。

string s = "12345678901234567890";

BL652では、PCから送信されてきたデータの最初の文字'1'(asciiコード)に1を足して、"22345678901234567890"として、それをPCに送り返しています(上図での最下位行)。これで、20バイトのデータの送受信が可能となったことが分かります。

  4ー2. フォーム.NET Coreアプリケーション

  GattWriteIndicateフォルダーの中にアプリケーション・ソフトウェア(バグフィックス済み)があります。コンパイルして実行すると、2つのボックスと1個の送信ボタンを持つダイアログ(対話)・ウィンドウが現れます。 例えば上のボックスに123と入れて、送信ボタンをクリックすると、下のボックスに223と現れれば、正常に動作しています。送信された文字列のうち、第1番目の文字だけが変わったもの(アスキーコードで1足されたもの)が、下のボックスに現れるはずです。


温度データの受信

BL652に内蔵されている温度計のデータをPCで受信します。

1.PCとBL652のBLE接続を解除します。

2.BL600-Applicationsの中のhtss.health.thermometer.sensor.custom.sbに、たった1行tmp=SYSINFO(2024)を加えました。BL652ブレークアウトボードに書き込むファームウェアはthermoBLE.zip(フォーム.NET Coreアプリケーション)を解凍して出てくるフォルダーの中の$autorun$.htss.health.thermometer.sensor.custom.sbです。まず、J7に接続したタクトスイッチを押しながらボードのリセットボタンを押します。その後リセットボタンを離し、最後にタクトスイッチを離します。LED1とLED2が両方とも薄く光っているはずです。これで、ファームウェアを書き込める状態になります。次に、UwTerminalX上でat&f*を実行し、その後このファームウェアをコンパイルしてBL652に書き込み実行します。

3.PCとBL652をBLEを接続します。接続が完了すると

のようになるはずです。

4.thermoBLEフォルダーの中に、PC用のアプリケーション・ソフトウェアがあります。これをコンパイルして実行すると次のようなダイアロブが現れます。

ここで、startボタンを押すと、BL652の温度を読み取ることができます。BL652を指などで温めると温度が変化することが分かると思います。読み取りを中断するにはstopボタンを押します。

ところで、このファームウェアのGATTデータベースはhealth_thermo.xlsxの様になっています。

参考:アプリケーション・ソフトウェアについては TomoSoft、また IEEE 11073 浮動小数点についてはsatoshi suzukiを参考にしました。



Windows10アプリケーションにおける注意点

アプリケーションの作成開始時の注意

1. 必要な機能の追加

  プログラム開発に必要な機能(最小単位はコンポーネント)をVisual Studio 2022に追加します。 必要な「個々のコンポーネント」を一つづ追加するのは大変なので、「ワークロー ド」と呼ばれる単位で種類別の開発(例えば、.NETデスクトップ開発)に必要な複数のコンポーネントを一気にVisual Studio 2022に追加します。 そして、「ワークロー ド」ではカバー出来ないコンポーネントは「個々のコンポーネント」としてVisual Studio 2022に追加します。なお、「ワークロー ド」の中にどの様なコンポーネントが含まれているかについては、Visual Studio Community component directory に書かれています。

  1_1. Visual Studio Installerを起動させます。そして、変更ボタンをマウスでクリックします。

  1_2.現れる画面のタブは次のようになっています。

  1_3.初めは「ワークロー ド」タブが選択されていますので、 .Netディスクトップ開発というワークロードにチェックを入れます。

  1-4. 次に、「個別のコンポーネント」タブを選択して、.NET Core 3.1 ランタイム(サポート対象外)にチェックを入れます。

  1-3. 閉じるボタンをマウスでクリックすると、プログラム開発に必要な機能がVisual Studio 2022に追加されます。

2. Windows10アプリケーションを作成する前にすべきこと

  2-1. .NET Coreアプリケーション(コンソールやフォーム)として作成します。(.NET Framework)ではありません

  2-2. 作成過程で追加情報なる項目が現れますので、必ずフレームワークとして.NET Core 3.1 ランタイム(サポート対象外)を選択します。

  2-3. また、BLEに関する関数等を使用するので、別途パッケージ(Microsoft.Windows.SDK.Contracts)を読む込む必要があります。プロジェクト名のところをマウスで右クリックして以下の図のようにサブメニューを出します。そこでNuGetパッケージの管理を選択します。

すると、以下ような画面が現れます。そこで参照タブを開き、例えばmicrosoft.windows.sdkでパッケージを検索します。検索されたものの中に、Microsoft.Windows.SDK.Contractsがありますので、これを選択して、画面右側にあるインストールボタンを押します。

以上、1から2までの設定をした後に、アプリケーションを開発して行きます。

アプリケーションの作成後の注意

  アプリケーションをコンパイルすると、実行ファイル(例えばLED_BTN1.exeファイル)ができますが、この実行ファイル単体では実行できません。例えば、LED_BTN1.exeを実行するためにはLED_BTN1.dllとLED_BTN1.runtimeconfig.jsonが同じフォルダーの中になければいけません。実行ファイル単体で実行できるよにするためにはdll(ダイナミック・リンク・ライブラリ)を埋め込む必要があります。以下、その方法です。

1. プロジェクト名のところをマウスで右クリックして以下の図のようにサブメニューを出します。そこで発行を選択します。2度選択する必要があるかも知れません。

2. 下図のように公開ダイアログが現れますので、フォルダーを選択して次へボタンを押します。

3. 下図のようなダイアログになりますので、完了ボタンを押します。

4. 下図のように、FolderProfile.pubxmlを選択します。

5.現れるファイル FolderProfile.pubxmlの中に、次の2行を追加します。

<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>

6. プロジェクト名のところをマウスで右クリックしてサブメニューを出し、再度発行を選択します。すると、次のような画面が現れます。ここで、発行ボタンを押します。

以上の操作で、例えばLED_BTN1の場合、LED_BTN1\LED_BTN1\bin\Release\netcoreapp3.1\publishフォルダーの中にLED_BTN1.exeができますが、これは単体で実行できます。



基本ファームウェアのバージョンアップ方法

  BL652ブレークアウトボードの基本ファームウェアをバージョンアップする前に、ati 49406 命令でsmartBASIC用のLicense codeを表示させて、それを控えておくことを強く勧めます。Laird社によると、バージョンアップの際、たいていの場合はLicense codeが消えることがないけれども、たまに消えてしまうことがあるそうです。

License codeを控えずに消した場合、at i 14 命令でBluetoothアドレスを得て、このアドレスに対するLicense codeをLaird社に問い合わせると丁寧に教えてくれます。Q and Aを参照ください。英語でのやり取りになります。なお、at+lic "License code(16進数)" 命令で、License codeを書き込むことができます。

購入したBL652ブレークアウトボードの基本ファームウェアのバージョンは、28.6.1.2でした。最新のものはITSE01052_11_BL652_Firmware_For_Upgrade_v28_11_8_0_r1です(Webページの下の方にあるSoftwareなる項目の中にあります)。メールアドレス、名前などを、架空のものでかまいませんので入力して、zipファイルをダウンロードします。バージョンアップは、これを解凍して出てくるフォルダーの中にあるFirmware\BL65xUartFwUpgrade.exeを実行することになります。

まず、J7に接続したタクトスイッチを押しながらボードのリセットボタンを押します。その後リセットボタンを離し、最後にタクトスイッチを離します。LED1とLED2が両方とも薄く光っているはずです。これで、ファームウェアを書き込める状態になります。次に、UwTerminalX上でat&f*を実行します。UwTerminalXを終了した後、Firmware\BL65xUartFwUpgrade.exeを実行します(以下のアイコンをクリック)。

実行すると以下の画面が現れるのでOKボタンを押します。

次の画面で仮想COMポートの番号を設定してOKボタンを押すと

以下の画面に変わり、そこでProceedボタンを押すとバージョンアップが始まります。

バージョンアップが終了したら、UwTerminalXを起動して、at i 3とタイプしてリターンキーを押します。

バージョンが28.11.8.0と表示されれば、バージョンアップ成功です。



自作USB-UART変換器

  自作したUSB-UART変換器の回路図は以下の通りです。

回路図中、PICの5番ピン(RX)は10KΩ(R1)でプルアップしています。BL652ブレークアウトボードのリセットボタンを押したとき、BL652のTX端子(結果としてPICのRX端子が)がオープン状態になり、PICのRX端子が雑音を拾ってしまいます。これを防ぐためのプルアップです。 また、PICの8番ピン(CTS)も10KΩ(R2)でプルアップしています。プルアップしていないとXCompile+Load+Runを実行したときに頻繁にエラーがでます。

今回、ファームウェアを書き込むために、PIC16F1455を用いたテスト回路を使いました。しかし、上の回路図に、書き込み用の配線を追加するのが簡単でしょう。具体的には、PIC16F1455を用いたテスト回路の回路図のように、JP1(5ピンのピンヘッド)と、そこからPIC16F1455への4本の配線とGNDへの1本の配線を追加するだけです。以下の写真に示すツールを用いています。

PICに書き込むファームウェアはRTS_CTS.zipです。解凍して出てくるRTS_CTSフォルダーの中のappsフォルダーbspフォルダー \microchip\mla\v2018_11_26フォルダーの中に上書きします(MLA v2018_11_26がインストールされていることが前提)。RTSをRC3(7番ピン)にCTSをRC2(8番ピン)に設定しています。このピン配置は、ファームウェアのRTS_CTS\bsp\pic16f1455\usart.hで定義しています。

試してはいませんが、CTSを2番ピンか3番ピンに変更して、PIC内部で変更したピンを弱プルアップするとR2がいらなくなると思います。



Android 携帯とBL652の間でデータの送受信

  Android 携帯とBL652の間でデータの送受信を行います。使用した携帯はXperia xz2 compact(Android10)とXperia Ace II(Android13)です。

接続・操作方法:

1.データの送受信の節で紹介したファームウェア$autorun$.btnled.gatt.server.sbを使用します。まず、BL652ブレークアウトボードにおいてJ7に接続したタクトスイッチを押しながらリセットボタンを押します。その後リセットボタンを離し、最後にタクトスイッチを離します。LED1とLED2が両方とも薄く光っているはずです。これで、ファームウェアを書き込める状態になります。次に、UwTerminalX上でat&f*を実行し、その後このファームウェアをコンパイルしてBL652に書き込み実行します。

2.アンドロイド携帯から接続を開始します。BluetoothをONにしたアンドロイド携帯において、まず「設定」アイコンをタップします。そして、「機器接続」をタップ、「+新しい機器とペア設定する」の箇所をタップします。少し待つと「Laird Btn LED Demo - BL600」と書かれたアイコンが現れるので、これをタップします。すると下図のように「現在接続されている機器」として、「Laird Btn LED Demo - BL600」が登録されます。このペアリング操作は最初だけ(1回だけ)行えば済みます。

3.アンドロイド携帯用のアプリケーション・ソフトウェアはBL652_Android.zip(Android10携帯用)とBL652_Android13.zip(Android13携帯用)です。Android Studioでこのソフトウェアを携帯に書き込んで実行します。すると下図のように、2つのエディット・テキストと1個のSENDボタンを持つ画面が現れます。 例えば上のエディット・テキストに123と入れてSENDボタンをタップすると、下のエディット・テキストに223と現れれば正常に動作しています。送信された文字列のうち、第1番目の文字だけが変わったもの(アスキーコードで1足されたもの)が現れるはずです。

4.2回目以降の接続(再接続)は、BL652の電源を入れ、アンドロイド携帯にてアプリケーション・ソフトウェアのアイコンをクリックするだけです。ただ、アプリケーション・ソフトウェアがすでに起動されており、かつ、そのActivityが表示中ならば、一端ホームキーなどを押して非表示にしてからアイコンをクリックします(注意1)。上記項目2での「ペアリング操作」は不要です。なお、SENDボタンをタップしても下のエディット・テキストに何も表示されないときは、BL652ブレークアウトボードのリセットボタンを押した後、一度ホーム画面に戻してアイコンをクリックしてください。

注意1:再接続の場合、アンドロイド携帯用のアプリケーション・ソフトウェアを再起動する必要があります。Activityを非表示にするとOnStop関数が呼ばれるので、この関数内で再起動しています。

注意2:UwTerminalXでデバック作業をしないときにはUSB-UART変換器を外しておきます。変換器を付けているとCTS信号が負論理でH(電圧で言えば0V)にならず、print文が実行できないからです。

注意3:ペアリング操作をした後、それを削除して再度ペアリングしようと思ってもペアリングできません。解決策はAndroid 携帯でBL652の温度データを受信(その2)の節にて示します。ところで、再接続と再度ペアリングは全く異なることなので混乱なきように。

参考にしたサイト:

khwadahiramineいわてぃ戌印-INUJIRUSHI


追記: Xperia Ace IIのAndroidバージョンは11から12を経て13になりました。 Android12以降では、11以前と異なりBluetoothのパーミッション(許可)の取得項目が変わりました。 BL652_Android.zipBL652_Android13.zipで、それぞれのAndroidManifest.xmlMainActivity.ktを比較すると分かります。なお、BL652用のファームウェアは、そのまま使用できます。

Bluetoothのパーミッションについて参考にしたサイト:  Xizhi Zhu


Android 携帯でBL652の温度データを受信

  温度データの受信をAndroid 携帯で行います。使用した携帯はXperia xz2 compact(Android10)とXperia Ace II(Android13)です。

接続・操作方法:

1. 温度データの受信の節で紹介したファームウェア$autorun$.htss.health.thermometer.sensor.custom.sbを使用します。まず、BL652ブレークアウトボードにおいてJ7に接続したタクトスイッチを押しながらリセットボタンを押します。その後リセットボタンを離し、最後にタクトスイッチを離します。LED1とLED2が両方とも薄く光っているはずです。これで、ファームウェアを書き込める状態になります。次に、UwTerminalX上でat&f*を実行し、その後このファームウェアをコンパイルしてBL652に書き込み実行します。

2.アンドロイド携帯から接続を開始します。BluetoothをONにしたアンドロイド携帯において、まず「設定」アイコンをタップします。そして、「機器接続」をタップ、「+新しい機器とペア設定する」の箇所をタップします。少し待つと「LAIRD_TS」と書かれたアイコンが現れるので、これをタップします。すると下図のように「現在接続されている機器」として、「LAIRD_TS」が登録されます。このペアリング操作は最初だけ(1回だけ)行えば済みます。

3.アンドロイド携帯用のアプリケーション・ソフトウェアはBL652_thermo_Android.zip(Android10携帯用)とBL652_thermo_Android13.zip(Android13携帯用)です。Android Studioでこのソフトウェアを携帯に書き込んで実行します。STARTボタンを押すと温度測定が始まります。BL652を指などで温めると温度が変化することが分かると思います。STOPボタンを押すと温度測定が止まります。温度測定を再開したければSTARTボタンを押します。

4.2回目以降の接続(再接続)は、BL652の電源を入れ、アンドロイド携帯にてアプリケーション・ソフトウェアのアイコンをクリックするだけです。ただ、アプリケーション・ソフトウェアがすでに起動されており、かつ、そのActivityが表示中ならば、一端ホームキーなどを押して非表示にしてからアイコンをクリックします。上記項目2での「ペアリング操作」は不要です。なお、温度が表示されないときは、BL652ブレークアウトボードのリセットボタンを押した後、一度ホーム画面に戻してアイコンをクリックしてください。

上記の注意1,2,3をお読みください。

IEEE 11073 浮動小数点について参考にしたサイト:

yinpeng263megadreams14


Android 携帯でBL652の温度データを受信(その2)

  Android 携帯でBL652の温度データを受信するだけなら、Android 携帯でBL652の温度データを受信の節(前節)で紹介したHealth Thermometerサービス用のファームウェアを使用するまでもありません。Android 携帯とBL652の間でデータの送受信の節で紹介したカスタムサービス用のファームウェアを手直しすれば済みます。

BL652用のファームウェア($autorun$.temp.gatt.server.sb)とAndroid携帯用のアプリケーション・ソフトウェアは BL652_temp_Android.zip(Android10携帯用)やBL652_temp_Android13.zip(Android13携帯用)を解凍するとでてきます。なお、表示される数値を10で割ると℃単位の温度となります。

  前節の注意3で書きましたが、ペアリング操作をした後、それを削除して再度ペアリングしようと思ってもペアリングできません。Andorid10と11携帯ではBletoothアドレスとしてResolvable Private Addressを採用しているためだと思います。すなわち、最初にペアリングした時のbluetoothアドレスをBL652が記憶しており、再度ペアリングしたときにアドレスが変わるので、アドレス不一致でペアリングできないのだと思います。解決策は、記憶しているアドレスをBleBondingEraseAll()関数を用いて消すことです。そこで、BL652ブレークアウトボードのBTN2を押しながらボードのRESETボタンを押すか、ボードの電源を入れ直すかしたとき、BleBondingEraseAll()関数が実行させるようにしました。


Android 携帯でBME680の温度・気圧・湿度データを受信

  BME680使用の温湿度・気圧・ガスセンサモジュールキット(秋月電子通商)の温度・気圧・湿度データをAndroid 携帯で受信します。今回は、ガスセンサーを使用しませんでした。

  まず、センサモジュールをBL652ブレークアウトボードとI2C接続して、モジュールの動作確認をします。ボードのSIO_27がI2C_SCLで、SIO_26がIC2_SDAです。

ブレークアウトボードに書き込むファームウェアは$autorun$.bme680.i2c.master.zipです。UwTerminalX上で実行すると、次のような結果になります。

画面上でval 174 10133 585なる出力がありますが、このうち174 10133 585なる文字列をAndroid 携帯に送ることになります。これらの3つ数値は、それぞれ温度、気圧、湿度の小数点以下1桁目までとって(小数点以下2桁目は四捨五入)、それを10倍した数値を文字列にしたものです。

注意:BME680の各レジスタ値は符号付き整数か符号無し整数です。どのレジスタ値が符号付き整数で、どのレジスタ値が符号無し整数なのかについて、マニアルには明記されていないようです。そこで、Bosch社がGithubにて提供しているファームウェアを参照して符号付きか符号無しかを判断しました。この判断は間違っているかも知れませんので注意願います。

  前節(Android 携帯でBL652の温度データを受信(その2))で紹介したファームウェアやアプリケーション・ソフトウェアを少し手直して、温度・気圧・湿度データをAndroid 携帯で受信できるようにしました。BL652用のファームウェア($autorun$.bme680.gatt.server.sb)とAndroid携帯用のアプリケーション・ソフトウェアは BME680_demo_android.zip(Android10携帯用)やBME680_demo_android13.zip(Android13携帯用)を解凍するとでてきます。以下はAndroid 携帯画面です。

  下の写真は回路を小型ケースに収めた様子です。写真右上のタクトスイッチ(BL652ブレークアウトボードのBTN2に相当)は再度ペアリング(再接続ではない)のためのもので、写真右下のスライドスイッチは電源スイッチです。なお、BL652の36番ピンがI2C_SCLで、37番ピンがIC2_SDAです。また、タクトスイッチはBL652の29番ピンとGNDの間に接続しています。再度ペアリングをするためには、タクトスイッチを押しながら電源を入れ直します。

参考にしたサイト:  dekuo-03



データの送受信の応用(OTTOの足)

  LE一般的HIDの応用(OTTOの足)の章で扱ったOTTOと言う名の2足歩行ロボットの足(正確には脚と足)をBL652とPIC24FJ64GB002の組み合わせで制御します。

1.制御回路

  足を制御する電子回路を以下に示します。PICとBL652はI2Cで接続するので、回路図の右下にSDASCL+3.3VGNDと書かれた4本の線はBL652ブレークアウトボードへ接続します。電源は単三充電式電池1.2Vを4本です。定格電圧は4.8Vになりますが、実際の電圧は5V以上になります。回路図では5Vと表記しています。この電圧を直接掛けるのはサーボモータだけです。あとは、3端子レギュレータで3.3Vを得て、これをサーボモータ以外の電源としています。回路図中のSW2は電源スイッチです。

拡大図 <=ここをクリック

実際の回路を以下に示します。


2.サーボホーンアームの取付けとその位置補正

  ①取付け:サーボモータにサーボホーンアームを取付ける前に、ファームウェアMCC_OTTO_FRC.X.zipを解凍して出てくるotto.cの中の配列trimの要素を trim[4] = {0, 0, 0, 0}のように、すべてゼロとします。回路図でのSW3をProgram側にした後、ファームウェアをPICに書き込み実行します。書き終わったらRun側に戻します。サーボモータが動きます。上の正面・背面写真(ホーム位置と言います)に近いような状態になるように、サーボモータにサーボホーンアームを取り付けます。

  注意:SW3をProgram側にすると、サーボモータの電源が切れ(サーボモータを回すことができない状態)、ファームウェア書込器(例えばICD3)に3.3Vが掛かります(Programできる状態)。逆にRun側にすると、サーボモータの電源が入り(サーボモータを回すことができる状態)、ファームウェア書込器への3.3Vは断たれます(Programできない状態)。SW3を無くすると、とても危険です。サーボモータが動いている状態でファームウェアを書き込むと、PICがリセットされたとき、短いパルスがサーボモータに掛かってしまいます。その結果として、サーボモータが意図せずに反時計回りに回りきってしまいます。サーボモータに固定されている物同士が干渉する場合、互いに衝突してしまうことになります。

  ②位置補正:サーボモータにサーボホーンアームを取り付けると、両者の噛合わせ具合により、ホーム位置から若干脚や足が曲がった状態になると思います。きちんとホーム位置になるようファームウェア上で補正します。配列trimの各要素を適当に変えては(整数値で単位は度:degree)ファームウェアをPICに書き込み実行することを繰り返してホーム位置になるようにします(試行錯誤)。なお、trim[0]は左脚(LL:Left Leg)、trim[1]は右脚(RL:Right Leg)、trim[2]は左足(LF:Left Foot)、trim[3]は右足(RF:Right Foot)に相当する補正です。trim[0]から順次補正して行けば良いと思います。

  ③動作確認:main.cの71行目の while(1); をコメント文にします。ファームウェアをPICに書き込み実行するとOTTOが前進歩行を始めるはずです。74行目の関数walk(1., 1000, 1);において、第1引数は繰返しの数、第2引数は周期(大きい数値にするとゆっくり動く:単位はmsec)、そして第3引数は動く方向(1とすると前進、-1とすると後進)です。周期を長くして、脚と足がどう動くかを観察すると面白いです。

3.Bluetooth LE制御

  PIC用のファームウェアはGB002_I2C_slave_OTTO.X.zipです。これを解凍して出てくるotto.cの中にある配列trimの要素を、上記補正で得た値で修正します。修正後のファームウェアをPICに書き込みます。一方、BL652用のファームウェアはGB002_I2C_slave_OTTO.X.zipを解凍して出てくるフォルダーの中にある$autorun$.btnled.gatt.otto.sbです。これをUwTerminalXでBL652に書き込みます。

Windows10用のアプリケーション・ソフトウェアはデータの送受信の節で紹介したGattWriteIndicate.zipです。また、Android携帯用のものはAndroid 携帯とBL652の間でデータの送受信の節で紹介したBL652_Android.zip(Android10携帯用)やBL652_Android13.zip(Android13携帯用)です。操作方法は、それぞれの節を参照してください。

アプリケーション・ソフトウェアを実行すると次の図のような画面が現れます。命令(前進の"f"か、後進の"b"か、左進の"l"(エル)か、右進の"")のうち1つの文字を以下のように上のボックスにタイプして送信(SEND)ボタンを押すと、与えた命令にしたがってOTTOが動きます。なお、上のボックスに複数の文字を入れた場合、その最初の文字だけが意味を持ちます。

 

4.注意事項

  サーボモータはPWM(Pulse Width Modulation)で制御します。4つのサーボモータを制御するためには独立した4つのPWMポートが必要です。BL652は3つのポートしかないようです。このため、PICで4つのポートを用意し、それをI2Cを経由してBL652で制御するという方法を採用しました。PICがI2CスレーブでBL652はマスターです。

BL652から命令データを送信してPICにOTTO動作を開始させます。OTTO操作には時間が掛かります。問題は、OTTO動作の完了をBL652がいかに知るかということです。BL652がPICからの完了データを待つために、普通クロック・ストレッチを利用すると思うのですが、うまく機能させることが出来ないでいます(データが読めない)。そこで、ソフトウェア・ハンドシェイクをすることにしました。

PIC用のI2CアプリケーションをMPLAB Code Configurator(MCC)で生成すると(MCCのインストール法はMCCのインストールに説明してあります )、EEPROMを模擬するファームウェアが生成されます。EMULATE_EEPROM_Memory[]配列の要素がメモリー内容に、そして配列のインデックスがメモリーアドレスに対応しています。なお、今回は(GB002_I2C_slave_OTTO.X.のなかでは)配列名を変えてbuf[]としています。

buf[3]をハンドシェイクに利用します。初期値は0xffです。アプリケーション・ソフトウェアからBL652に文字列をBluetooth送信します。BL652では、その文字列の最初の1文字だけ(命令データ)を取り出し、これをメモリーアドレス0、1、2に対して送信します。PICではそれらを受信してbuf[0]、buf[1]、buf[2]に書き込みます。その後、PICはOTTOを動作させ、それが完了したらbuf[3]=0x01とします(main.cの中のbuf[HANDSHAKE] = 0x01;)。BL652ではメモリーアドレス3を繰り返し読み、その値が0x01になるまでひたすら待ちます。0x01となったら、PICのOTTO動作が完了したと判断してメモリーアドレス0、1、2を空読みしします(応答データを受け取ることを予定していたのですが、今回は意味ある応答データがありませんので空読みとなります)。その後、応答データ受信完了をPICに知らせる目的でメモリーアドレス3に0x02を書き込みます。PIC側では、buf[3]が0x02になるまで待って、0x02になったら必要な初期化をして((main.cの中の address1 = 0; buf[HANDSHAKE] = 0xff;)、新たな命令データがBL652からメモリーアドレス0、1、2に送られてくるまで待ちます(main.cの中のwhile (address1 < 2);)。



市販のUSB-UART変換器:DTR信号線の有無

DTR信号線あり

  DTR信号線を引き出すことができるUSB-UART変換器として(秋月電子通商:FT232RL USBシリアル変換モジュールキット :K-06693)があります。ただし、すべての信号線は(DTR信号線も含め)必ず3.3V入出力に設定することが必要です。ジャンパーJ1とJ2での設定になります。付属の説明書や以下の写真を参照ください。なお、以下の写真のヘッダーピンは上から、DTR、RXD、TXD、CTS、RTS、GNDです。

BL652ブレークアウトボードの回路の写真で示したように、ボードのJ7の2つのスルーホール端子はタクトスイッチに青と白の線で配線しています。これら2つの線を外す必要はありません。白い線が配線されているJ7のスルーホール端子にFT232RLのDTR信号線を追加配線します。このスルーホール端子はBL652内部でプルダウンされているので、タクトスイッチを押さない状態では0Vになっています。青い線で配線しているJ7のスルーホール端子は常に3.3Vになっていますので、こちらにDTR信号線を配線してはいけません。必ずテスターで電圧を確かめてから配線に取り掛かりましょう。

以上の配線で、UwTerminalX上だけでBL652にファームウェアを書き込める状態にすることができるようになります。作業は次のようになります。
①UwTerminalXを起動します。
②UwTerminalX画面の上方に、DTRとBREAKというチェックボックスがあります。DTRのチェックをマウスで外すと、DTR信号線は3.3Vとなります(タクトスイッチを押すことと等価)。

➂BREAKにチェックをマウスで入れます(BL652ブレークアウトボードのリセットボタンを押すことと等価)。
④BREAKにチェックを外します(リセットボタンを離すことと等価)。
➄DTRにチェックを入れます(タクトスイッチを離すことと等価)。
⑥UwTerminalX画面の黒い箇所を右クリックしてサブメニューを表示させ、Clear Moduleを選択します。

以上の作業でBL652にファームウェアを書き込める状態になります。ファームウェアを書き込める状態にするためにDTR信号線を活用してUwTerminalX上だけで操作するか、あるいは(DTR信号線がそもそも引き出されていないUSB-UART変換器を使う場合も含めて)DTR信号線を使わず、J7に配線したタクトスイッチとBL652ブレークアウトボード上のリセットボタンを操作するか、どちらを選択するかは趣味の問題です。

ところで、このUSBシリアル変換モジュールを使用する場合デバイス・ドライバーが必要です。付属の説明書を参照ください。

DTR信号線なし

 DTR信号線が引き出されていないUSB-UART変換器として、(秋月電子通商:CH340 USBシリアル変換モジュールType-C)があります。この変換器を利用する場合、BL652ブレークアウトボードのJ7に配線したタクトスイッチとブレークアウトボード上のリセットボタンは必須になります。

このUSBシリアル変換モジュールの信号線は5Vで、そのままでは使用できません 。ただ、モジュールに搭載されているUSB-UART変換用IC(CH340E)は3.3Vでも働くので、3.3V出力の3端子レギュレータを使ってモジュールを改造すれば、信号線を3.3V入出力にすることができます。

改造方法:以下の写真のCUTと書かれた部分の銅箔をカットします。カット箇所の上方(①で示した箇所)にはUSBコネクタからの5Vが掛かります。この5Vを3端子レギュレータのINに接続します。カット箇所の下方はVCC端子(②で示した箇所)に繋がっているので、これを3端子レギュレータのOUTに接続します。そして、モジュールのGND端子(➂で示した箇所)を3端子レギュレータのGNDに接続します。なお、3端子レギュレータの入力とGND間、そして出力とGND間には、それぞれ適当な容量のコンデンサーが必要です。

モジュールと3端子レギュレータ間の配線は、以下の写真のようにモジュールの上面で行いました。なお、以下の写真のヘッダーピンは上から、RXD、TXD、CTS、RTS、GNDです。

ところで、このUSBシリアル変換モジュールを使用する場合デバイス・ドライバーが必要です。よくある質問(Q&A)を参照ください。

注意:PCがCH340 USBシリアル変換モジュールをUART機器として認識するためには、変換モジュールとBL652(あるいはBL652ブレークアウトボード)間の接続を切っておかないといけません。1度認識できたら、それ以降は両者を接続したままでかまいません。
原因:PCが変換モジュールをUART機器として認識しようとする時に、変換モジュールのRTSの電圧が下がっていると認識されません。変換モジュールをBL652(あるいはBL652ブレークアウトボード)に接続していると、変換モジュールのRTSの電圧が下がるのです。
対策:BL652ブレークアウトボードのCTSから変換モジュールのRTSへ電流が流れるような方向にショットキーバリア・ダイオード1SS106を入れたところ問題は解決しました。変換モジュールとBL652(あるいはBL652ブレークアウトボード)間の接続を保持したままでPCにきちんとUART機器として認識されます。



2つのBL652ブレークアウトボード間でデータの送受信

  BL652ブレークアウトボードとUSB-UART変換器を2組用意します。そして、2つのBL652ブレークアウトボードの一方をマスターとし、他方をスレーブとして、両者の間でデータの送受信(双方向通信)を行います。マスターは、スレーブを見つけBL接続をする方です。一方、スレーブは「俺はここにいるぞ」とアドバタイズ(宣伝)して、マスターに見つけて貰い、BL接続して貰らう方です。Peripheral/Central(双方向通信の場合に定義される)を参照してください。下図は接続イメージです(2つのUSB-UART変換器とパーソナル・コンピュータはデバック用ですので、デバック終了後は不要)。

  以下、GATTサーバーとかGATTクライアントなる用語が出てきます。スレーブは自分がどんなサービスを持っているかを記述したGATTデータベースを所有しているので、スレーブはGATTサーバーと呼ばれます。一方、マスターはスレーブが所有しているGATTデータベースを読み込むのでGATTクライアントと呼ばれます。GATT(双方向通信の場合に定義される)を参照してください。

なお、GATTデータベースに関しては、CQ出版社の「インターフェース」2013年5月号(あるいは、同社の「Bluetooth無線でワイヤレスI/O」の第3版の10章と11章)が参考になります。ハンドル番号に関する記述もあります。

  これまでは、BL652ブレークアウトボードは常にGATTサーバー(スレーブ)で、GATTクライアント(マスター)であるPCやAndroid携帯に見つけて貰らい、BL接続して貰っていました。したがって、GATTサーバー(スレーブ)用のファームウェアはすでにできており、後はGATTクライアント(マスター)用のファームウェアを作るだけです


2バイトデータの送受信

  2バイトデータを送受信するためのGATTサーバー用のファームウェアは、すでにLEDとSWの操作の節で作成済みです(BL600-Applicationsをダウンロード・解凍して得られるbtnled.gatt.server.sbを手直しして作成)。 したがって、あとはGATTクライアント用のファームウェアを作成すれば良いことになります。使えそうなファームウェアは、BL620-Applicationsをダウンロード・解凍して得られるbtnled.gatt.client.sbです。念のため、btnled.gatt.server.sbとbtnled.gatt.client.sbをLED_original.zipとして纏めておきます。なお、ファイル名に$autorun$.を付加していますが内容に変更はありません。

  さて、$autorun$.btnled.gatt.client.sbを若干手直しします。以下の2ヶ所です。

a.BL652ブレークアウトボードの入出力ポートに合わせて以下の部分を手直ししました。

#define GPIO_BTN0 11
#define GPIO_BTN1 15
#define GPIO_LED0 17
#define GPIO_LED1 19

b.ハンドル番号をbtnled.gatt.server.sbのGATTデータベースに合わせます。なお、GATTデータベースLED_BTN.xlsxは、すでにLEDとSWの操作の節で紹介しています。関係するハンドル番号は、0x10と0x13と0x11(10進数で、それぞれ16、19、17)です。

#define CLILEDS_CHAR_HANDLE (16)
#define SERLEDS_CHAR_HANDLE (19)
#define SERLEDS_CHAR_CCCD_HANDLE (17)

手直ししたGATTクライアント用のファームウェア($autorun$.btnled.gatt.client.sb)は、LED_server_client_2.zipの中にあります。また、BL652ブレークアウトボードの入出力ポートに合わせてLEDとSWの操作の節で手直ししたGATTサーバー用のファームウェア($autorun$.btnled.gatt.server.sb)も、この中に入れておきました。

操作方法:

1.2つのBL652ブレークアウトボード、それぞれにUSB-UART変換器を接続します。2つのUSB-UART変換器はパーソナル・コンピュータ(PC)のUSBポートに接続します。PCからは、2つのUART機器が接続されたように見えますので、対応する機器のポートが2つあるはずです。例えば、それらポートの番号を4番と5番とします。UwTerminalX.exeアイコンをマウスでダブルクリックしてUwTerminalXを起動した後、COM4に設定します。さらに、再度同じUwTerminalX.exeアイコンをマウスでダブルクリックして別のUwTerminalXを起動してた後、COM5に設定します。2つのUwTerminalX画面がPCに表示されますので、どちらがGATTクライアントで、どちらがGATTサーバーに対応しているのか混乱しないようにします。

2.GATTクライアントとしてのBL652ブレークアウトボードには、GATTクライアントに対応するUwTerminalX画面を使って$autorun$.btnled.gatt.client.sbを、GATTサーバーとしてのBL652ブレークアウトボードには、GATTサーバーに対応するUwTerminalX画面を使って$autorun$.btnled.gatt.server.sbを書き込み実行します。

3_1.GATTクライアンとしてのBL652ブレークアウトボードのタクトスイッチBTN1(BTN2)を押下すると、GATTサーバーとしてのBL652ブレークアウトボードのLED1(LED2)が点灯します。離すとLED1(LED2)が消灯します。

3_2.GATTサーバーとしてのBL652ブレークアウトボードのタクトスイッチBTN1(BTN2)を押下するとGATTクライアントとしてのBL652ブレークアウトボードのLED1(LED2)が点灯します。離すとLED1(LED2)が消灯します。

なお、GATTクライアンとGATTサーバーに対応するUwTerminalX画面のスナップ・ショットもLED_server_client_2.zipに入れておきました。


20バイトデータの送受信

  ここでは、20バイト(L2CAPデータ列は23バイトで、ここからATT命令の種別1バイトとハンドルの2バイトを引くと、送受信できる最大データ長は20バイトとなる)までデータを送受信できるようにしました。具体的には、LED_server_client_2.zipを手直して、LED_server_client_20.zipを作成しました。正確には、手直ししたのはGATTクライアント用のファームウェア($autorun$.btnled.gatt.client.sb)だけで、GATTサーバー用のもの($autorun$.btnled.gatt.server.sb)は、データの送受信の節で作成してあったものです。WinMergeなどのファイル比較ソフトでLED_server_client_2.zipLED_server_client_20.zipの中身を比較すると手直し部分が分かります。

操作方法:

1.2バイトの場合の操作方法の1.と2.を実行します。ただし、$autorun$.btnled.gatt.client.sb$autorun$.btnled.gatt.server.sbLED_server_client_20.zipに入っているものを使います。

2.GATTクライアントとしてのBL652ブレークアウトボードのタクトスイッチBTN1を押下すると20バイト文字列"12345678901234567890"(固定)がGATTサーバーに送信されます。GATTサーバーからは、送信した20バイト文字列の最初の1文字にアスキーコードで1を足したものが、つまり20バイト文字列"22345678901234567890"がGATTクライアントに送り返されて来ます。GATTクライアンとGATTサーバーに対応するUwTerminalX画面のスナップ・ショットもLED_server_client_20.zipに入れておきました。

注意1:UwTerminalXでデバック作業をしないときにはUSB-UART変換器を外しておきます。変換器を付けているとCTS信号が負論理でH(電圧で言えば0V)にならず、print文が実行できないからです。

注意2:今回作成したGATTクライアント用のファームウェアは、GATTサーバーが持っているGATTデータベース(LED_BTN.xlsx)の内容をあらかじめ知っていることを前提にしています。つまり、$autorun$.btnled.gatt.client.sbは、$autorun$.btnled.gatt.server.sb専用ということです。


20バイトデータの送受信の応用

  20バイトデータの送受信が可能となると、かなりひ弱ですが、PCやAndroid携帯の代わりにGATTクライアントとしてのBL652ブレークアウトボードを使うことができるようになります。例えば、Android 携帯でBME680の温度・気圧・湿度データを受信の節で、以下の写真に示す回路を作成し、Android 携帯とBL接続していました。

Android 携帯の代わりに、GATTクライアントとしてのBL652ブレークアウトボードを(ファームウェアに全く手を加えることなく)、そのままで使うことができます。GATTクライアントに対応するUwTerminalX画面のスナップ・ショットを以下に示します。温度22.8 ℃、気圧998.9 hPa、湿度53.9 %という数値がきちんと読み取られています。

その他の例として、PCやAndroid携帯の代わりにGATTクライアントとしてのBL652ブレークアウトボードを使って「OTTOの足」の様なハードを無線操縦するコントローラが考えられます。



戻る