メイカーフェア東京2017では、LEDの点滅状態がわかりやすいように、加工前のシリアルLEDと2個ずつセグメント状態に配置した表示器を並べて展示しました。
表示器で数値をカウントアップ、カウントダウンするだけなので、プログラムがシンプルで分かりやすいと思います。下の写真が全体の画像です。左端に14個のLEDが並んだシリアルLED、右下が1セグメントに2個のLEDを配置した7セグメント表示器、右上がプリント基板です。どちらのLEDもNanoの5V、GND、D7に接続しました。
LEDは次の写真のように0から13までの順番でつながっています。

プリント基板のパターンは、右端中央から信号が入り、左端中央から次の桁に信号を伝えるように考えました。基板の面積を最小限にできるようにナルト模様のようにしました。基板を近づけて配置するときに有効な方法だと思います。基板は木工CNCで切削してパターンを作成しました。バリがあると指に刺さったり、短絡してしまったりするので、ヤスリで削ってあります。

左側の14個の切断していないLEDと7セグメント表示器の14個のLEDは、電気的には全く同じように直列に14個接続されたもので、Nanoの同じ端子に接続されています。

全て点灯させると以下のように光ります。写真では色がわかりにくいですが、2個のシリアルLEDはNanoに近い方から末端まで同じ色に光っています。

数字の4はこのように点灯します。

ソフトウェア
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
#include <Adafruit_NeoPixel.h> #define PIN 7 #define NUMPIXELS 14 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); boolean seg[7]; int count=0; void setup() { Serial.begin(9600); delay(50); Serial.println("Demo_7seg14led04_170810"); strip.begin(); } void loop() { for(int i=0;i<3;i++){ colorWipe(strip.Color(255, 0, 0), 15); // Red colorWipe(strip.Color(0, 255, 0), 15); // Green colorWipe(strip.Color(0, 0, 255), 15); // Blue } rainbowCycle(5); for(int i=0;i<10;i++){ Seven_seg_Mask(i); rainbowCycle_Mask(2); } count=count%3; for(int i=0;i<10;i++){ if(count==0) Seven_seg(9-i,255,0,0); if(count==1) Seven_seg(9-i,0,255,0); if(count==2) Seven_seg(9-i,0,0,255); strip.show(); delay(800); } count++; } void Seven_seg_Mask(int i){ switch(i){ case 0: seg[0]=HIGH,seg[1]=HIGH,seg[2]=HIGH,seg[3]=LOW,seg[4]=HIGH,seg[5]=HIGH,seg[6]=HIGH; break; case 1: seg[0]=HIGH,seg[1]=LOW,seg[2]=LOW,seg[3]=LOW,seg[4]=HIGH,seg[5]=LOW,seg[6]=LOW; break; case 2: seg[0]=HIGH,seg[1]=HIGH,seg[2]=LOW,seg[3]=HIGH,seg[4]=LOW,seg[5]=HIGH,seg[6]=HIGH; break; case 3: seg[0]=HIGH,seg[1]=HIGH,seg[2]=LOW,seg[3]=HIGH,seg[4]=HIGH,seg[5]=HIGH,seg[6]=LOW; break; case 4: seg[0]=HIGH,seg[1]=LOW,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=LOW,seg[6]=LOW; break; case 5: seg[0]=LOW,seg[1]=HIGH,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=HIGH,seg[6]=LOW; break; case 6: seg[0]=LOW,seg[1]=HIGH,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=HIGH,seg[6]=HIGH; break; case 7: seg[0]=HIGH,seg[1]=HIGH,seg[2]=LOW,seg[3]=LOW,seg[4]=HIGH,seg[5]=LOW,seg[6]=LOW; break; case 8: seg[0]=HIGH,seg[1]=HIGH,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=HIGH,seg[6]=HIGH; break; case 9: seg[0]=HIGH,seg[1]=HIGH,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=LOW,seg[6]=LOW; break; } } void Seven_seg(int i, int r, int g, int b){ switch(i){ case 0: seg[0]=HIGH,seg[1]=HIGH,seg[2]=HIGH,seg[3]=LOW,seg[4]=HIGH,seg[5]=HIGH,seg[6]=HIGH; break; case 1: seg[0]=HIGH,seg[1]=LOW,seg[2]=LOW,seg[3]=LOW,seg[4]=HIGH,seg[5]=LOW,seg[6]=LOW; break; case 2: seg[0]=HIGH,seg[1]=HIGH,seg[2]=LOW,seg[3]=HIGH,seg[4]=LOW,seg[5]=HIGH,seg[6]=HIGH; break; case 3: seg[0]=HIGH,seg[1]=HIGH,seg[2]=LOW,seg[3]=HIGH,seg[4]=HIGH,seg[5]=HIGH,seg[6]=LOW; break; case 4: seg[0]=HIGH,seg[1]=LOW,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=LOW,seg[6]=LOW; break; case 5: seg[0]=LOW,seg[1]=HIGH,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=HIGH,seg[6]=LOW; break; case 6: seg[0]=LOW,seg[1]=HIGH,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=HIGH,seg[6]=HIGH; break; case 7: seg[0]=HIGH,seg[1]=HIGH,seg[2]=LOW,seg[3]=LOW,seg[4]=HIGH,seg[5]=LOW,seg[6]=LOW; break; case 8: seg[0]=HIGH,seg[1]=HIGH,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=HIGH,seg[6]=HIGH; break; case 9: seg[0]=HIGH,seg[1]=HIGH,seg[2]=HIGH,seg[3]=HIGH,seg[4]=HIGH,seg[5]=LOW,seg[6]=LOW; break; } for(int j=0;j<7;j++){ if(seg[j]){ strip.setPixelColor(j*2, strip.Color(r,g,b)); strip.setPixelColor(j*2+1, strip.Color(r,g,b)); } else{ strip.setPixelColor(j*2, strip.Color(0,0,0)); strip.setPixelColor(j*2+1, strip.Color(0,0,0)); } } } void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, c); strip.show(); delay(wait); } } void rainbowCycle_Mask(uint8_t wait) { uint16_t i, j; for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)*(int)seg[i/2]); } strip.show(); delay(wait); } } void rainbowCycle(uint8_t wait) { uint16_t i, j; for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); } strip.show(); delay(wait); } } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } |
seg[0]からseg[6]までの配列でセグメント0からセグメント6に対応させて、表示する数値によってセグメントを点灯するときはHIGH、消灯するときはLOWにします。具体的にはSeven_seg_Mask(int i)関数で、seg[0]からseg[6]まで設定します。rainbowCycle_Mask(uint8_t wait)関数はサンプルプログラムのrainbowCycle(uint8_t wait)関数をベースにseg[0]からseg[6]までのHIGH/LOWでHIGHの場合だけ点灯するように改造しました。ここで、セグメントに2個LEDを配していることに注意して、i番目のLEDのHIGH/LOWはseg[i/2]で表わしました。
rainbowCycle関数を使った色の設定と、セグメントHIGH/LOWを掛け合わせることで簡単にカラフルな数値表示を実現しています。
(2017.08.10)