度々失礼します。何とか特定のボタンでの制御、受信はできたのですが、その値(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)のみを受信できるのでしょうか?また押した回数だけ動かすためにはどうしたらよいでしょうか?
まだまだ分からないことも多く、勘違いをしているかもしれませんが、回答よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。