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

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

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

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

解決済

C言語 Arduino サーボモータの停止指令プログラム

himuka55
himuka55

総合スコア1

Arduino

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

3回答

0評価

0クリップ

4919閲覧

投稿2020/10/20 12:56

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

y_waiwai

2020/10/20 23:20

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Arduino

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