2016年06月14日

シリアル通信の無線化 -第4回:作成

はじめに

お久しぶりです。多少はブログのネタもできてきたので、更新を再開しようかと思います。
ただし今までのように定期的な更新を行うのではなく、今後も不定期で更新しようと思ってます。
 

目次

 

1. おさらい

Bluetoothの使用方法はプロファイルというルールで決められており、SPP(Serial Port Profile)というプロファイルを使えばBluetoothでシリアル通信を行うことができます。RN-42はSPPに対応していますので、Bluetoothが載っているパソコンなどとシリアル通信を行えます。またRN-42にはシリアル通信のピンがありますので、有線でArduinoを繋ぐことができます。(図1)
 
June13_Bluetooth-SPP.png
図1 作成物概要
 
このようなものを作ります。
 

2. 実装

ハードウェア

図2が作成した回路です。
 
Wireless-LCD.png
図2 回路図
 
Arduino Unoは5[V]でRN-42は3.3[V]ですので、それらの間にはIC3(レベルシフタFXMA108)があります。これで5[V]-3.3[V]の変換を行います。また、RN-42用の電源としてIC4(三端子レギュレータTA48M033F)を使っています。
 
シリアル通信の線はArduinoのD10とD11に接続します。ですので、シリアル通信はソフト的に行います。
 
シリアル通信を行うだけならこれでいいのですが、それだけだと面白くないので以前作成したキャラクタ液晶(DIS1)も接続し、通信内容を表示できるようにします。
 
 
この程度の回路なら実装はブレッドボードでもできますが、基板設計の練習を兼ねてEagleで設計し、ユニクラフトに発注して、基板を作りました。
上にある部品がキャラクタ液晶、右下にある部品がRN-42です。Arduinoシールドとして使用できるように設計しています。
 
P2280374.jpg
図2 回路図
 
これで回路設計と基板実装ができました。
 

ソフトウェア

シリアル通信を行うだけなら、Software.Serialライブラリを使えば動かすことができます。
キャラクタ液晶で作成したスケッチをソフトウェアシリアル化したスケッチが以下です。
/* 使用しているライブラリ
 * 作者名:TOMO. "I2C液晶のArduinoライブラリ – ST7032". サイト名:オレ工房. http://ore-kb.net/archives/195, (参照日:2016-01-17)
 */

#include <Wire.h>
#include <ST7032.h>
#include <string.h>
#include <SoftwareSerial.h>

// initialize the library with the numbers of the interface pins
ST7032 lcd;
SoftwareSerial mySerial(10, 11); // RX, TX

int i, n, n1=0, n2=0;
char str1[30]="", str2[30]="";

void setup(){
  // set up the LCD's number of columns and rows: 
  lcd.begin(8, 2);
  lcd.setContrast(27);
  // initialize the mySerial communications:
  mySerial.begin(9600);
}

void loop()
{
  // when characters arrive over the mySerial port...
  if (mySerial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
    
    //1行目の文字列を2行目に移動
    strcpy(str2, str1);
    n2=n1;

    // read all the available characters
    i=0;
    while (mySerial.available() > 0) {
      // display each character to the LCD
      str1[i]=mySerial.read();
      i++;
    }
    str1[i]='\0';
    n1=i;

    //2行のうち、文字数が多い方を採用
    if(n2 > n1){
      n=n2-7;
    }
    else{
      n=n1-7;
    }

    lcd.clear();
    lcd.home();
    lcd.setCursor(0,0);
    lcd.print(str1);
    lcd.setCursor(0,1);
    lcd.print(str2);
  }
  // clear the screen
  
  //8文字以上の場合スクロール処理
  if(0<n){
    delay(1500);
    for(i=0; i<n; i++){
      //スクロール処理中にシリアル受信をしたらbreak
      if (mySerial.available()) {
        break;
      }
  
      lcd.scrollDisplayLeft();
      delay(500);
    }

    //breakによる脱出でなければスクロールを先頭に戻す
    if(i==n){
      delay(1000);
      if (mySerial.available()==0) {
        lcd.clear();
        lcd.home();
        lcd.setCursor(0,0);
        lcd.print(str1);
        lcd.setCursor(0,1);
        lcd.print(str2);
      }
    }
  }
}
 

3. 動作確認

では実際にBluetoothでシリアル通信を行います。
まず、パソコンとRN-42を接続します。画面でRNBT-4703と表示されているのがRN-42ですので、これとBluetoothで接続します。
 
2016-06-11 (4).png
図3 Bluetooth接続画面
 
あとは有線と同じようにポートを接続し、シリアル通信できます。
今回使用しているRN-42モジュールはシリアル通信の接続状態を示すためのLEDが実装されています。切断時は点滅、接続時は点灯します。
 
  

まとめ

Bluetooth SPPを使うことで、Arduinoのシリアル通信を無線化することができました。
  

Bluetooth無線でワイヤレスI/O [ トランジスタ技術編集部 ]

価格:2,808円
(2016/6/14 10:07時点)
感想(0件)

posted by ました at 10:08| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック