Arduino勉強会/06-赤外線を使ってみる
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[Arduino勉強会]]
#contents
2014/05/03からのアクセス回数 &counter;
** 赤外線リモコンのフォーマット [#r63ad23a]
赤外線リモコンには、以下の3つのフォーマットがありますが、...
(([[赤外線リモコンの通信フォーマット>http://elm-chan.org/...
- NEC(現ルネサスエレクトロニクス)フォーマット
- AEHA(家製協)フォーマット
- SONYフォーマット
*** NECフォーマットについて [#b7be1649]
最もよく使われているNECフォーマットを使って実験することに...
NECフォーマットでは、ビット情報は38KHz(1/3duty)で送信さ...
に続いてRepeatと呼ばれるFrameの終わりを表すデータがボタン...
Frameは、以下の形式を持っています。データが1の時には、0....
データが0の場合には、0.56msのON, 1.69msのOFFを送ります。
- Leader(9msのON, 4.5msのOFF)
- Customer Code(16bitのカスタマコードをLSBから順に送信)
- Data(8bit)
- Dataのビット反転値(8bit)
- Stopビット
** Arduinoを使ってNECフォーマットのデータを送る [#sedc3517]
38KHzでオン・オフを繰り返すには、digitalWriteでは時間がか...
このため使用可能なデジタルピンは、0から7番までとなってい...
Arduinoを使って赤外線リモコンを送信する例題は、いくつかあ...
- Arduinoで遊ぶページの [[赤外線リモコンの実験>http://gar...
- 戸田よろず研究所の[[赤外線リモコンの複製2(38 kHzをソフ...
- セミコロンラボの[[Arduinoで赤外線リモコン送信>http://ww...
ここでは、Arduinoで遊ぶページをメインに参考にさせて頂き、...
*** リモコン側のブレッドボード [#q5ebb4dd]
ちょっと乱暴ですが、動作を確認するだけなので、赤外線LEDの...
今回使った赤外線LEDは、スイッチサイエンスの
[[SIR-34ST3F>http://www.switch-science.com/catalog/1484/]]
です。
&ref(IR_Send_Bread.png);
*** リモコン側のスケッチ [#hcac2606]
使用するスケッチは、以下の様にします。
#pre{{
class IrControlNecFormat {
public:
// constructor
IrControlNecFormat(byte ledPin, byte custom0, byte cu...
void sendCommand(byte data);
private:
byte _ledPinMask; // the pin mask which the LED is ...
byte _custom0; // custom code
byte _custom1; // custom code'
void sendData(byte date);
void on(int num);
};
IrControlNecFormat::IrControlNecFormat(byte ledPin, byte ...
_ledPinMask = 1 << ledPin;
_custom0 = custom0;
_custom1 = custom1;
pinMode(ledPin, OUTPUT); // set the ledPin as an OUTPUT
}
void IrControlNecFormat::sendCommand(byte data){
on(346); // leader code(ON)
delayMicroseconds(4500); // leader code(OFF)
sendData(_custom0); // custom code
sendData(_custom1); // custom code
sendData(data); // data
sendData(~data); // ~data
on(22); // stop bit
}
void IrControlNecFormat::sendData(byte data) {
for(int i = 0; i < 8; i++) {
on(22);
int delayU_Sec = ( data & 0x01 ) ? 1690 : 565;
delayMicroseconds( delayU_Sec );
data = data >> 1;
}
}
void IrControlNecFormat::on(int num) {
for(int i = 0; i < num; i++) {
PORTD |= _ledPinMask;
delayMicroseconds(9);
PORTD &= ~_ledPinMask;
delayMicroseconds(17);
}
}
// 赤外線LEDを2番ピンとGNDに接続
// 東芝REGZAのカスタマコードは、 0x40, 0xBF
IrControlNecFormat controller(2, 0x40, 0xBF);
void setup() {
}
void loop() {
// REGZAの電源コードは、0x12
controller.sendCommand(0x12);
// 5秒間隔でオン・オフを繰り返す
delay(5000);
}
}}
スケッチの以下の部分で2番ピンにカスタマコードとして、0x40...
#pre{{
IrControlNecFormat controller(2, 0x40, 0xBF);
}}
これで、東芝REGZAのコントロールができるcontrollerができま...
これに、0x12(電源のコード)をsendCommandで送ると電源のオ...
*** 実際に動かしてみる。 [#x5795c9f]
ブレッドボードを組み立てて、LEDをテレビに向けてリセットス...
5秒間隔でオン・オフを繰り返します。((どうもREGZAでは電源...
&ref(IR_Send_Setting.png);
*** 他の操作方法 [#y823a5e1]
上記のスケッチのカスタマコードとコードを変えるといろんな...
以下のPDFに各種テレビのカスタムコードとデータの意味がまと...
- [[NECフォーマット 赤外線リモコン コード表>http://www.ne...
** 赤外線受信機 [#f876ebf3]
赤外線リモコンのコードが公開されていない場合には、どうし...
今回は、スイッチサイエンスの
[[RPM6938リモコン受光モジュール>http://www.switch-science...
を使って実験してみます。
&ref(RPM6938_master_10.jpg);
ピンの配置は、データシートから引用します。丸い突起のある...
&ref(IR_Receiver.png);
*** 赤外線受光器のブレッドボード [#y6ebc8dd]
以下の様にブレッドボードを組み立てます。受光モジュールが...
&ref(IR_Rec_Bread.png);
*** 赤外線コード解析 [#p18333c5]
Arduinoで遊ぶページの[[赤外線リモコンコード解析(NECフォー...
に紹介されている赤外線リモコン解析スケッチが重宝します。
以下に引用して表示します。
#pre{{
#define COUNT_NUM 68
const int pin = 2; /* 赤外線センサの出力を接...
unsigned long time[COUNT_NUM]; /* 時刻を格納する配列 */
void setup () {
pinMode(pin, INPUT);
Serial.begin(9600);
}
void loop () {
int repeat = 0;
int mode; /* 読み取るデータを決める */
char str[64];
/* 68回データを読み取る */
mode = HIGH; /* 最初はHIGH */
for (int i = 0; i < COUNT_NUM; i++) {
while(digitalRead(pin) == mode) { /* 状態が変わるまで...
;
}
time[i] = micros(); /* 時刻を記録する */
if (mode == HIGH) { /* onとoffが交互に来るので,待つ...
mode = LOW;
} else {
mode = HIGH;
}
/* リーダコードのoffが2.25msだと次にストップビットが...
/* 3000ms以下かどうかで判定 */
if ((i == 3) && ((time[2] - time[1])) < 3000) {
repeat = 1;
break;
}
}
/* データの出力 */
Serial.print("--------- BEGIN ---------\n");
sprintf(str, "Leader:\n HIGH %dms\n", (time[1] - time[...
Serial.print(str);
sprintf(str, " LOW %4dms\n\n", (time[2] - time[1]));
Serial.print(str);
if(repeat) {
Serial.println("Repeat");
} else {
Serial.println("Custom Code:");
print_data(2);
print_data(18);
Serial.println("");
Serial.println("Data:");
print_data(34);
print_data(50);
Serial.print("--------- END ---------\n\n");
}
}
void print_data(int start) {
int code = 0;
char str[32];
sprintf(str, " ");
for (int i = 0; i < 8; i++) {
if ((time[2 * i + start + 2] - time[2 * i + start]) >...
code |= 1 << i;
sprintf(&str[2 * (i + 1)], "1 ");
} else {
sprintf(&str[2 * (i + 1)], "0 ");
}
}
sprintf(&str[17], ", %02x", code);
Serial.println(str);
}
}}
*** 赤外線コード解析を動かしてみる [#f59e8621]
それでは、赤外線コード解析スケッチを動かしてみます。
&ref(IR_Recv_Setting.png);
シリアルモニターを起動し、テレビ(REGZA)の電源ボタンを押...
&ref(IR_Recv_monitor.png);
最初に作った通り、カスタマコード0x40, 0xBFとデータ0x12が...
これを使えば、他のリモコンの解析もできます。
*** 再確認 [#jd87e4b7]
小出さまのご質問で、再度実験をしてみました。
もしかしてCPUのクロックが影響しているのかと思い、今回はDu...
&ref(confirm.png);
起動直後は、きちんと動いていましたが、蛍光灯の明かりを消...
表示されました。
#pre{{
--------- BEGIN ---------
Leader:
HIGH 2152ms
LOW 324ms
Repeat
--------- BEGIN ---------
Leader:
HIGH 80ms
LOW 2572ms
Repeat
}}
出力を遡ってみると、東芝のリモコンを押したときには、きち...
#pre{{
--------- BEGIN ---------
Leader:
HIGH 72ms
LOW -18344ms
Custom Code:
1 1 1 1 1 1 1 1, ff
0 1 0 1 1 1 1 0, 7a
Data:
1 0 0 0 0 1 0 0, 21
0 0 0 1 0 1 0 0, 28
--------- END ---------
}}
** コメント [#n42e613d]
#vote(おもしろかった[22],そうでもない[0],わかりずらい[3])
皆様のご意見、ご希望をお待ちしております。勉強会で分から...
スパム防止に画像の文字列も入力してください。
- たいへん興味深く、赤外線コード解析作製したのですが、東...
- 小出さま、「再確認」を見てください。状況によってはシリ...
- ありがとうございます。調べてみます。arduino興味深いんで...
- Leader が流れるので 箱の中に入れたりしたのですが、電池...
#comment_kcaptcha
終了行:
[[Arduino勉強会]]
#contents
2014/05/03からのアクセス回数 &counter;
** 赤外線リモコンのフォーマット [#r63ad23a]
赤外線リモコンには、以下の3つのフォーマットがありますが、...
(([[赤外線リモコンの通信フォーマット>http://elm-chan.org/...
- NEC(現ルネサスエレクトロニクス)フォーマット
- AEHA(家製協)フォーマット
- SONYフォーマット
*** NECフォーマットについて [#b7be1649]
最もよく使われているNECフォーマットを使って実験することに...
NECフォーマットでは、ビット情報は38KHz(1/3duty)で送信さ...
に続いてRepeatと呼ばれるFrameの終わりを表すデータがボタン...
Frameは、以下の形式を持っています。データが1の時には、0....
データが0の場合には、0.56msのON, 1.69msのOFFを送ります。
- Leader(9msのON, 4.5msのOFF)
- Customer Code(16bitのカスタマコードをLSBから順に送信)
- Data(8bit)
- Dataのビット反転値(8bit)
- Stopビット
** Arduinoを使ってNECフォーマットのデータを送る [#sedc3517]
38KHzでオン・オフを繰り返すには、digitalWriteでは時間がか...
このため使用可能なデジタルピンは、0から7番までとなってい...
Arduinoを使って赤外線リモコンを送信する例題は、いくつかあ...
- Arduinoで遊ぶページの [[赤外線リモコンの実験>http://gar...
- 戸田よろず研究所の[[赤外線リモコンの複製2(38 kHzをソフ...
- セミコロンラボの[[Arduinoで赤外線リモコン送信>http://ww...
ここでは、Arduinoで遊ぶページをメインに参考にさせて頂き、...
*** リモコン側のブレッドボード [#q5ebb4dd]
ちょっと乱暴ですが、動作を確認するだけなので、赤外線LEDの...
今回使った赤外線LEDは、スイッチサイエンスの
[[SIR-34ST3F>http://www.switch-science.com/catalog/1484/]]
です。
&ref(IR_Send_Bread.png);
*** リモコン側のスケッチ [#hcac2606]
使用するスケッチは、以下の様にします。
#pre{{
class IrControlNecFormat {
public:
// constructor
IrControlNecFormat(byte ledPin, byte custom0, byte cu...
void sendCommand(byte data);
private:
byte _ledPinMask; // the pin mask which the LED is ...
byte _custom0; // custom code
byte _custom1; // custom code'
void sendData(byte date);
void on(int num);
};
IrControlNecFormat::IrControlNecFormat(byte ledPin, byte ...
_ledPinMask = 1 << ledPin;
_custom0 = custom0;
_custom1 = custom1;
pinMode(ledPin, OUTPUT); // set the ledPin as an OUTPUT
}
void IrControlNecFormat::sendCommand(byte data){
on(346); // leader code(ON)
delayMicroseconds(4500); // leader code(OFF)
sendData(_custom0); // custom code
sendData(_custom1); // custom code
sendData(data); // data
sendData(~data); // ~data
on(22); // stop bit
}
void IrControlNecFormat::sendData(byte data) {
for(int i = 0; i < 8; i++) {
on(22);
int delayU_Sec = ( data & 0x01 ) ? 1690 : 565;
delayMicroseconds( delayU_Sec );
data = data >> 1;
}
}
void IrControlNecFormat::on(int num) {
for(int i = 0; i < num; i++) {
PORTD |= _ledPinMask;
delayMicroseconds(9);
PORTD &= ~_ledPinMask;
delayMicroseconds(17);
}
}
// 赤外線LEDを2番ピンとGNDに接続
// 東芝REGZAのカスタマコードは、 0x40, 0xBF
IrControlNecFormat controller(2, 0x40, 0xBF);
void setup() {
}
void loop() {
// REGZAの電源コードは、0x12
controller.sendCommand(0x12);
// 5秒間隔でオン・オフを繰り返す
delay(5000);
}
}}
スケッチの以下の部分で2番ピンにカスタマコードとして、0x40...
#pre{{
IrControlNecFormat controller(2, 0x40, 0xBF);
}}
これで、東芝REGZAのコントロールができるcontrollerができま...
これに、0x12(電源のコード)をsendCommandで送ると電源のオ...
*** 実際に動かしてみる。 [#x5795c9f]
ブレッドボードを組み立てて、LEDをテレビに向けてリセットス...
5秒間隔でオン・オフを繰り返します。((どうもREGZAでは電源...
&ref(IR_Send_Setting.png);
*** 他の操作方法 [#y823a5e1]
上記のスケッチのカスタマコードとコードを変えるといろんな...
以下のPDFに各種テレビのカスタムコードとデータの意味がまと...
- [[NECフォーマット 赤外線リモコン コード表>http://www.ne...
** 赤外線受信機 [#f876ebf3]
赤外線リモコンのコードが公開されていない場合には、どうし...
今回は、スイッチサイエンスの
[[RPM6938リモコン受光モジュール>http://www.switch-science...
を使って実験してみます。
&ref(RPM6938_master_10.jpg);
ピンの配置は、データシートから引用します。丸い突起のある...
&ref(IR_Receiver.png);
*** 赤外線受光器のブレッドボード [#y6ebc8dd]
以下の様にブレッドボードを組み立てます。受光モジュールが...
&ref(IR_Rec_Bread.png);
*** 赤外線コード解析 [#p18333c5]
Arduinoで遊ぶページの[[赤外線リモコンコード解析(NECフォー...
に紹介されている赤外線リモコン解析スケッチが重宝します。
以下に引用して表示します。
#pre{{
#define COUNT_NUM 68
const int pin = 2; /* 赤外線センサの出力を接...
unsigned long time[COUNT_NUM]; /* 時刻を格納する配列 */
void setup () {
pinMode(pin, INPUT);
Serial.begin(9600);
}
void loop () {
int repeat = 0;
int mode; /* 読み取るデータを決める */
char str[64];
/* 68回データを読み取る */
mode = HIGH; /* 最初はHIGH */
for (int i = 0; i < COUNT_NUM; i++) {
while(digitalRead(pin) == mode) { /* 状態が変わるまで...
;
}
time[i] = micros(); /* 時刻を記録する */
if (mode == HIGH) { /* onとoffが交互に来るので,待つ...
mode = LOW;
} else {
mode = HIGH;
}
/* リーダコードのoffが2.25msだと次にストップビットが...
/* 3000ms以下かどうかで判定 */
if ((i == 3) && ((time[2] - time[1])) < 3000) {
repeat = 1;
break;
}
}
/* データの出力 */
Serial.print("--------- BEGIN ---------\n");
sprintf(str, "Leader:\n HIGH %dms\n", (time[1] - time[...
Serial.print(str);
sprintf(str, " LOW %4dms\n\n", (time[2] - time[1]));
Serial.print(str);
if(repeat) {
Serial.println("Repeat");
} else {
Serial.println("Custom Code:");
print_data(2);
print_data(18);
Serial.println("");
Serial.println("Data:");
print_data(34);
print_data(50);
Serial.print("--------- END ---------\n\n");
}
}
void print_data(int start) {
int code = 0;
char str[32];
sprintf(str, " ");
for (int i = 0; i < 8; i++) {
if ((time[2 * i + start + 2] - time[2 * i + start]) >...
code |= 1 << i;
sprintf(&str[2 * (i + 1)], "1 ");
} else {
sprintf(&str[2 * (i + 1)], "0 ");
}
}
sprintf(&str[17], ", %02x", code);
Serial.println(str);
}
}}
*** 赤外線コード解析を動かしてみる [#f59e8621]
それでは、赤外線コード解析スケッチを動かしてみます。
&ref(IR_Recv_Setting.png);
シリアルモニターを起動し、テレビ(REGZA)の電源ボタンを押...
&ref(IR_Recv_monitor.png);
最初に作った通り、カスタマコード0x40, 0xBFとデータ0x12が...
これを使えば、他のリモコンの解析もできます。
*** 再確認 [#jd87e4b7]
小出さまのご質問で、再度実験をしてみました。
もしかしてCPUのクロックが影響しているのかと思い、今回はDu...
&ref(confirm.png);
起動直後は、きちんと動いていましたが、蛍光灯の明かりを消...
表示されました。
#pre{{
--------- BEGIN ---------
Leader:
HIGH 2152ms
LOW 324ms
Repeat
--------- BEGIN ---------
Leader:
HIGH 80ms
LOW 2572ms
Repeat
}}
出力を遡ってみると、東芝のリモコンを押したときには、きち...
#pre{{
--------- BEGIN ---------
Leader:
HIGH 72ms
LOW -18344ms
Custom Code:
1 1 1 1 1 1 1 1, ff
0 1 0 1 1 1 1 0, 7a
Data:
1 0 0 0 0 1 0 0, 21
0 0 0 1 0 1 0 0, 28
--------- END ---------
}}
** コメント [#n42e613d]
#vote(おもしろかった[22],そうでもない[0],わかりずらい[3])
皆様のご意見、ご希望をお待ちしております。勉強会で分から...
スパム防止に画像の文字列も入力してください。
- たいへん興味深く、赤外線コード解析作製したのですが、東...
- 小出さま、「再確認」を見てください。状況によってはシリ...
- ありがとうございます。調べてみます。arduino興味深いんで...
- Leader が流れるので 箱の中に入れたりしたのですが、電池...
#comment_kcaptcha
ページ名:
SmartDoc