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

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

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

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

Q&A

2回答

1060閲覧

Arduinoの符号反転とセンサの反応回数の取得

yyybbbyy

総合スコア13

Arduino

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

0グッド

0クリップ

投稿2022/10/14 07:48

編集2022/10/14 08:38

前提

Arduinoにおいて例えばシリアルモニタ等からaを受け取ったらモーターが正転、bを受け取ったら後転させ、その時のモーターの回転数を1秒ごとに出力するプログラムを作成しました。

実現したいこと

現在はシリアルモニタ―を開いた瞬間から回転数を取得しているが、aやbといった信号を受け取ってから計測し始めるようなプログラムを作成したいです。
またbが入力された際はマイナス値で出力したいです。(countはlong型)
つまりaが入力されたら1秒ごとに回転数を出力、bが入力されたら1秒ごとにマイナスで回転数を出力といった感じです。

発生している問題・エラーメッセージ

エラー等はないのですが、以下のプログラムではシリアルモニタを開いた瞬間から回転数をカウントしてしまいます。(最初は回転していない為0が出力され続けます。)

該当のソースコード

Arduino

1void countInc() { 2 count++; //センサが1回反応するごとにプラス1 3} 4void loop() { 5 unsigned long t = millis(); //tは現在の時間を取得 6 if (t - t0 >= 1000) { //1000ミリ秒経ったら 7 noInterrupts(); 8 Serial.println(count); // 9 count = 0; 10 interrupts();//割り込み再開 11 t0=t; // 12 } 13 14 if (Serial.available() > 0) { //ここから先はモーターの操作 15 data = Serial.read();//シリアル通信で受け取ったデータを読み込む 16 if (data == 'a') { 17 digitalWrite(IN1, HIGH); // 正転 18 digitalWrite(IN2, LOW); // 正転 19 } else if (data == 'b') { 20 digitalWrite(IN1, LOW); // 後転 21 digitalWrite(IN2, HIGH); // 後転 22 } 23}

試したこと

while文などを使いましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

どうかよろしくお願いいたします。

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

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

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

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

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

thkana

2022/10/15 01:50

https://teratail.com/questions/hxlynge95m5zsn 他人に書かせたプログラムを流用したならその旨書いておくべきじゃないですかねぇ。 いちいち質問者の過去の質問を確認するわけでもないので、「そのプログラムを自分で書く技量がある」前提の回答がついちゃったりしますよ。
thkana

2022/10/15 02:07

本題じゃないけれど、出力設定のピンにIN1とかIN2という名前を付けるのはとてもキモチワルイです。
guest

回答2

0

提示コードがうまく理解できていませんが、おおよそ以下のような対応でよいかと思います。

  • nDirのような整数型の変数を用意。初期値は0。
  • a,bを受け取ったら1,-1といった値をセット。
  • nDirが0以外のときだけシリアル出力。このとき「回転数」にnDirを掛けた値を出力。

投稿2022/10/14 08:00

can110

総合スコア38256

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

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

yyybbbyy

2022/10/14 08:53

コメントありがとうございます。少しコードに間違えもあったため、修正させていただきました。 すいません、nDirとは何でしょうか?簡単なコードで大丈夫ですので教えてもらうことは可能でしょうか??
can110

2022/10/14 08:57

nDirは0=回転していない(出力しない)、1=正転、-1=後転といった状態を表すフラグ的な変数です。
yyybbbyy

2022/10/14 11:49 編集

ありがとうございます。 解釈が間違っていたら申し訳ないのですがnDirの代わりとしてシリアルからの情報を受け取る変数dataを取得し、dataの値によってモーターの動き等を変えています。 以下のプログラムだとaを入力すると値は出力されるのですが、1回しか回転数が出力されません。何が原因なのでしょうか? void loop() { if (Serial.available() > 0) { data = Serial.read();//シリアル通信で受け取ったデータを読み込む if (data == 'a') { digitalWrite(IN1, HIGH); // 直進(ノーマル) digitalWrite(IN2, LOW); // モータ1を正転 unsigned long t = millis(); //こっから計測のプログラム if (t - t0 >= 1000) { noInterrupts(); Serial.print(cnt); cnt = 0; interrupts();//割り込み再開 t0=t; } }else if (data == 'b') { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); }
yyybbbyy

2022/10/14 11:53

もしくはifをwhileに変更した場合、aを入力すると1秒ごとに出力はされますが、bを入力してもうごかない(aの動きを続けてしまいます)ので、これを改善したいです。 while (data == 'a') { digitalWrite(IN1, HIGH); // 直進(ノーマル) digitalWrite(IN2, LOW); // モータ1を正転 unsigned long t = millis(); //こっから計測のプログラム if (t - t0 >= 1000) { noInterrupts(); Serial.print(cnt); cnt = 0; interrupts();//割り込み再開 t0=t; } }if (data == 'b') { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); }
guest

0

シリアルから最初の入力があったかどうかを示す変数を置く
初期値をfalseにして入力があったらtrueにする
if文なりなんなりでfalseの間は計測をしないようにする

投稿2022/10/14 07:52

ozwk

総合スコア13521

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

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

yyybbbyy

2022/10/14 11:49 編集

ご回答ありがとうございます。一応、シリアルから入力があったら開始する、以下のプログラムだとaを入力すると値は出力されるのですが、1回しか回転数が出力されません。何が原因なのでしょうか? void loop() { if (Serial.available() > 0) { data = Serial.read();//シリアル通信で受け取ったデータを読み込む if (data == 'a') { digitalWrite(IN1, HIGH); // 直進(ノーマル) digitalWrite(IN2, LOW); // モータ1を正転 unsigned long t = millis(); //こっから計測のプログラム if (t - t0 >= 1000) { noInterrupts(); Serial.print(cnt); cnt = 0; interrupts();//割り込み再開 t0=t; } }else if (data == 'b') { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); }
yyybbbyy

2022/10/14 11:53

もしくはifをwhileに変更した場合、aを入力すると1秒ごとに出力はされますが、bを入力してもうごかない(aの動きを続けてしまいます)ので、これを改善したいです。 while (data == 'a') { digitalWrite(IN1, HIGH); // 直進(ノーマル) digitalWrite(IN2, LOW); // モータ1を正転 unsigned long t = millis(); //こっから計測のプログラム if (t - t0 >= 1000) { noInterrupts(); Serial.print(cnt); cnt = 0; interrupts();//割り込み再開 t0=t; } }if (data == 'b') { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); }
ozwk

2022/10/14 20:56 編集

フラグ= false void loop(){ if(シリアルにデータがある){ 受信処理 フラグ= true } if(フラグ){ 測定処理 } }
ozwk

2022/10/14 20:57

> シリアルからの情報を受け取る変数dataを取得し 回答はそういう意味ではありません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問