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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

1回答

3275閲覧

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

talkje

総合スコア7

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/08/14 05:30

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); } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/08/14 11:01

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

回答1

0

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

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

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

投稿2019/08/14 09:40

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問