ハロウィン仮装 LED装飾に挑戦!
今年のハロウィンは長女ちゃんは不思議の国のアリスにLEDで光る靴、長男くんはLED棒人間で仮装しました!
トリック オア トリート!!!!
目次
光る靴
構成
小型マイコンDigisparkとLEDテープNeopixelを使用しました。LEDテープは両面テープで固定。電源は9V電池です(少し歩きにくい。。。ww)。
半端ない安さ!! Digisparkの詳細については以下も参照ください。
NeopixelのArduino用ライブラリは以下にアップされています。
https://github.com/adafruit/Adafruit_NeoPixel
Arduinoコード
ほぼライブラリの例のstrandtest.inoのとおりです。
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 |
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #define PIN 0 // Parameter 1 = number of pixels in strip // Parameter 2 = Arduino pin number (most are valid) // Parameter 3 = pixel type flags, add together as needed: // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) // NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products) Adafruit_NeoPixel strip = Adafruit_NeoPixel(26, PIN, NEO_GRB + NEO_KHZ800); // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input // and minimize distance between Arduino and first pixel. Avoid connecting // on a live circuit...if you must, connect GND first. void setup() { // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif // End of trinket special code strip.begin(); strip.setBrightness(80); strip.show(); // Initialize all pixels to 'off' } void loop() { // Some example procedures showing how to display to the pixels: colorWipe(strip.Color(255, 0, 0), 50); // Red colorWipe(strip.Color(0, 255, 0), 50); // Green colorWipe(strip.Color(0, 0, 255), 50); // Blue //colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW // Send a theater pixel chase in... theaterChase(strip.Color(127, 127, 127), 50); // White theaterChase(strip.Color(127, 0, 0), 50); // Red theaterChase(strip.Color(0, 0, 127), 50); // Blue rainbow(20); rainbowCycle(20); theaterChaseRainbow(50); } // Fill the dots one after the other with a color 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 rainbow(uint8_t wait) { uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, Wheel((i+j) & 255)); } strip.show(); delay(wait); } } // Slightly different, this makes the rainbow equally distributed throughout 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); } } //Theatre-style crawling lights. void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //do 10 cycles of chasing for (int q=0; q < 3; q++) { for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); //turn every third pixel on } strip.show(); delay(wait); for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //turn every third pixel off } } } } //Theatre-style crawling lights with rainbow effect void theaterChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel for (int q=0; q < 3; q++) { for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on } strip.show(); delay(wait); for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //turn every third pixel off } } } } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. 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); } |
動作
なかなかのサイバー感!!
LED棒人間
少し小さくなった冬着を加工しました!LEDテープは両面テープと糸でちょこちょこ縫って固定。
構成
LEDテープNeopixelとマイコンAdafruit Pro Trinketを使用し、電源にはモバイパッテリーを使用しました。
Adafruit Pro Trinketの詳細・使用方法は以下のとおり。
https://learn.adafruit.com/introducing-pro-trinket
Trinketは小さくて良いけど若干クセあって使いにくいかも。。。
Arduino IDEボードマネージャーで以下を登録・インストールして
1 |
https://adafruit.github.io/arduino-board-index/package_adafruit_index.json |
書込装置:USPtinyISPにして以下動画のようにリセットボタン押して書込モード(LEDゆっくり点滅)にしてから書き込みます。。めんどい(´・ω・`)。。
モバイルバッテリーは以下を使用
このバッテリーはON/OFFスイッチあって低負荷・無負荷時でもスリープしないので使いやすいです。さすがIoTって表記してるだけのこと有る!
Arduinoコード
光る靴と同様にNeopixelライブラリ例のstrandtest.inoを参考に作成しました。
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 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif // Parameter 1 = number of pixels in stripAL // Parameter 2 = Arduino pin number (most are valid) // Parameter 3 = pixel type flags, add together as needed: // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) // NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products) Adafruit_NeoPixel stripH = Adafruit_NeoPixel(38, 8, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel stripAL = Adafruit_NeoPixel(18, 9, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel stripAR = Adafruit_NeoPixel(18, 4, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel stripB = Adafruit_NeoPixel(19, 5, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel stripLL = Adafruit_NeoPixel(19, 6, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel stripLR = Adafruit_NeoPixel(19, 10, NEO_GRB + NEO_KHZ800); // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input // and minimize distance between Arduino and first pixel. Avoid connecting // on a live circuit...if you must, connect GND first. void setup() { // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif // End of trinket special code stripH.begin(); stripAL.begin(); stripAR.begin(); stripB.begin(); stripLL.begin(); stripLR.begin(); stripAL.setBrightness(60); stripAR.setBrightness(60); stripLL.setBrightness(60); stripLR.setBrightness(60); stripH.setBrightness(60); stripB.setBrightness(60); stripAL.show(); // Initialize all pixels to 'off' stripAR.show(); stripLL.show(); // Initialize all pixels to 'off' stripLR.show(); stripH.show(); stripB.show(); } void loop() { // Some example procedures showing how to display to the pixels: colorWipe(stripAL.Color(255, 0, 0), 50); // Red colorWipe(stripAL.Color(0, 255, 0), 50); // Green colorWipe(stripAL.Color(0, 0, 255), 50); // Blue //colorWipe(stripAL.Color(0, 0, 0, 255), 50); // White RGBW // Send a theater pixel chase in... theaterChase(stripAL.Color(127, 127, 127), 50); // White theaterChase(stripAL.Color(127, 0, 0), 50); // Red theaterChase(stripAL.Color(0, 0, 127), 50); // Blue rainbow(20); rainbowCycle(8); theaterChaseRainbow(40); } // Fill the dots one after the other with a color void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i<stripH.numPixels(); i++) { stripAL.setPixelColor(i, c); stripAR.setPixelColor(i, c); stripLL.setPixelColor(i, c); stripLR.setPixelColor(i, c); stripH.setPixelColor(i, c); stripB.setPixelColor(i, c); stripAL.show(); stripAR.show(); stripLL.show(); stripLR.show(); stripH.show(); stripB.show(); delay(wait); } } void rainbow(uint8_t wait) { uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i<stripH.numPixels(); i++) { stripAL.setPixelColor(i, Wheel((i+j) & 255)); stripAR.setPixelColor(i, Wheel((i+j) & 255)); stripLL.setPixelColor(i, Wheel((i+j) & 255)); stripLR.setPixelColor(i, Wheel((i+j) & 255)); stripH.setPixelColor(i, Wheel((i+j) & 255)); stripB.setPixelColor(i, Wheel((i+j) & 255)); } stripAL.show(); stripAR.show(); stripLL.show(); stripLR.show(); stripH.show(); stripB.show(); delay(wait); } } // Slightly different, this makes the rainbow equally distributed throughout 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< stripH.numPixels(); i++) { stripAL.setPixelColor(i, Wheel(((i * 256 / stripAL.numPixels()) + j) & 255)); stripAR.setPixelColor(i, Wheel(((i * 256 / stripAL.numPixels()) + j) & 255)); stripLL.setPixelColor(i, Wheel(((i * 256 / stripAL.numPixels()) + j) & 255)); stripLR.setPixelColor(i, Wheel(((i * 256 / stripAL.numPixels()) + j) & 255)); stripH.setPixelColor(i, Wheel(((i * 256 / stripAL.numPixels()) + j) & 255)); stripB.setPixelColor(i, Wheel(((i * 256 / stripAL.numPixels()) + j) & 255)); } stripAL.show(); stripAR.show(); stripLL.show(); stripLR.show(); stripH.show(); stripB.show(); delay(wait); } } //Theatre-style crawling lights. void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //do 10 cycles of chasing for (int q=0; q < 3; q++) { for (uint16_t i=0; i < stripH.numPixels(); i=i+3) { stripAL.setPixelColor(i+q, c); //turn every third pixel on stripAR.setPixelColor(i+q, c); stripLL.setPixelColor(i+q, c); //turn every third pixel on stripLR.setPixelColor(i+q, c); stripH.setPixelColor(i+q, c); stripB.setPixelColor(i+q, c); } stripAL.show(); stripAR.show(); stripLL.show(); stripLR.show(); stripH.show(); stripB.show(); delay(wait); for (uint16_t i=0; i < stripH.numPixels(); i=i+3) { stripAL.setPixelColor(i+q, 0); //turn every third pixel off stripAR.setPixelColor(i+q, 0); stripLL.setPixelColor(i+q, 0); //turn every third pixel off stripLR.setPixelColor(i+q, 0); stripH.setPixelColor(i+q, 0); stripB.setPixelColor(i+q, 0); } } } } //Theatre-style crawling lights with rainbow effect void theaterChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel for (int q=0; q < 3; q++) { for (uint16_t i=0; i < stripH.numPixels(); i=i+3) { stripAL.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on stripAR.setPixelColor(i+q, Wheel( (i+j) % 255)); stripLL.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on stripLR.setPixelColor(i+q, Wheel( (i+j) % 255)); stripH.setPixelColor(i+q, Wheel( (i+j) % 255)); stripB.setPixelColor(i+q, Wheel( (i+j) % 255)); } stripAL.show(); stripAR.show(); stripLL.show(); stripLR.show(); stripH.show(); stripB.show(); delay(wait); for (uint16_t i=0; i < stripH.numPixels(); i=i+3) { stripAL.setPixelColor(i+q, 0); //turn every third pixel off stripAR.setPixelColor(i+q, 0); stripLL.setPixelColor(i+q, 0); //turn every third pixel off stripLR.setPixelColor(i+q, 0); stripH.setPixelColor(i+q, 0); stripB.setPixelColor(i+q, 0); } } } } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return stripAL.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; return stripAL.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return stripAL.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } |
動作
View this post on Instagram去年のハロウィン #led #neopixel #halloween https://homemadegarbage.com/halloween2016
さて来年はどんな仮装にしようかなー
いいですね!子供が喜びそうです。私も同じくらいの子供たちとたまに電子工作したりしています。参考になりました!