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

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

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

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

1668閲覧

a/dコンパレータの使い方 Arduino

Y.Ta

総合スコア2

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2021/11/11 02:38

編集2021/11/11 08:03

質問です。

Arduinoにて、

現状;
////モーターの回転回数を測定するのに、近接センサーを用いてデジタル2ピンに入力している。
シリアルモニターで回転回数を確認している。
一応必要電圧出るのでHIGHにはなり外部入力割り込みとして検知できているが、アナログ信号なので読み込みカウントが正しくできず、 500prm 以上でカウントが早くなってしまう。(prmは外部装置で計測しているので信頼と仮定しています)

やりたいこと;
//モーターの回転回数を測定するのに、近接センサーを用いてアナログ0ピンに入力します。
//その信号をコンパレートして、1回転毎にデジタル2ピンをHIGHにしたいです。
//正確にカウントしたい。

質問;
A/Dコンバータを使うか、コンパレータを使うかで、今回はモーターの速度を1000prmまで上げたいので、コンパレータを使いたいのですが、調べてもいまいちやり方がわかりません。

有効なライブラリと理解が簡単なスケッチがありますでしょうか。

#include<LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2);//LCD情報 #include <Stepper.h> Stepper myStepper(200, 8, 9, 10, 11);//X軸モーター #include<Wire.h> volatile unsigned int count=0;//割り込み初期値 void setup(){//一度だけ実行 Serial.begin(9600); pinMode(2, INPUT); //割り込みピン attachInterrupt(0, count_pulse, RISING);//外部入力割り込み(2ピン、関数、HIGHでオン) lcd.init(); // LCDの初期化 lcd.backlight(); // LCDバックライトの点灯 lcd.setCursor(0, 0); // LCD1行目指定 lcd.print("turn 8000"); // 文字の表示 lcd.setCursor(0, 1); // LCD2行目指定 lcd.print("Moveing..."); // 文字の表示 rot1(); myStepper.setSpeed(150);//X軸動作速度 MAX150 //DCモーター pinMode(3, OUTPUT);//速度 pinMode(4, OUTPUT);//DC out pinMode(5, OUTPUT);//DC out myStepper.step(-150);//最初に右に動く delay(20); } void rot1(){//DCモーター制御 正転(反転させる場合はHIGH/LOWを逆に) analogWrite(3,80); //DCパワー 70/prm1170 digitalWrite(4, HIGH); digitalWrite(5, LOW); } void rot2(){//X軸制御 myStepper.step(300);//最初に右に動く delay(20); myStepper.step(-300); delay(20); } void loop(){ rot2(); while(count > 8000){//規定countでDCモーターを動作ストップさせループエンド analogWrite(3, 0); digitalWrite(4, LOW); digitalWrite(5, LOW); lcd.setCursor(0, 1); // LCD2行目指定 lcd.print("Finished !!"); // 文字の表示 exit(0); } } void count_pulse(){ count=count+1; Serial.print("Count___"); Serial.println(count); }

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

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

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

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

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

nac_tnk

2021/11/11 07:10

Aruduinoと言わず、ちゃんと機種を示してください。 ※AruduinoではなくArduinoです。 というのも、Arduinoとしてはサポートしていません。 =統一の操作方法は用意されていません。 各チップのレジスタを操作する事になります。
Y.Ta

2021/11/11 08:03

大変失礼いたしました。修正しました。
thkana

2021/11/11 22:19

"Aruduino"が問題なんじゃなくて、Arduinoが出してるボードには https://www.arduino.cc/en/Main/Products ぐらいの種類があって、それ以外にもなんとなく"Arduinoっぽいもの"が山程あって、それのどれなのかはっきりして、という話です。
guest

回答2

0

そもそもとして、なんでそこでコンパレータ(比較器)がでてくるのかしら?

近接センサーを用いてアナログ0ピンに入力します。

//その信号をコンパレートして、1回転毎にデジタル2ピンをHIGHにしたいです。

どういうリクツで改善されるという期待が持てるのでしょう。

A/Dコンバータを使うか、コンパレータを使うかで

全然違う性質のものなので、迷うところではないはずです。A/Dコンバータとは、またコンパレータとはなにか(少なくともA/Dコンパレータなんてものはないでしょう)、ちゃんと調べてみては。このケースでA/Dコンバータの出番はあまりないような気がしますが...

もし、信号の立ち上がり/立ち下がりがブロードでバタつくのなら、むしろ速度が遅い時のほうが影響が大きくなる可能性が高いでしょうが、それは置いておくとしてもそういうときの対策はデジタル入力ならシュミットトリガ、コンパレータなら軽く正帰還をかけてヒステリシス。いずれもハードウェアで行う対策です。ADコンで処理するのならソフト的にヒステリシスをかけることになるかも知れません。あるいは、デジタル入力でスイッチのチャタリングと同じように処理してしまえばよいだけだったりしませんか。

ちなみに、センサーのパルス幅は回転角にしてどのくらいの期間出力されるのでしょう?

まず「なぜ速度が早い時に誤差が大きくなるのか」というリクツをちゃんと突き止めておいたほうがいいと思います。

投稿2021/11/11 12:49

thkana

総合スコア7703

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

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

Y.Ta

2021/11/11 14:50

ご回答丁寧にありがとうございます! まず、ADコンバータの件に関してはネットで漁ってて出てくる用語としてよく調べずに使いました。申し訳ありません勉強になります。 おっしゃる通り、入力時のばたつきが原因かも?と懸念を持って矩形波にしたら改善されるかもしれない。という期待を持ってテストしたい次第です。 また、確かに速度が速い方が誤差が大きいというのは、その原因追求必要だと感じました。 センサーのパルスはアナログ電圧なので、近づいて止まっていればずっと出力されています。 およそ5.3vです。 出したい速度は1000prm程度なので1msecでon/offできるようにコンパレートできたらなと考えていました。 ご指摘箇所のおかげで自分の視点が明確になりました!ありがとうございます!
thkana

2021/11/11 22:36

> センサーのパルスはアナログ電圧なので どういう意味で言っていますか? センサーのパルス高が、何らかの条件によってアナログ的に電圧が変わるのですか? それとも、「デジタルは仮想的な話で、現実世界では全てアナログだ!」という話ですか? 後者であれば、それはとりあえず「デジタル」と称します。アナログ的性質が無視出来ない領域があるなら、なぜ無視できないのかを明確にして、その部分についてだけアナログ的に議論しましょう。アナログというコトバが出てきたからA/Dコンバータに飛びつくというものではないです。 prmじゃなくてRound Per Minuteかと思いますけれど、1000rpmなら秒16.6回転、それと"1ms"との関係は? 1msでon/offとは「何が」1msですか? パルス幅? 立ち上がり/立ち下がり? > 自分の視点が明確になりました う~ん、まだ「よくわかっていないこと/誤解を組み合わせてさらにわけがわからない理論を構築している」感が拭えません。一つ一つの要素/用語を確認する必要を感じます。
guest

0

ベストアンサー

タイトル周辺だけみて書いてしまった。
私の方もちゃんと相手も確認すべきだった。UNOだったね。
内蔵コンパレータの使い方を聞いているのかと思ったけど、そうでもないようだね。

まず、磁気形近接センサというのは具体的な型番、或いはタイプは?

自転車のホイールに付けるような感じだと距離も離れるのでオン/オフは明確に出るだろうけど、
モータの軸だと軸も金属?だろうから裏まで磁化されて難しくなっているのかも。
まぁ設置状態が判らないので何とも言えないけど。
まずは、アナログ入力で、軸をゆっくり回してどんな数値になっているのか確認する事が第一だと思う。

それと通信速度は115200bpsとかにしておいた方が良い。9600じゃ不安。

投稿2021/11/11 08:33

nac_tnk

総合スコア494

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

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

Y.Ta

2021/11/11 08:57

回答ありがとうございます! amazon のこちらの商品です。 https://www.amazon.co.jp/gp/product/B00VKATA9G/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 パルス電圧は5.5V あたりを検出しましたのON/OFFはかなり明確に起きます。 しかし、出力は近づくと電圧が徐々に上がってくるようなので、その辺りが正確なカウントをキープできないのかもしれません。 ゆっくり回すと、しっかり1回転で1カウントとなっているのですが、1000prmを超えると明らかにカウントが実際に回っている速度より早くカウントされてしまいます。 なのでアナログ派の正弦波ではなくデジタルの矩形波に直したいと思ったのです。 A/Dコンバータだと速度的に不安なのと、コンパレータの方が処理が簡単そうなことは調べていて分かったのですが...そこから先がどうもわからず... 内蔵コンパレータがあるんですね? 通信速度が変えられるんですね!?早速試してみます。
nac_tnk

2021/11/11 09:36

あぁ、これですか。 最近誰かの質問で見ました。 因みにこれはNPNと書いてありますから、オープンコレクタ出力です。 メータの12Vの横に78L05がありますから、メータ内で5Vにプルアップされているのかな? いずれにしても、メータのGND=電源の-とArduinoのGNDは繋ぐ必要があります。 (以前の図では繋いでいないようなので) コンパレータを使う必要があるかどうかは、1周回してみて取得したデータ次第です。 閾値を1.5Vとか、3.5Vとかにした方がより明確に反応してくれそうな波形(上がりきらない、あるいは下がりきらない)なら、使った方が良いかも、という事です。
Y.Ta

2021/11/11 10:19

ありがとうございます!  GNDには繋いでいました!申し訳ないです。 UNOにはコンパレータできる機能が内蔵されているんですね。もう一度調べてみようと思います。 ひとまず通信速度を速くしたら、カウントの割り込みでのステッパの挙動が安定しました。 通信速度を速くしすぎた時のデメリットや、遅い場合のメリットなどはどういったものなのでしょうか。
nac_tnk

2021/11/11 13:38

通信速度自体の安定性です。遅い方が取りこぼしにくくなる、とは言えます。 けれども特別な問題(違い)は無いです。 単に昔から9600bpsがシリアル通信の基準の速度のようになっていて、どの機器(センサ)でもデフォルトで9600bpsで繋げるようになっていた、という感じです。 相手と合わせる必要がある通信ですから。
Y.Ta

2021/11/11 14:52

なるほど! 違う機会との通信も考慮すれば、設定する意味が出てくるわけですね! 一度コンパレータを仕込んで閾値5vでトライしてみます。
thkana

2021/11/11 22:36

余談 > 昔から9600bpsがシリアル通信の基準の速度のようになっていて 爺の知っている昔は、1200bpsが「普通」で、9600bpsがシリアルの「最高速」だったりしたけれど...
thkana

2021/11/11 22:48

> 一度コンパレータを仕込んで閾値5vでトライしてみます。 いやいやいや... そもそも、「デジタル入力」ってのは閾値が 0.7*Vdd 固定のコンパレータのようなものだ、というのはわかって言っていますか? なぜコンパレータを使うのか、まずは閾値を自由に設定したい、ということのはずです。ヒステリシスをかけやすい、とかもありますけれど。今回の件について、そもそもなぜ「コンパレータを使う」ことが「カウントが早くなってしまう」ことの対策になりうるのか、その道筋が全くみえていないのです。 コンパレータってものがあるらしいすごいらしい使ってみたい、でそれがどういう意味かも考えずに突っ走っていたりしませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問