Arduino 9) 4連 Digital Tube LED Displayを試す
2019.02.28
![](http://randol-news.net/img/1551282401-s.jpg)
注文してから1ヶ月以上かかりました。長かった・・orz
![](http://randol-news.net/img/1551282213-s.jpg)
左からVCC、SCLK、RCLK、DIO、GND
この5ピンを接続し、SCLK、RCLK、DIOの3ピンで制御します。
![](http://randol-news.net/img/1551361932-s.jpg)
基本配線は上記でいいと思います。
![](http://randol-news.net/img/1551282346-s.jpg)
どうせなら変化があったほうが面白いので
前回の可変抵抗を読み取って表示することを踏まえて配線しています。
![](http://randol-news.net/img/1626106133-s.jpg)
LED文字には各パーツごとに光るようになっています。
それらを組み合わせて人間が数字として読み取れるように
場所を指定し光らせます。
ビットが0なら光る。1なら消えるを意味します。
つまり
0なら 0b11000000
1なら 0b11111001
2なら 0b10100100
3なら 0b10110000
4なら 0b10011001
5なら 0b10010010
6なら 0b10000010
7なら 0b11111000
8なら 0b10000000
9なら 0b10010000
といった2進数コードを使用します。
ではコーディングですが、いちから作るのは面倒なので、
どこぞから拾ってきたものをカスタマイズして仕上げました。
//接続するピンを設定する
#define SCLK 3
#define RCLK 4
#define DIO 5
byte digitBuffer[4]; //キャラ数(文字数を設定)この配列に入れた数字がそのまま表示される。
void setup(){
pinMode(RCLK, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(DIO, OUTPUT);
}
void loop()
{
digitBuffer[0] = 1; //1文字目に1を表示
digitBuffer[1] = 2; //2文字目に2を表示
digitBuffer[2] = 3; //3文字目に3を表示
digitBuffer[3] = 4; //4文字目に4を表示
showDisplay();
}
//表示するために関数を定義
void showDisplay(){
const byte digit[10] = {
0b11000000,//0
0b11111001,//1
0b10100100,//2
0b10110000,//3
0b10011001,//4
0b10010010,//5
0b10000010,//6
0b11111000,//7
0b10000000,//8
0b10010000 //9
};
const byte chr[4] = {
0b00001000,//1
0b00000100,//2
0b00000010,//3
0b00000001,//4
};
for(byte i = 0; i <= 3; i++)
{
digitalWrite(RCLK, LOW);
shiftOut(DIO,SCLK,MSBFIRST, digit[digitBuffer[i]]);
shiftOut(DIO,SCLK,MSBFIRST, chr[i]);
digitalWrite(RCLK, HIGH);
delayMicroseconds(1000);
}
}
![](http://randol-news.net/img/1551282143-s.jpg)
無事光りました。
では可変抵抗の値を表示するプログラムに改造してみたいと思います。
int Denatu = 0;
int OutNum = 0;
int StackNum = 0;
//接続するピンを設定する
#define SCLK 3
#define RCLK 4
#define DIO 5
byte digitBuffer[4]; //キャラ数(文字数を設定)この配列に入れた数字がそのまま表示される。
void setup(){
Serial.begin( 9600 ); //シリアルモニタを使うときの儀式
pinMode(13, OUTPUT); //ボードのLEDを使用する
pinMode(RCLK, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(DIO, OUTPUT);
}
void loop()
{
//digitalWrite(13, HIGH); //LEDを光らせる
Denatu = analogRead(0); //A0ピンの電圧を測る0(0V)~1023(5V)
if (Denatu != StackNum) { //前回と値が違うときだけ処理を行う
Serial.println(Denatu); //シリアルモニタに値を出力
OutNum = Denatu;
//4文字目に数字を表示
digitBuffer[3] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで4ケタが3ケタにシフトする。
//3文字目に数字を表示
digitBuffer[2] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで3ケタが2ケタにシフトする。
//2文字目に数字を表示
digitBuffer[1] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで2ケタが1ケタにシフトする。
//1文字目に数字を表示
digitBuffer[0] = OutNum % 10; //10で割ってあまりを求める。
//結果を4LEDに表示
showDisplay();
//今回の電圧を記録する。
StackNum = Denatu;
}
delay(Denatu); //読み取った値分処理を止める1023=1.023秒
digitalWrite(13, LOW); //LEDを消す
delay(Denatu); //読み取った値分処理を止める1023=1.023秒
}
//表示するために関数を定義
void showDisplay(){
const byte digit[10] = {
0b11000000,//0
0b11111001,//1
0b10100100,//2
0b10110000,//3
0b10011001,//4
0b10010010,//5
0b10000010,//6
0b11111000,//7
0b10000000,//8
0b10010000 //9
};
const byte chr[4] = {
0b00001000,//1
0b00000100,//2
0b00000010,//3
0b00000001,//4
};
for(byte i = 0; i <= 3; i++)
{
digitalWrite(RCLK, LOW);
shiftOut(DIO,SCLK,MSBFIRST, digit[digitBuffer[i]]);
shiftOut(DIO,SCLK,MSBFIRST, chr[i]);
digitalWrite(RCLK, HIGH);
delayMicroseconds(1000);
}
}
赤字の部分はこの仕組のキモで、
可変抵抗の4ケタまでの数字を分解して4つのLEDに表示する。
プログラマーを長くやっていると定番のアルゴリズムですが、
ここでも役立つとは思いませんでした。
では実行。
表示がオカシイ。
値が1024でも一桁目の4しか正常に表示しない。
他の桁はチカチカしてしまう。
いろいろソースを変えて試してみたけど
Delayで処理を止めるとその間だけ表示も止まっているようだ。
今の所解決方法が見つからない。
よく使われる部品でこんなトラブルとはがっかり(;´Д`)