センサーを付けて楽器にする

IMG_3512

Arduinoに興味があって実際に触る機会があり、これで楽器を作ってみたいと思ったので、はじめの一歩として簡単だと思った叩く楽器のようなものを作ろうと思いました。その過程を紹介しようと思います。

スケッチを作る

簡単に叩く→音が鳴る方法を探していると、Arduinoのフラッシュメモリーに音を書き込んで鳴らす方法を使って音声を再生するという動画を発見しました。
【電子工作】Arduinoをしゃべらせてみた
この動画の投稿者のブログに書いてあったスケッチをもとに、叩くことによって音がなるように作り変えました。

変更点

  • この作者がスケッチを書いた頃と仕様が変わっていたので変更しました。(赤字部)
  • KUGIをSNDに変えました
  • KnockでLEDをつけるスケッチから、音声を鳴らすスケッチに叩いて動作させるためコピーしました。(青字部)

スケッチはこの記事の下にあります。

音声ファイルは今回はフリーの効果音サイトのものを使いました。爆発音を使用しました。

ファイルはAudacityでモノラルにしてリサンプリングして8000Hzにしました。
ファイルが短すぎると大きな音のノイズも鳴ってしまいました。なので今回は、ファイルの最後に1秒弱無音をつくりました。

そのファイルをWAVで保存して、WAV2CというWindows用のソフトをWINE環境で動作させて、テキストに変換しました。
スクリーンショット 2017-02-06 16.56.11

組み立て 

ブレッドボードを使い、配線します。
ピエゾ
を用意、6枚100円で売っていました。

リード線を半田付けします。
ピエゾから入力するとき、保護のために抵抗2.2MΩを入れました。

スピーカーはデジタルの3番、ピエゾはアナログの0番に繋ぎます。
この写真を参考にしてください。
IMG_3545

ピエゾを何か箱に貼り付けます。

完成

IMG_3547


 

スケッチ

// ***********************************************
// *** Arduinoをしゃべらせてみた

// ***********************************************
#include <avr/pgmspace.h>
const unsigned char SND[] PROGMEM ={音声ファイル};
// ***********************************************

// these constants won’t change:
const int ledPin = 13; // led connected to digital pin 13
const int knockSensor = A0; // the piezo is connected to analog pin 0
const int threshold = 100; // threshold value to decide when the detected sound is a knock or not

// these variables will change:
int sensorReading = 0; // variable to store the value read from the sensor pin
int ledState = LOW; // variable used to store the last LED status, to toggle the light

void setup() {
// ***—————————————–***
// *** D03 OUTPUT PWM設定

// ***—————————————–***
pinMode( 3,OUTPUT); // *** D03 PWM OUTPUT

TCCR2A = 0b00100011; // *** 高速PWM設定

TCCR2B = 0b00011001;
OCR2A = 255;

// *** 周期

// *** 1count=0.0625us

// *** 0.0625*256 -> 16us

// *** -> 62.5kHz
OCR2B = 0; // *** Duty 0 – 255

// ***—————————————–***
}
// ***********************************************
void loop() {

// read the sensor and store it in the variable sensorReading:
sensorReading = analogRead(knockSensor);

// if the sensor reading is greater than the threshold:

if (sensorReading >= threshold) {
// toggle the status of the ledPin:
ledState = !ledState;
// update the LED pin itself:
digitalWrite(ledPin, ledState);
// send the string “Knock!” back to the computer, followed by newline
Serial.println(“Knock!”);
// ***—————————————–***
int i;
// ***—————————————–***
for(i=0; i<12000; i++){
// ***—————————————–***
OCR2B = pgm_read_byte_near(&SND[i]);
delayMicroseconds(125); // *** 8kHzで再生

// ***—————————————–***
}
}
delay(100); // delay to avoid overloading the serial port buffer
// ***—————————————–***
}
// ***********************************************
// *** PROGRAM END

// ***********************************************

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です