質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

millis()を用いたArduinoを用いたモーター複数制御

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 665

talkje

score 7

Arduinoを用いたモーター複数制御について

モータードライバー(https://www.pololu.com/product/2130/)を用いて、3つのモーターの回転数を独立制御したいと考えています。
Delay()を使ってしまうと、一つのモーターを動かしている途中に他のモーターを動かすことができない為、こちら(http://yohei-msp430.blogspot.com/p/41delayled.html)を参考にしていたのですがうまく行かなかった為質問させていただきました。

モータの選択、初期、中期、後期速度(ms)の時間を指定できる関数generate()を作成して、
loop()内でそれを呼び出すことで個別にモータの制御を行いたいと考えています。

例えば、この関数を使って500msごとにモータの回転が一つずつ始まる、といったことが行いたいです。
このコードに対しての改良点、もしくは参考にできそうなページがあれば教えていただきたいです。
宜しくお願い致します。

int motorL = 44;
int motorLb = 23;
int motorM = 45;
int motorMb = 25;
int motorR = 46;
int motorRb = 27;

unsigned long curMillis;

unsigned long fanMillis = 0;
unsigned long iniMillis = 0;
unsigned long midMillis = 0;
unsigned long purMillis = 0;

int motorstate = 0;

void setup() {
  pinMode(motorL, OUTPUT);
  pinMode(motorLb, OUTPUT);
  pinMode(motorM, OUTPUT);
  pinMode(motorMb, OUTPUT);
  pinMode(motorR, OUTPUT);
  pinMode(motorRb, OUTPUT);

  digitalWrite(motorLb, LOW);
  digitalWrite(motorMb, LOW);
  digitalWrite(motorRb, LOW); //モーターは正転のみ行う為
}

void loop() {
  curMillis = millis();

  generate(motorR, 1500, 1000, 1000);
  delay(500); //本来ここもdelay以外の方法を使いたい・・
  generate(motorM, 1500, 1000, 1000);
  delay(500);
  generate(motorL, 1500, 1000, 1000);

}

int generate(char motor, int initial, int middle, int purge) {

  if (curMillis - iniMillis > initial) {
    if (motorstate == 1) {
      analogWrite(motor, 100);
    }
    int motorstate++;
    iniMillis = curMillis;
  }

  if (curMillis - midMillis > middle) {
    if (motorstate == 2) {
      analogWrite(motor, 130);
    }
    motorstate++;
    iniMillis = curMillis;
  }


  if (curMillis - purMillis > purge) {
    if (motorstate == 3) {
      analogWrite(motor, 180);
    }
    motorstate++;
    purMillis = curMillis;
  }

  if (iniMillis == curMillis && midMillis == curMillis && purMillis == curMillis) {
    motorstate
    analogWrite(motor, 0);
  }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/08/14 20:01

    現状のコードではどういう動作になるんでしょうか

    キャンセル

回答 1

0

改良ってのは、とりあえず動いた上で「良くする」もの。まともに動いていないものは「改良」どころじゃないでしょう。

generate()関数も、loop()関数も、結構根っこの方で理解できていない感があります。
参照先のサイトをちゃんと読み込んで、書いてあることをきちんと理解するところから始めては。

掛け時計が一つある部屋で、部屋に入って30分経ったら出てくるよう言われたらどうしますか。部屋に入ったときに時計を見て、その後ちらちらと時計を見て最初の時間から30分経ったかどうか確かめるでしょう。そんなような話なんですが。
一方、アラーム付きの時計を用意して30分後にセットして寝入ってしまうのがdelay()、です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る