楽器

今回はWiiのヌンチャクコントローラをArduinoに接続して楽器を作ってみます。
ヌンチャクを使ったテルミンのような楽器なので、とりあえずChuckminと名づけました。
必要なもの
- Arduino(下記はArduino Unoに場合の接続例です。Arduino Leonardoの場合の接続方法は備考をご覧ください。)
- ヌンチャクコントローラ
- WiiChuck
- ピンヘッダ(4P)(何でも良いです。今回は 秋月電子通商で購入しました。)
- 圧電ブザー(何でもよいです。今回は TDK PS1740P02E を使用しました。)
- chuck_funcs.h(こちらからダウンロードしてください。 「Raw」を右クリックして名前をつけて保存。
手順
- WiiChuckにピンヘッダを半田付けする。(labs.thingm.comと書いてある側からピンヘッダの短い方を差込み、逆側から半田付けする。)
- ArduinoのA2ピンに-、A3ピンに+、A4ピンにd、A5ピンにcが挿さるように挿す。
- 圧電ブザーをGNDと10番ピンに挿さるように挿す。
- WiiChuckにヌンチャクコントローラを挿す。(ヌンチャクの金属端子の凹みがある方が上になるように挿す。)
- USBケーブルを挿す。
- 下記スケッチをダウンロードし、一旦上書きする。
- スケッチと同じ場所にchuck_funcs.hを格納する。
- Arduinoに書き込む。
遊び方
できる操作は下記の通りです。ぐにぐに操作して遊んでください。
- Cボタンを押すと、音が出ます。
- ヌンチャクを左に倒すと音階が下がり、右に倒すと音階が上がります。
- ジョイスティックを手前に倒すと音程が下がり、奥に倒すと音程が上がります。
設定について
- DEBUG定数を1にすると、シリアルモニタにヌンチャクのセンサの現在の値が表示されます。
- notes配列をコメントアウトされている側に差し替えると、ヨナ抜き長音階になります。民謡風に聞こえる音階です。 なお、デフォルトの音階はニロ抜き長音階で、琉球民謡風に聞こえる音階です。
スケッチ
/*
* Chuckmin
*
* 2013 http://cubic9.com
*
* original sketch is WiiChuckDemo
* by 2008 Tod E. Kurt, http://thingm.com/
*
*/
#include <Wire.h>
#include "nunchuck_funcs.h"
#define NOTE_A5 880
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_D6 1175
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_G6 1568
#define NOTE_A6 1760
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_D7 2349
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_G7 3136
#define NOTE_A7 3520
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_D8 4699
#define NOTE_E8 5274
#define NOTE_F8 5588
#define NOTE_G8 6272
#define BUZZER 10
#define DEBUG 0
#define INTERVAL 50
#define LENGTH 100
int loop_cnt = 0;
byte accx,accy,accz,zbut,cbut,joyx,joyy;
int ledPin = 13;
int base;
int shift;
// ヨナ抜き音階
/*
int notes[] = {
NOTE_A5, NOTE_C6, NOTE_D6, NOTE_E6, NOTE_G6,
NOTE_A6, NOTE_C7, NOTE_D7, NOTE_E7, NOTE_G7,
NOTE_A7, NOTE_C8, NOTE_D8, NOTE_E8, NOTE_G8
};
*/
// ニロ抜き音階
int notes[] = {
NOTE_B5, NOTE_C6, NOTE_E6, NOTE_F6, NOTE_G6,
NOTE_B6, NOTE_C7, NOTE_E7, NOTE_F7, NOTE_G7,
NOTE_B7, NOTE_C8, NOTE_E8, NOTE_F8, NOTE_G8
};
void setup()
{
#if DEBUG
Serial.begin(19200);
#endif
nunchuck_setpowerpins();
nunchuck_init(); // send the initilization handshake
#if DEBUG
Serial.print("WiiChuckDemo ready\n");
#endif
}
void loop()
{
if( loop_cnt > INTERVAL ) {
loop_cnt = 0;
nunchuck_get_data();
accx = nunchuck_accelx(); // ranges from approx 70 - 182
accy = nunchuck_accely(); // ranges from approx 65 - 173
accz = nunchuck_accelz();
zbut = nunchuck_zbutton();
cbut = nunchuck_cbutton();
joyx = nunchuck_joyx();
joyy = nunchuck_joyy();
#if DEBUG
Serial.print(" accx:"); Serial.print((byte)accx,DEC);
Serial.print(" accy:"); Serial.print((byte)accy,DEC);
Serial.print(" accz:"); Serial.print((byte)accz,DEC);
Serial.print(" zbut:"); Serial.print((byte)zbut,DEC);
Serial.print(" cbut:"); Serial.print((byte)cbut,DEC);
Serial.print(" joyx:"); Serial.print((byte)joyx,DEC);
Serial.print(" joyy:"); Serial.println((byte)joyy,DEC);
#endif
base = notes[(accx - 70) / 9];
shift = (joyy - 129) * 8;
tone(BUZZER, (base + shift) * cbut, LENGTH);
}
loop_cnt++;
delay(1);
}
備考
Arduino Leonardoの場合は、I2Cの接続ピンが異なります。
役割 | Wiichuckでの表示 | Unoでの接続先 | Leonardoでの接続先 |
---|---|---|---|
GND | - | A2 | GND |
V | + | A3 | 3.3V |
SDA(シリアルデータ) | d | A4 | D2 または SDA |
SCL(シリアルクロック) | c | A5 | D3 または SCL |
Leonardoを使う場合は、トランスモグリシールドでピンをUno互換にするか、ジャンプワイヤなどで上記の通りに接続先を変えてください。
また、nunchuck_funcs.hの25行目~34行目は次のように修正してください。
// Uses port C (analog in) pins as power & ground for Nunchuck
static void nunchuck_setpowerpins()
{
/*
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &= _BV(gndpin);
PORTC |= _BV(pwrpin);
delay(100); // wait for things to stabilize
*/
}