arrow-right hamburger logo-mark social-facebook social-github social-twitter
2017.06.08

電子工作でパリピな夏を独り占め!サイバーパンク大五郎!!

きょうこ

ギャル電

はじめまして、ギャル電きょうこです。ギャルによるギャルのためのテクノロジーを提案する電子工作ユニット、ギャル電で活動しておりまっす。夢はドンキでアルドゥイーノが買える世の中です。

この記事では、”Lチカ以上、IoT未満” な電子工作テクニックでも楽しく作れてすぐに遊べるアイテムを紹介していきたいと思います。

今回の工作は夏フェスでパリピにめっちゃモテるやつ!

夏といえば、夏フェス!夏フェスといえばパリピ!パリピといえば酒!!!です。

ということで、今回はパリピに激モテな電子工作、甲類焼酎大五郎4ℓペットボトルを作ってみました。

なぜ大五郎なのか

渋谷の街を歩いていたらセンター街で片手にスマホ、片手に4ℓの大五郎(半分減ってる)をもっているギャルをみかけました。

デニムのショーパンにベアトップ、そして大五郎。強めギャルファッションにこんなにも大五郎がジャストフィットしていてエモさしかありませんでした。

このエモさにさらにLEDを加えたら、絶対に最高なものができる!光る大五郎とか超未来!!なんでみんな光らせないわけ?!超機会損失してる!!!!

ないなら今すぐ作るしかない!というわけで、とりあえず大五郎を光らせることにしたのです。

とりあえず光らす方法

材料

ボードについては、わたしは小さくてUSBケーブルを差す口がもともとついているやつが好みなので、今回はGR-CITRUSAdafruit Trinket5Vを使ってみました。USBケーブルの口が付いたボードは、モバイルバッテリーをつなげば動くのでめっちゃ便利です。

環境導入については、ボードの名前と自分の使っているPCのOSのバージョン(Windows XXとかMac OS XXとか)でググるとだいたい親切な先人の情報がみつかると思いまっす。

配線は3本だからそんなに難しくない

NeoPixel LEDテープ(WS2812B)は、GND、5V、信号(D0)の三本の線をそれぞれArduino(または互換機)のGND、5V、デジタルピンにつなぐと光らせることができます。

今回の光る大五郎のように、底面とハンドルの部分だけLEDを使いたい場合は、LEDテープを光らせたい部分の長さに切ってテープとテープの間を電線で3本つなぎなおしたらオッケーです。

配線に必要な電線の長さは、適当に実物において測りました。仮置きするときはマスキングテープで貼るとやりやすいです。

LEDを光らせるプログラムを入れる

GR-CITRUS

GR-CITRUSはWebコンパイラを使ってブラウザでスケッチを作成することができます。詳しい書き込み方法は下記を参照してください。

Adafruit_NeoPixcel.cppAdafruit_NeoPixel.hの二つのファイルを下記ページからダウンロードして、GR-CITRUSで作成したプロジェクトにアップロードする必要があります。(Webコンパイラ使用時)

https://github.com/adafruit/Adafruit_NeoPixel

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

//neopixcel用の設定部分
//neopixelを接続するPINを設定
#define PIN_LED 12
//neopixelのLEDの数を設定
#define NUM_LEDS 12

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN_LED, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;

void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < 17; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

// ここからNeoPixelのアニメーション設定


void FadeInOut(byte red, byte green, byte blue){
  float r, g, b;

  for(int k = 0; k < 256; k=k+1) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showStrip();
  }

  for(int k = 255; k >= 0; k=k-2) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showStrip();
  }
}


void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(red,green,blue);
    showStrip();
    delay(FlashDelay);
    setAll(0,0,0);
    showStrip();
    delay(FlashDelay);
  }

 delay(EndPause);
}


void Sparkle(byte red, byte green, byte blue, int SpeedDelay) {
  int Pixel = random(NUM_LEDS);
  setPixel(Pixel,red,green,blue);
  showStrip();
  delay(SpeedDelay);
  setPixel(Pixel,0,0,0);
}

void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
  int Position=0;

  for(int i=0; i<NUM_LEDS*2; i++)
  {
      Position++; // = 0; //Position + Rate;
      for(int i=0; i<NUM_LEDS; i++) {
        // sine wave, 3 offset waves make a rainbow!
        //float level = sin(i+Position) * 127 + 128;
        //setPixel(i,level,0,0);
        //float level = sin(i+Position) * 127 + 128;
        setPixel(i,((sin(i+Position) * 127 + 128)/255)*red,
                   ((sin(i+Position) * 127 + 128)/255)*green,
                   ((sin(i+Position) * 127 + 128)/255)*blue);
      }

      showStrip();
      delay(WaveDelay);
  }
}

byte * Wheel(byte WheelPos) {
  static byte c[3];

  if(WheelPos < 85) {
   c[0]=WheelPos * 3;
   c[1]=255 - WheelPos * 3;
   c[2]=0;
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   c[0]=255 - WheelPos * 3;
   c[1]=0;
   c[2]=WheelPos * 3;
  } else {
   WheelPos -= 170;
   c[0]=0;
   c[1]=WheelPos * 3;
   c[2]=255 - WheelPos * 3;
  }

  return c;
}


void rainbowCycle(int SpeedDelay) {
  byte *c;
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< NUM_LEDS; i++) {
      c=Wheel(((i * 256 / NUM_LEDS) + j) & 255);
      setPixel(i, *c, *(c+1), *(c+2));
    }
    showStrip();
    delay(SpeedDelay);
  }
}


void Twinkle(byte red, byte green, byte blue, int Count, int SpeedDelay, boolean OnlyOne) {
  setAll(0,0,0);

  for (int i=0; i<Count; i++) {
     setPixel(random(NUM_LEDS),red,green,blue);
     showStrip();
     delay(SpeedDelay);
     if(OnlyOne) {
       setAll(0,0,0);
     }
   }
}
void TwinkleRandom(int Count, int SpeedDelay, boolean OnlyOne) {
  setAll(0,0,0);

  for (int i=0; i<Count; i++) {
     setPixel(random(NUM_LEDS),random(0,255),random(0,255),random(0,255));
     showStrip();
     delay(SpeedDelay);
     if(OnlyOne) {
       setAll(0,0,0);
     }
   }
}

void setup()
{
    pinMode(PIN_LED0, OUTPUT);
    digitalWrite(PIN_LED, LOW);
   #if defined (__AVR_ATtiny85__)
   if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  strip.begin();
  strip.show();
}

void loop()
{
    FadeInOut(0x1C, 0xFF, 0xB3);
    FadeInOut(0x1C, 0xFF, 0xB3);
    FadeInOut(0x1C, 0xFF, 0xB3);
    FadeInOut(0x36, 0xEB, 0xFF);
    FadeInOut(0x36, 0xEB, 0xFF);
    FadeInOut(0x36, 0xEB, 0xFF);
    Twinkle(0xff, 40, 99, 10, 50, false);
    Twinkle(0xff, 40, 99, 10, 50, false);
    TwinkleRandom(20, 100, false);
    TwinkleRandom(20, 100, false);
    TwinkleRandom(20, 100, false);
    TwinkleRandom(20, 100, false);
    TwinkleRandom(20, 100, false);
    TwinkleRandom(20, 100, false);
    RunningLights(0x26,0xFF,0x7D, 50);
   RunningLights(0x26,0xFF,0x7D, 50);
    RunningLights(0x26,0xFF,0x7D, 50);
    RunningLights(0xDD,0xFF,0x33, 50);
     RunningLights(0xDD,0xFF,0x33, 50);
      RunningLights(0xDD,0xFF,0x33, 50);
    RunningLights(0xFF,0xAE,0x0D, 50);
    RunningLights(0xFF,0xAE,0x0D, 50);
    RunningLights(0xFF,0xAE,0x0D, 50);
    RunningLights(0xFF,0x21,0x21, 50);
    RunningLights(0xFF,0x21,0x21, 50);
    RunningLights(0xFF,0x21,0x21, 50);
    RunningLights(0xFF,0x54,0x93, 50);
    RunningLights(0xFF,0x54,0x93, 50);
    RunningLights(0xFF,0x54,0x93, 50);
    RunningLights(0x7A,0x7F,0xFF, 50);
    RunningLights(0x7A,0x7F,0xFF, 50);
    RunningLights(0x7A,0x7F,0xFF, 50);
    Strobe(0xff, 0xff, 0xff, 10, 50, 1000);
    Strobe(0xff, 0xff, 0xff, 10, 50, 1000);
    Strobe(0xff, 0xAB, 0xf9, 10, 50, 1000);
    Strobe(0xff, 0xAB, 0xf9, 10, 50, 1000);
    rainbowCycle(20);

  }


Adafruit Trinket

TrinketはArduino IDEでスケッチを作成し書き込みます。

Introduction Trinket

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

//neopixcel用の設定部分

//neopixelを接続するPINを設定
#define PIN_LED 4

//neopixelのLEDの数を設定
#define NUM_LEDS 12

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN_LED, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;

void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < 17; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

// ここからNeoPixelのアニメーション設定


void FadeInOut(byte red, byte green, byte blue){
  float r, g, b;

  for(int k = 0; k < 256; k=k+1) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showStrip();
  }

  for(int k = 255; k >= 0; k=k-2) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showStrip();
  }
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(red,green,blue);
    showStrip();
    delay(FlashDelay);
    setAll(0,0,0);
    showStrip();
    delay(FlashDelay);
  }

 delay(EndPause);
}

void Twinkle(byte red, byte green, byte blue, int Count, int SpeedDelay, boolean OnlyOne) {
  setAll(0,0,0);

  for (int i=0; i<Count; i++) {
     setPixel(random(NUM_LEDS),red,green,blue);
     showStrip();
     delay(SpeedDelay);
     if(OnlyOne) {
       setAll(0,0,0);
     }
   }
}
void TwinkleRandom(int Count, int SpeedDelay, boolean OnlyOne) {
  setAll(0,0,0);

  for (int i=0; i<Count; i++) {
     setPixel(random(NUM_LEDS),random(0,255),random(0,255),random(0,255));
     showStrip();
     delay(SpeedDelay);
     if(OnlyOne) {
       setAll(0,0,0);
     }
   }
}

//

void setup()
{
    pinMode(PIN_LED, OUTPUT);
    digitalWrite(PIN_LED, LOW);
   #if defined (__AVR_ATtiny85__)

   if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  strip.begin();
  strip.show();
}

void loop()
{
    FadeInOut(0x1C, 0xFF, 0xB3);
    FadeInOut(0x1C, 0xFF, 0xB3);
    FadeInOut(0x1C, 0xFF, 0xB3);
    FadeInOut(0x36, 0xEB, 0xFF);
    FadeInOut(0x36, 0xEB, 0xFF);
    FadeInOut(0x36, 0xEB, 0xFF);
    Twinkle(0xff, 40, 99, 10, 50, false);
    Twinkle(0xff, 40, 99, 10, 50, false);
    TwinkleRandom(20, 100, false);
    TwinkleRandom(20, 100, false);
    Strobe(0xff, 0xff, 0xff, 10, 50, 1000);
    Strobe(0xff, 0xff, 0xff, 10, 50, 1000);
    Strobe(0xff, 0xAB, 0xf9, 10, 50, 1000);
    Strobe(0xff, 0xAB, 0xf9, 10, 50, 1000);
  }

TrinketはGR-CITRUS用に書いたコードをコピペしたらスケッチが大きすぎ!って怒られたのでだいぶコードを削りました。

配線のはんだ付けと動作テストが終わったら、ダクトテープで部品を大五郎に貼り付けます。

大五郎の背面に貼り付けられたバッテリーとボード、LEDテープ類。ダクトテープと両面テープがあればなんでも貼り付けられて超便利です。

一般的には不審物としかいいようのない見た目のため、電車や駅のトイレ等の公共の場所への置き忘れは要注意です。

実際にパーティで大五郎を光らせてみよう!

作成した光る大五郎をさっそく現場(パーティ)に投入してみました。

結果、最&高!!!!!

暗いところで幻想的に光る大五郎は、インテリアとしても飲み物としても威力を発揮し新しいパーティアイテムとして流行る予感しかありませんでした。

残念ながら盛り上がって飲みすぎたため、写真があまり残っていません……。

4ℓはなかなかに重いということと、酔っぱらったパリピにブレッドボードから配線を抜かれがちということ以外には特に問題なく使用できました。

飲み終わったら、ダクトテープをはがして新しい大五郎にLEDユニットを貼るスタイルでいつでも光る大五郎が楽しめるので、改良してまた新たなパーティに出かけようと思います。

みんなもさっそく作ってパーティにでかけちゃおう!パリピに超モテるよ☆