第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()…と同じような名前が増えていく。