クラウド型 ワークフロー

電光掲示板で業務の状況をモニタリングする ~とりあえず1桁~

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

電光掲示板に業務のステータス情報を表示することを考えます。例えば問い合わせ対応プロセスにおける「現在対応中の件数」、受注プロセスにおける「月ごとの受注件数」など、単純な件数でも電光掲示板に解りやすく表示することができれば、パソコンの画面よりも社内へのインパクトは(たぶん)絶大です。

今回は前回作成した仕組みを、7 セグメント LED を使うように変更します。7 セグメント LED とは、以下のような7 本の LED を使って数字(場合によっては英字)を表示する部品です。7 セグメント LED実際には小数点を表す LED を含めて、8 本の LED で構成されています。これを使えば、いかにも「電光掲示板」という雰囲気になります。世の中には複数桁に対応した部品もあるのですが、1桁ずつバラの部品を購入しましたので、今回はとりあえず1桁表示できるようにします。

まずちょっとした基本的事項です。ダイオードには、アノードとカソードという2つの端子があり、アノードからカソードの方向にしか電流を流しません。電流が流れた時に発光する性質を持ったダイオードが、 LED (発光ダイオード) です。ダイオードでは、アノードが陽極でカソードが陰極です。以下の写真ように、LED は長さが違う2つのリード線を持ち、長い方がアノード、短い方がカソードとなっています。

LED

7セグメント LED はリード線の長さに違いはないのですが、やはりアノードとカソードを持ちます。またそれぞれのセグメントに対応したリード線も決まっています。私が購入した 7 セグメント LED は調べたところ、以下の対応になっていました。

7 segment LED anode cathode

上下の中央がカソード。残りの8本が各セグメントに対応したアノード。2つのカソードのいずれかを Arduino のマイナス側(GND)につなぎ、いずれかのアノードをプラス側につないで電圧をかけると、対応する LED が発光します。

さて Arduino との接続を行います。まずカソードを抵抗経由で GND につなぎます。LED は使用電圧以上に電圧をかけると壊れることもあるらしいのですが、購入した7セグメント LED の使用電圧が解らず、適当に 330Ωの抵抗を入れました。330Ωという数字に、深い意味はありません。これを入れても十分に明るかったので、そのまま使っています。

続いて c を除いて、a から h のアノードを Arduino のデジタル入出力ピンの2番から順につなぎます。

  • 2 → a
  • 3 → b
  • 4 → d
  • 5 → e
  • 6 → f
  • 7 → g
  • 8 → h

デジタル入出力ピンには 0番と1番もあるのですが、これらはシリアル通信の入出力に使われるため、使用しません。これで Arduino と 7 セグメント LED の接続は終了です。

続いて Arduino に読み込ませるスケッチ(プログラム)を添付します。ポイントは以下の部分です。

int table[10][7] =
  {{HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW},  // 0
   {LOW,LOW,HIGH,HIGH,LOW,LOW,LOW},      // 1
   {HIGH,HIGH,LOW,HIGH,HIGH,LOW,HIGH},   // 2
   {LOW,HIGH,HIGH,HIGH,HIGH,LOW,HIGH},   // 3
   {LOW,LOW,HIGH,HIGH,LOW,HIGH,HIGH},    // 4
   {LOW,HIGH,HIGH,LOW,HIGH,HIGH,HIGH},   // 5
   {HIGH,HIGH,HIGH,LOW,HIGH,HIGH,HIGH},  // 6
   {LOW,LOW,HIGH,HIGH,HIGH,LOW,LOW},     // 7
   {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH}, // 8
   {LOW,LOW,HIGH,HIGH,HIGH,HIGH,HIGH}};  // 9

...

// 数字の表示
void print(int n){
  if(n < 0 || n > 9){
    clear();
    return;
  }
  for(int i = 0; i < 7; i++){
    digitalWrite(i + 2, table[n][i]);
  }
}

table 変数は 2次元配列で、index に対応した数字に対して、どの出力を HIGH にするか、LOW にするか管理しています。print 関数は引数で指定された数字で table を検索し、その内容に応じて、デジタル出力ピンの出力を HIGH または LOW に設定しています。デジタル出力ピンの0番からではなく2番から使用しているので、 i +2 を指定しています。

シリアル通信については前回とほぼ同じなのですが、以下の部分だけ変えています。
前回はデータを文字列として処理していましたが、今回は数値として処理しています。

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

それにあわせて PC 側の Java プログラムも変わっているので添付します。
変わっているのは以下です。こちらも文字列ではなく、数値としてデータを送るようにしています。

while (true) {
  //Questetra BPM Suite と通信して、プロセス数を取得
  int count = getCount();

  //Arduino にプロセス数を送信
  output.write(count);
  output.flush();

  //5分スリープ
  Thread.sleep(1000 * 60 * 5);
}

以下は動作させた時の様子です。ちょっとケーブルが邪魔ですね。ご容赦ください。もちろん次回は、桁数を増やすことに取り組みます。7 segument LED is running

 

 

あわせて読みたい
15.野望・展望・志 の前の記事 BPMフォーラム2013 ハッピでプレゼン編
15.野望・展望・志 の次の記事 ソフト会社のクラウド戦略2013
Hatanaka Akihiro の他の記事 業務プロセスで「翻訳こんにゃく」を使う

アーカイブ

 RSS