クラウド型 ワークフロー

電光掲示板で業務の状況をモニタリングする ~3桁に拡張~

業務状況を電光掲示板でモニタリングする仕組みを考えます。 前回に引き続き、稼働プロセス件数を 7セグメントLEDに表示するように改良します。今回は 3 桁表示に対応です。

電光掲示板に業務のステータス情報を表示することを考えます。例えば問い合わせ対応プロセスにおける「現在対応中の件数」、受注プロセスにおける「月ごとの受注件数」など、単純な件数でも電光掲示板に解りやすく表示することができれば、パソコンの画面よりも社内へのインパクトは(たぶん)絶大です。 前回、7 セグメント LED を使うように変更しましたが、1桁にしか対応していませんでした。今回は 3 桁に拡張します。 まずおさらいです。全体としての仕組みは、これまでの章と同じです。PCに Questetra BPM Suite と通信するプログラムを置き、Arduino とは USB シリアル通信でやり取りします。Arduino と通信する PC 側のプログラムは前章と同じものを使います。 QBPMS and Arduino 続いて Arduino 側で使用する7セグメントLEDの入力端子を再掲します。a から h のアノードと、2つあるカソードのいずれかと電圧差が発生すると、対応する LED が発行します。つまり1つの7セグメントLEDを制御するのに、8 つのリード線(cを除くアノード7つとカソード1つ)を、Arduino の端子と接続する必要があります。7セグメントLED を3つ使えば3桁に拡張できるのですが、Arduino UNO は 3 x 8 = 24 の端子を持っていません。工夫が必要になります。 7 segment LED anode cathode 全てを記載していませんが、配線は以下の通りです。3つある7セグメントLEDの h のアノードは、全て同じ Arduino の端子に接続します。c を除く a-g のアノードについても同じように、それぞれまとめて、同じ Arduino の端子に接続します。ただこの方法では、アノードに関しては、3つの 7 セグメントLED に同じ信号しか送ることができません。そこでカソードは別々の端子に接続し、カソードを制御することで、どれか1つの 7 セグメント LED のみ数字を表示できるようにします。つまりあるタイミングでは、3桁のうちのどれか1つ、「1の位」「10の位」「100の位」のいずれかしか表示しません。 その上で、プログラムで表示する桁を高速に切り替えるようにします。瞬間瞬間では1桁しか表示されないのですが、プログラムで表示桁を高速に切り替えることで、人間の目には、あたまかも同時に3桁の数字が見えるようにします。 7 segment LED wiring そのスケッチ(Arduino のプログラム)を添付します。表示桁を切り替えながら繰返し表示する処理は、標準の loop() 関数の中で処理せず、タイマーを使って実現します。添付のプログラムでは、MsTimer2 というライブラリを使用しています。MsTimer2 は Arduino が持つタイマー機能を、使いやすくまとめたライブラリです。タイマー機能を使って、5ミリ秒おきに updateDisplay() 関数を呼ぶように設定しています。

// 表示桁
int digit = 0;

// 表示する数値
int displayNumber = 888;

void setup(){
  ...

  //タイマーの初期化
  MsTimer2::set(5, updateDisplay);
  MsTimer2::start();
}

// どれか1桁の数字を表示する処理
void updateDisplay(){
  // 数字の表示をクリア
  clear();

  // 表示桁の変更
  changeDigit();

  // 表示桁で表示すべき数字の計算
  int d = 0;
  switch(digit){
    case 0:
      // 1の位
      d = displayNumber % 10;
      break;
    case 1:
      // 10の位
      d = displayNumber / 10 % 10;
      break;
    case 2:
      // 100の位
      d = displayNumber / 100;
      break;
    default:
      return;
  }

  // 数字の表示
  print(d);
}

// 表示桁の変更
void changeDigit()
{
  // 表示桁の変更
  digit ++;
  digit %= 3;

  // カソードの出力を変更
  for(int i = 0; i < 3; i++){
    if (i == digit){
      digitalWrite(11 + i, LOW);
    } else {
      digitalWrite(11 + i, HIGH);
    }
  }
}

3つの7セグメントLEDで表示させたい数字は、グローバル変数 displayNumber で管理しています。表示桁は、グローバル変数 digit で管理しています。updateDisplay() 関数では、関数が呼ばれる時には「1」「10」「100」の位の、いずれかの数字しか表示する処理を行いません。

  1. いったん表示している数字をクリア
  2. 表示桁を変更し、それにあわせてカソードの出力を変更 (changeDigit 関数で処理)
  3. 表示桁で表示すべき数字を計算
  4. 数字にあわせてアソードの出力を変更して、数字を表示 (print 関数で処理)

この処理を 5 ミリ秒置きに繰り返し行うようにしています。 あとは前回のプログラムとほぼ同じです。loop() 関数の中で、シリアル通信で受け取った数字を、グローバル変数 displayNumber に設定する処理を行っています。

void loop(){
  //シリアル通信でデータを受信したら
  if (Serial.available() > 0) {
    int value = Serial.read();
    displayNumber = value;
  }
}

いかがでしたでしょうか。以下は動作している時の写真です。配線が複雑なので、ケーブルがごちゃごちゃしています。本格的にはハンダ付けとかするのでしょうが。。。次はセンサーと Questetra BPM Suite の連携にチャレンジしたいと思います。three 7 segument LED is running   ★関連ブログ投稿

あわせて読みたい
15.野望・展望・志 の前の記事 業務改善に必要な3つの「素養」
15.野望・展望・志 の次の記事 何のために、創るのか?
Hatanaka Akihiro の他の記事 業務プロセスで「翻訳こんにゃく」を使う

アーカイブ

 RSS