Top/Devel/電子工作/Arduino/楽器

楽器はてなブックマーク

chuckmin.jpg

今回は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配列をコメントアウトされている側に差し替えると、ヨナ抜き長音階になります。民謡風に聞こえる音階です。
    なお、デフォルトの音階はニロ抜き長音階で、琉球民謡風に聞こえる音階です。

スケッチ

filechuckmin.ino
/*
 * 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        
*/
}

関連

../ゲームコントローラー

参考

Amazon

差分 一覧