上位に戻る Windows10へのアップグレード 初版2019/08/01
改版2019/11/02

重さを量って、単位あたりの重さが同じものの数量を測定したかった。ケーブルの長さや、部品の個数など。
電子天秤を使って Bluetooth で、Androidと、接続して、スマホで計量しようという作戦です
電子天秤 ほぼインターフェースは、今時ですが、RS-232Cのシリアル通信しか売ってません。 232CをBluetoothに変換するアダプター売ってますが
天秤は、高いは、このアダプタも高い!で、作ってみることに

  1. HC-06 Bluetoothアダプタと、CP2102 USB→TTLシリアルアダプタ

    アマゾンだと、上記のユニット1000円以下で販売されていましたので早速購入してテストしました
    USBのシリアルアダプタでなくても、PCに232Cのインターフェースがあるんでしたら、記事の後半に書いていますレベルコンバータで接続する
    方法もあります(どの道、レベルコンバータは必要ス)

    同じシリーズで、HC-05は、親にもなれるし、子にもなれるようです。値段あんまり変わらないので、HC-05のほうがよかったかも
    です。理由 現状の設定内容をHC-05は、読み出せる。HC-06は、設定できるのみです
    HC-06の設定は、ペアリングされてない状態で、シリアル接続で、ATコマンドを送って設定します
    皆目やったことないので、まず、パソコンと接続し、設定と、Androidスマホとの通信を確認してみます

    買ったのは、HiLetgo の HC-06 と、DSD TECH の USB to TTL DSD TECH サイト




    コネクタケーブル付いているし、電源は、USBから供給されるので、挿すだけダス

    CP2102USBtoTTL は、自動でドライバが入らないので、パソコンにまずドライバをインストール

    Silicon Laboのページからダウンロード

    デバイスを指して認識すればok  
    デバイスマネージャで確認すると、COM3として認識しています



    通信ソフトとして、パソコンには、TeraTernをインストールしました スマホには、Serial Bluetooth Terminalをインストールしました







    アダプタのデフォルトが、速度が、9600 8bit パリティなしなので、設定をあわせます
    Serial Bluetooth Terminal側のの文字コードもあっているか確認します

    ATと入力してOKと帰れば通信できています



    HC-06の設定コマンドですが、以下を参考に適当に試してみます
    ※以下の電子天秤 EK-i シリーズは、デフォルトの通信速度は、2400bps   ビット長は7bit 偶数パリティです
     天秤側の設定をHC-06側に合わせるか、HC-06側を天秤に合わせる必要があります
    1.ATコマンドセット
     ATコマンドモードへの道:モジュールに電源を供給し、ATモードに入ります
     ペアリングする必要はありません。コマンドの間隔は約1秒です。
     デフォルトパラメータ:ボーレート:9600bps、ID:HC-06、パスワード:1234
     通信テスト
     送信:AT(毎秒送信してください)
     戻る:OK

    2. Bluetoothシリアルボーレートをリセットします。
     送信:AT + BAUD1
     戻る:OK1200
     送信:AT + BAUD2
     戻る:OK2400
     ……
     1 --------- 1200
     2 --------- 2400
     3 --------- 4800
     4 --------- 9600(デフォルト)
     5 --------- 19200
     6 --------- 38400
     7 --------- 57600
     8 --------- 115200
     9 --------- 230400
     A --------- 460800
     B --------- 921600
     C --------- 1382400
     PCは115200よりも大きいボーレートをサポートできません。解決策は次のとおりです。MCUのボーレートを高くする。
     プログラミングによって(115200より大きい)率、およびATによってボー・レートを低レベルにリセットして下さい
     コマンド。
     ATコマンドでリセットされたボーレートは、電源を切っても次回から保持することができます。
     オフ。

    3. Bluetooth名をリセットします
     送信:AT + NAMEname
     戻る:OKname
     パラメータ名:設定が必要な名前(20文字以内)
     例:
     送信:AT + NAMEbill_gates
     戻る:OKname
     これで、Bluetooth名が「bill_gates」にリセットされました
     電源を切ってもパラメータは保持されます。ユーザーは新しいBluetoothの名前を見ることができます
     PDAリフレッシュサービスで。 (注:名前は20文字以内に制限されています。)

    4. Bluetoothペアパスワードを変更する
     送信:AT + PINxxxx
     戻る:OKsetpin
     パラメータxxxx:設定する必要があるペアパスワードは4ビットの数字です。このコマンドは使用可能です
     マスターおよびスレーブモジュールで。場合によっては、マスターモジュールに
     マスタモジュールがスレーブモジュール(アダプタまたは携帯電話)に接続しようとしたときのパスワード。場合のみ
     パスワードを入力すると、正常な接続が確立されます。他の機会に、ペアは終えることができます
     マスタモジュールが適切なスレーブモジュールを検索でき、パスワードが正しい場合は自動的に
     ペアリングされたスレーブモジュール以外に、マスターはスレーブモジュールを持つ他のデバイスを接続することができます。
     Bluetoothデジタルカメラ、Bluetooth GPS、Bluetoothシリアルプリンタなど。
     例:
     送信:AT + PIN8888
     戻る:OKsetpin
     その後、パスワードは8888に変更され、デフォルトは1234です。
     このパラメータは、電源を切っても保持されます。

    5.パリティチェックなし(V1.5以上のバージョンではこのコマンドを使用できます)
     送信:AT + PN(これはデフォルト値です)
     戻る:OK

    6.奇数パリティチェックを設定します(V1.5より高いバージョンでは、このコマンドを使用できます)。
     送信:AT + PO
     戻る:わかりました
    7.偶数パリティチェックを設定します(バージョンV1.5以上でこのコマンドを使用できます)
     送信:AT + PE
     戻る:OK EVEN


     
    で、スマホとペアリングさせます。ペアリングすると、LEDの点滅が連続点灯に変わります
    スマホ側で、Serial Bluetooth Terminalを起動します








    てな感じで、通信できるようになれば、テストOK 後は、アプリを作ってみるよん


  2. アプリを作ってみよう

    さて開発環境どうしようか? 過去に、Eclipseを使ってアプリを作ったことがあったし、過去のソースデータも参考にしたかった
    ので、Eclipseをインストールしてみたが、Andoroidの開発環境を起動するとエラーになる!!どうやら、2015年から、Android SDK
    のサポートが打ち切りになって、Googleが提供しだした Android Studioに移行してしまったようです
    仕方ないので、Android Studioをインストール(IEでは、DLできません) 使いなれた、MSのVisual Studioでも作れるので、これも
    試してみました。

    EclipseのソースをAndroid Studio移行できるとあったので、色々試してみたが、エラー続出でNG
    Visual Studioは、他のプラットフォームが、javaなのに対して C言語 使っている人少なそうで参考サイトが少ない
    やっぱ王道 Android Studioしか仕方ない・・・・・。でも、過去のソース参考にしたいので、Eclips をあがいてみた
    どうやら、Eclips側では、JAVA SDKのパスが通っているが、Android SDKからは、見えていない状況 別途passを設定して起動
    できるようにはなってソースは参照できるようになった やれやれ でも、何かが足らないらしくコンパイルは、できない
    (たぶんAPIのレベルが低すぎるのかも・・・)


    てなわけで、Android Studioでつくることに
    しかし、作り方完全に忘却の世界に行っちまってます・・・・・・。




    Bluetoothは、使ったことが無かったので、参考サイトを探していましたところ、まさにバッチリなのが、ありました
    コマンド送って、受け取る仕組み まさに、このままじゃん!! しかも HC-06 使ってるし!!

    https://android.keicode.com/basics/bluetooth-rfcomm-socket-2.php
    https://iot.keicode.com/arduino/bluetooth-android.php

    まるっぽコピーしてしまいました・・・。スイマセン 労せずです 感謝!

    取りあえず、まだ電子天秤買う前に、動かせるかのテストを実施することに

    TeraTermから模擬コマンド送って数量を表示できるところまで確認しました


    変更点
    電子天秤ですが、エーアンド・デイのEK-iシリーズが、一番安そうだったので、これをターゲットにしました

    コマンドモードで、
    要求コマンド Q+CR+LF(Q+改行) を送信
    応答で、   ST,+001234.5 gCRLF が帰ってきます

    なので、

    String command = "Q\r\n";
    outputStrem.write(command.getBytes());
    Thread.sleep(1000);


    を送出後、1Secタイマーを持たせています
    もとは、受信後、3Secタイマーになっていましたが、これだと、試したところ
    データ受信すると、readが帰ってきますが、頭 2〜3文字しかバッファーに入っておらず
    もう一度ポーリングすると、残りを受信します
    なので、受信後のタイマーを削除して、送信後にタイマーを入れました

    又、文字コードが、ASCIIコード(懐かしい響き・・・)なので、UTF-8を止めて、ASCIIに変更

    try {
    s = new String(buff, "US-ASCII");
    } catch (Exception e) {
    e.printStackTrace();
    return;
    }


    後、終了時には、Bluetoothの接続を切る必要があります。Finishとかで終わってもセッション持った
    ままになるので、次に起動したときに接続できないことになります
    戻るボタンで、以下を記載していますが、onDestroy のほうがよいと思われます
    if(bluetoothSocket != null){
    try {
    bluetoothSocket.close();
    } catch (IOException e) {}
    bluetoothSocket = null;
    }
    finish();


    ここでえらい問題が inputStream は、値が入らないと帰ってこないようで、天秤の電源が切れていた場合に
    outputStremを送ったあと、値が帰らない為、後から天秤の電源を入れても 待ち状態となります
    又、何らかの通信不具合でも同様の現象になります
    なので、sleepして、inputStreamが利用可能な状態か確認することで回避しました
    別スレッドで動作させてタイムアウトで抜けるようにしようかと画策しましたが難しすぎて挫折
    なんとか、以下でできました
    // Read Response
    String s="";
    if (inputStream.available() != 0) {
    int incomingBytes = inputStream.read(incomingBuff);
    byte[] buff = new byte[incomingBytes];
    System.arraycopy(incomingBuff, 0, buff, 0, incomingBytes);
    s = new String(buff, "US-ASCII");
    }

    26項目分の数量を設定できます。項目数おおいので、レイアウト作るのめんどいので、プログラムでレアイウト生成した
    かったのですが、複雑すぎて断念しました(ボタンのみを並べるなどは以前作ったことあるんすが・・・・・。)

    作ったソフト 実行ファイル

    ※デバイス名は、hello 固定です 設定部分は作っていません。(DLして、ほぼ使われることない思われるので


  3. さて、次は、実際に電子天秤につないで見ましょう

    ヤフオクで探してみたら EK-3000i 動作未確認 ACアダプタなし 1500円でジャンク品がありました。取りあえずゲットしました
    Bluetoothのユニットは、TTLレベルなので、RS232Cとは電圧レベルが合わないので、変換が必要になります
    また、接続ケーブルも必要になります

    コンバータは、NULSOM のNS-RS232C を購入しました 天秤側は、オスコネクタなので、メスコネクタタイプで直結したかったの
    ですが、ピン配列が、送信受信が逆になります
    オスタイプを購入してメスメスストレートケーブルを注文しました


    天秤側













    てな感じでテスト中です
    実機でテストしたら、受信時に文字化けが発生 Sと、数字の0は正常 それ以外の文字が化けてました
    原因は、天秤側が、データビットが、7bit + 1bitパリティ 最初、HC-06側でのデータビット設定の仕方が判らなかったので
    天秤側を 8bit パリティなしに設定しました


    HC-06ユニットは、輸入品で、実際の利用には、技術基準適合証明を受ける必要があります
    又は認証済み無線モジュールを購入する必要があります







    以上間違い等ありましたら、以下ご意見箱にお願いします

   

    ご意見箱