研究テーマ->メディアアート->メディアアートについて->ピエゾ(コンタクトマイク)をトリガーにして音を鳴らす プログラム

ArduinoとShieldについて紹介します。  
ハードウェアの準備


 
C:\Program Files (x86)\Arduino\examples\06.Sensors\Knockというフォルダの下にlayout.pngというファイルがあります。layout.pngの画像をもとに、配線を行います。ピエゾ(コンタクトマイク)1つと、1Mオームの抵抗が必要です。
layout.pngではArudinoに直接配線していますが、ここではShieldの上から配線します。
サンプルコードの読み込み
ハードウェアの動作確認のため、まず、サンプルプログラムを実行してみます。
「06 Sensors」の中にある「Knock」というサンプルプログラムを読み込みます。ピエゾをたたくとLEDが点灯する仕組みですが、ここではLEDを使わず、シリアルモニタへの表示を利用して動作確認を行います。
プログラムをボードに転送し、ピエゾを指でたたいてみます。
上図のように表示されたら正しく動作しています。
配線の変更


 
「player.beginInMidiFmt();」を行うと、アナログの入力ポートは、A4以降のポートしか機能しなくなるようです。このため、上図のように配線を変更してA4ポートを使用するようにします。 サンプルでは1Mオームの抵抗がつけられていて、はずしてもセンサーは反応しますが、取得する値が不安定になります。
プログラムの変更
#include <SD.h>
#include <SPI.h>
#include <arduino.h>
#include <MusicPlayer.h>
const int knockSensor = A4; // the piezo is connected to analog pin 0
int sensorReading = 0; // variable to store the value read from the sensor pin
const int threshold = 10; // threshold value to decide when the detected sound is a knock or not
bool on_off_flg = false;
void setup()
{
    Serial.begin(9600);
    player.beginInMidiFmt();
    player.midiWriteData(0xB0, 0x07, 120);
}
void loop()
{
    sensorReading = analogRead(knockSensor);
    Serial.println(sensorReading);
if (sensorReading >= threshold && on_off_flg==false)
{
    player.midiWriteData(0x90, 0x40, 120);
    on_off_flg=true;
}
else if (sensorReading < threshold && on_off_flg==true)
{
    player.midiWriteData(0x80, 0x40, 120);
    on_off_flg=false;
}
}
midi_single_toneのプロジェクトに戻って、上のようにプログラムを書き換えます。ピエゾをたたくと発音、もう一度たたくと音を止めるという動作です。