ボタンとか、ボリュームとか大好きな子ども向けのおもちゃを作ってみました!
我が子(0歳)が、あらゆる家電のスイッチをいじくり回すので、
ボタンが沢山ついているおもちゃがあると楽しいのではと思い、作ってみました。
ボタンを押すと、色が変わったり、LEDの光る数が増えたり、音が鳴ったりします。
アイデアの検討
最初は、手元にあったマトリックスLEDを使ってなにか絵や文字が出たらいいのでは、と
ボタン・ブザー・マトリックスLEDを並べて実験してみました。
しかし、なんかつまらない。
文字とか絵とか出したところで0歳児にはわからないし。
やっぱり、もっとたくさんボタンがあった方が楽しいよね!
ということで、色々なパーツを購入し、デザインを再検討しました。
使ったもの
- Arduino Uno
- ゲームスイッチ x2
- Neo Pixel Ring
- スライドボリューム
- ボリューム
- 木箱
プログラム
プログラムはこちら
/*
A0 スライどボリューム
A1 ボリューム
8 LED
11 スピーカー
12 黄色ボタン
13 青色ボタン
*/
#include <Adafruit_NeoPixel.h>
#define SPEAKER 11
#define PIN 8 // ネオピクセルのピン番号を6に設定。必要に応じて変更してください
#define NUMPIXELS 8 // LEDの数を8に設定
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// constants won't change. They're used here to set pin numbers:
//LEDの色
int red = 0;
int blue = 0;
int green = 0;
float brightness = 1;
float color = 1;
int ledCount = 1;
//青ボタン
const int buttonPin = 13; // the number of the pushbutton pin
int buttonState = 0; // variable for reading the pushbutton status
int lastButtonState = LOW; // 前回のボタンの状態
unsigned long lastDebounceTime = 0; // 最後にデバウンスが行われた時刻
unsigned long debounceDelay = 50; // デバウンスの遅延時間(ミリ秒)
//黄色ボタン
const int buttonPinY = 12; // the number of the pushbutton pin
int buttonStateY = 0; // variable for reading the pushbutton status
int lastButtonStateY = LOW; // 前回のボタンの状態
unsigned long lastDebounceTimeY = 0; // 最後にデバウンスが行われた時刻
unsigned long debounceDelayY = 50; // デバウンスの遅延時間(ミリ秒)
void setup() {
Serial.begin(9600);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
strip.begin(); // NeoPixelライブラリを初期化
strip.show(); // すべてのピクセルをOFFにリセット
}
void loop() {
// read the state of the pushbutton value:
int reading = digitalRead(buttonPin);
int readingY = digitalRead(buttonPinY);
if (reading != lastButtonState) { // ボタンの状態が変わった場合
lastDebounceTime = millis(); // 時刻を更新
}
if (readingY != lastButtonStateY) { // ボタンの状態が変わった場合
lastDebounceTimeY = millis(); // 時刻を更新
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// 最後の状態変更から十分な時間が経過した場合
if (reading != buttonState) { // ボタンの状態が変わった場合
buttonState = reading; // 状態を更新
if (buttonState == HIGH) { // ボタンが押された場合のアクション
ledCount ++;
Serial.println(ledCount);
}
}
}
if ((millis() - lastDebounceTimeY) > debounceDelayY) {
// 最後の状態変更から十分な時間が経過した場合
if (readingY != buttonStateY) { // ボタンの状態が変わった場合
buttonStateY = readingY; // 状態を更新
if (buttonStateY == HIGH) { // ボタンが押された場合のアクション
red = random(255);
green = random(255);
blue = random(255);
}
}
}
lastButtonState = reading; // 状態を保存
lastButtonStateY = readingY; // 状態を保存
int val = analogRead(A0);
int val2 = analogRead(A1);
brightness = (float)val/1024;
color = (float)val2/1024;
//Serial.println(val);
//サウンド
if(val > 5){
tone(SPEAKER, val, 1000);
}else{
noTone(SPEAKER);
}
//LED
for(int i=0; i<strip.numPixels(); i++) {
}
lightUpLeds(ledCount%8+1);
}
void lightUpLeds(int numLeds) {
strip.clear(); // すべてのLEDを消灯
for (int i = 0; i < numLeds; i++) {
strip.setPixelColor(i, strip.Color(red*brightness,green*color,blue*brightness));
}
strip.show();
}
組み立て
箱は手元にあった桐箱(たしかお菓子が入っていた...)を使いました。
ちょうどよいサイズ感ですが、ゲームボタンは意外と高さが7cmほどあり、箱が閉まりません。
無理やり薄く切った竹を挟み込んで蓋が閉まるように調整しました。
直径30mmのホールソーで穴あけをしました。
ロゴはレーザー加工機で入れました。
Neo Pixel Ringのカバーを3Dプリンターで作成しました。
出力とモデリングを4回ほどやりなおし、やっとうまくはまりました。
ただの白いPLAで印刷をしましたが、厚みを1mm程度にしたところLEDの光をいい感じに拡散してくれます。
完成!
2歳はすぐに使いこなせる!我が子は回す方が好き!
完成し、さっそく我が子に渡してみると...
ゲームボタンを押すのではなくねじろうとしていました。
そういえば、家でももっぱらトースターのボリュームをネジネジしています。
次回作はボリュームを複数個つけようと思いました。
反省点も色々
また、箱型は単体では収まりが良い感じがしますが、実際に使ってみると分厚さが気になります。
ベビーカーに固定できるか、C環につけらえるか、設計を変える必要がありそうです。
M5Stack Dialで作ったら面白いのでは?というご意見もいただきました。
ちょっと高価ですが、たしかにこれは喜びそうです。
気が向いたら、新しいバージョンも作ってみようと思います。