5188円で始めるフィジカルコンピューティング 第2回 〜テルミンつくってみるミン 動けArduinoさんの巻〜

今までの連載:
5188円で始めるフィジカルコンピューティング 第1回 〜テルミンつくってみるミン イントロ〜

 まだ1回目を見ていない人は、Yahoo Japanを見ていたほうがいいと思います。はりきって2回目です。みなさんのもとにArduinoは届いたでしょうか。買ってしまった人は手遅れです、早く逃げて〜。

090521_Arduino01
090521_Arduino01 posted by (C)karaage
 手遅れの図。イタリア生まれのおしゃれなArduinoさん

 セットアップですが、「Arduinoでマイコンしよう!!」というページを参考にして下さい。多分問題なくセットアップできるはずです。Windows VISTAでArduinoのソフト環境が起動しないときは、あわてず騒がず「Arduino IDEがVistaでも快適に」というページを参考にしてみてください。セットアップできたら、早速サンプルを動かしてみましょう。File→Sketchbook→Example→Digital→Blinkを選択した後、左上の矢印でコンパイル(プログラムをマイコンのわかる形に翻訳)、右上の→でアップロード(マイコンにデータを送る)。ArduinoのTx,RxというLEDが点滅しばらく点滅した後(通信している合図)LEDがピカピカしたら成功です。うまくアップロードできないよ〜という人は、Tool→BoardでArduino Duemilanove/ATMEGA328にチェックが入っているか確認してください。よくはまるところかと思います。恥ずかしながら、自分も暫く悩んでいました。
 では、プログラムの簡単な説明でも、ソースコードは下記のような感じです。

int ledPin = 13;                // ピン番号の指定、ここでピン番号を設定する

void setup()                    // 一度だけ実行する関数。初期設定はここで行う。
{
  pinMode(ledPin, OUTPUT);      // 一行目で指定したピンを出力ピンとして設定する
}

void loop()                     // setup()関数を実行した後、このloop()関数の無限ループに入る
{
  digitalWrite(ledPin, HIGH);   // セットアップ関数で指定したピンをHIGH(=1)にする
  delay(1000);                  // 1秒(=1000ms)待つ
  digitalWrite(ledPin, LOW);    // セットアップ関数で指定したピンをオフ(=1)にする
  delay(1000);                  // 1秒(=1000ms)待つ
}

 ArduinoはProcessingという言語を使います。javaがベースみたいで、C言語とか一度でも触ったことある人ならすぐわかるかと思います。日本語のコメントつけておきました。(//以下がコメントで、何を書いてもまったくプログラムの動作には影響しません)。初歩的なプログラムの説明は省略しますので、勉強したい人は、Processing,java,C言語あたりで検索して解説サイトを見て下さい。最初はなんとなくの理解でもいいかなという気もします。ざっくり説明すると、Arduinoは1度setup()関数を実行した後、loop()関数の無限ループに入ります。setup()という関数でArduinoの設定した後、loop()関数でプログラム実行という感じ。ここでは13番ピンを1秒毎にオン、オフ切り変えるプログラムが実行されます。実は、13番ピンはArduinoの基板上のLEDと接続されているので、LEDがピカピカ点滅するという仕組みです。delay(1000)って命令の1000の数字を色々変えると、点滅の仕方が変わるのがわかると思います。色々ためして体で覚えてみてください。

 次は、File→Sketchbook→Example→Digital→Melodyをためしましょう。
ソースコードはこんな感じです。

int speakerPin = 9;

int length = 15; // the number of notes
char notes[] = "ccggaagffeeddc "; // a space represents a rest
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 300;

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}

void playNote(char note, int duration) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
  
  // play the tone corresponding to the note name
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}

void setup() {
  pinMode(speakerPin, OUTPUT);
}

void loop() {
  for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }
    
    // pause between notes
    delay(tempo / 2); 
  }
}

 プログラムの最初に9番ピンが設定されているので、9番ピンに何かを繋げると凄いことが起こりそうということが想像できます。ここでは、前回買った圧電ブザーをジャンパワイヤ(オス〜オス)を使って接続するのが正解(?)です。ちなみに前回の記事、ジャンプワイヤ(オス〜オス)と書きながら、何故か(メス〜メス)にリンクしていたので修正しておきました、深くお詫びいたします。まあオスとメスを勘違いするなんて、人間でもよくあることですよね☆
 圧電ブザーの白い線をジャンプワイヤでDigitalと書かれている列の9番ピン、黒いほうをPowerと書いてある列のGND端子に接続してください。GNDというのは、基準の電位(0V)のことで、専門用語でグランドといいます。数字の上ではただの0ですが、電気的には重要な要素をもっていて、エンジニアの世界で、「ちょっとグランドが弱いですね」とか「グランドのインピーダンスが高いのが原因かもしれません」とかいうとちょっとできる奴と思われる風習があります。明日から困ったら使ってみましょう。責任は全くとれませんけど。準備が完成したら、下のソースコードを実行して下さい。

 LEDピカピカの要領でコンパイル→アップロードして音楽が流れたら成功です。仕組みはというと、この圧電ブザーは、電圧のオン・オフを素早く繰り返すと高い音が出て、オン・オフのゆっくり繰り返すと低い音が出ると言う仕組みを持っているのですが、その仕組みを利用してメロディーを奏でています。イメージでいうと、さっきのLEDのピカピカの点滅が早いほど高い音が出て、ピカピカが遅いほど低いというイメージ。多分プログラムわかる人なら、すぐ仕組みがわかると思います。わからない人は勉強してみてね☆ふぁいとっ!


Arduino01
 サンプルの低画質動画を無駄に世界に向けて発信してやるぜ!

 想像以上に長くなってしまったのでここで2回目は完了。次回はセンサーを使うよ〜(僕のやる気があれば)。3回でテルミン完成の予定だったのですが、このペースだと全6回くらいになりそうな予感です。今のところこのサイトをちゃんと見ている人の20人に1人くらいが完走できるようなレベルを目指しています。まだまだみんな余裕だよね☆
 ちょっとプログラム自信ないよ〜とか予習をしたい人は、いくつか参考サイトを挙げておくので予習、復習してみてください。

■Arduino 日本語リファレンス
 日本語のリファレンス。プログラムが良くわからない人は参考になると思います。

■エレキジャック連載 フィジカル・コンピューティング
 エレキジャックという名前からしてあまりに電波な雑誌連載です。ここにリンク貼って終わりにすればよかったんじゃないかと今更後悔しています。LEDピカピカとかは「この解説記事」を読むと電波な人は理解が深まるかもしれません。しかしこんな良質な記事をWEBで公開し続けるとは、エレキジャックさんはなんて電波な出版社なのでしょう、つぶれるんじゃないかしら。