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

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

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

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Arduino

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

マイコン

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

Q&A

解決済

3回答

1017閲覧

DCモーターの回転総カウントをセンサーを使って外部割り込みで行いLCDに映したい。

Y.Ta

総合スコア2

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Arduino

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

マイコン

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

0グッド

0クリップ

投稿2021/11/08 02:36

編集2021/11/08 06:41

イメージ説明### 前提・実現したいこと
Arudiuno UNOプラグラムについて

arduino初心者です。よろしくお願いいたします。
実験でコイル巻線機を作っていて、カウントアップをLCDに映したいのですが、
非接触の磁気センサーのパルスを外部割り込みとして機能させようとしたところ、カウントされず、X軸モーターもとまってしまいました。

色々と書き込んで試しているのですが、訳が分からなくなってしまったので、いったんソースコードを公表しアドバイスいただけたらと思いました。

用語などまだ体に染みついていないため、なるだけ噛み砕いてくださると幸いです...

配線図です。手書きで申し訳ありません。
Arduino-L298n-ステッピングモーター
-L298n-DCモーター
-I2C-LCD
-非接触センサー
(マグネットが最大に近づいた時にデジタルテスターで2pin~GND間で5.5vの電圧を確認できました
。オシロスコープでも確認できました。

現状はDCモーターには取り付けず手でつけたり離したりしている状況です。
近づいている時は常に5.5Vです。距離が遠のくと徐々に電圧降下します。
もともと9000RPMくらいまで対応できるセンサーです。)

やりたいこと
/DCモーターでコイル巻く
/X軸で左右にコイルを振る
/LCDでカウントアップ

(スイッチオンでスタート。規定回数でストップ。までを目指していますが、ひとつひとつ解決しながら覚えていきたいです)

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

コンパイルはできていますが希望の動作ではないです

該当のソースコード

C言語 Arudiuno

1 2#include <Stepper.h> 3#include<LiquidCrystal_I2C.h> 4#include<Wire.h> 5 6 7 8 LiquidCrystal_I2C lcd(0x27,16,2);//LCD情報 9 Stepper myStepper(200, 8, 9, 10, 11);//X軸モーター 10 volatile int count = 0; //カウント基準 11 12 //2ピンをパルスインにした割り込み Count_pinの宣言 13 void Count_pin(void); 14 //2ピンにパルスインした時にカウントアップ 15 void Count_pin(void){ 16 if(digitalRead(2) == HIGH){ 17 count=count+1; 18 lcd.setCursor(0, 1); // LCD2行目指定 19 lcd.print("Count___"); 20 lcd.print(count); 21 }} 22 23void setup() { 24 //パルスイン 25 pinMode( 2, INPUT_PULLUP); 26 attachInterrupt(0,Count_pin, RISING); //2ピン=0, if関数, HIGHになった時に関数呼び出す 27 28 lcd.init(); // LCDの初期化 29 lcd.backlight(); // LCDバックライトの点灯 30 lcd.setCursor(0, 0); // LCD1行目指定 31 lcd.print("Coil Turn Count"); // 文字の表示 32 lcd.setCursor(0, 1); // LCD2行目指定 33 lcd.print("Count___"); 34 lcd.print(count); // カウントアップの変数を入れたい 35 36 myStepper.setSpeed(200);//X軸動作速度 37 38 //DCモーター 39 pinMode(3, OUTPUT);//enA 40 pinMode(4, OUTPUT); 41 pinMode(5, OUTPUT); 42 43 Serial.begin(9600); 44} 45 46void rot1(){ 47 48 //DCモーター制御 49 digitalWrite(4, HIGH);//正転 50 digitalWrite(5, LOW); 51 analogWrite(3, 80); 52 53} 54 55void rot2(){ 56 57 //X軸制御 58 myStepper.step(250); 59 delay(10); 60 myStepper.step(-250); 61 delay(10); 62 63} 64 65 66 67void loop() { 68 69 rot1(); 70 delay(10); 71 rot2(); 72 delay(10); 73 74} 75 76

試したこと

割り込み用のCount_pinを宣言しなければ、DCとステッピングモーターは望みの動作をしてくれます。
なのでカウントアップ用の割り込みの書き方がいけないことまではわかるんですが、書き込んでいてわからなくなってしまいました。

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

ARUDIUNO UNO R3 FW 1.8.16

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

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

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

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

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

y_waiwai

2021/11/08 03:22

回路図は提示できませんか。 コードだけ出されてもなにがなんやらわかりません
Y.Ta

2021/11/08 03:53

回答ありがとうございます! 拙いですが、回路図という物が書けないので、配線図を明記しました。
ozwk

2021/11/08 04:39

非接触センサー単体の動作確認はできてますか?
Y.Ta

2021/11/08 05:22

ご回答ありがとうございます! 確認したところ、磁気式の近接センサーで、 マグネットが最大に近づいた時にデジタルテスターで2pin~GND間で5.5vの電圧を確認できました 。オシロスコープでも確認できました。 現状はDCモーターには取り付けず手でつけたり離したりしている状況です。 近づいている時は常に5.5Vです。距離が遠のくと徐々に電圧降下します。 もともと9000RPMくらいまで対応できるセンサーです。
ozwk

2021/11/08 05:33

質問文のソースコードで 割り込みハンドラでLCDにcountを書き込んでいる部分がなくなりましたが 貼り間違えていたから修正したということでよろしいでしょうか?
Y.Ta

2021/11/08 05:38

その通りです。 回答欄の方のご意見で、不要ということでしたので、削除しました。 必要でしたら直したいと思います。また、分かりづらく申し訳ございません!
ozwk

2021/11/08 05:55 編集

貼り間違えていたから削除したのか 「回答欄の方のご意見で、不要ということでしたので、削除し」たのかどっちですか? 実際に問題が起こっているコードと起きている問題を質問文に書いてください。 回答者に言われて修正したけど駄目だったという場合には 修正前後をわかるように書いておいてください。 見る人が混乱します。
Y.Ta

2021/11/08 05:58

わかりました!もうしわけありません!
guest

回答3

0

そのLCD.print()は内部で割り込み使っていませんか?
割り込み中でさらに割り込みをさせようとするなら、それなりに注意深く、然るべき手順を踏まないとできませんよ。
というか、割り込み中で「表示」を行うなんていうことは少なくとも組み込み系では割と非常識。割り込みからは可及的速やかに復帰するもの。で、表示はしばしば(コンピュータの観点からみると)遅い仕事だったりします。I2Cでバッファに書き込むだけだから大丈夫、という可能性はあるけど、やるならちゃんと確認してから。
どうせLCDなんて反応速度がミリ秒オーダーなんだから、割り込み中では値を変数にとっておくぐらいにして、表示の作業そのものはメインのコンテキスト中で行うべきでしょう。

投稿2021/11/08 12:53

編集2021/11/08 14:46
thkana

総合スコア7703

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

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

0

モータ駆動のコードは横に置いといて、、
まずは、その割り込み関数の中でシリアルにメッセージ出力するなりして、あなたの望むような割り込みがかかってるのか確認してみては。

なんかセンサはアナログ出力してるみたいですが、割り込み用の入力ピンはデジタル入力です。
そこらへんでおかしくなってそうな気がします

投稿2021/11/08 05:34

y_waiwai

総合スコア88042

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

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

Y.Ta

2021/11/08 06:32

回答ありがとうございます! あああ、なるほど。矩形波で出さないとかも?一応5V超えればHIGH扱いになるのかなとも思ったのですが、ちゃんとanalogを変換したほうがよさそうですね。
y_waiwai

2021/11/08 06:55

いや、アナログ値でも、ちゃんとしきい値を横断してれば割り込みはかかりますが、それがきちんと割り込みかかるレベルまで電圧が落ちてるのか、というのが問題になります まずは意図通りに割り込みがかかってるのか、をチェックしましょう
Y.Ta

2021/11/08 10:16

ありがとうございました!! モーターなど全部消して、シリアルモニターで確認したらシリアルモニターへはちゃんと高速でカウントアップがされました。しかし、LCDへの入力はかないませんでした。なので他の方が言うようにI2Cパラレルが悪さをしていたようです。今回はカウンティングはシリアルモニタにて計測し、LCDはファイルの表記など別のことに使うことにしました。  一歩前進できました!今回はここで一度締めたいと思います。ありがとうございました!!
guest

0

ベストアンサー

割り込み内で操作する外部変数には

volatile int count = 0; //カウント基準

と、volatileを付けます。

{ lcd.setCursor(0, 1); // LCD2行目指定
からの3行を{}で括っていますけど、不要です。

LCD表示が間に合うかどうかも判りません。(回転数次第)

X軸のステッパーは単に脱調じゃないの?
モータ自体、プルプルしていませんか?完全に停止している感じ?
上記の変更で直るものなのかは判りません。

スケッチ的には、回しっぱなしでは無く、指定回転数で止めるようなものにした方が良いです。
まぁこれからなんでしょうけど。

投稿2021/11/08 03:38

nac_tnk

総合スコア494

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

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

Y.Ta

2021/11/08 04:25

回答ありがとうございます! volatile 入れるのですね!しかしまだカウントアップされないようです。 しかしxモーターは動きました。こちらは脱調かもしれません。
nac_tnk

2021/11/08 05:34

このLCDはパラレル+PCF8574のようだけど、これだと駄目だと思います。 どの位の表示(転送)速度だったかは忘れましたけど、かなり遅いです。 以前検討した時に、あまりに遅いので見送った事があります。 『例えば』1ms/文字なら、凡そ十数msは表示に時間を取られます。 一方、ステッパーの方は200rpm≒667steps/s≒1.5ms間隔で正確にステップを入れ続ける必要があります。 つまり、現状ではLCD表示をすればステッパーはちゃんと回らないでしょう。 ただし、何故LCDの方が表示出来ないのかは判りません。 実際にはどのような表示になっているのでしょうか? countの数値だけが無表示なのですか?
Y.Ta

2021/11/08 05:52

LCDディスプレイ: インターフェースIC:HD44780 表示:16文字 x 2行 I2CシリアルI/F: チップ:PCF8574 こちらを使用しています。 LCDには Coil Turn Count Count___0 の文字が来ています。なので、基準の0は代入されています。
nac_tnk

2021/11/08 06:07

スケッチが変わっていますけど、今現在のスケッチでは回る前に表示しただけです。 なので当然そうなります。 以前のスケッチでの話でしょうか?
nac_tnk

2021/11/08 06:19

もしかしたら私が{}が余計と言ったので、カッコ内まで消してしまったのでしょうか? そうなら言葉足らずでした。そこの「{」「}」のみ消してください。
Y.Ta

2021/11/08 06:21

あ!!!そういうことですね!?すみません! 直します!
Y.Ta

2021/11/08 06:29

思ったんですが、setup内の lcd.print(count);は1度だけで、loop内に変数として対応できるように入れないとダメですか?
Y.Ta

2021/11/08 10:19

ありがとうございました!! モーターなど全部消して、シリアルモニターで確認したらシリアルモニターへはちゃんと高速でカウントアップがされました。しかし、LCDへの入力はかないませんでした。やはりあなたが言うようにI2Cパラレルが悪さをしていたようです。今回はカウンティングはシリアルモニタにて計測し、LCDはファイルの表記など別のことに使うことにしました。  またステッピングに関してもLCDを文字だけにしたところ動作が安定したように思います。  一歩前進できました!今回はここで一度締めたいと思います。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問