前回、ソフトとカバーの一部だけつくった。

今回は、ちゃんとカバーも作って、観賞するとことまで。

部材

  • Pro Micro(Arduino)
  • Pull up 回路(スイッチ用)
  • RING LED(NeoPixel Jewel 7)
  • 横壁と上面の接合用ボンド

3Dデータ

thingiverse で色々見たが、どれも大きい(15cm四方くらい)ので、小さいものが欲しくなった。

まあ、大きいとプリントに時間がかかるので、、、

お手本は、これ

造形の概要

底の部品が、側面を支える形がGOOD。 大きさを約5cm四方にし、側面の厚さは3mmらいに成形。 また、穴になっている部分は、穴にせず、0.4mm くらいの薄さにした。 穴に別の色の穴塞ぎ部品をはめるより、薄く成型したほうが、それっぽいし、工程が減って楽ちん。

↑をみると、ちゃんと透けてる。

組立方はこんな感じ。

といことではじめて thingiverse にUP

配線

大事なのは、作ったあと、ProMicroを取り外して、ソフトの入れ替えを容易にできるようにすること。 GPIOは、メス端子で接続しておく。

無理矢理。

  • PIN1 ... NeoPixel Data
  • PIN0 ... Switch(PullUo)

BASE部分

LEDは、RING型のLEDを使う。 RING LEDを固定するために、LED両脇にちょうどよい穴を使い、そこにすぽっとはいるように支えを作る。

ProMicro はなるべく固定されるように、深めの溝にはめる。

SIDEの接合

色々見たけど、あきらめてボンドで接合。 BASE部分を台にして、ペタペタ。

TOP

ボタンにするスイッチは、TOPにボンドで固定。 ボタン自体は、固定しなくてもよい。

プログラム

前回とほぼ変わらず。 ただし、Pro Micro上のTX,RXのLED(赤)が邪魔なので、消灯する設定を追加。

main.cpp · Gistcpp
#include <Adafruit_NeoPixel.h>

// GPIO
#define NEOPIXEL_PIN 1
#define NUMPIXELS 7

#define SWITCH_PIN 0
#define LED_PIN 5

#define MAX_BRIGHT 80
#define MIN_BRIGHT 5

int Current_pattern = 0;

// RING
// Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_RGB + NEO_KHZ800);
// Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, NEOPIXEL_PIN, NEO_RGB);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, NEOPIXEL_PIN, NEO_RGBW);

void setup()
{
  Serial.begin(9600);
  pixels.begin();
  pixels.show();

  pinMode(SWITCH_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);

  // TX LED OFF
  pinMode(30, OUTPUT);
  digitalWrite(30, HIGH);

  // RX LED OFF
  pinMode(17, OUTPUT);
  digitalWrite(17, HIGH);
}

void loop()
{
  static int bright = MIN_BRIGHT;
  static int bright_offset = 2;
  static int prev_switch_value = HIGH;
  int value;
  uint32_t color = pixels.Color(bright, bright, bright);

  value = digitalRead(SWITCH_PIN);
  if (prev_switch_value != value)
  {
    if (value == LOW)
    {
      // SWITCH ON
      if (Current_pattern++ > 3)
      {
        // change color pattern
        Current_pattern = 0;
      }
    }
    prev_switch_value = value;
    // LED ON/OFF
    digitalWrite(LED_PIN, value);
  }

  for (int pixel_no = 0; pixel_no < NUMPIXELS; pixel_no++)
  {
    // GRB
    color = pixels.Color(0, 0, 0);
    switch (Current_pattern)
    {
    case 0:
      // red stone
      color = pixels.Color(0, bright, 0);
      break;
    case 1:
      // iron
      color = pixels.Color(bright / 4, bright / 1.2, bright / 6);
      break;
    case 2:
      // gold
      color = pixels.Color(bright / 3, bright / 1.2, 0);
      break;
    case 3:
      // emerald
      color = pixels.Color(bright, 0, 0);
      break;
    case 4:
      // diamond
      color = pixels.Color(bright / 2, bright / 5, bright / 1.2);
      break;
    }
    pixels.setPixelColor(pixel_no, color);
  }

  bright += bright_offset;
  if (bright >= MAX_BRIGHT)
  {
    // darkness
    bright_offset = -2;
  }
  if (bright <= MIN_BRIGHT)
  {
    // lightness
    bright_offset = 2;
  }

  pixels.show();
  delay(30);
}

demo