メインコンテンツまでスキップ

楽器

今回はWiiのヌンチャクコントローラをArduinoに接続して楽器を作ってみます。

ヌンチャクを使ったテルミンのような楽器なので、とりあえずChuckminと名づけました。

必要なもの

手順

  1. WiiChuckにピンヘッダを半田付けする。(labs.thingm.comと書いてある側からピンヘッダの短い方を差込み、逆側から半田付けする。)
  2. ArduinoのA2ピンに-、A3ピンに+、A4ピンにd、A5ピンにcが挿さるように挿す。
  3. 圧電ブザーをGNDと10番ピンに挿さるように挿す。
  4. WiiChuckにヌンチャクコントローラを挿す。(ヌンチャクの金属端子の凹みがある方が上になるように挿す。)
  5. USBケーブルを挿す。
  6. 下記スケッチをダウンロードし、一旦上書きする。
  7. スケッチと同じ場所にchuck_funcs.hを格納する。
  8. 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-A2GND
V+A33.3V
SDA(シリアルデータ)dA4D2 または SDA
SCL(シリアルクロック)cA5D3 または 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
*/
}

参考