息を吹きかけると回転するデジタルかざぐるま”Digindmill”を作りました。
構成
マイコンにマイクとLEDテープ(Neopixel)を接続し、マイクに息をかけることで音を検出しLEDの発光を制御します。
音量によってLED回転スピードが変わります。
部品一覧
製作過程
羽には100均のポリプロピレンシートを使用し、持ち手には100均のピコピコハンマーの物を利用しました。
持ち手内部で配線します。LEDテープはセル5づつの8本使用しポリプロピレンシートに貼り付けました。
Arduinoコード
プログラミングはArduino IDEを用いて実施しました。
LEDテープ Neopixelのライブラリとサンプルコードは以下で公開されており、気軽に楽しむことができます。
https://github.com/adafruit/Adafruit_NeoPixel
Digindmillコード
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
const int analogInPin = A1;
int sensorValue = 0;
int amp = 0;
int rotDelay = 500;
int fin = 0;
//かざぐるまの羽 八枚分のLED設定
#define NUMPIXELS 5
Adafruit_NeoPixel pixel0 = Adafruit_NeoPixel(NUMPIXELS, 2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixel1 = Adafruit_NeoPixel(NUMPIXELS, 3, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixel2 = Adafruit_NeoPixel(NUMPIXELS, 4, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixel3 = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixel4 = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixel5 = Adafruit_NeoPixel(NUMPIXELS, 7, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixel6 = Adafruit_NeoPixel(NUMPIXELS, 8, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixel7 = Adafruit_NeoPixel(NUMPIXELS, 9, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels[8] = {pixel0, pixel1, pixel2, pixel3, pixel4, pixel5, pixel6, pixel7};
uint32_t finColors[8];
void setup() {
Serial.begin(9600);
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
for(int i = 0; i < 8; i++ ){
pixels[i].begin();
pixels[i].setBrightness(20);
}
//羽の色 設定
finColors[0] = pixels[0].Color(255,0,0);
finColors[1] = pixels[0].Color(150,150,150);
finColors[2] = pixels[0].Color(85,0,170);
finColors[3] = pixels[0].Color(120,155,0);
finColors[4] = pixels[0].Color(0,0,255);
finColors[5] = pixels[0].Color(170,0,85);
finColors[6] = pixels[0].Color(0,255,0);
finColors[7] = pixels[0].Color(0,170,170);
}
void loop() {
//マイク出力平均化
for(int i = 0; i < 10; i++){
sensorValue =+ analogRead(analogInPin);
}
Serial.print(sensorValue/10);
//マイク出力バイアス除去
amp = abs(sensorValue/10 - 30);
Serial.print(" ");
Serial.print(amp);
//マイク出力から回転スピード導出
rotDelay = map(amp, 10, 60, 150, 0);
if(rotDelay < 0){
rotDelay = 0;
}
Serial.print(" ");
Serial.println(rotDelay);
for(int j = 0; j < 8; j++){
int k = j + fin;
if(k >= 8){
k = k - 8;
}
for (int i = 0; i < 5; i++){
pixels[j].setPixelColor(i, finColors[k]);
}
}
for(int i = 0; i < 8; i++ ){
pixels[i].show();
}
delay(15);
//マイク出力が一定以上で回転
if(amp > 10){
delay(rotDelay);
fin++;
if(fin >= 8){
fin = fin - 8;
}
}
for(int i = 0; i < 8; i++ ){
pixels[i].clear();
pixels[i].show();
}
delay(1);
}
8本のLEDテープの信号線を指定して発色の色がくるくる回るようにしました。
回転スピードはマイクから検出される音声信号の大きさで変更しています。
マイクの信号はアナログ入力ピンA1に接続しています。
動作
1
2
6
6
投稿者の人気記事
-
HomeMadeGarbage
さんが
2019/10/08
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する