androidスマートフォン・タブレットとBluetoothで無線接続する入出力装置(RN42XVP-I/RM使用)

●概要
 スマホ等から、離れたところにある機器の制御や、離れたところにあるセンサー等のアナログデータを取得することができるものです。制御出力は、on/off(デジタル出力)が3つ、PWMが4つです。入力(デジタル入力)は、on/offが3つ、アナログ入力が3つです。
 PWM出力は、LEDの明るさ調整などに利用出来ます。アナログ入力は、各種センサーをつなぐことで、A/D変換された値や、アナログセンサーの特性に応じた変換式を設定できます(1次式に限る)ので、温度などを直接表示し、スマホで確認することができます。
 このセットは、主に下記の3つの部分から構成されています。下記の入出力回路において、PIC(マイクロチップ社製マイコン)を用いています。
 1.Bluetooth モジュール
 2.入出力回路
 3.Androidアプリ

●使用する主要パーツリスト
部品名 型式等 数量
Bluetoothモジュール RN42XVP-I/RM 1個
Bluetoothモジュール変換基板 AE-XBee-REG-DIP1個
PIC 16F1827 1個
動作確認用LED 赤、緑 各4個
動作確認用タクトスイッチ 不明 3個
コンデンサ 100μF 1個
プルアップ用・A/D変換テスト入力用抵抗 10kΩ 5個
LED用抵抗 270Ω 1個

●使い方について
 1.作成した回路の電源を入れておく。緑色のLEDが点滅する。
 2.下記リンクから、BluetoothControl.apkをダウンロード、インストールする。
 3.アプリ上にて「接続」ボタンを押と、周囲で検出されたブルートゥース端末のリストが表示される。下記は参考画面です。
 4.作成した回路のBluetoothモジュールが表示されているはずなので、それをタップする。正常なら「接続されました」と表示されます。
 5.強制的に接続が遮断された場合など、モジュールの緑色のLEDが点滅していない場合は、接続することが出来ません。そこで、通信が滞った場合、強制的にリセットをかけるようにしています。
 6.接続されれば、自動的に入力値の表示がされます。また、端末操作により信号が出力されます。

●応用機能について(PWM組み合わせ保存機能)
 4つのPWM出力は、それらを3原色のLEDに接続して、リモコン照明に応用することも考え、設定を組み合わせて保存する機能を有しています。
 具体的には、PWM1(赤)、PWM2(緑)、PWM3(青)、PWM4(予備、黄色等)を4種類のそれぞれの設定値を4組登録・再現することができます。シークバーで各色の設定を行った後に、「設定1」等のボタンを長押しするとそのパターンが保存されます。「設定1」等のボタンを短く押すと、各色の設定値が再現されます。
 なお、長押しすることによって、ボタンの色が変わります。正確ではないですが、およそどのような色を登録したのか判別するためにボタンの色を変えています。
 それと、このPWMの設定値は端末側に保存しています。Bluetoothモジュール固有のアドレスも併せて保存しているため、多数の回路(Bluetoothモジュール)専用に、保存・再現することができます(寝室、リビングなど複数の照明を作った場合、それぞれ別の設定が可能)。

 画面レイアウトはかなり小さめに作っています。というのは、以前使っていた小型であるIDEOSをリモコン専用端末として再利用したかったためです。

●仕様について
 ・回路の電源電圧は3.3Vです。モジュールを載せているピッチ変換基板上に3.3Vレギュレータがありますので、5Vを供給すれば良いです。
 ・PWMの出力は、約8kHz、分解能10ビット(0〜1023)です。
 ・A/D変換入力は、分解能が10ビット(0〜1023)、サンプリングは毎秒5サンプル程度です。(A/D変換数値がふらつく場合、各入力とGND間に0.1μF程度のコンデンサを入れると比較的安定します。)
 ・BluetoothはSPPで通信を行っています。
 ・通信可能距離は、環境に左右されると思いますが、10m程度が限界とお考え下さい。
 ・端末アプリから、制御用コマンド・データ要求コマンドを送ると回路側が反応するようにしています。
  下記にコマンド、応答信号の説明がありますが、基本動作を確認するだけなら理解する必要はありません。アプリを自作する場合に必要となります。
 ・画面の向きを縦・横に変更すると、一時的に通信が途切れます。

●端末から送信するコマンドの種類
 ・on/off出力
     例1、 Command:DO1-0 (デジタル出力1のポートを0(=Lレベル)にする)
     例2、 Command:DO2-1 (デジタル出力2のポートを1(=Hレベル)にする)
    ※注意 コマンドの最後に0x00を付加すること。
 ・PWM出力
     例1、 Command:AO1-3ff (PWM出力1を100%とする)
          16進数で0x3ffは、10進数で1023であり、これが最大値である。
     例2、 Command:AO2-100 (PWM出力2を約25%とする)
          16進数で0x100は、10進数で256であり、最大値の約25%である。
    ※注意 コマンドの最後に0x00を付加すること。
 ・PWM出力一括設定(PIC側未実装)
     「Command:RGBA」に続いて3桁の16進数を4つつなげ、最後に0x00を送信する。
     例1、 Command:RGBA3ff3ff3ff3ff (PWM出力1〜4をすべて100%とする)
          16進数で0x3ffは、10進数で1023であり、これが最大値である。
     例2、 Command:RGBA100100100100 (PWM出力1〜4をすべて約25%とする)
          16進数で0x100は、10進数で256であり、最大値の約25%である。
    ※注意 コマンドの最後に0x00を付加すること。
 ・データの取得
    Command:Z
    ※注意 コマンドの最後に0x00を付加すること。
    これにより、デジタル入力、アナログ入力に加え、デジタル出力値、PWM出力値を一括で48バイトで表現して返送する(下記「回路から返答する信号の構造」参照)。

●回路から返答する信号の構造
 ・返信される信号は、48バイト(見やすいようにテキスト)で構成されている。
 ・先頭から、デジタル入力4バイト、デジタル出力4バイト、PWM出力16バイト、アナログ入力16バイト、空き7バイト、終端0(=null)となっている。
 ・デジタル入力
  本来、1バイトで8入力を判別することできるが、テキストとしたことから、1バイトで4入力とした。1バイトを使って'0'〜'f'を表現し、4ビット(入力)に割り当てている。合計4バイトを割り当てているが、このセットでは先頭の1バイトのみ使用している(しかも入力ポートが3つだけなので、先頭1バイトの'0'〜'7'の範囲で使用している)。
 ・デジタル出力
  デジタル入力と同様に、テキストで表現しているため、1バイトで4出力を割り当てている。出力ポートが4つであることから、先頭1バイトのみ使用している。
 ・PMW出力の設定値
  1出力あたり、4バイトを割り当て、4出力で16バイトを使用している。
  0〜1023を16進数で表現すると、'0x0'〜'0x3ff'であるが、4バイトに満たない場合は先頭に0を入れて、さらに、'0x'を除いて'0000'〜'03ff'として指定する。
 ・アナログ入力
  1ポートあたり、4バイトを割り当て、4ポートで16バイトを使用している(使用PICの制約から、使用しているのは3ポートであり、1ポートは空き。)。
  PWM出力と同様に、1ポートあたり、4バイトを割り当て、4ポートで16バイトを使用している。
  ※上記以外に端末と回路の組み合わせが正しいことを確認する認証用応答があります(詳細非公開)。
 
●Androidアプリについて
 ・現時点では、PlayStoreに登録できておりません。従って、私のHPから直接ダウンロードしていただく必要があります。この際、端末の「提供元不明のアプリ」のインストールを許可する必要があります。
 ・初めて作成したアプリであり、完成度は十分とはいえません。場合によっては強制終了されてしまうこともあります。
 ・万一、このアプリをインストールしたことによって端末の他の機能に影響が出ても補償いたしかねます。
 ・ソフトの内容(ソースファイル等)は、性質上非公開とさせて頂きます。
 ・全てのandroid端末(バージョン2.2.1以上)で汎用的に使用することができない可能性があります。購入前にインストール可能であることを確認することをおすすめいたします。
 ・端末の処理能力によっては正常に動作しない可能性があります。
 ・ダウンロードは「 このリンク 」から可能です。

●アナログ入力の変換式について
 アナログ入力値の換算式(1次式)の定数の設定や、単位表示等の設定が可能です(下記スクリーンキャプチャ4参照)。
 この設定は、3つ(4つ)のアナログ入力それぞれ個別に設定可能です。また、センサーのばらつきによる補正(下記bの値でオフセットを補正できます)としても活用できます。
 (例)温度センサーなどの特性に応じて表示数値を換算する必要がある場合、換算式の係数(下記a, b)を設定します。

      Y = aX + b     ( Y:表示数値、 X:入力(0〜1023)) において

    (例)電源電圧が3.3Vであり、アナログ入力が1Vの時に「100」を、アナログ入力が3V の時に「0」を表示させたい時。
        1V時 → X = 1023÷3.3 = 310
        3V時 → X = 1023÷3.3×3 = 930    となるので、

        a = (0 −100)÷(930−310) = −0.1613
        b = 0 − (−0.1613)×930 = 150    となる。

●アプリのカスタマイズ依頼について
 アプリのカスタマイズは、ごく一部に限って有償で承ります。
 ・対応可能の事項
  1.アナログ数値の文字サイズ変更
 ・対応できない事項
  1.バグの修正(標準アプリは可能な限りバージョンアップしていきます(カスタマイズアプリを除く)。)
  2.アイコンの変更
  3.ボタンの追加
  4.ボタンの削除
  5.機能の追加等


●派生バージョン等について
  ・アナログ入力に特化したサンプリング速度を向上させたもの(アナログ3入力のみで約50サンプル/秒)も試作しております。専用のPICと専用のアプリ(BluetoothAnalog.apk)の組み合わせで使用します。
  ・BluetoothモジュールとしてRN42XVP-I/RMではなく、「RN-42使用 Bluetooth無線モジュール評価キット」(AE-RN-42)でも同様の動作が確認できております。回路図は本HPの最下段にあります。
   AE-RN-42の方がやや高価ですが、ピッチ変換基板が不要、3.3Vの取り出しが容易、小型実装が可能等のメリットがあります。





回路図(Bluetoothモジュールとして「AE-RN-42」を使用する場合はこのページ末を参照)


回路写真1


回路写真2


回路写真3(○で囲った部分は、ピッチ変換基板から3.3V電源を取り出している線)


スマートフォン写真1(最新バージョンではありません)


タブレット写真(最新バージョンではありません)



スクリーンキャプチャ1(Bluetoothがオフの場合、オンを促すダイアログが表示される。)


スクリーンキャプチャ2(左上の「接続」ボタンを押すと、デバイスの一覧が表示される。)


スクリーンキャプチャ3(接続完了後の画面。アナログ1は電圧、アナログ2,3は温度、アナログ4は非表示としています。)


スクリーンキャプチャ4(アナログ入力2の設定画面。変換式の定数a,b等を設定する。温度センサーMCP9701用の定数を設定。)


Bluetoothモジュールとして「AE-RN-42」を使用した場合の回路図(+5Vの供給はこのHPの写真を参照


●オークション関係トップページへ(他にもいろいろと出品しています)
●PIC関連の出品物の入札を考えている方に(必ずお読み下さい)