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) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2016年02月21日

今後の更新

普段でしたら日曜日に更新するのですが、試しに更新日を金曜日に変更してみようと思います。
ですので、次の更新日は2月26日(金)です。
更新日の連絡だけというのも寂しいので、今後記事として扱うだろう内容を紹介します。
 

Bluetoothによるシリアル通信

BluetoothモジュールRN-42とキャラクタLCD AQM0802を実装できるプリント基板を作成しました。
これを使って、シリアル通信を無線化しようと思っています。
 
P1000569.jpg
 

カラーLED

カラーLED PL9823を光らせてみました。ネットで検索すると「電源ラインに外付け抵抗を入れる」回路例が見つかりますが、色々調べてみると外付け抵抗は不要な気がしています。
 
P1000565.jpg
 
現在更新中のキャラクタLCDを終えたら、これらの記事を書こうかなと思っています。
posted by ました at 18:41| Comment(0) | TrackBack(0) | その他 | このブログの読者になる | 更新情報をチェックする

2016年02月14日

文字表示器 -第7回:主な関数

はじめに

前回は表示に関すること(位置やスクロール)などを説明しました。今回はLCDを扱うためのライブラリにある関数をいくつか紹介します。
なお、Arduinoにも標準でLCDライブラリがありますが、Arduino標準のライブラリは日立製LCD HD44780と互換性のあるLCDに対応したライブラリです。一方、使用するLCD AQM0802はHD44780と互換性がありません。そのため、AQM0802を扱うためにオレ工房さんが作成されたライブラリを使います。ですので今回紹介する関数の内、一部はArduino標準のLCDライブラリに含まれていません
 

目次

 

1. 初期設定に関する関数

キャラクタLCDを使うために、一番最初に呼びだす関数です。
 

begin()

キャラクタ液晶の設定や通信の初期化を行います。キャラクタ液晶を使用する前に呼びだします
begin()関数では使用するキャラクタLCDの文字数と行数を設定します。AQM0802は8文字×2行なので、以下のように設定します。
lcd.begin(8, 2);
 

setContrast() 

キャラクタ液晶のコントラスト値を設定します。※この関数はオレ工房さんが作成されたライブラリに含まれており、Arduino標準のライブラリには含まれていません
lcd.setContrast(27);
 
P1000540.jpg
図1 コントラスト値40
 
P1000541.jpg
図2 コントラスト値27
 

2. 表示に関する関数

キャラクタLCDに文字を表示したり消したりする際に呼びだす関数です。
 

print()

文字を表示します。
lcd.print("abcde");
 
P1000541.jpg
図3 print()関数による表示
 

clear()

表示を消します。
lcd.clear();
 
P1000545_2.jpg
図4 clear()関数による消去
 

3. 表示位置に関する関数

キャラクタLCDに表示する範囲や文字の入力位置(=カーソル位置)を変更できる関数です。
 

home()

左上が(0,0)となるように表示範囲とカーソル位置を動かします。
lcd.home();
 
feb02_AQM0802_6.png
図5 home()関数による表示範囲
 

setCursor()

文字を表示するカーソル位置を指定します。
lcd.setCursor(1,0);
lcd.print("abcde");
 
P1000542.jpg
図6 setCursor()関数の使用例
 

scrollDisplayLeft(), scrollDisplayRight()

表示範囲を左右に一字ずらします。文字を表示するカーソル位置を指定します。
lcd.setCursor(39,0);
lcd.print("zABCDE");
 
P1000544.jpg
図7 スクロール前
 
lcd.scrollDisplayLeft();
 
P1000545.jpg
図8 scrollDisplayLeft()関数による左スクロール
 
lcd.scrollDisplayRight();
 
P1000546.jpg
図9 scrollDisplayRight()による右スクロール
 

まとめ

キャラクタLCDを使うためにはこれらの関数を使用します。関数は他にもありますが、それらの関数は使う際に紹介します。
次回はシリアル受信した文字列をキャラクタLCDに表示させようと思います。
 

参考資料

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

サインスマート RFID マスターキット モーターサボー、LCD、多種のセンサー Arduino IDE/AVR/MCU勉強者用

価格:11,300円
(2016/2/14 10:44時点)
感想(0件)

タグ:Arduino LCD
posted by ました at 16:58| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする