teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

調査結果追記

2019/07/14 09:55

投稿

thkana
thkana

スコア7735

answer CHANGED
@@ -2,4 +2,49 @@
2
2
  どうしても1台でやらないといけない理由があるのなら仕方ないのでIRemoteルーチンの内部を解析して送受同時動作可能か確認しましょう。もしタイマーを叩いていたりしているとすると、送受の同時動作は不安です。
3
3
 
4
4
 
5
- 余談ですが、スマホとかのCMOSやCCDカメラは赤外線に感度があるので、スマホのカメラで赤外線リモコン等をみると赤外線LEDが「光って」みえる、なんてのは知ってますか?
5
+ 余談ですが、スマホとかのCMOSやCCDカメラは赤外線に感度があるので、スマホのカメラで赤外線リモコン等をみると赤外線LEDが「光って」みえる、なんてのは知ってますか?
6
+
7
+ ---
8
+ 追記
9
+ IRremoteライブラリの中身を覗いてみました。
10
+ sendNEC()関数の先頭 (ir_NEC.cpp)
11
+ ```Arduino
12
+ void IRsend::sendNEC (unsigned long data, int nbits)
13
+ {
14
+ // Set IR carrier frequency
15
+ enableIROut(38);
16
+ ```
17
+ enableIROut()関数 (irSend.cpp)
18
+ ```Arduino
19
+ void IRsend::enableIROut (int khz)
20
+ {
21
+ #ifdef USE_SOFT_CARRIER
22
+ periodTime = (1000U + khz/2) / khz; // = 1000/khz + 1/2 = round(1000.0/khz)
23
+ periodOnTime = periodTime * DUTY_CYCLE / 100U - PULSE_CORRECTION;
24
+ #endif
25
+
26
+ // Disable the Timer2 Interrupt (which is used for receiving IR)
27
+ TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
28
+ ```
29
+ enableIRIn()関数 (irRecv.cpp)
30
+ ```
31
+ void IRrecv::enableIRIn ( )
32
+ {
33
+ // Interrupt Service Routine - Fires every 50uS
34
+ cli();
35
+ // Setup pulse clock timer interrupt
36
+ // Prescale /8 (16M/8 = 0.5 microseconds per tick)
37
+ // Therefore, the timer interval can range from 0.5 to 128 microseconds
38
+ // Depending on the reset value (255 to 0)
39
+ TIMER_CONFIG_NORMAL();
40
+
41
+ // Timer2 Overflow Interrupt Enable
42
+ TIMER_ENABLE_INTR;
43
+ ```
44
+
45
+ 送信開始時にはタイマー割り込みを止めていて、
46
+ 受信許可時にはタイマー割り込みを開始しています。
47
+ これより、
48
+ IRremoteライブラリをそのまま使っている限り、自分が送信した信号を自分で拾うことは出来ない、と言ってよさそうです。
49
+
50
+ ただし、この場合出来ないのは「受信」のはずであって、「送信できない」というのが観測できる事実だとすれば一致しないですね。