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

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

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

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

Q&A

0回答

2921閲覧

ArduinoMEGA 割り込み2,3について

Norm_

総合スコア8

Arduino

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

0グッド

0クリップ

投稿2016/12/22 01:03

###前提・実現したいこと
現在、Arduino MEGA2560を使い、モータ制御を行っています。
仕組みとしては、以下の通りです。
1、モータドライバを使用し、正逆転。
2、モータが回転すると、モータに付けている遮蔽物がフォトインタラプタを通過。
3、フォトインタラプタの信号で割り込み。
4、割り込み処理内で、カウント。
5、一定数以上なら停止。そうでなければ、1~4を繰り返す。

###発生している問題
ArduinoMEGAには割り込みが0~5(pin2,pin3,pin21,pin20,pin19,pin18)ありますが、
pin21とpin20の割り込み2,3が上手く機能していません。
割込み0,1,4,5は正常に機能しています。

###該当のソースコード
汚いコードですみません....。

C

1/* モータの個数 */ 2#define MotorNumber ( 6 ) 3/* モータ1 */ 4#define MTR1A ( 22 ) 5#define MTR1B ( 24 ) 6#define INR1 ( 2 ) 7/* モータ2 */ 8#define MTR2A ( 26 ) 9#define MTR2B ( 38 ) 10#define INR2 ( 3 ) 11/* モータ3 */ 12#define MTR3A ( 30 ) 13#define MTR3B ( 32 ) 14#define INR3 ( 21 ) 15/* モータ4*/ 16#define MTR4A ( 36 ) 17#define MTR4B ( 38 ) 18#define INR4 ( 20 ) 19/* モータ5 */ 20#define MTR5A ( 40 ) 21#define MTR5B ( 42 ) 22#define INR5 ( 19 ) 23/* モータ6 */ 24#define MTR6A ( 44 ) 25#define MTR6B ( 46 ) 26#define INR6 ( 18 ) 27 28/* 1センチの回転 */ 29#define cm1 ( 11 ) 30 31/* ステータス用定数 */ 32#define STOP ( 0 ) 33#define FWRD ( 1 ) 34#define RVRS ( 2 ) 35/* 初期センチ数 */ 36#define RODcm ( 9 ) 37/* 遮光ON/OFF */ 38#define SHDON ( true ) 39#define SHDOFF ( false ) 40 41/* モータ構造体 */ 42struct MOTOR { 43 int MoveStatus; /* 正逆止ステータス/ 0:停止中 / 1:正転中 / 2:逆転中 */ 44 int PinNumberPT; /* フォトインタラプタ用デジタルピン番号 */ 45 int PinNumberD1; /* モータIN1用デジタルピン番号 */ 46 int PinNumberD2; /* モータIN2用デジタルピン番号 */ 47 int cmCnt; /* センチ数格納 */ 48 int LoopCnt; /* ループカウント */ 49 boolean ShadeFlg; /* 遮光フラグ */ 50}; 51 52struct MOTOR MotorArray[MotorNumber] = { 53 { STOP, INR1, MTR1A, MTR1B, RODcm, 0, SHDOFF }, /* モータ1 */ 54 { STOP, INR2, MTR2A, MTR2B, RODcm, 0, SHDOFF }, /* モータ2 */ 55 { STOP, INR3, MTR3A, MTR3B, RODcm, 0, SHDOFF }, /* モータ3 */ 56 { STOP, INR4, MTR4A, MTR4B, RODcm, 0, SHDOFF }, /* モータ4 */ 57 { STOP, INR5, MTR5A, MTR5B, RODcm, 0, SHDOFF }, /* モータ5 */ 58 { STOP, INR6, MTR6A, MTR6B, RODcm, 0, SHDOFF }, /* モータ6 */ 59}; 60 61int CM[MotorNumber]; 62 63void setup() { 64 // put your setup code here, to run once: 65 Serial.begin(9600); 66 for(int ForCnt = 0; ForCnt < MotorNumber ; ForCnt++ ){ 67 if( (ForCnt != 2) && (ForCnt != 3) ){ 68 pinMode(MotorArray[ForCnt].PinNumberPT, INPUT); 69 pinMode(MotorArray[ForCnt].PinNumberD1,OUTPUT); 70 pinMode(MotorArray[ForCnt].PinNumberD2,OUTPUT); 71 }else{ 72 pinMode(MotorArray[ForCnt].PinNumberPT, INPUT_PULLUP); 73 pinMode(MotorArray[ForCnt].PinNumberD1,OUTPUT); 74 pinMode(MotorArray[ForCnt].PinNumberD2,OUTPUT); 75 }/* 76 pinMode(MotorArray[ForCnt].PinNumberPT, INPUT); 77 pinMode(MotorArray[ForCnt].PinNumberD1,OUTPUT); 78 pinMode(MotorArray[ForCnt].PinNumberD2,OUTPUT);*/ 79 80 CM[ForCnt] = RODcm; 81 init(ForCnt); 82 } 83 84 attachInterrupt(0, intr0, FALLING); 85 attachInterrupt(1, intr1, FALLING); 86 attachInterrupt(2, intr2, FALLING); 87 attachInterrupt(3, intr3, FALLING); 88 attachInterrupt(4, intr4, FALLING); 89 attachInterrupt(5, intr5, FALLING); 90} 91 92void loop() { 93 // put your main code here, to run repeatedly: 94 if(Serial.available() == 1){ 95 int num = Serial.read(); 96 if( num == 's' ){ 97 for( int i = 0; i < MotorNumber; i++ ){ 98 for(; Serial.available() != 1 ;){ 99 /* 何もしない */ 100 } 101 CM[i] = Serial.read() - 48; 102 init(i); 103 } 104 } 105 } 106} 107 108 109void init(int Cnt){ 110 if( MotorArray[Cnt].cmCnt < CM[Cnt] ){ 111 MotorArray[Cnt].MoveStatus = FWRD; 112 digitalWrite(MotorArray[Cnt].PinNumberD1,HIGH); 113 digitalWrite(MotorArray[Cnt].PinNumberD2,LOW); 114 }else if( CM[Cnt] < MotorArray[Cnt].cmCnt ){ 115 MotorArray[Cnt].MoveStatus = RVRS; 116 digitalWrite(MotorArray[Cnt].PinNumberD1,LOW); 117 digitalWrite(MotorArray[Cnt].PinNumberD2,HIGH); 118 }else{ 119 MotorArray[Cnt].MoveStatus = STOP; 120 digitalWrite(MotorArray[Cnt].PinNumberD1,LOW); 121 digitalWrite(MotorArray[Cnt].PinNumberD2,LOW); 122 } 123} 124 125void intr0(){ 126 int num = 0; 127 MotorArray[num].LoopCnt ++; 128 if( MotorArray[num].LoopCnt > cm1 ){ 129 if(MotorArray[num].MoveStatus == FWRD){ 130 MotorArray[num].cmCnt ++; 131 }else if(MotorArray[num].MoveStatus == RVRS){ 132 MotorArray[num].cmCnt --; 133 } 134 MotorArray[num].LoopCnt = 0; 135 init(num); 136 } 137} 138 139void intr1(){ 140 int num = 1; 141 MotorArray[num].LoopCnt ++; 142 if( MotorArray[num].LoopCnt > cm1 ){ 143 if(MotorArray[num].MoveStatus == FWRD){ 144 MotorArray[num].cmCnt ++; 145 }else if(MotorArray[num].MoveStatus == RVRS){ 146 MotorArray[num].cmCnt --; 147 } 148 MotorArray[num].LoopCnt = 0; 149 init(num); 150 } 151} 152 153void intr2(){ 154 int num = 2; 155 MotorArray[num].LoopCnt ++; 156 if( MotorArray[num].LoopCnt > cm1 ){ 157 if(MotorArray[num].MoveStatus == FWRD){ 158 MotorArray[num].cmCnt ++; 159 }else if(MotorArray[num].MoveStatus == RVRS){ 160 MotorArray[num].cmCnt --; 161 } 162 MotorArray[num].LoopCnt = 0; 163 init(num); 164 } 165} 166 167void intr3(){ 168 int num = 3; 169 MotorArray[num].LoopCnt ++; 170 if( MotorArray[num].LoopCnt > cm1 ){ 171 if(MotorArray[num].MoveStatus == FWRD){ 172 MotorArray[num].cmCnt ++; 173 }else if(MotorArray[num].MoveStatus == RVRS){ 174 MotorArray[num].cmCnt --; 175 } 176 MotorArray[num].LoopCnt = 0; 177 init(num); 178 } 179} 180 181void intr4(){ 182 int num = 4; 183 MotorArray[num].LoopCnt ++; 184 if( MotorArray[num].LoopCnt > cm1 ){ 185 if(MotorArray[num].MoveStatus == FWRD){ 186 MotorArray[num].cmCnt ++; 187 }else if(MotorArray[num].MoveStatus == RVRS){ 188 MotorArray[num].cmCnt --; 189 } 190 MotorArray[num].LoopCnt = 0; 191 init(num); 192 } 193} 194 195void intr5(){ 196 int num = 5; 197 MotorArray[num].LoopCnt ++; 198 if( MotorArray[num].LoopCnt > cm1 ){ 199 if(MotorArray[num].MoveStatus == FWRD){ 200 MotorArray[num].cmCnt ++; 201 }else if(MotorArray[num].MoveStatus == RVRS){ 202 MotorArray[num].cmCnt --; 203 } 204 MotorArray[num].LoopCnt = 0; 205 init(num); 206 } 207}

###補足情報(言語/FW/ツール等のバージョンなど)
現在のコードでは、12回転で1センチ動いた事になるはずです。
つまり、9→0になる様にシリアルから命令を出すと、8×12=96回転するはずです。
しかし、モータの回転を手で抑えながら数えた所、31回転で止まりました。
1回数えれ忘れたとして32回転、3分の1になっています。

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

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

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

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

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

MasahikoHirata

2016/12/22 02:13

pin21とpin20の信号の確認をすべきでは?
Norm_

2016/12/22 02:18

ありがとうございます。確認してみます。
thkana

2020/01/22 14:01

もっと単純に、割り込みでLEDが点灯するだけ、みたいなプログラムで動作を確認してみては。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問