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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

2577閲覧

Arduinoと赤外線LEDを用いて、リモコンの信号を変換するような装置を作りたいです。

takio-

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2020/05/11 09:09

教えていただきたいこと

赤外線の送信方法は昨日同サイトで教えていただき理解したのですが、受信する際のスケッチがどうしてもわかりません。

Yahoo!知恵袋の情報を参考にIRremote同梱のIRrecvDemoを使用し、赤外線を受信することはできましたが、それから送信することができませんでした。

知識不足で不確かな説明、稚拙なスケッチになっておりますが、何卒ご享受ください。

小さなことからでもお力添えをいただけると幸いです。

###概観

リモコンA → 赤外線レシーバで受信 → Arduino → 赤外線ledで信号(リモコンB)を送信 → 受信

環境

Windows 10 Pro
Arduino 1.8.12
Arduino MEGA 2560

IRrecvDemoを参考にしたスケッチ

IRrecvDemo

1 2#include <IRremote.h> 3 4IRsend irsend; 5 6int RECV_PIN = 11; 7 8IRrecv irrecv(RECV_PIN); 9 10decode_results results; 11 12void setup() 13{ 14 Serial.begin(9600); 15 Serial.println("Enabling IRin"); 16 irrecv.enableIRIn(); 17 Serial.println("Enabled IRin"); 18 pinMode (led ,OUTPUT); 19} 20 21void loop() { 22 if (irrecv.decode(&results)) { 23 Serial.println(results.value, HEX); 24 if (results.value == 99788182){  //左のコードはこのスケッチをマイコンにアップしてシリアル通信で得たリモコンAの赤外線信号です。 25 26// これより下のスケッチはIRremote同梱のIRsendRawDemoからそのまま引用しました // 27 28 int khz = 38; 29 unsigned int irSignal[] = {6000,2950, 600,500, 600,1600, 600,550, 550,550, 550,550, 600,500, 600,500, 600,500, 600,500, 600,550, 550,550, 550,1650, 600,500, 600,500, 600,500, 600,550, 550,550, 550,550, 550,550, 600,500, 600,500, 600,500, 600,500, 600,1650, 550,550, 550,1650, 600,1600, 600,550, 550,1650, 600,1600, 600,500, 600,1650, 550,550, 600,1650, 550,1650, 600,500, 600,1600, 600,1650, 550,550, 600}; //IRremote 同梱のIRrecvDumpV2で得たリモコンBの赤外線信号のraw信号です。 30 irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); 31 32 delay(5000); 33 }else { 34 delay (1000); 35 } 36 } 37 delay(100); 38}

###補足
LEDや赤外線レシーバーの問題であることを疑い、それぞれテストを行いましたが、信号を読み取ることができたので問題がある可能性は低いと考えております。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まぁ、大体は出来ていますけど、大体出来ていれば動く、というものでもありません。

IRrecvDemoのloop部を見てください。おおよそ肝になるのは

if (irrecv.decode(&results)) {//受信したら、(結果がresultsに入る)
Serial.println(results.value, HEX);//値を表示(シリアル送信)
irrecv.resume(); //次の受信へ
}

です。IRrecvDemoでは受信結果をシリアル送信していますけど、その部分でLEDを光らせればいい事になります。(LEDを光らせる場合です)

次に、提示されたスケッチですけど、重大(だけど些細)な間違いが

if (results.value == 99788182){

です。これは16進数で、99788182です。なので、

if (results.value == 0x99788182){

としないと動きません。

また、
irrecv.resume();
を付けないと、次の受信を開始しません。

まぁその程度で、9番ピンに赤外LEDを繋げば送信しそうな気がします。(megaの場合)

投稿2020/05/11 14:40

nac_tnk

総合スコア463

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

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

takio-

2020/05/12 03:58

ご丁寧な回答ありがとうございます。 おかげさまでやることができました。 ですが、最後に一つ質問があります。 スケッチをマイコンにアップロードして、最初にリモコンAで信号を送信したときは赤外線ledが反応するのですが、二度目以降は反応しません。どうすれば二度三度と同じ動作をさせることができますか? お手数をおかけしますが、よろしくお願いします。 【スケッチ】 #include <IRremote.h> IRsend irsend; int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); Serial.println("Enabling IRin"); irrecv.enableIRIn(); // Start the receiver Serial.println("Enabled IRin"); pinMode (led ,OUTPUT); } void loop() { if (irrecv.decode(&results)) { if (results.value == 0x99788182){ int khz = 38; unsigned int irSignal[] = {6000,2950, 600,500, 600,1600, 600,550, 550,550, 550,550, 600,500, 600,500, 600,500, 600,500, 600,550, 550,550, 550,1650, 600,500, 600,500, 600,500, 600,550, 550,550, 550,550, 550,550, 600,500, 600,500, 600,500, 600,500, 600,1650, 550,550, 550,1650, 600,1600, 600,550, 550,1650, 600,1600, 600,500, 600,1650, 550,550, 600,1650, 550,1650, 600,500, 600,1600, 600,1650, 550,550, 600}; irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); delay(5000); }else { delay (100); } irrecv.resume(); } }
nac_tnk

2020/05/12 05:24

??、スケッチを見る限り、2度目以降、反応しない、という形跡はありません。 ただし、Bへ送信した時にdelay(5000)と5秒取っているので、その間に2度目のAからの送信をしている、という事はありませんか?
takio-

2020/05/12 06:12

数分待って試したり、いろいろと試しており、一度はつきますが、二度目以降はやはりできません。
nac_tnk

2020/05/12 07:30

原因は不明です。 こういった場合は、何処でおかしいのかをデバックする必要があります。 PCで繋いているのでしたら、例えば、 if (results.value == 0x99788182) { の後に Serial.println("receive"); delay(5000);の前に、 Serial.println("send"); とか、色々入れてみてどう動いている(或いはどこで止まっている)かを調べた方が良いです。 ※単体で、RAWデータを複数回送った場合は上手く動くのでしょうか?
nac_tnk

2020/05/12 15:42 編集

気になったので、検証してみました。 結果、確かに、1回送るとおかしくなります。 結局の所、 irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); をすると受信の設定事項が狂うみたいです。 なので、この直後に irrecv.enableIRIn(); を付けてください。 内容は詳しく調べていませんけど、これで動作しました。
takio-

2020/05/13 09:05

できました! 本当に助かりました。 わざわざ検証までしていただき本当にありがとうございました。
guest

0

まずは、受信するだけ、のコードを組みましょう。
それがしっかり動作するのを確認して、今度は送信のコードを組みます。
その双方がしっかり動作するのを確認できたら、双方を載せたコードを書きます

投稿2020/05/11 09:13

編集2020/05/11 09:13
y_waiwai

総合スコア87719

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

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

takio-

2020/05/11 09:48

回答ありがとうございます。 受信するだけのコードはスケッチ例をそのまま使ってできました。 しかし、それのどこにif構文書きみ込めばいいのかわかりません。 目で見てわかるように赤外線LEDを青色発光ダイオードに変え、digitalWriteで幾度となく試していますが、できません。 スケッチ例(IRrecvDemo)のどこに書き込めば良いか教えていただけませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問