• 締切済み

アルディーノのプログラムについて

アルディーノマイコンでステッピングモーターを回して、ある動作をさせたいのですが、上手く行きません。 動作としては、トグルSWがONでモーターが回り出し、センサーが、ONになると、そこから、1.5秒回って、停止すると言う動作です。 現在のプログラムは uint32_t time=1501; byte dir=2; byte pul=3; byte tgl_sw=6; byte sensor=7; word wait_us=2500;//2500us*2*200→フルステップで約1RPS void setup() { pinMode(dir,OUTPUT); pinMode(pul,OUTPUT); digitalWrite(dir,HIGH); pinMode(tgl_sw,INPUT_PULLUP);//※LOWでON pinMode(sensor,INPUT);//※ } } void loop() { if(digitalRead(tgl_sw)==LOW) digitalWrite(pul,HIGH); delayMicroseconds(wait_us); digitalWrite(pul,LOW); delayMicroseconds(wait_us); if(digitalRead(sensor)==HIGH)time=millis(); digitalWrite(pul,millis()-time<=1500); } です。モーターは動くので、ドライバ、モーターの説明は省略します。

みんなの回答

回答No.1

同じ環境を持っていないので、 テストはできませんが、プログラムとしてのみについてです。 if(digitalRead(sensor)==HIGH)time=millis(); #1 digitalWrite(pul,millis()-time<=1500); #2 #1は、ワンパルス保証されてますか? もしずっとHIGHを返しているなら、毎回 新しいtimeがセットされるので、 #2は常に0なのではないかと。(論理値は1を維持) 以下は、余談です。 millis()-time<=1500 これを (millis()-time)<=1500 の方がいいですね。優先順位として元々の物でも問題はないが、 理想としては、 if ( (millis()-time)<=1500 ) { data=1; }else{ data=0; } にするか data=( (millis()-time)<=1500 ) ? 1:0; と、論理値を出力値にした方が、メンテはしやすいかと (ここは、本件とは関係はない部分ですが)

subaruxv13
質問者

補足

#1は、ワンパルス保証されてますか? もしずっとHIGHを返しているなら、毎回 新しいtimeがセットされるので、 #2は常に0なのではないかと。(論理値は1を維持) 申し訳ございません。どちらもよく理解出来ませんでした。プログラムは具体的にどう直せば良いのでしょうか?

関連するQ&A