前提・実現したいこと
Arduinoでサーボモータ制御の学習をしています。
リモコンスイッチで動作指令しています。連続作動中にリモコンスイッチ
例えば4番を押すことで途中停止させようとプログラム作りに挑戦していますが
うまくいきません。
今のプログラムは以下の通りです。回転速度を調整できるプログラムです。
リモコン作動のプログラムはネット上から拝借したものです。
プログラム後半の他のスイッチを押すとfor(;;)で連続動作するようにしてます。
いまのプログラムでリモコンスイッチを押すことによるサーボモータ動作は
問題ありません。
for(;;)で連続回転している途中で例えば4番スイッチを押すと
途中停止させるプログラムが分かりません。
いろいろbreak とか digitalWrite(...LOW)とか試しましたが
うまくいきません。 なお
サーボモータはTower Pro SG92Rです。
教えてください。よろしくお願い致します。
#include <VarSpeedServo.h> //2servo speed control rimokon
//1番SWONで緑点灯、2個順次サーボ動作連続
//2SWで赤LED点灯消え、3SWで緑LED点灯消え、その他swで赤LED点灯2番サーボ連続動作 OK 2020.10.18
VarSpeedServo myservo1; // インスタンス作成
VarSpeedServo myservo2;
#define INFRARED 11 // 赤外線センサー
#define RECEIVE_OK 3 // 緑LED
#define RECEIVE_ERROR 4 // 赤LED
void setup() {
Serial.begin(9600);
// 赤外線
pinMode(INFRARED, INPUT);
pinMode(RECEIVE_OK,OUTPUT);
pinMode(RECEIVE_ERROR,OUTPUT);
myservo1.attach(9); //servo1 D9ピンをサーボ1の信号線
myservo2.attach(10); //servo2 D10ピンをサーボ2の信号線
}
void loop() {
unsigned long dword = 0, pls;
// リーダーコードの開始(8T = 9ms)
while(digitalRead(INFRARED) == HIGH){
// none
}
// リーダーコードの終了(4T = 4.5ms)
while(digitalRead(INFRARED) == LOW){
// none
}
// NECフォーマットの読み込み(32bit)
// (16bitのカスタマーコード(メーカー識別コード) + 8bitのデータコード + 8bitの反転データコード)
for(int i = 0; i < 32; i++) {
// パルスの検出(パルスの長さ)
// ※戻り値はマイクロ秒(μs)
pls = pulseIn(INFRARED, HIGH);
// パルス検出のタイムアウト(1秒)
if(pls >= 1000000) {
Serial.println("timeout");
return;
}
// ビットが1の場合にデータを加算する
// ※ビット0= 1125μs ビット1 = 2250μs
if(pls >= 1126){
// Serial.println(pls);
dword |= 1UL << i;
}
}
// 待機状態のエラーを回避
// ※このスケッチ固有のエラーです。
if(dword == 0){return;}
// リピートコード(9ms + 2.25ms)
pulseIn(INFRARED, HIGH);
// ストップビット(0.56ms)
while(digitalRead(INFRARED) == HIGH){
// none
}
// データコードが正しく受信できているかを確認
byte bit8_data1 = (dword >> 16) & 0xFF; // データコード
byte bit8_data2 = 255 - ((dword >> 24) & 0xFF); // データコードの反転
if(bit8_data1 == bit8_data2){
// 送信波形を反転する
dword = (dword >> 24) & 0xFF |
((dword >> 16) & 0xFF) << 8 |
((dword >> 8) & 0xFF) << 16 |
(dword & 0xFF) << 24;
// デバッグ用
//リモコンキー1番
Serial.println(dword ,HEX);
if(dword == 0xFF0CF3){
digitalWrite(RECEIVE_OK,HIGH);//sw1押すと緑LED点灯してサーボ1動いて次に2が動いて停止 緑led off
delay(300);
myservo1.write(180,100,true);
myservo1.write(0,100,true);
delay(2000);
myservo2.write(180,100,true);
myservo2.write(0,100,true);
delay(2000);
digitalWrite(RECEIVE_OK,LOW);
delay(2000); //緑LED消える
}
else if(dword == 0xFF18E7) //2のスイッチ押すと赤1LED点灯してすぐ消える
{
digitalWrite(RECEIVE_ERROR,HIGH);
delay(1000);
digitalWrite(RECEIVE_ERROR,LOW);
}
else if(dword == 0xFF5EA1)//3のスイッチ押すと緑LED点灯してすぐ消える
{
digitalWrite(RECEIVE_OK,HIGH);
delay(1000);
digitalWrite(RECEIVE_OK,LOW);
}
else { //他のsw押すと赤LED点灯2サーボが連続動作
digitalWrite(RECEIVE_ERROR,HIGH);
delay(300);
for(;;)
{
myservo2.write(180,100,true);
delay(1000);
myservo2.write(0,100,true);
delay(1000);
//if (dword == 0xFF0CF3) 連続作動中に例えばsw1で停止させる方法が分からない
// digitalWrite(9,LOW);
}
}
}
}
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー