HOWTO · Arduino

Arduino でカウンターを作る

Arduino のループを使用してカウンターを作成できます。

このページの内容

Arduinoでカウンターを作るには、ボタンをデジタル入力ピンとGNDに接続し、押された回数を読み取って変数を増やし、その値をシリアルモニターに表示します。以下の例はUno互換ボードを対象としており、設定した上限に達するとカウントをリセットします。内蔵LEDまたは外付けLEDはボタンが押されたことを知らせるもので、数値を表示するものではありません。

Arduinoカウンターの仕組み

カウンターとは、数値を保存し、何らかのイベントが起きたときに値を変える変数です。このプロジェクトでは、ボタンを押すことがイベントになります。Arduinoはloop()を繰り返し実行して入力を確認し、ボタンが離された状態から押された状態に変わったときに、カウントを1回だけ増やします。短いデバウンス時間を設けると、物理スイッチが閉じる際に発生する急速な電気的変化を除去できます。

ループを使って、決まった回数だけ処理を繰り返すこともできます。たとえば、forループでLEDを5回点滅させて停止できます。これは有限ループですが、Arduinoのloop()は実行を続けます。ここで使うスケッチでは、継続するループでボタンを監視します。

ボタンとLEDの配線

INPUT_PULLUPを使う場合、押しボタンの片側をデジタルピン2に、もう片側をGNDに接続します。ボタンを離している間は、ボード内蔵のプルアップ抵抗によって入力がHIGHに保たれます。ボタンを押すとピンがGNDにつながり、入力はLOWになります。この配線方法では外付けのプルアップ抵抗は不要です。

外付けLEDを使う場合は、デジタルピン13から電流制限抵抗を通してLEDのアノード(長い脚)につなぎ、カソード(短い脚)をGNDに接続します。Unoでは内蔵LEDがピン13につながっていることが一般的ですが、ほかのボードではピン配置を確認してください。このスケッチはLED_BUILTINを使い、ボードで定義された内蔵LEDのピンを利用します。LED回路の電流がボードのピンの上限を超えないようにしてください。

ボタンカウンターのスケッチを作成して書き込む

次のC++ソースは、Arduino IDEでスケッチとして使える完全なコードです。デスクトップでC++としてビルドする場合は、付属のハーネスがボタンを3回押した入力を与えるため、カウンターの動作を確認できます。resetAtには、カウンターを0に戻す最初の値を設定します。デバウンス時間は30ミリ秒です。

#ifdef ARDUINO
#include <Arduino.h>
#else
// Desktop harness for a deterministic button sequence.
#include <iostream>
using byte = unsigned char;
const int HIGH = 1, LOW = 0, INPUT_PULLUP = 2, OUTPUT = 3;
const int LED_BUILTIN = 13;
unsigned long mockNow = 0;
void pinMode(byte, int) {}
void digitalWrite(byte, int) {}
unsigned long millis() { return mockNow; }
int digitalRead(byte) {
  bool pressed = (mockNow >= 10 && mockNow < 50) ||
                 (mockNow >= 100 && mockNow < 140) ||
                 (mockNow >= 190 && mockNow < 230);
  return pressed ? LOW : HIGH;
}
struct MockSerial {
  void begin(int) {}
  void println(int value) { std::cout << value << '\n'; }
  void println(const char* value) { std::cout << value << '\n'; }
} Serial;
#endif

const byte buttonPin = 2;
const byte ledPin = LED_BUILTIN;
const unsigned long debounceMs = 30;
const int resetAt = 3;

int counter = 0;
int lastRawReading = HIGH;
int stableReading = HIGH;
unsigned long lastChangeTime = 0;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int reading = digitalRead(buttonPin);
  unsigned long now = millis();

  if (reading != lastRawReading) {
    lastRawReading = reading;
    lastChangeTime = now;
  }

  if (now - lastChangeTime >= debounceMs && reading != stableReading) {
    stableReading = reading;
    if (stableReading == LOW) {
      counter++;
      digitalWrite(ledPin, HIGH);
      Serial.println(counter);
      if (counter >= resetAt) {
        counter = 0;
        Serial.println("Counter reset");
      }
    } else {
      digitalWrite(ledPin, LOW);
    }
  }
}

#ifndef ARDUINO
int main() {
  setup();
  for (mockNow = 0; mockNow <= 230; mockNow += 10) loop();
}
#endif
1
2
3
Counter reset

デスクトップ用ハーネスでは、与えられた3回の押下でresetAtに達するため、各カウントの後にリセットメッセージが表示されます。この出力例に含まれる「Counter reset」というラベルは、コードとのバイト単位の一致を保つため英語のままです。

Arduino IDEでは、接続したボードとポートを選択してスケッチを書き込み、Tools > Serial Monitorを開いてボーレートを9600に設定します。カウントするたびにボタンを押して離してください。モニターには1、2、3と表示され、3回目の押下後には英語の「Counter reset」と表示されます。次に押すと1から再開します。ボタンが安定して押されている間はLEDが点灯し、離すと消灯します。実機ではsetup()とloop()がArduinoコアを使います。デスクトップ用ハーネスは、同じカウンター処理に固定の入力列を与えます。

カウントの表示とリセット

この例では、シリアルモニターが数値表示の役割を果たします。LEDは押下が受け付けられたことを知らせますが、カウント値は表示できません。機器上に数字を表示するには、7セグメントモジュールまたはLCDと、それに必要な配線やライブラリを使います。これらのディスプレイは、このスケッチには実装されていません。

resetAtに達すると自動的にリセットされます。スケッチはしきい値の値を表示し、保存しているカウントを0にして、処理を続けます。別の上限にするには、resetAtをほかの正の数に変更してください。このコードでは専用のリセットボタンを使いません。追加する場合は、未使用のピンに頼らず、専用の入力を割り当てて配線と動作を明示してください。

よくある質問

必要な部品は何ですか?

カウントしてパソコンで確認するには、Uno互換ボード、押しボタン、ジャンパーワイヤー、USBケーブルがあれば十分です。視覚的なフィードバックには内蔵LEDを使うか、外付けLEDと電流制限抵抗を追加してください。

別のディスプレイを使えますか?

はい。LCDや7セグメントディスプレイで数値を表示できますが、それぞれ適切な接続と表示用のコードが必要です。上の例では数値をシリアルモニターに送り、LEDはボタンが押されたことを示す用途に限って使います。

リセットする上限を変更するには?

スケッチ上部にあるresetAtを編集します。カウンターは、その上限に達した値を表示した直後にリセットされます。

カウンターを減算式にできますか?

はい。減算式にするには、受け付けた押下ごとに1を引き、下限に達したときの動作を決めます。この変更は上のスケッチには含まれていません。

ボタンを追加できますか?

はい。追加するボタンごとにピンを割り当てて入力を設定し、減算や手動リセットなど、それぞれ異なる動作を割り当てます。選んだ入力モードに合わせて各ボタンを配線してください。ここで紹介した例が扱うボタンは1つだけです。