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

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

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

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

Q&A

2回答

985閲覧

Arduinoのピンの挙動について

middleeye

総合スコア12

Arduino

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

0グッド

0クリップ

投稿2019/08/28 02:16

編集2019/08/28 02:32

Arduinoにモーター2つ、センサー1つ、外部出力機器2つを接続したシステムを作っています。
また、それらの情報をシリアル通信(USB経由)でPCに送信しています。

ピンのアサインは下記のようになっています。

4番ピン モーター1制御
5番ピン モーター1制御(PWM)
6番ピン モーター2制御
12番ピン モーター2制御(PWM)
8番ピン センサー入力
9番ピン 外部IO出力1
A4ピン  外部IO出力2

モーター制御はドライバーモジュールを使っています。

初期化時にシリアル通信「Serial.begin(9600);」実行しますが、この時なぜかモーター1が勝手に回りだし、しばらくすると止まります。

この現象の原因はなぜ起こるのでしょうか?
初期化のソースコードは以下になります。MsTimer2でセンサーの入力を500ms毎にPCへ送信しています。

void setup() { pinMode(6, OUTPUT); pinMode(12, OUTPUT); pinMode(8, INPUT_PULLUP); pinMode(5, OUTPUT); pinMode(4, OUTPUT); pinMode(A4, OUTPUT); Serial.begin(9600); // モーター1を停止 analogWrite(5, 0); digitalWrite(4, HIGH); // モーター2を停止 analogWrite(12, 0); digitalWrite(6, HIGH); MsTimer2::set(500, avg); MsTimer2::start(); }

ちなみに、下記のサイトで

2.同時に全部が使えないピン

「例えば、Arduinoにはタイマーという時間を刻む機能があるのですが、このタイマーの周期を作るために、●番ピンを使用してパルスを作っている! など...
ですので、最初のうち、全部のポートにいろいろな部品をぶら下げて機器を作ってみようとすると、プログラムでは決して制御していないLEDが急に光りだしたり、いきなりモータが回りだしたりとします。」

https://daisuki-arduino.com/arduino-pin/

という記載があり、これが問題なのではないかと考えています。

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

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

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

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

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

y_waiwai

2019/08/28 02:22

回路図かプログラムにバグが有るためです。 双方とも提示されていないので言えるのはここまでですね
middleeye

2019/08/28 02:32

ご指摘ありがとうございます。初期化のソースコードを追加しました。
guest

回答2

0

初期化時にシリアル通信「Serial.begin(9600);」実行しますが、この時なぜかモーター1が勝手に回りだし

そのように判断した根拠というか現象を教えて下さい。

極論、

Arduino

1void setup() { 2 pinMode(6, OUTPUT); 3 pinMode(12, OUTPUT); 4 pinMode(8, INPUT_PULLUP); 5 pinMode(5, OUTPUT); 6 pinMode(4, OUTPUT); 7 pinMode(A4, OUTPUT); 8 9 Serial.begin(9600); 10 //以降バッサリ削除 11} 12void loop(){ 13//何もしない 14}

ではモーターが動いて、

Arduino

1void setup() { 2 pinMode(6, OUTPUT); 3 pinMode(12, OUTPUT); 4 pinMode(8, INPUT_PULLUP); 5 pinMode(5, OUTPUT); 6 pinMode(4, OUTPUT); 7 pinMode(A4, OUTPUT); 8 9 //Serial.begin(9600); //コメントアウト 10} 11void loop(){ 12}

では動かない、とかいう事象が観察されているのでしょうか。

最初のうち、全部のポートにいろいろな部品をぶら下げて機器を作ってみようとすると、<略>

という記載があり

なぜ「最初のうち」なんでしょうかねぇ。単に間違えてるだけじゃないかと思いますけれど。タイマーやなにかは、内部のレジスタで制御されていて、特に指定しないかぎり外部のピンには出てきません。ライブラリの出来が悪いとかそういうのがあるとわかりませんが。後で詳細を書く、みたいなことは書いてありますが、私はまだそれについての記述を見つけられていませんが、どこかに具体例が書いてありましたか?

(インターネット上にある情報は「全て正しい」わけではありません...もちろん、この回答も。正しいかどうか、十分吟味してくださいね。)

投稿2019/08/28 13:51

thkana

総合スコア7639

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

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

0

Serial.begin(9600);

の時点では各ポートは出力にしてるだけで、出力はLowレベルになってると思うけど、それでモータが回るような回路構成になってませんか?

それと、モータの電源はどこからとってるんでしょうか

投稿2019/08/28 02:44

y_waiwai

総合スコア87774

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

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

middleeye

2019/08/28 02:52

出力がLowレベルでモーターが回るとすれば、初期化後は常に回っていると思うのですが、そのようなことはありません。 モーターの電源は12vなので、別途スイッチング電源からとっています。
y_waiwai

2019/08/28 02:55

ああ、それならいいですね とりあえず、 pinMode(4, OUTPUT); のあとに digitalWrite(4, HIGH); をいれておきましょう。 それで、 Serial.begin(9600); のあとに無限ループを入れておいて、回らないかみてみては。
middleeye

2019/08/28 03:48

ありがとうございます。 無限ループを入れる発想がありませんでした。試してみます。
middleeye

2019/08/28 06:03

実際に確認しましたが、無限ループを入れてもやはりモーターが数秒動作してしまいます。 シリアルがオープンした段階でなぜか回ってしまうようです。
y_waiwai

2019/08/28 06:06

実際の回路図がわからないのでアレですが、 4,5のピンのレベルがどうなってるか、オシロかなんかで確認してみよう
middleeye

2019/08/28 06:48

モータードライバの入力端子2つとGNDを接続しているだけなので、回路図で示すほどのものでもないと考えておりました。。 下記の製品を使っています。オシロも持っておらず… https://www.switch-science.com/catalog/3605/
y_waiwai

2019/08/28 06:52

まあ、正しいはずだ、ということでしようがないと諦めれるなら、そんでいいんでしょうけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問