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

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

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

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

Q&A

2回答

3250閲覧

赤外線でのサーボモーター制御

Onigiri_03

総合スコア4

Arduino

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

1グッド

0クリップ

投稿2019/08/19 12:16

度々失礼します。何とか特定のボタンでの制御、受信はできたのですが、その値(0xFF16E9)が受信されるまで動きません。←当然ですが…
逆に言うと、(0xFF16E9)以外のコードも受信されてしまいます。(赤外線リモコンのフォーマットの時には0xFF16E9のみしか受信されず、サーボモーターをつなげて操作するとほかの値も出てきてしまいます。 )
また、一回(0xFF16E9)が受信されて動くと、次に(0xFF16E9)が受信されても動かなくなってしまいます。

現在のスケッチ????

include <Servo.h>

define INFRARED 2 // 赤外線センサー

Servo servo1;

void setup() {
Serial.begin(9600);

// モーター
servo1.attach(9);
servo1.write(90);

// 赤外線
pinMode(INFRARED, INPUT);

}

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; // デバッグ用 Serial.println(dword ,HEX); // 45度回転 if(dword == 0xFF16E9){ servo1.write(45); // 0.5秒 delay(500); ????リモコンボタン「0」のみを押したとき。 }}}![イメージ説明](270cb7a6faaa54725a95acc557e42b5c.jpeg)

どのようにしたら、(0xFF16E9)のみを受信できるのでしょうか?また押した回数だけ動かすためにはどうしたらよいでしょうか?
まだまだ分からないことも多く、勘違いをしているかもしれませんが、回答よろしくお願いします。

bochan2👍を押しています

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

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

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

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

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

guest

回答2

0

Arduino-IRremoteのライブラリを使用する方法がいろいろなサイトにありますので、
そちらを参考した方がよろしいかと思われます。

投稿2019/10/06 09:13

mappy

総合スコア65

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

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

0

(0xFF16E9)のみを受信できるのでしょうか?

の意味がいまいちわかりません(連投されたであろう質問の全てに目を通せていないからかもしれませんが)。

押した回数だけ動かす

これは、入力された値が変化した場合のみに処理を実行すれば良い気がします。
例えば、以前に入力された値をtmpに放り込んで置いて、

c++

1if (tmp != 新しく入力された値){ 2 処理 3} 4tmp = 新しく入力された値

投稿2019/09/26 13:41

編集2019/09/26 13:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問