第3回 解答例

モータとセンサの関数

演習の解答例。まず自分で書いてから読むこと。

解答

const int MOTOR_PIN = 24;
const int BUTTON_PIN = 9;
const int SENSOR_PIN = 6;

const int MIN_SPEED = 0;
const int MAX_SPEED = 100;
const int PWM_MAX = 255;

int motorSpeed = 0;   // 現在の速度を覚えておく

void motorSetSpeed(int speed) {
    if (speed < MIN_SPEED) {
        speed = MIN_SPEED;
    }

    if (speed > MAX_SPEED) {
        speed = MAX_SPEED;
    }

    motorSpeed = speed;
    analogWrite(MOTOR_PIN, speed * PWM_MAX / MAX_SPEED);
}

void motorStop() {
    motorSetSpeed(0);
}

bool isButtonPressed() {
    return digitalRead(BUTTON_PIN) == LOW;
}

int readSensor() {
    return analogRead(SENSOR_PIN);
}

void setup() {
    pinMode(MOTOR_PIN, OUTPUT);
    pinMode(BUTTON_PIN, INPUT_PULLUP);

    motorStop();
}

void loop() {
    if (isButtonPressed()) {
        motorSetSpeed(50);
    } else {
        motorStop();
    }
}

ポイント

  • motorStop()はmotorSetSpeed(0)を呼ぶだけでよい。同じ処理を2か所に書かない
  • isButtonPressed()がboolを返すことで、loop()が読みやすい文になる
  • 速度の制限をmotorSetSpeed()の中に置いたので、呼ぶ側は範囲を気にしなくてよい

この解答の問題点

motorSpeedがグローバル変数なので、プログラムのどこからでも書き換えられる。

motorSpeed = -100000;   // 誰でも書けてしまう。制限を通らない

モータが2つに増えたときはさらに困る。motorSpeed2、motorSetSpeed2()…と同じような名前が増えていく。

→ 第3回の本文に戻る