sandarkのアイコン画像
sandark 2021年02月28日作成 (2022年01月29日更新)
製作品 製作品 閲覧数 1567
sandark 2021年02月28日作成 (2022年01月29日更新) 製作品 製作品 閲覧数 1567

レンズ付き7セグLEDとArduino Nano互換機をスタックする基板設計およびハック

レンズ付き7セグLEDとArduino Nano互換機をスタックする基板設計およびハック

大阪の日本橋にあるデジットさんで売られているレンズ付き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倍の数以上はかなり珍しいらしい。製造時はこのサイズで製造するのではなくて、大きな基板に並べるだけ並べて作った後にカットされるので、そこらへんの事情とか、品質が悪かった時のために予備として多く入れることがあるのだと思います。サイズが小さかったのでここまで多く来たのもあるでしょう。
キャプションを入力できます
キャプションを入力できます

組み立てとはんだ付け

後で重ねるので手順を間違えると組み立てできません。
キャプションを入力できます

  1. チップ抵抗と7セグLEDを自作基板にはんだ付け。
  2. ピンヘッダをはんだ付け。
    ここまでできると↓のようになります。
    キャプションを入力できます
  3. 最後に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のアイコン画像
主にArduinoなどのマイコンを使った電子工作をやっています。Arduino Uno, Nano, ESP32, FlashAir, M5Stackなどなど。 3Dプリンターやレーザーカッターも使った工作もやっていて、分解も好きです! Twitterはこちら → sandark : @sandarkR
ログインしてコメントを投稿する