2016年02月26日

文字表示器 -第8回:シリアル通信の表示

はじめに

今回は今まで行ったことを組み合わせてシリアル通信で受信した文字列をキャラクタLCDに表示させます。
  

目次

 

1. 仕様検討

おおまかな仕様を考えます。
  • キャラクタLCDはAQM0802(8文字×2行)を使用
  • シリアル受信した文字列をLCDの1行目に表示
  • LCDの2行目には前回受信した文字列を表示
  • 文字数が8文字以上の場合はスクロール表示
  • 例外処理(受信した文字数が非常に多い、非対応文字の受信など)は行わない
以上の仕様を満たすように作成します。
 

2. ハードウェア

回路は文字表示器の第4回で作成した回路と同じです。
 
jan24_LCD回路図.png
図1 文字表示器回路図
 
部品の実装についてですが、今回はブレッドボードでなくプリント基板に実装しました。設計はEagleで行い、製造はユニクラフトさんに発注して行いました。
 
P1000569.jpg
図2 文字表示器基板
 
部品がいくつか実装されていますが、下部にあるのはBluetoothモジュールと周辺部品ですので文字表示器とは関係ありません。その内Bluetoothで受信した文字列を表示できるようにしたいと思っています。
 
これでハードウェアの実装は完成です。
 

3. ソフトウェア

作成したスケッチと簡単な説明を載せます。
  • シリアル通信にて文字を受信すると、文字を表示する処理を行う
  • できるだけ受信してから表示の間隔を短くするために、スクロール処理中はこまめに受信バッファをチェックしている
 
ソースコードを表示するには下記をクリックしてください。
/* シリアル通信によるキャラクタLCD制御
 * 
 * シリアル受信した文字列をキャラクタLCD AQM0802に表示する。
 * 1行目には現在受信した文字列、2行目には前回受信した文字列を表示する。
 * 文字数が8文字以上の場合はスクロールを行う
 * 
 * 作成日:2016-02-26 作者:ぱなぺー http://play-arduino.seesaa.net/
 */
#include <Wire.h>
#include <ST7032.h> //作者:TOMO,  Web:"オレ工房" http://ore-kb.net/archives/195
#include <string.h>

ST7032 lcd;

/*
 * str1, str2:1行目と2行目に表示する文字列
 * n1, n2:str1とstr2の文字数
 * n:スクロール回数
 */
int i, n, n1=0, n2=0;
char str1[30]="", str2[30]="";

void setup(){
  //LCDとシリアル通信の初期化 
  lcd.begin(8, 2);
  lcd.setContrast(27);
  Serial.begin(9600);
}

void loop()
{
  //シリアル受信した場合、1行目に今受信した文字列を、
  //2行目に前回受信した文字列を表示
  if (Serial.available()) {
    delay(100); //シリアル受信待機
    
    //前回受信した文字列を2行目にコピー
    strcpy(str2, str1);
    n2=n1;

    //受信した文字列を読み込み、文字数をカウント
    i=0;
    while (Serial.available() > 0) {
      str1[i]=Serial.read();
      i++;
    }
    str1[i]='\0';
    n1=i;

    //スクロール回数の計算
    if(n2 > n1){
      n=n2-7;
    }
    else{
      n=n1-7;
    }

    // LCD表示処理
    lcd.clear();
    lcd.home();
    lcd.setCursor(0,0);
    lcd.print(str1);
    lcd.setCursor(0,1);
    lcd.print(str2);
  }
  
  // スクロール処理
  if(0<n){
    delay(1500); //スクロール開始時は1.5[sec]表示
    for(i=0; i<n; i++){
      //スクロール処理中にシリアル受信をした場合、スクロール処理を中断
      if (Serial.available()) {
        break;
      }
  
      lcd.scrollDisplayLeft();
      delay(500); //スクロール中は0.5[sec]表示
    }

    //スクロールを先頭に戻す ※シリアル受信をした場合、スクロールを先頭に戻さない
    if(i==n){
      delay(1000); //スクロール終了時は1.0[sec]表示
      if (Serial.available()==0) {
        lcd.clear();
        lcd.home();
        lcd.setCursor(0,0);
        lcd.print(str1);
        lcd.setCursor(0,1);
        lcd.print(str2);
      }
    }
  }
}
 

4. 動作確認

実際に動かしている動画です。文字数が8文字未満の場合はそのまま表示し、8文字以上の場合はスクロールしているのが分かると思います。
 
 

まとめ

これでシリアル通信にて受信した文字列をキャラクタLCDに表示することが出来ました。
次回はシリアル受信時の処理を割り込み処理で行うようにしたいと思います。
 

参考資料

  1. 作者名:TOMO. "I2C液晶のArduinoライブラリ - ST7032". サイト名:オレ工房. http://ore-kb.net/archives/195, (参照日:2016-02-26)
  2. 作者名:Arduino. "LiquidCrystal Library". サイト名:Arduino. https://www.arduino.cc/en/Reference/LiquidCrystal, (参照日:2016-02-26)
 

ボクのArduino工作ノート改訂版 [ 鈴木哲哉 ]

価格:2,646円
(2016/2/26 14:16時点)
感想(0件)

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

メールアドレス:

ホームページアドレス:

コメント:

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

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