| 1 | = Arduinoで作る野球ゲームの部品セット 紹介ページ = |
| 2 | |
| 3 | [http://toragi.cqpub.co.jp/Portals/0/support/junior/ トラ技ジュニア] 12・1月号の記事「ひとりでできるマイコンArduino ~電子回路のプログラムもコピペッペ~」で紹介されている「LED野球ゲーム」にピッタリのキットです。 |
| 4 | |
| 5 | == キット内容物 == |
| 6 | * Arduino Uno |
| 7 | * ブレッドボード |
| 8 | * 柔らかいジャンパ 4本 |
| 9 | * LED5個(赤4個、緑1個) |
| 10 | * 抵抗1kΩ 1個 |
| 11 | * タクトスイッチ 1個 |
| 12 | * 圧電スピーカ 1個 |
| 13 | * USBケーブル |
| 14 | |
| 15 | == 野球ゲーム スケッチ == |
| 16 | |
| 17 | {{{ |
| 18 | #define BUTTON 2 |
| 19 | #define SPEAKER 3 |
| 20 | #define BALL5 9 |
| 21 | #define BALL4 10 |
| 22 | #define BALL3 11 |
| 23 | #define BALL2 12 |
| 24 | #define BALL1 13 |
| 25 | #define DURATION 500000 |
| 26 | |
| 27 | unsigned long duration = DURATION; |
| 28 | int level = 0; |
| 29 | int strike = 0; |
| 30 | int last = 0; |
| 31 | |
| 32 | void setup() { |
| 33 | pinMode(BALL1, INPUT); |
| 34 | pinMode(BALL2, INPUT); |
| 35 | pinMode(BALL3, INPUT); |
| 36 | pinMode(BALL4, INPUT); |
| 37 | pinMode(BALL5, INPUT); |
| 38 | pinMode(SPEAKER, OUTPUT); |
| 39 | pinMode(BUTTON, INPUT_PULLUP); |
| 40 | Serial.begin(9600); |
| 41 | } |
| 42 | |
| 43 | boolean ball(int pin) { |
| 44 | tone(SPEAKER, 880, 20); |
| 45 | pinMode(pin, OUTPUT); |
| 46 | digitalWrite(pin, HIGH); |
| 47 | last = pin; |
| 48 | unsigned long start = micros(); |
| 49 | while (micros() - start < duration) { |
| 50 | if (digitalRead(BUTTON) == LOW) { |
| 51 | return true; |
| 52 | } |
| 53 | } |
| 54 | digitalWrite(pin, LOW); |
| 55 | pinMode(pin, INPUT); |
| 56 | return false; |
| 57 | } |
| 58 | |
| 59 | void loop() { |
| 60 | Serial.print("Level: "); |
| 61 | Serial.println(level); |
| 62 | Serial.print("Strike: "); |
| 63 | Serial.println(strike); |
| 64 | Serial.println("Hit the button to start"); |
| 65 | |
| 66 | // ボタンが押されてから離されるのを待つ。 |
| 67 | while (digitalRead(BUTTON) == HIGH) { |
| 68 | } |
| 69 | while (digitalRead(BUTTON) == LOW) { |
| 70 | } |
| 71 | delay(50); |
| 72 | |
| 73 | // ボールを投げる。 |
| 74 | if (ball(BALL1) || ball(BALL2) || ball(BALL3) || ball(BALL4)) { |
| 75 | // ボタンを押したのが早すぎる。 |
| 76 | ++strike; |
| 77 | tone(SPEAKER, 50, 500); |
| 78 | delay(700); |
| 79 | } else |
| 80 | if (ball(BALL5)) { |
| 81 | // ヒット! |
| 82 | strike = 0; // ストライクの数を0に戻す。 |
| 83 | ++level; // レベルを上げる。 |
| 84 | duration *= 0.8; // ボールを速くする。 |
| 85 | tone(SPEAKER, 554, 300); |
| 86 | delay(300); |
| 87 | tone(SPEAKER, 440, 300); |
| 88 | delay(300); |
| 89 | } else { |
| 90 | // 遅すぎる。 |
| 91 | ++strike; |
| 92 | tone(SPEAKER, 50, 500); |
| 93 | delay(700); |
| 94 | } |
| 95 | |
| 96 | // ボタンがオフになるまで待つ。 |
| 97 | while (digitalRead(BUTTON) == LOW) { |
| 98 | } |
| 99 | Serial.println(); |
| 100 | digitalWrite(last, LOW); // 最後に光らせたLEDを消す。 |
| 101 | pinMode(last, INPUT); |
| 102 | |
| 103 | if (strike == 3) { |
| 104 | // 3ストライク、バッターアウト。 |
| 105 | Serial.print("Last Level: "); |
| 106 | Serial.println(level); |
| 107 | Serial.println("Hit the button to start over."); |
| 108 | tone(SPEAKER, 50, 500); |
| 109 | delay(700); |
| 110 | tone(SPEAKER, 50, 500); |
| 111 | |
| 112 | // ボタンが押されてから離されるのを待つ。 |
| 113 | while (digitalRead(BUTTON) == HIGH) { |
| 114 | } |
| 115 | while (digitalRead(BUTTON) == LOW) { |
| 116 | } |
| 117 | duration = DURATION; |
| 118 | level = strike = last = 0; |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | }}} |