Arduinoを使ってボタンを押すとモーターが回る・停止するという機能を実現したい場合、いくつかのポイントを押さえてコードを組む必要があります。この記事では、初心者向けにその方法を簡単に解説し、AIで生成されたコードを改良する方法を紹介します。
必要なハードウェアと設定
まず、今回使用するハードウェアについて説明します。ボタンはKeystudioのもので、モーターはRF-500TBを使用しています。電力不足を防ぐため、PCのUSBではなく、直流電源装置とモータードライバ(トー芝のTA7291P)を使っています。
AI生成コードの問題点
以下がAIが生成したコードです。これに基づいて、モーターの回転や停止をボタンで制御するようになっていますが、うまく動作しない場合があります。
const int in1 = 7;
const int in2 = 8;
const int vref = 9; // PWM制御
const int buttonPin = 2;
bool motorState = false;
bool lastButtonState = HIGH; // プルアップなので初期はHIGH
void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(vref, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // 内部プルアップを有効化
Serial.begin(9600);
}
void loop() {
int buttonState = digitalRead(buttonPin);
// HIGH→LOW(押された瞬間)を検出
if (buttonState == LOW && lastButtonState == HIGH) {
motorState = !motorState;
delay(50); // チャタリング防止
}
lastButtonState = buttonState;
if (motorState) {
// モーター正転
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(vref, 200);
Serial.println("モーター ON");
} else {
// モーター停止
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(vref, 0);
Serial.println("モーター OFF");
}
delay(10);
}
問題の原因と解決方法
このコードは基本的には正しいのですが、以下の点に注意する必要があります。
- チャタリング防止:ボタンを押した際にチャタリングが発生し、正しい状態が反映されないことがあります。delay(50)で遅延を加えていますが、ボタンを複数回押す場合には処理の方法を工夫する必要があります。
- モータードライバの設定:モータードライバTA7291Pを使用している場合、信号の送り方に注意が必要です。正転、逆転、停止の設定を正しく行い、モーターに無理な負荷がかからないようにしましょう。
- 電源供給:PCのUSBからでは電力が足りないとのことなので、適切な外部電源を使用していることを確認します。モーターやモータードライバに十分な電力が供給されていない場合、正常に動作しない可能性があります。
改善されたコードの例
以下は、ボタンを押した際にモーターが正しくオン・オフされるように改善したコードです。
const int in1 = 7;
const int in2 = 8;
const int vref = 9;
const int buttonPin = 2;
bool motorState = false;
bool lastButtonState = HIGH;
void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(vref, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW && lastButtonState == HIGH) {
motorState = !motorState;
delay(150); // ボタンのチャタリング防止を改善
}
lastButtonState = buttonState;
if (motorState) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(vref, 255);
Serial.println("モーター ON");
} else {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(vref, 0);
Serial.println("モーター OFF");
}
}
まとめ
ボタンを押すことでモーターのオン・オフを制御するためには、チャタリング防止やモータードライバの設定、電源供給に注意が必要です。今回紹介した改善点を試して、よりスムーズにモーターの動作を実現しましょう。初心者でも理解しやすいコードと手順を踏むことで、Arduinoを使ったモーター制御のスキルが向上します。

コメント