赤外線リモコン信号受信・送信 ラズベリーパイ研究室

赤外線リモコン信号の受信・送信に関する実験を行いました。
赤外線リモコンの規格はメーカーにより様々なようで、公開されているデータには限りがあるようです。 しかし、規格がわからなくとも現物さえあれば、その信号をキャプチャしてそのまま送信するだけで 十分リモコンとして機能することが分かりました。



おススメ!記事
Raspberry Pi 用「HAL」で、
カップラーメン・タイマーを作ってみよう!
ラズパイDIYの決定版! ソケットサーバー「HAL」をご紹介します。

※誠に申し訳ありませんがこちらの電子工作のコンテンツは弊社の実験制作例となっております。十分な安全が保障されているわけではないため、参照や実施は自己責任となってしまいますのでご注意ください。

はじめに

(2016/07/23追記 この記事を全面的に改定した新記事「赤外線学習リモコン―赤外線信号送信・受信(改)」を、新たに作成しました。お急ぎの方はそちらをお読み下さい。このページは、初めて私が Raspberry Pi と 電子回路に触れた時に何を考えて何を試したのかの軌跡として残してあります。余裕のある方のみ、御覧ください)

 Raspberry Pi を使って、学習可能な汎用赤外線リモコンを制作してみました。

 「raspberrypi 赤外線リモコン」で検索すると、とても沢山のページがヒットします。当初は簡単に実装できるものと高をくくっていたのですが、これがかなり難航しました。

 結論から言うと、弊社では発売間もない時期にRaspberry Pi 2 Model B を初めて購入したのですが、これらのページで紹介されていた赤外線リモコン信号送受信用のアプリケーション「lirc」は、Raspberry Pi 2 Model B では動作しないようです。(送信のみ。受信は可能)

『Raspberry Piで遊ぼう! 改訂第3版』最新情報お知らせページ

(※2015/05/25 追記 tech4u blogさんの Raspberry Pi 2 で LIRC(赤外線リモコン) の記事でRaspberry Pi のファームウェアアップデートの紹介があったためか、Raspberry Pi 2でのlircについての不具合の記事は削除されていました)

 初めての Raspberry Pi であったためにどこに問題があるのかわからず1週間くらい悩み、あきらめて仕方なく大宮技研さんの「irMagician」を購入して、到着を待っている時に上記ページを見つけた次第です。

 同時に、うしこlog さんの「ラズパイでエアコンを動かす」を発見し、すぐにサンプルコードをダウンロードしてコンパイルし、実行してみました。1週間、お腹が痛くなるくらい悩んだのが馬鹿みたいな話で、すんなり動作してくれました。

 Raspberry Pi 2 を買って、赤外線リモコン送信が出来ずに悩んでいる方、lirc はあきらめましょう。

2015/05/19

 このページをリンクしてくださった方のブログで、Raspberry Pi のファームウェアをアップデートするとLircが利用できるようになるといった記事を見つけました。tech4u blogさんのRaspberry Pi 2 で LIRC(赤外線リモコン)(Google Analytics はこういう用途にも使えて便利ですね)

 これについては弊社ではテストしていませんので詳細は分かりませんが、lircを利用されたい方は参考になさってください。

配線

 さて、配線ですが、こちらはネットで検索して出てくるどの配線でも大抵動きます。弊社ではブレッドボードで次のような配線をしました。(2016/07/14 下図の、特に受光部分について作図ミスであるというご指摘を受けて追記を行いました。)

ブレッドボードと回路図

※赤外線受光モジュールは、ブレッドボード図とは別のものを利用しています。脚の位置が違いますのでご注意ください。

使用部品

  • 赤外線リモコン受光モジュール(PL-IRM2161-XD1) 1個
  • 赤外線LED (OSI5LA5113A) 3個
  • 抵抗 (1KΩ) 2個(※リンクは100本入りなので注意)
  • トランジスタ (2SC1815C GR) 1個

 赤外線LEDを3個も使っている理由ですが、この赤外線LEDの半減角度は15°とのことで、有効な照射範囲がかなり狭めです。ですから、数を増やしてできるだけ有効範囲を広げようとしています。

 トランジスタのベース前の抵抗が1KΩですが、コレクタ→エミッタ間には実測値で134mAの電流が流れました。赤外線LED OSI5LA5113Aの最大定格電流は100mAなのでかなりオーバーしているのですが、当初80mA程度流す予定で3.9KΩの抵抗を使ったところ、有効な照射距離が2m程度しか出ませんでしたので、購入してあった1KΩの抵抗に差し替えました。

 赤外線リモコン信号の場合はパルス信号を送信しており、極めて短時間の明滅を繰り返します。点灯時間は400µsec程度なので電流オーバーでもそれほど負担にはならないと考えています。今後継続的に動作検証を行います。

 ただ、実験途中で誤って電流を流しっぱなしにしてしまい(回路をショートさせてしまったようです)LEDを一つ破裂させてしまいました。ですので、最初は3.9KΩの抵抗と可視光LEDでテストをされることをお勧めします。

 そういったこともあり、確実にトランジスタのON/OFFを切り替えて意図しない電流をコレクタ-エミッタ間に流さないよう、エミッタ-ベース間に1KΩの抵抗を挟んで漏れ電流(遮断電流)を逃がしています。

(参考)コレクタ遮断電流とは?

(※サイトが閉鎖されたようです)

トランジスタのしくみ

(参考)トランジスタをマイコン出力のスイッチとして使う方法(1/2)

プログラム

 赤外線受信・送信プログラムは、基本的には うしこlog さんの「ラズパイでエアコンを動かす」を踏襲しています。まず、こちらのページを一読されることをお勧めします。

 ただし、ダウンロードできるコードにいくらかのバグがあるのと、個人的に少し分かりずらいネーミングやコーディングであったこともあって、拡張を施しながらコードを1から書き直しました。

前準備(WiringPi のインストール)

 WiringPiは、Raspberry PiのGPIOを制御するためのC言語ライブラリです。赤外線の送受信ではGPIOを制御するため、このライブラリを利用します。

 インストールの仕方は比較的簡単なので、以下のコマンドをターミナル等で順番通りに実行するだけでインストールできます。

git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

 正しくインストールされたか、gpioのバージョンを表示して確認してみましょう。

gpio -v

下記のような情報が表示されれば正しくインストールされています。(下記はRaspberry Pi Model B+での動作)

gpio version: 2.26
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
Type: Model B+, Revision: 1.2, Memory: 512MB, Maker: Sony

赤外線信号受信プログラム

 受信プログラムは以下の様になっています。

/*
* scanir.c
*
* copyright © 2016 Katsuhiko Miki All rights reserved.
*/

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>

int readable = 1; // 非同期でイベントが発生した場合、コールバックにより0に設定される
int read_pin = 7; // 入力ピン番号(wiringpiの番号)
int interval = 10; // 継続時間判定の間隔(us)
int max_wait = 40000; // 最大継続時間(us)

void signalCallBackHandler(int sig)
{
readable = 0;
}

double getMoment()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return ((double)(tv.tv_sec) * 1000000 + (double)(tv.tv_usec));
}

int main(int argc, char *argv[])
{
int result;

// スキャンデータを書きだすファイルのポインタを取得
FILE *fp;
char *fileName = "irdata.txt";
if(argc >= 2){ fileName = argv[1]; }
if((fp = fopen(fileName, "w")) == NULL){
printf("can't open file : %s\n", fileName);
exit(1);
}
printf("write file: %s\n", fileName);

// signal関数は、シグナル(非同期イベント)が発生したときに、
// そのシグナルを受信して、シグナル特有の処理を行うシグナル処理関数(シグナルハンドラ)を登録します。
if(signal(SIGINT, signalCallBackHandler) == SIG_ERR){
printf("can't set signal\n");
exit(1);
}

// wiringpiのセットアップ
if(wiringPiSetup() == -1){
printf("error wiringPi setup\n");
exit(1);
}

// 読み取りピン番号
if(argc >= 3){
read_pin = atoi(argv[2]);
}
pinMode(read_pin, INPUT);
printf("scaning pin: %d (wiringpi)\n", read_pin);

// 最大継続時間
if(argc >= 4){
max_wait = atoi(argv[3]) * 1000;
}
printf("max keep time: %d(ms)\n", max_wait/1000);

// 準備完了
printf("Infrared LED scanning start.\n");
printf("Pressed Ctrl+C, this program will exit.\n");

// スキャン開始
result = scan(fp);

fclose(fp);

if(result || !readable){
printf("\n\n!!! could not scanning. quit.\n\n");
} else {
printf("\nScanning has been done.\n\n");
}

return 0;
}

int scan(FILE *fp)
{
// 受光モジュールは受光するとLOWになる
if(!digitalRead(read_pin)){ return 1; }

int on, off;

// 送信が開始されるまで待機
while( readable && digitalRead(read_pin) ){}

// 解析開始
while( readable ){
on = getTime(0);
off = getTime(1);
fprintf(fp, "%6d %6d\n", on, off);

//最大継続時間同じ状態が続いたら送信は終了していると判断
if(off > max_wait){ break; }
}

return 0;
}

int getTime(int status)
{
int count = 0;
int max = max_wait / interval;
double start, end;

start = getMoment();
while( digitalRead(read_pin) == status )
{
delayMicroseconds(interval);
count++;
//最大継続時間同じ状態が続いたら送信は終了していると判断
if(count > max){ break; }
}
end = getMoment();

return getInterval(start, end);
}

int getInterval(double t1, double t2)
{
return (int)(t2-t1);
}

 これを、以下のようにしてコンパイルします。

sudo gcc scanir.c -o scanir -lwiringPi

 コンパイルが完了すると、scanirという実行ファイルが生成されているはずです。

 このscanirの仕様は、第一引数が書きだすファイル名、第二引数が読み取りピン、第三引数が最大継続時間です。最大継続時間は、この時間以上赤外線が点灯しなかった場合、リモコンからの送信は終了しているとみなし、読み取りを終了してファイルを書き出します。

 第二引数の読み取りピン番号ですが、このピン番号はRaspberry Pi のピン番号でもGPIO番号でもなく、WiringPiのピン番号です。WiringPiのピン番号とこれらの対照表は、

gpio readall

で確認できます。デフォルトは7番ピン(Raspberry Pi でも7番ピン)に設定しています。他のピンで動作させたい場合は、

sudo ./scanir ir.data 3

のように引数を与えてください。上記の場合、3番ピン(Raspberry Piの15番ピン)で読み取りが行われます。

 受信のコツですが、0.5秒から1秒程度リモコンボタンを押し続けるようにしてください。

 なお、スキャンしたデータを確認するとわかるのですが、リモコンによって、ボタンを押し続けている間断続的に信号が送信されるものと、1度だけ送信されるものがあるようです。断続的に送信されるものは立ち上がりが不安定な場合があるので、スキャンしたデータをエディタなどで、良質な部分だけ切り出すなどすると良いでしょう。弊社では読み取ったデータを自動で整形するプログラムを書いていますが、PHPなため、ここでの説明は割愛します。

赤外線送信プログラム

 送信プログラムは以下のようになっています。

/*
* sendir.c
*
* copyright © 2016 Katsuhiko Miki All rights reserved.
*/

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <math.h>
#include <unistd.h>
#define BUF_LEN 256

int write_pin = 0;

int Hz = 38; // 周波数(KHz)
int duty_num = 1; // duty比(分子)
int duty_denomi = 3; // duty比(分母)
int unit = 26; // ユニット長us
int duty_high = 9; // HIGH時間
int duty_low = 17; // LOW時間
int repeat = 1; // 送信回数

void high(int on_time)
{
// パルス信号に変換して送信
int i;
int count = on_time/unit;
for(i=0; i<count; i++)
{
digitalWrite(write_pin, 1); //high
delayMicroseconds(duty_high);

digitalWrite(write_pin, 0); //low
delayMicroseconds(duty_low);
}
}

void output(int on_time, int off_time)
{
// 赤外線点灯
high(on_time);

// 赤外線消灯
digitalWrite(write_pin, 0);
delayMicroseconds(off_time);
}

void readAndSend(FILE *fp)
{
char buf[BUF_LEN];
int i, j, length = 0;
int *on, *off;

while( fgets(buf, BUF_LEN, fp) != NULL){ length++; }
on = (int *)calloc(length, sizeof(int));
off = (int *)calloc(length, sizeof(int));

rewind(fp);
for(i=0; i<length; i++)
{
fscanf(fp,"%d %d", &on[i], &off[i]);
}

// 送信(同じ情報をrepeat回送信する)
for(j=0; j<repeat; j++)
{
printf("send data.\n");
for(i=0; i<length; i++)
{
output(on[i], off[i]);
}
usleep(50000);
}

// アロケートしたメモリを解放
free(on);
free(off);
}

int main(int argc, char *argv[])
{
// 送信データファイル
FILE *fp;
char *fileName = "irdata.txt";
if(argc >= 2){ fileName = argv[1]; }
if((fp = fopen(fileName, "r")) == NULL){
printf("can't open file: %s\n", fileName);
exit(1);
}
printf("read file: %s\n", fileName);

// wiringpiのセットアップ
if(wiringPiSetup() == -1){
printf("error wiringPi setup\n");
exit(1);
}

// 送信繰り返し回数
if(argc >= 3){
repeat = atoi(argv[2]);
}

// 送信ピン番号
if(argc >= 4){
write_pin = atoi(argv[3]);
}
pinMode(write_pin, OUTPUT);
printf("output pin: %d (wiringpi)\n", write_pin);

// 周波数の設定
if(argc >= 5){ Hz = atoi(argv[4]); }

// duty比の分子
if(argc >= 6){ duty_num = atoi(argv[5]); }

// duty比の分母
if(argc >= 7){ duty_denomi = atoi(argv[6]); }

// unit長
unit = (1.0f / (Hz * 1000)) * 1000000;
duty_high = roundf(((float)unit / duty_denomi) * duty_num);
unit = (int)unit; //us
duty_low = unit - duty_high;

printf("unit: %dms duty:%d-%d\n", unit, duty_high, duty_low);

// 準備完了
printf("send infrared signal.\n");

// データ読み込みと赤外線の送信
readAndSend(fp);

printf("\ndone\n");
fclose(fp);

return 0;
}

 こちらも同様にコンパイルするのですが、数学関数を利用しているため、コンパイルオプションに-lmを追加します。

sudo gcc sendir.c -lm -o sendir -lwiringPi

 sendirの仕様は、第一引数が読み取りファイル名、第二引数が送信繰り返し回数、第三引数が出力ピン番号、第四引数が送信信号の周波数、第五引数がduty比の分子、第六引数がduty比の分母です。

 周波数、duty比については、放課後マイコンクラブさんのブログが参考になりました。この記事の周辺に赤外線リモコンのフォーマットについての記述がありますので、そちらも併せて読まれると良いでしょう。

 基本的に赤外線リモコンのduty比は1/3で良さそうなので、これをデフォルトにしています。弊社の蛍光灯がNationalなので、デフォルトの周波数は38KHzを設定してあります。一応、33KHzでも40KHzでも蛍光灯のON/OFFができましたので、重要なのはduty比と信号のON/OFFのタイミングであり、周波数(送信時間)にはかなり柔軟なようです。(2015/05/07 単位が間違っていたので修正しました)

 送信コードは以下のようになります。

sudo ./sendir ir.data 3

 上記は、ir.dataに記録されている信号パターンを連続で3回送信します。

 冒頭で述べた lirc ではプログラムのバッファ容量の問題からか、エアコンのような信号長の長いリモコンには対応できなかったようですが、この送受信プログラムはエアコンなどにも対応できます。

 問題点としては、134mAまで電流量を増やしても、3m程度しか赤外線が届かないことですね。市販の赤外線リモコンは10mくらい離れていても赤外線が届くので、かなりの出力を行っているのだと思います。また、有効角度もかなり広く、明後日の方を向いていても機器が反応するので、赤外線LED自体が全く違う物なのかもしれません。

a配線結果

2015/05/04

 上記回路についていろいろと抵抗値を変えたりコンデンサを挟んでみたりしたのですが、どうもうまくいきませんでした。出力が130mA程度しか出ません。そこでもう少し検索してみたところ、

(参考)トランジスタのスイッチ

 にたどり着きました。どうやら、Raspberry Piの3.3Vの電圧下での2SC1815は厳しいようです。

2SC1815のデータシートより抜粋

2SC1815データシート抜粋

 グラフを見ると分かるのですが、コレクタ電流が60mAを越えたあたりから急激にhFE値が下がっていて、電圧が低いほど急激な下がり方をしています。弊社の回路では

(3.3V - エミッタ・ベース間飽和電圧1.0V) ÷ 1000Ω = 2.3mA

がベース電流で、GRをhFE200倍とすると、460mA程流れることが予測されるのですが、実際には134mAでしたので、58倍にしかなっていません。グラフからも、大体そのあたりに落ち着くことが読み取れます。2SC1815 GRでは、あまり高出力の赤外線LED発光は望めそうにありません。

 そこで、似たようなトランジスタで3.3Vでももっと大量の電流を流せるトランジスタが無いか少し検索してみたところ、

2SC3419-Y

 こちらのトランジスタが良さそうな感じです。

2SC3419のデータシートより抜粋

2SC3419データシート抜粋

 300mA付近までhFEの低下はほとんどなくVCE 2VでもhFE 150程度が得られそうです。(2.3×150=345mA程流せるかと思います)

 電脳伝説 Vintagechipsさんのトランジスタのスイッチの記述の通り、130mAでは3m程しか赤外線信号が届かなかったので、このトランジスタを購入して出力を上げてみたいと思います。

2015/05/18

 2SC3419が届いたので、テストしてみました。

2SC1815と2SC3419

 2SC3419は中電力増幅用のためか、2SC1815よりも大き目です。テストした回路は次のような簡単なものです。

2SC3419のテスト回路

 A点での実測値は330mA、hFE値は140で、データシート通りの結果が得られました。

2SC3419データシート

 実は、2SC3419購入に合わせてもう一つ電界効果トランジスタ(FET)を購入しました。

2SJ496

2SJ496-TZ-E

 これで何がしたいかなのですが、前述のように赤外線LED (OSI5LA5113A)の定格電流は100mAですから、330mAを流せばLEDは壊れ、悪くすれば破裂します(事故でショートさせて1つ破裂させました)。

 赤外線リモコンではパルス信号を送信するため常に330mAが流れるわけではないのですが、万が一流れ続けてしまうことが無いよう、安全装置を付ける必要があります。

 2SJ496はPchのMOS FETで、ゲートがLOWの時にソース→ドレインに電気が流れ、HIGHの時には流れません。これを利用し、次のような回路を組みました。

MOS FETを使ったNOT回路

 Raspberry Pi からの信号がLOWの時は、5VからLED側に向かって電気が流れますが、2SC3419のベースに電流が流れないためコレクタ→エミッタに電気が流れることが出来ず、LEDは光りません。ただし、LEDの前にあるキャパシタ(コンデンサ)はグランド接地されているため電気が流れ、ここに必要な電気が溜まります。

 Raspberry Pi からの信号がHIGHになると2SJ496のゲートに電圧がかかるため、ソース→ドレイン間に電気が流れなくなって5VからのLED側への電気の流れは止まります。同時に2SC3419のベースに電気が流れるため、コレクタ→エミッタに電気が流れる事ができるようになります。キャパシタにはLOW時に電気が溜まっているため、この電気がなくなるまでLEDに電気が供給される、という回路です。

 R3、R4はそれぞれのトランジスタの漏れ電流により意図せずにスイッチが入って電気が流れてしまわないようにしています。R5は万が一 Raspberry Pi からの信号線がオープンになってしまった時2SC3419のスイッチが入ってしまい、キャパシタに溜まっている電気がLEDに向かって流れ続けてしまうのを防いでいます。

 電解コンデンサ(キャパシタ)の容量を200µFにしたのは100µFの電解コンデンサで防爆弁がついているものが見当たらなかったからです。あまり大きな容量の電解コンデンサは接続し間違えて万が一破裂したりすると怖いので動作に問題ない範囲で小さなものにしようと思い、電子回路シミュレータCircuitViewerで実験したところ、100µFでもLEDの点灯には十分そうな電流が流れました。それで近くの電子部品販売店でキャパシタを探したところ、一番近い200µFが防爆弁があったのでこちらにしたという理由です。Raspberry Pi は最大でも5Vですからそうそう爆発するようなこともないと思うのですが、より安全そうな方を選びました。

 実験結果はこちらです。

 これで赤外線リモコンも完成か…と思いきや、どうもまだ出力が足りないようです。2SC1815の時よりは若干出力が強くなったようですが、もう少し出力を上げたいところです。

 そこで、赤外線LED (OSI5LA5113A)のデータシートをよく確認してみました。

OSI5LA5113Aデータシート

 なんと、パルス信号の定格電流は1000mAです。(パルス幅100µs以下、duty比1/100以下)

 この送信プログラムでは、38KHzで送信した時の信号の1ユニットは26µsで、duty比1/3なのでLED発光時間は9µsです。これを考えると、定格電流とまではいかなくとも、750mAくらい流してもLEDは大丈夫そうに思えます。

 そこで、もう一度2SC3419のデータシートを確認。

  2SC3419データシート3

 750mA流す時のhFEは 60倍程度なので、ベースに流す電流は12.5mAとなります。ただ、今度は2SC3419の定格が問題で、2SC3419のコレクタ定格電流は800mAでした。安全性を考慮して今回は600mAほど流す事を考えると、hFE 80倍なのでベースに流す電流は7.5mA程度が良さそうです。

 Raspberry Pi のGPIOは3.3Vで、2SC3419のベース・エミッタ間飽和電圧は標準で0.9Vなので、

(3.3V-0.9V) ÷ 0.0075A = 320Ω

 ですね。320Ωの抵抗は無いので、330Ωで良さそうです。と、弊社には330Ωの抵抗が2つしかないので、また仕入れる必要がありますね… 後日、再実験します。

2015/05/20

 330Ωの抵抗でテストしてみましたが、どうもまだ若干弱い感じです。Raspberry Pi の5Vのリミッターは600mAらしいので、デフォルトのままではこれ以上は出力できないでしょう。(2015/05/22 リミッターがあるのはUSBだけの様にも… 詳しいスペックシートないか探してみます)

altテキスト

 しかし、実際の回路ではキャパシタ(コンデンサ)に蓄えられた電気を流すため、キャパシタに溜まっている電気分は流れるはずです。パルス信号ですから多少定格を越えても流せるだけ流してしまいましょう、ということで、

  160Ω抵抗回路

 こんな回路になりました。

(3.3 - 1.1) ÷ 160 = 13.75mA

 hFE値は定格一杯の60倍以下でしょうから、精一杯流れたとして

13.75 × 60 = 825mA

 このくらいなら大丈夫な気がします。ということで、実験。大分出力は強くなりました。ただ、やはり半減角は狭めで、LEDがちゃんと蛍光灯の方を向いていないと拾ってくれません。やっぱりLED自体が広角のような気がするんですが…

 今のところ発熱など問題は無いので、もう少しテストを繰り返してみます。問題なさそうなら、これで赤外線リモコン送信回路は終了にしたいと思います。

2016/07/14 追記

一年の時を経て、最初の回路に大間違いが合った事がわかりました。赤外線受光モジュールの Vcc について、赤外線 LED のカソード側に接続するように記述していましたが、実際に私が試したのは

訂正

こうでした。

当時はとにかく送信部分について苦慮していて、受光についてはあまり深く考えておらずずっと気づきませんでした。

気づくきっかけになったのは、当サイトのサーバーフレームワーク製品の「HAL」の利用例として、私の拙い回路ではなく、安心して利用できる既成品をご存知の方がいないかと思い Facebook の「ラズベリー・パイ ジャパン」グループに投稿した事でした。

先程述べたとおり私は送信部分にばかり気が行っていたのでみなさんが指摘してくれている事がよくわからなかったのですが、根気よく説明してくださったS.Nさん、K.Wさん、S.Yさん始め、他のみなさんに深く感謝します。

なお、上記の訂正部分についても適切ではありません。というのも赤外線受光モジュールに 5V の電圧をかけてそれをそのまま GPIO に流しているのですが、Raspberry Pi の GPIO は 3.3V 耐圧だからです。この記事で使用している PL-IRM2161-XD1 は

データシート

によると 2.4V ~ 5V で動作するようですので、Raspberry Pi の 3.3V に繋ぐのが正解で、上図のように 5V に繋ぐのであれば分圧を行って電圧を下げる必要があります。

何しろ1年前の事ですし、この記事が最初にかいた Raspberry Pi の記事なので、本当に 5V に繋いでいたのか、3.3V に繋いでいたのを 5V と間違えたのかは今となっては定かではありませんが、いずれにせよ、赤外線 LED のカソード側に受光モジュールの Vcc を繋いでいるのは明らかに間違いです。訂正してお詫びします。

上記データシートの参考回路をみてみると、Vcc と GND の間に 10μF 1.0μF のコンデンサを挟んでいます。

データシートのサンプル

Facebook のグループで教えていただいたのですが、Raspberry Pi はノイズが入りやすいため、このようにコンデンサを挟むことで動作を安定させた方がよいそうです。

送信部分もそうですが、受光部分についても、本当に適切な回路にするにはまだまだ修正が必要であることを追記します。

最後にもう一度、S.Nさん、K.Wさん、S.Yさんに謝意を表して今回の追記を終わります。

この記事へのコメント

※現在コメントはMarkdown記法が強制です。>>Markdown の書き方


John

お名前:Smithb39ウェブサイト

2016-07-18 18:44:32

Can you add a Blackberry template? This web page is tricky to read otherwise for those of us browsing with cell phones. Otherwise, in the event you can place a RSS link up, that would be good also. dcdebedefbggkeda

お名前:Administratorウェブサイト

2016-07-18 19:13:54

Hi, Thank you for your comment. I don't have a Blackberry device. So, I don't know how does this site appears on your device. I'm going to investigate, and think about better way to improve your experience.

Orange Pi PCでも使えました

お名前:西川賢一ウェブサイト

2016-06-26 08:32:53

Orange Pi PCでも正常に動くことを確認しました。 こちらで紹介させていただいています。 http://nopnop2002.webcrow.jp/OrangePiPC/OrangePiPC-11-B.html ありがとうございました。

お名前:管理者ウェブサイト

2016-06-26 15:22:21

こんにちは、西川さん。いらっしゃいませ。 > Orange Pi PCでも正常に動くことを確認しました。 それは良かったです。 西川さんもいろいろとやってらっしゃるようですね。後でじっくり拝見させていただきます。 今後とも、よろしくお願いいたします。

お名前:西川賢一ウェブサイト

2016-07-30 08:11:09

再度のコメントですいません。 リモコンのフォーマットにはNECフォーマットとかSONYフォーマットとかいくつかありますが、このプログラムは全てのフォーマットに対応しているのでしょうか?? よろしくお願いします。

お名前:管理者ウェブサイト

2016-07-30 09:45:45

西川さん、こんにちは 当サイトには NEC や SONY のリモコンが無いので動作確認はしていませんが、送信プログラムの4~6番目の引数に適切な数値を指定することで、振る舞いを各フォーマットに合わせられる事を目指して設計してあります。 4番目が周波数、5番目がduty比の分子、6番目がduty比の分母です。 SONYフォーマットですと、40kHzのようなので、次のようなコマンドで動作するかと思います。 sudo ./sendir ir.data 3 [pin番号] 40 1 3 参考)[赤外線リモコンの通信フォーマット](http://elm-chan.org/docs/ir_format.html) ぜひ試してみて、レポートいただけないでしょうか?

お名前:管理者ウェブサイト

2016-07-30 09:57:29

先ほどのリンクページをみて、Transmissionの規定が有る事に初めて気づきました。 そのうちに、Transmission 用の第 7 引数の設定もできるようにしようかと思います。

この記事に返信

このコメントに返信