とりあえずさくっと Japanino のプリロード(デフォルト)スケッチを適当にいじってみた
Japanino のスケッチその他についてはこちら。
で、Japanino 購入時に元々入っているスケッチ(≒プログラムコード*1)は Japanino 自身と付属の LED-POV の動作確認用なので、ギミック的に面白いものではない。…ので、インタラクション的にちょっとだけいじってみましたよ。(ちょっとだけと言いつつ何時間もかかっているのは内緒の方向で。)
で、「入力用」のスイッチだが、コネクタで外に引き出してみたり。
スケッチはこちら。
改造した箇所(行)にはだいたい 「****」を入れている。
/* * * 出荷時スケッチ改・Ver.NEKOFUN 003 * */ // 20100522 OkibiWorksLabo (改造) // 設定 int defaultDuration = 50; // **** LEDを点灯する時間(ミリ秒) int duration = defaultDuration; // **** int inputPin = 6; // スイッチ入力ピン(オンでLOW) int ledMin = 7; // LEDピン範囲の最小 int ledMax = 13; // LEDピン範囲の最大 int buzzPin = 14; // ブザーピン(A0はD14としてアクセス) int buzzTone = 4000; // ブザーの音程 int buzzTime = 10; // ブザーを鳴らす時間(ミリ秒) // ****【実験】tone の音階をいじる #include "pitches.h" int melody[] = {NOTE_DS6 , NOTE_CS6 , NOTE_FS5 , NOTE_FS6 , NOTE_FS6 , NOTE_DS6 , NOTE_CS6 , NOTE_FS5 , NOTE_FS6 , NOTE_FS6 , NOTE_DS6 , NOTE_CS6 , NOTE_FS5 , NOTE_FS6 , NOTE_DS5 , NOTE_FS6 , NOTE_CS5 , NOTE_F6 , NOTE_F6 , NOTE_DS6 , NOTE_CS6 , NOTE_CS5 , NOTE_F6 , NOTE_F6 , NOTE_DS6 , NOTE_CS6 , NOTE_CS5 , NOTE_F6 , NOTE_F6 , NOTE_DS6 , NOTE_CS6 , NOTE_CS5 , NOTE_F6 , NOTE_DS5 , NOTE_F6 , NOTE_FS5 , NOTE_FS6 , NOTE_FS6 , 0}; int melodyPtr = 0; // **** // グローバル変数 unsigned long lastOn = 0; // ブザー鳴らし始め時刻(0なら鳴っていない) void setup() { pinMode(inputPin, INPUT); // スイッチは入力 digitalWrite(inputPin, HIGH); // 内蔵プルアップ有効 for (int i = ledMin; i <= ledMax; i++) { pinMode(i, OUTPUT); // LEDへの接続は出力 } pinMode(buzzPin, OUTPUT); // ブザーは出力 ending(); // **** 最初ですけど、てってけてーを鳴らす(笑) } // LED点灯中にやるべき処理 void pause() { unsigned long started = millis(); for (;;) { unsigned long now = millis(); // LED点灯時間が経過したら、 if (now - started > duration) { // この関数を終わる。 return; } // スイッチがオンになっていたら、 if (digitalRead(inputPin) == LOW) { tone(buzzPin, melody[melodyPtr]); // ブザーを鳴らす。 lastOn = now; // 鳴らし始めた時刻を覚えておく。 duration = 8; // **** LED点滅間隔を詰める } // ブザーが鳴っていて、かつ一定時間経過していたら、 if (lastOn != 0 && now - lastOn > buzzTime) { noTone(buzzPin); // ブザーを止める。 lastOn = 0; // 止めたことを覚えておく。 duration = defaultDuration; // **** LED点滅間隔を元に戻す melodyPtr++; // **** 音符を進める if (melody[melodyPtr] == 0) { melodyPtr = 0; }; // **** ループする /* Serial.print (melody[melodyPtr]); */ /* Serial.print (" "); */ /* Serial.println(melodyPtr); */ } } } void loop() { // 上方向 for (int i = ledMin; i <= ledMax; i++) { digitalWrite(i, HIGH); // 点灯する pause(); digitalWrite(i, LOW); // 消灯する } // 下方向 for (int i = ledMax; i >= ledMin; i--) { digitalWrite(i, HIGH); // 点灯する pause(); digitalWrite(i, LOW); // 消灯する } } void ending() { // **** てってけてーの部分 int endMelody[] = {NOTE_FS6 , 0 , NOTE_CS6 , NOTE_CS6 , NOTE_D6 , NOTE_CS6 , 0, NOTE_F6 , 0 , NOTE_FS6 , 0}; int endMelodyLen[] = {8,8,8,8,4,4,4,8,8,8,8}; for (int i = 0 ; i < 11 ; i++) { int dura = 1000 / endMelodyLen[i]; tone(buzzPin, endMelody[i], dura); int dura2 = dura * 1.2; delay(dura2); } } // **** Ending なのに最初に流すのは仕様です
かなり計画性無く適当に書いたんで変数とかめちゃくちゃですみません m(_ _)m
ていうか、ほぼコピペの掻き集めしかしていないような気もする m(_ _)m m(_ _)m
で。
そのまま実行しようとするとたぶん「pitches.h が無いよぅ」とか怒られてコンパイル完了しないはず。そこで、ArduinoIDE のパッケージの中に、例えば
\arduino-0018\examples\Digital\toneMelody
あたりに「pitches.h」があるので*2 スケッチの保存してるフォルダ(か、若しくは ArduinoIDE 本体のあるフォルダ(たぶんこのへんのどっかに入れてもいけるはず*3))にコピーして IDE を 1回再起動(ここ重要)。
【追記】 Arduino IDE から [ファイル]>[スケッチ例]>[Digital]>[toneMelody] を選んで開き、コピペ上書きでスケッチを丸々置き換えればいいよん、Japanino と、公式サイトでは説明している(未検証)。
これで、音階に「NOTE_F4」とか「NOTE_CS7」とか(S はシャープの意味らしい)が使えるようになる。この「pitches.h」ライブラリがやっているのは音高(周波数)値を階名の定数に淡々とに定義しているだけなので、ロードするスケッチのサイズを小さくするなら(Japanino は特に ATMega168V が使われているので壮大な曲を書くとサイズ的に微妙になるかもしれない)、使わない「音」は削って構わない。
まあ要するにあれです、ボタン押して何かが起こるなら、このくらい起こると楽しいかな、と思ってですね。