7セグメントLEDシリアルドライバモジュールを表示させる(2/2)

〔1/2〕 〔Arduinoの動かせ方入門に戻る〕


前ページ(1/2)では7セグメントLEDシリアルドライバモジュールの基本編を書きました、
このページでは7セグメントLEDを複数個配線した場合の話を書きます。
尚、7セグメントLEDとPIC16F1829の話はこちらを参照下さい。

《7セグメントLEDが複数個編》

複数個と書きましたがここでの例は3個で記述しますが、何個でも同じ様な感じです。
スケッチも複数個に対応しています。

7セグ3個の実態配線図
電源はArduinoからの5Vを使用。
Arduino UNOの12番ピンはSPIのSDIピンだが配線無しです、
又、他の機能ピンとして利用出来ません

スケッチについて

IDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。
---------------------------------------------------------------------
#include "pins_arduino.h"
#include <SPI.h>

void setup() {
     SPI.begin() ;                         // SPIを行う為の初期化
     SPI.setBitOrder(MSBFIRST) ;           // ビットオーダー
     SPI.setClockDivider(SPI_CLOCK_DIV8) ; // クロックをシステムクロックの1/8で使用(16MHz/8)
     SPI.setDataMode(SPI_MODE0) ;          // クロック極性0(LOW) クロック位相0(LOW)
     digitalWrite(SS,LOW) ;                // SS(LATCH)ラインをLOWにする

     SevenSEG_Erase(3) ;                   // 7セグ表示を消去する
     delay(3000) ;                         // 3秒後開始
}
void loop() {
     int i ;

     // 整数値"0〜100"までを表示させる
     for (i=0 ; i<=100 ; i++) {
          SevenSEG_NumOut(3,0,0,i) ;
          delay(500) ;
     }
     // 浮動小数値を"7.46"表示させる
     delay(2000) ;
     SevenSEG_NumOut(4,2,0,7.456) ;
     while(1) ;                   // 処理中断
}
void SevenSEG_Erase(unsigned char kosu)
{
     int i ;
     
     digitalWrite(SS, LOW) ;
     for (i=0 ; i<kosu ; i++) {
          SPI.transfer(0x00) ;
     }
     digitalWrite(SS, HIGH) ;     // ラッチ信号を出す
}
void SevenSEG_NumOut(unsigned char digit,unsigned char prec,unsigned char zero,double val)
{
     const unsigned char NumPatternData[] {
          0b00111111 , // 0
          0b00000110 , // 1
          0b01011011 , // 2
          0b01001111 , // 3
          0b01100110 , // 4
          0b01101101 , // 5
          0b01111101 , // 6
          0b00000111 , // 7
          0b01111111 , // 8
          0b01101111 , // 9
          0b10000000 , // .
          0b01000000 , // -
          0b00000000 , // 空白
     } ;
     char buff[16] ;
     int  len , i , flg ;

     flg = 0 ;
     // 数値を文字列に変換する
     dtostrf(val, digit, prec, buff) ;
     len = strlen(buff) - 1 ;
     digitalWrite(SS, LOW) ;
     for (i=len ; i>=0 ; i--) {
          switch (buff[i]) {
            case '-' :        // マイナス記号処理
               SPI.transfer(NumPatternData[11]) ;
               break ;
            case ' ' :        // 先頭の空白処理
               if (zero == 1) SPI.transfer(NumPatternData[0]) ;  // ゼロ
               else           SPI.transfer(NumPatternData[12]) ; // スペース
               break ;
            case '.' :
               flg = 1 ;
               break ;
            default :
               if (flg == 1) {
                    // 小数点有り時の場合
                    flg = 0 ;
                    SPI.transfer(NumPatternData[buff[i]-0x30] | NumPatternData[10]) ;
               } else {
                    // 通常時
                    SPI.transfer(NumPatternData[buff[i]-0x30]) ;
               }
          }
     }
     digitalWrite(SS, HIGH) ; // ラッチ信号を出す
}
---------------------------------------------------------------------
又、↓ここから上記サンプルスケッチファイルをダウンロード出来ます。
SevenSEG.zip

解凍すると下の様に展開されます。
[SevenSEG]------- SevenSEG.ino

ArduinoIDE 1.8.1 がインストールされているフォルダー、インストール先を変更していないなら
[C:\Program Files\arduino-1.8.1\libraries]です。
この場所に上記解凍ファイルを[SevenSEG]ディレクトリ丸ごと移動します。

SevenSEG.ino

サンプルのSevenSEG.inoを開くには、
IDEを起動して、メニューバーの「ファイル」→「スケッチブック」→「SevenSEG」
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みをします。

実行させると約3秒後に整数値"0〜100"までを表示させ、 約2秒後に浮動小数値"7.46"を表示させます。

関数の使い方を説明します。

SPIの関数に関してはArduinoの標準ライブラリを使っているので詳しくは、”Arduino 日本語リファレンス”を参照下さい。
尚、以下の関数はライブラリ化をしていないので使う場合はコピッペして下さい。

 void SevenSEG_Erase(unsigned char kosu)
  7セグLEDの表示を消す処理
   kosu : 7セグLEDの実装した個数(今回なら3となります)

 void SevenSEG_NumOut(unsigned char digit,unsigned char prec,unsigned char zero,
               double val)

  7セグLEDに指定の数値を表示させる処理
   digit : 表示させる数値の桁を指定する(小数点有りなら桁に含む)
       "123"を表示させるなら3指定、"12.3"を表示させるなら4を指定します。
       指定した桁は実装した7セグLEDと同じか少ない数値となります。
       例えば、実装が"3"で桁指定2なら右詰めとなり先頭表示はzero引数にて指示します。
   prec : 0で整数指定、それ以外は小数点の位置を指定
       例えば、 "2.34"なら2を指定しますが、"234"なら0となります。
   zero : ゼロパディング指定、0=空白 1=ゼロで埋める
   val  : 表示を行う数値を指定する
       整数値又は、浮動小数値を指定出来ますが、数値から文字列への変換はdtostrf( )関数に
       従います、尚、左詰めには未対応です。

《その他》

実験風景
左写真は実験時の風景です。

やっぱり離れた所から数値を見るにはこれに限りますね〜ぇ。
写真の様にデジタルピンやアナログピンが余っていますねぇ、
これでぇ他のセンサー等の接続や制御も可能ですね。

又、Arduino Zero(Mo) Proの3.3Vボードでも行って見ました。
動作は出来ます、但しスケッチの変更が必要です。



[前ページ”7セグメントLEDが1個編”へ]





【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.