大型7セグメントディスプレイの作り方

大型7セグメントディスプレイの作り方

・電源電圧9~12V(12V鉛バッテリー可)
 電圧が低いほど輝度が低くなる
 輝度調節したいときは電圧を変更する
・最大電流 
 電源電圧9Vの時約0.1A
 電源電圧12Vの時約0.4A

コロン用LEDは180度回転させて時計として使用するための物
コロンとドットのLEDは並列接続されているのでどちらか一方だけしか使えない


2016-03-30

表面
・部品はLEDのみ
・LEDの向きは必ず足の長さで区別する 
 この写真では 左がプラス(足が長い)。右がマイナス
 コロンのLEDは45度傾いている 左下がプラス(足が長い)。右上がマイナス
・コロンLEDとドットLEDは同時点灯するため同時には使用できない
 回転計多機能版に接続するときはソフトウェア上使用されていないためコロンは使用できない
 コロンの使用例はGPS時計の記事を参照

R0032218.jpg

裏面
・赤いディップスイッチは表示する桁を決定するための物
・ISCPはプログラムを書き込むための端子なので何も取り付けない
・INPUT側の信号入力ソケットの足は折れやすいので基板とソケットを両面テープで貼り付けてから半田付けするとよい
・左下にある5Vは回転計多機能版を使用するときは使わない
 電流をあまり必要としない機器はこれを使用して良い。50mA程度取り出せる

R0032230.jpg

連結したところ
・回転計多機能版はこの写真左側に接続する
・連結ソケット経由で流せる電流は4A程度が限界なので8連が限界
 それ以上にしたいときは12V電源を電線で配線する
・最後尾のOUTPUTピンはショートの原因になるので取り付けない
・ソケットの代わりに電線で配線してもよい。但し長くしすぎないこと

R0032217.jpg

DIPスイッチと回転計の桁の関係

R0032234.jpg
dipsw.png

配線:
 各桁はIN<->OUTを相互接続
 回転計多機能版V2とは基板左下コネクタと接続
 
 回転計多機能版V2 大型ディスプレイ
 -------- --------
  GND      GND
  CLK      CLK   (シルク印刷はC)
  DAT      DATA  (シルク印刷はD)
  ENABLE   ENABLE(シルク印刷はE)

 回転計多機能版V2のピン配置はこの順番に並んでいる
 ENABLEはLED5と共通のためLED5は使用できなくなる

R0028944.jpg
R0032050.jpg

左:裏面に実装する部品は外形が黄色で文字も裏文字、表面に実装する部品は灰色(表面はLEDのみ)
右:裏面から見た部品の配置

brdlarge7seg.png

部品表

buhinhyo.png

集合抵抗は向きに注意して下さい。基板の白い印刷で四角く囲んであるのが1番ピンです。印刷が異なる物が入っていることがありますが●が1番ピンの位置を意味します

R0032449.jpg
プログラムなど暫定版
ファイル ファイルタイプ 添付ファイルの解説
7SEG_MODULE_REV2_EAGLE.zip EAGLE 回路図&プリント基板レイアウト
7segdisplayMikrobasic.zip mikroBasic プログラムソース含む一式 CHECKSUM 6FDF
7SEG_MODULE_REV2.pdf PDF 回路図 PICの周波数20MHzは誤り。正しくは16MHz

*************************** ここより下は 回転計多機能版以外で使用したいときの開発者向け情報 ***********************************

この大型ディスプレイは回転計多機能版V2に接続して使用することを想定したものですがArduino等で使用することも可能です

サンプルスケッチの配線。これに加えてディスプレイに9~12Vの電源供給。Arduinoには5V電源供給

R0032439.jpg
Sample1 0~9を表示するプログラム

ENABLE,DATA,CLOCKの関係
1.ENABLEをHIGH->LOWにする
2.CLOCKの立ち上がりでデータを受け取る方式なのでDATAをセットしてからクロックを立ち上げる
3.データは高位ビットから送信する
4.送信が終わったらENABLEをLOW->HIGHにする ENABLEがHIGHになっている間はクロック、データが変化しても何も起こらない
0001  /*------------------------------------------------------------------*/
0002 /* Large LED display sample */
0003 /*------------------------------------------------------------------*/
0004 #define LED7SEG_ENABLE 12
0005 #define LED7SEG_DATA 11
0006 #define LED7SEG_CLOCK 10
0007
0008 #define DISPLAY_ID 0
0009
0010 #define CMD_NORMAL 0b00010000
0011 #define CMD_NORMAL_DP 0b00100000
0012 #define CMD_CODE 0b01110000
0013 #define CMD_ID 0b10000000
0014
0015 #define CMD_ASCII 0
0016 #define CMD_MAX7219 1
0017 #define CMD_ASCII_ROTATE 2
0018 #define CMD_MAX7219_ROTATE 3
0019
0020 //------------------------------------------------------------------------------
0021 // external LARGE LED display
0022 //------------------------------------------------------------------------------
0023 void led7seg_write( unsigned char data )
0024 {
0025 digitalWrite(LED7SEG_CLOCK,1);
0026 delayMicroseconds(1);
0027 digitalWrite(LED7SEG_ENABLE,0);
0028 for( unsigned char i = 0 ; i < 8 ; i++ ) {
0029 digitalWrite(LED7SEG_CLOCK,0);
0030 if( (data & 0x80) == 0x80 ) {
0031 digitalWrite(LED7SEG_DATA,1);
0032 } else {
0033 digitalWrite(LED7SEG_DATA,0);
0034 }
0035 data <<= 1;
0036 delayMicroseconds(10);
0037 digitalWrite(LED7SEG_CLOCK,1);
0038 delayMicroseconds(10);
0039 }
0040 digitalWrite(LED7SEG_ENABLE,1);
0041 delayMicroseconds(15);
0042 }
0043
0044 //------------------------------------------------------------------------------
0045 // setup
0046 //------------------------------------------------------------------------------
0047 void setup() {
0048 pinMode(LED7SEG_ENABLE, OUTPUT);
0049 pinMode(LED7SEG_CLOCK, OUTPUT);
0050 pinMode(LED7SEG_DATA, OUTPUT);
0051
0052 digitalWrite(LED7SEG_ENABLE,1);
0053
0054 delay(1000);
0055 led7seg_write( CMD_ID | CMD_CODE | DISPLAY_ID );
0056 led7seg_write( CMD_ASCII );
0057 delay(10);
0058 }
0059
0060 //------------------------------------------------------------------------------
0061 // loop
0062 //------------------------------------------------------------------------------
0063 void loop() {
0064 for( unsigned char num = 0 ; num <=9 ; num++ ) {
0065 led7seg_write( CMD_ID | CMD_NORMAL_DP | DISPLAY_ID );
0066 led7seg_write( num + '0' );
0067 delay(500);
0068 }
0069 }
行番号
解説
4-5
Arduinoとの接続は上の配線図を参照
15-18
ASCIIコードを送信するモードとMAX7219互換モードがある ASCIIコードはあらかじめ定義された文字しか表示できない MAX7219モードに制限はない
15
表示するデータがASCIIコードで送られてくることを大型ディスプレイに通知する
16
表示するデータがASCIIコードで送られてくることを大型ディスプレイに通知する。加えて表示を180度回転させる
17
表示するデータがMAX7219コードで送られてくることを大型ディスプレイに通知する
18
表示するデータがMAX7219コードで送られてくることを大型ディスプレイに通知する。加えて表示を180度回転させる
23-42
データを1バイト送信するサブルーチン
54
大型ディスプレイが起動する前にデータを送信してはいけないのでディレイを入れる必要がある
54-55
データは2バイト単位で送り込む 1バイトの制御コードに続けてデータを1バイト送る
55
6ビット目から4ビット目が全部1だとこの後に制御用コードが続いて送られてくると大型ディスプレイは理解する。この行ではDISPLAY_IDだけが変数。ディップスイッチで設定したIDと下位4ビットが一致したディスプレイのみが反応する
56
表示するデータをASCIIコードで送ることを宣言する
57
コードを変更したときは10msec待つ必要がある。大型ディスプレイがコード変換テーブルを生成するための時間として必要
65
DPを点灯する
66
ASCIIコードを送信する
Sample2 何を表示するものなのかは添付のMOVIEを参照

MAX7219コード互換モードのデータとセグメントの関係
6bit-segment A
5bit-segment B
4bit-segment C
3bit-segment D
2bit-segment E
1bit-segment F
0bit-segment G
0001  /*------------------------------------------------------------------*/
0002 /* Large LED display sample 2 */
0003 /*------------------------------------------------------------------*/
0004 #define LED7SEG_ENABLE 12
0005 #define LED7SEG_DATA 11
0006 #define LED7SEG_CLOCK 10
0007
0008 #define CMD_NORMAL 0b00010000
0009 #define CMD_NORMAL_DP 0b00100000
0010 #define CMD_CODE 0b01110000
0011 #define CMD_ID 0b10000000
0012
0013 #define CMD_ASCII 0
0014 #define CMD_MAX7219 1
0015 #define CMD_ASCII_ROTATE 2
0016 #define CMD_MAX7219_ROTATE 3
0017
0018 #define Digit_0 0x7E
0019 #define Digit_1 0x30
0020 #define Digit_2 0x6D
0021 #define Digit_3 0x79
0022 #define Digit_4 0x33
0023 #define Digit_5 0x5B
0024 #define Digit_6 0x5F
0025 #define Digit_7 0x70
0026 #define Digit_8 0x7F
0027 #define Digit_9 0x7B
0028 #define Digit_E 0x4F
0029 #define Digit_F 0x47
0030 #define Digit_U 0x3E
0031 #define Digit_u 0x1C
0032 #define Digit_L 0x0E
0033 #define Digit_C 0x4E
0034 #define Digit_P 0x67
0035 #define Digit_Y 0x3B
0036 #define Digit_A 0x77
0037 #define Digit_a 0x7D
0038 #define Digit_r 0x05
0039 #define Digit_n 0x15
0040 #define Digit_d 0x3D
0041 #define Digit_t 0x0F
0042 #define Digit_G 0x5E
0043 #define Digit_b 0x1F
0044 #define Digit_i 0x04
0045 #define Digit_l 0x30
0046 #define Digit_NON 0x00
0047 #define Digit_o 0x1D
0048 #define Digit_S 0x5B
0049 #define Digit_h 0x17
0050 #define Digit_H 0x37
0051 #define Digit_c 0x0D
0052 #define Digit_J 0x3C
0053 #define Digit_US 0x08
0054 #define Digit_MINUS 0x01
0055 #define Digit_DP 0x80
0056
0057 //------------------------------------------------------------------------------
0058 // external LARGE LED display
0059 //------------------------------------------------------------------------------
0060 void led7seg_write( unsigned char data )
0061 {
0062 digitalWrite(LED7SEG_CLOCK,1);
0063 delayMicroseconds(1);
0064 digitalWrite(LED7SEG_ENABLE,0);
0065 for( unsigned char i = 0 ; i < 8 ; i++ ) {
0066 digitalWrite(LED7SEG_CLOCK,0);
0067 if( (data & 0x80) == 0x80 ) {
0068 digitalWrite(LED7SEG_DATA,1);
0069 } else {
0070 digitalWrite(LED7SEG_DATA,0);
0071 }
0072 data <<= 1;
0073 delayMicroseconds(10);
0074 digitalWrite(LED7SEG_CLOCK,1);
0075 delayMicroseconds(10);
0076 }
0077 digitalWrite(LED7SEG_ENABLE,1);
0078 delayMicroseconds(15);
0079 }
0080
0081 //------------------------------------------------------------------------------
0082 // setup
0083 //------------------------------------------------------------------------------
0084 void setup() {
0085 pinMode(LED7SEG_ENABLE, OUTPUT);
0086 pinMode(LED7SEG_CLOCK, OUTPUT);
0087 pinMode(LED7SEG_DATA, OUTPUT);
0088
0089 digitalWrite(LED7SEG_ENABLE,1);
0090
0091 delay(1000);
0092
0093 //------------ ASCII CODE MODE ---------------------------------
0094 led7seg_write( CMD_ID | CMD_CODE | 0 ); // display id = 0
0095 led7seg_write( CMD_ASCII );
0096 delay(100);
0097 //------------ MAX7219 CODE MODE ---------------------------------
0098 led7seg_write( CMD_ID | CMD_CODE | 1 ); // display id = 1
0099 led7seg_write( CMD_MAX7219 );
0100 delay(100);
0101 }
0102
0103 //------------------------------------------------------------------------------
0104 // loop
0105 //------------------------------------------------------------------------------
0106 void loop() {
0107 for( unsigned char num = 0 ; num <= 9 ; num++ ) {
0108 led7seg_write( CMD_ID | CMD_NORMAL | 0 ); // display id = 0
0109 led7seg_write( num + '0' );
0110
0111 led7seg_write( CMD_ID | CMD_NORMAL_DP | 1 ); // display id = 1
0112 switch( num ) {
0113 case 0: led7seg_write( Digit_A ); break;
0114 case 1: led7seg_write( Digit_U ); break;
0115 case 2: led7seg_write( Digit_u ); break;
0116 case 3: led7seg_write( Digit_d ); break;
0117 case 4: led7seg_write( Digit_P ); break;
0118 case 5: led7seg_write( Digit_H ); break;
0119 case 6: led7seg_write( Digit_h ); break;
0120 case 7: led7seg_write( Digit_US ); break;
0121 case 8: led7seg_write( Digit_MINUS ); break;
0122 case 9: led7seg_write( Digit_L ); break;
0123 }
0124
0125 delay(500);
0126 }
0127 }
行番号
解説
-
Sample1との主要な違いだけを解説
95
ID=0 のディスプレイはASCIIモード
99
ID=0 のディスプレイはMAX7219モード
109
0~9を表示
111
DPを点灯
113-122
A U u d P H h _ - L w を順番に表示
Arduinoで使用するときのサンプルスケッチ
ファイル ファイルタイプ 添付ファイルの解説
LED7SEGtest.zip arduino Sample1スケッチ
LED7SEGtest1.wmv MOVIE Sample1が動いているところ
LED7SEGtest2.zip arduino Sample2スケッチ
LED7SEGtest2.wmv MOVIE Sample2が動いているところ
7LED_LARGE7SEG.zip ----- 点灯パターンを確認するための表計算ソフト OpenOffice CALC odsファイル

=======================================================
 回転計多機能版から送られてくるコード体系の仕様
=======================================================
・1文字につき2バイト送信されてくる
・最初の1バイトが制御コード、次の1バイトが表示する文字コード
・大型ディスプレイの文字コードはASCIIコードとMAX7219文字コードの2種に対応しているが
 回転計からはMAX7219のコードが送られてくる
 ASCIIコードは回転計多機能版を使わない人用
・制御コード
  0~3ビット 表示する桁。つまりDIPスイッチで設定した値
  4~6ビット 1:通常表示
         2:ドット付き表示
         7:コードテーブル生成など特殊動作
         0,3~6は未使用、輝度変更などの計画があったが没になった
  7ビット   制御コードのなのか文字コードなのかを表すもの
         このビットが1なら制御コード
         つまり文字コードは7ビット目が常に0
・制御コードが特殊動作を意味するときはそれに続く1バイトは表示する文字コードではなく
  0:ASCIIコードの変換テーブルを生成する
  1:MAX7219コードの変換テーブルを生成する <-回転計多機能版ではこれを使っている
  2:ASCIIコードの上下反転テーブルを生成する(ディスプレイを上下反転させて使う場合)
  3:MAX7219コードの上下反転テーブルを生成する(ディスプレイを上下反転させて使う場合)
  4:タイム計測プログラムのみ使用されている。ゴールした時にこのコードが送られてくる 表示上は何も変わらない タイム計測プログラムV5.01以降で対応
 変換テーブルは処理高速化のため。テーブルが無いと現在の文字表示を処理している間に次のデータが送られてきてそれを取りこぼす
 テーブルが無いと表示できないので回転計の電源投入時にこのコードが送られてくる
・回転計からはその桁の表示値に変更があった場合のみデータが送られてくる
 表示値が変わらない場合、送信は無駄になるので送っていない