Minecraft Lamp を3DプリンタとPro Micro で作る(その2)

目次
前回、ソフトとカバーの一部だけつくった。
今回は、ちゃんとカバーも作って、観賞するとことまで。
部材
- 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);
}
