大阪の日本橋にあるデジットさんで売られているレンズ付き7セグメントLEDをArduino Nanoで動かすための基板と方法について紹介します!
きっかけ
MakerFairKyoto2019のデジットさんのブースで面白い7セグLEDが売られていました。しかも5個入り100円という安さ。デジットBlogでも紹介されていました→ デジットBlog:レンズ付き7セグメントLEDを紹介します!
ネットでは今の所売られていないようです。
さっそく開けてみると裏側のパターンがすごい。11本のピンが出ています。
動作確認しようとArduino Nanoを取り出し無事に光らせることが出来ました。で、サイズがArduino Nanoと同じくらいだなと...
ということで、Arduino Nanoと重ねて使えるための基板を作ってみることにしました。
部品選定
使った部品はこちら。Arduino NanoのGPIOに直接繋いでドライブするのでこれだけです。
- チップ抵抗300Ω 0805inch(2012mm)×7
- ピンヘッダ15P×2
基板作成
7セグLEDの外形や、ピンの位置をノギスで測定し、この部品のEagleを使ってシンボルとフットプリントを作成。そのあと、回路図とパターンを描く。
ピンの位置などが干渉しないように十分確かめたあと、完成しました!このときはElecrowさんへ発注しました。
基板到着
基板が届くと開けてびっくり!24枚も入っていました。発注したのは10pcsです。調べてみるとElecrowさんは注文枚数よりも多く届くことがあるとのこと(「Elecrowガチャ」とか言われているらしい...) しかしながら、2倍の数以上はかなり珍しいらしい。製造時はこのサイズで製造するのではなくて、大きな基板に並べるだけ並べて作った後にカットされるので、そこらへんの事情とか、品質が悪かった時のために予備として多く入れることがあるのだと思います。サイズが小さかったのでここまで多く来たのもあるでしょう。
組み立てとはんだ付け
- チップ抵抗と7セグLEDを自作基板にはんだ付け。
- ピンヘッダをはんだ付け。
ここまでできると↓のようになります。
- 最後にArduino Nano互換機をはんだ付けして、完成!
右側が完成したもので、左は取り外しできるようにピンソケットやICソケットを付けたバージョンです。厚みが全然違う...
プログラム
まずはプログラムを。
"1280"を表示させるプログラム
#define a 2
#define b 3
#define c 6
#define d 7
#define e 10
#define f 11
#define g 9
#define K1 12
#define K2 8
#define K3 4
#define K4 5
void ConvertNumber(int number, int* num) {
// default. -1 is no display.
// int num_tmp[] = {-1, -1, -1, -1};
int tmp;
if(number <= 1881) {
if((number % 10) <= 1) { // 2
// can be displayed
// 4 digit
if(number >= 1000) {
num[3] = 1;
}
// 3 digit
tmp = (int)((number / 100) % 10);
if(number >= 100) {
num[2] = tmp;
}
// 2 digit
tmp = (int)((number / 10) % 10);
if(number >= 10) {
num[1] = tmp;
}
// 1 digit
tmp = number % 10;
if(tmp <= 1) {
num[0] = tmp;
}
}
}
// num = num_tmp;
// dubug_num(number, num_tmp);
}
void DisplayNumber(int *num, int digit) {
if(digit == 4) {
if(*(num + 3) >= 0) {
DisplayDigit(*(num + 3));
digitalWrite(K1, LOW);
digitalWrite(K2, HIGH);
digitalWrite(K3, HIGH);
digitalWrite(K4, HIGH);
// Serial.print("digit:");
// Serial.print(digit);
// Serial.print(" => ");
// Serial.print(*(num + 3));
}
}else if(digit == 3) {
if(*(num + 2) >= 0) {
DisplayDigit(*(num + 2));
digitalWrite(K1, HIGH);
digitalWrite(K2, LOW);
digitalWrite(K3, HIGH);
digitalWrite(K4, HIGH);
// Serial.print("digit:");
// Serial.print(digit);
// Serial.print(" => ");
// Serial.print(*(num + 2));
}
}else if(digit == 2) {
if(*(num + 1) >= 0) {
DisplayDigit(*(num + 1));
digitalWrite(K1, HIGH);
digitalWrite(K2, HIGH);
digitalWrite(K3, LOW);
digitalWrite(K4, HIGH);
// Serial.print("digit:");
// Serial.print(digit);
// Serial.print(" => ");
// Serial.print(*(num + 1));
}
}else if(digit == 1) {
if(*(num + 0) >= 0) {
DisplayDigit(*(num + 0));
digitalWrite(K1, HIGH);
digitalWrite(K2, HIGH);
digitalWrite(K3, HIGH);
digitalWrite(K4, LOW);
// Serial.print("digit:");
// Serial.print(digit);
// Serial.print(" => ");
// Serial.print(*(num + 0));
}
}
Serial.println();
}
void DisplayDigit(int num) {
if(num == 0) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}else if(num == 1) {
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}else if(num == 2) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}else if(num == 3) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}else if(num == 4) {
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}else if(num == 5) {
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}else if(num == 6) {
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}else if(num == 7) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}else if(num == 8) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}else if(num == 9) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
}
void dubug_num(int number, int* num) {
Serial.print(number);
Serial.print(" -> ");
if(*(num + 3) >= 0) {
Serial.print(*(num + 3));
}else{
Serial.print("*");
}
if(*(num + 2) >= 0) {
Serial.print(*(num + 2));
}else{
Serial.print("*");
}
if(*(num + 1) >= 0) {
Serial.print(*(num + 1));
}else{
Serial.print("*");
}
if(*(num + 0) >= 0) {
Serial.print(*(num + 0));
}else{
Serial.print("*");
}
Serial.println();
}
void setup() {
Serial.begin(9600);
pinMode( a, OUTPUT);
pinMode( b, OUTPUT);
pinMode( c, OUTPUT);
pinMode( d, OUTPUT);
pinMode( e, OUTPUT);
pinMode( f, OUTPUT);
pinMode( g, OUTPUT);
pinMode(K1, OUTPUT);
pinMode(K2, OUTPUT);
pinMode(K3, OUTPUT);
pinMode(K4, OUTPUT);
digitalWrite(K1, HIGH);
digitalWrite(K2, HIGH);
digitalWrite(K3, HIGH);
digitalWrite(K4, HIGH);
}
void loop() {
int num[] = {-1, -1, -1, -1};
ConvertNumber(1280, num);
for(int digit=1; digit<=4; digit++) {
DisplayNumber(num, digit);
}
}
- ConvertNumber()
ある数(number)を各桁単位で0~9までの数字どれを表示するかを配列(num)に入れます。ただし1桁目はgのセグメントがないですし、4桁目はb, cのセグメントしかないので表示できる数字には制限があります。
またデバック用のコードをコメントアウトしています。 - DisplayNumber()
各桁で表示する数字と表示する桁を指定して表示させます。 - setup()
シリアル通信とピンの入出力設定、初期設定などを書いています。 - loop()
配列(num)を作って、数値を変換したのち、for()分で4桁分表示を切り替えてダイナミック点灯で表示します。この処理を繰り返すことで任意の数を表示できます。
まとめ
今回は指定した数値を表示させるだけでしたが、それを変えてやればカウンターなども作れると思います。写真だとちょっと見た感じが微妙ですが、実際見ると赤色がとてもきれいです。
実はこれが人生初自作基板でした笑
製作過程のツイートもあるので是非ご覧ください↓
Twitterモーメント:はじめての自作基板外注まとめ
投稿者の人気記事
-
sandark
さんが
2021/02/28
に
編集
をしました。
(メッセージ: 初版)
-
sandark
さんが
2021/02/28
に
編集
をしました。
-
sandark
さんが
2022/01/29
に
編集
をしました。
ログインしてコメントを投稿する