うしこlog
公開: 2016/07/11

ラズパイから操作できる照明を自作しよう

今回の内容

 ラズパイから操作できる照明を一式作ってみましょう。 ラズパイはリモコンの送信側として扱い、受信側はAVRマイコンを使用します。ラズパイから送信した信号に応じて、AVRに繋げた照明(パワーLED)の明るさを調節できる照明を自作します。

 なお、作成や利用に関しては、自己責任でお願いします。

前回までの内容は?

 エアコンの操作や、Juliusによる音声認識、iPhoneからのvpn接続、音楽プレーヤーサーバの構築を、ラズパイ2上で行ってきました。 前回までの内容が気になる方や、ラズベリーパイをもっと活用したい方 は、ぜひ以下の記事をご確認ください。
前回までの内容が気になる方や、ラズベリーパイをもっと活用したい方 は、ぜひ以下の記事をご確認ください。

必要な部品

 リモコンから照明の明るさを変えられたらいいなと思いませんか。今回は、パワーLEDを用いた簡単な照明と、ラズパイから照明を制御するための赤外線リモコンを自作します。 送信側は、ラズパイ2と赤外線LEDを使って受信側に命令を送ります。受信側では、AVRマイコンと赤外線受信モジュールを使用して命令を受信し、AVRマイコンからパワーLEDを光らせます。

ちょっとおしゃれな照明を作りたいという方は、以前に和紙を使った照明を作ったので、LEDと和紙で照明を自作しようも合わせてご覧下さい。 和紙のランプカバーの作り方も紹介しているので、それを今回の照明に利用すると良いかもしれません。

送信側の部品例

 送信側で必要な部品を以下にまとめます。部品は比較的少ないです。部品の購入は、秋月電子通商さんやマルツパーツさん等から買いました。
ラズパイがよく分からないという方については、ラズベリーパイ2のOSセットアップをご覧下さい。

用意する部品部品名
ラズベリーパイここで説明するのはラズベリーパイ2であるが、なんでも良い
ラズパイ用の電源ACアダプタ5V 2A
ブレッドボードか基板小さめのボレッドボードまたは、ユニバーサル基板(72x47mm)
赤外線LED5mm赤外線LED OSI5FU511
(2m以上飛ばしたいのであれば、パワー赤外線LEDもおすすめ
抵抗カーボン抵抗 1/4W 150Ω (パワー赤外線LEDなら1/2Wや1W以上)
導線ブレッドボード用または、よくあるワイヤー

受信側の部品例

 受信側で必要な部品を以下にまとめます。基板を使いますので、半田付けが出来ることを前提としています。そんなに難しくないので、これを機に始めてみませんか!その場合は別途、半田ごて(電子部品を扱う場合は20Wがおすすめ) と 半田 も必要となります。

用意する部品部品名
AVRマイコンATtiny2313
ICソケット20PIN用のICソケット
AVRのライタいろいろなAVR用のライタがあるが、Atmel純正のAVRISPmkIIを使用
電源ACアダプタ5V 1A
DCジャック2.1mm標準DCジャック 基板取付用 MJ-179P
DCジャック基板AB基板 DCジャック基板 AB-D
トグルスイッチ基板用トグルスイッチ3P
赤外線受信モジュール赤外線リモコン受信モジュール PL-IRM
トランジスタ2SC3421
パワーLED放熱基板付3Wウォームホワイト色パワーLED (OSM5XME3C1S)
パワーLED用レンズパワーLED用レンズ (OSOLRA2045M)
放熱器(ヒートシンク)放熱器 (46x25x17mm)
シリコングリスシリコングリス HY-750 (3g)
抵抗カーボン抵抗 1W 1Ω, 1/4W 47KΩ, 1/4W 1KΩ
基板ユニバーサル基板(72x47mm)
導線(ワイヤー)耐熱電子ワイヤー
[なくても良い]発光LED赤色や緑色など好きなもの。受信の確認用
[なくても良い]抵抗カーボン抵抗 1/4W 1KΩ (こちらはなくても良いが、1本は上記で必要)

自作リモコンの信号フォーマット

 ここでは作成する赤外線リモコンの信号フォーマットについて説明します。

 赤外線LEDを使ってデータを表すには、点灯や消灯により、"0" か "1" を表せます。この時、点灯しているか、消灯しているのかで判断してしまうと太陽光にも反応してしまいます。それを防ぐために点灯時は38kHzで変調させます。さらに、変調された点灯(実際は点滅だが以下、点灯とする)と、消灯を利用することで、"0" か "1" を表すようにします。この考え方は、テレビやエアコン等のリモコンにも導入されています。
例えば、あるデータを表すには図1のように、点灯と、消灯を組み合わせて1つのデータを表します。点灯は、図の通り38KHzで変調させています。データを区別するには、変調させた部分の長さと、消灯させた部分の長さを変えます。このことについては、後でまた説明します。

データの表し方
データの表し方

 自作する照明信号のフォーマットは、図2のように先頭から「ヘッダ部」「ID部」「データ部」「フッタ部」の順で構成することにします。誤り訂正は、簡単のため無しにします。誤り訂正について知りたい場合は、ハミング符号で調べたら色々と出てくると思います。 それぞれの役割を以下に示します。
ヘッダ部は、照明用信号の始まりを意味します。このヘッダにより、自作照明用の信号が来ることがわかります。
ID部は、複数の自作照明があった時に、どの照明への信号なのかを判断するためのものです。最大8台を判別できます。
データ部は、照明の明るさをXX段階で表します。
フッタ部は、信号の終わりを示します。これにより、信号が終わったことを判断できます。
次節でそれぞれの構成を詳しく説明していきます。

信号のフォーマット
信号のフォーマット
名称説明
ヘッダ照明用信号の始まり
ID照明ID (複数の照明があるとき、任意の照明を識別するためのID)
データ照明の明るさ(16段階)
フッタ信号の終わり

ヘッダ部

 ヘッダ部は、照明信号の始まりを示す役割をします。ヘッダ部信号としては下図のように、3つのデータで表します。
1つ目の長いデータは、点灯時間:2500[us]、消灯時間:1000[us]。
2つ目のデータは、点灯時間:1000[us]、消灯時間:2000[us]。
3つ目のデータも、点灯時間:1000[us]、消灯時間:2000[us]。

照明リモコン-ヘッダ部信号
照明リモコンのヘッダ部信号

ID部

 ID部は、個別の照明を表す役割をします。3つのデータで表すため8台まで識別可能です。ID部信号としては、"0" と "1" を表す2種類のデータを使用します。"0" と"1" は消灯時間の長さで判別し、"0" を表すデータよりも、"1" を表すデータの消灯時間の方が長くなります。
例えば、図の信号は左から "001" となるため、2進数の考えを取り入れると、IDは1となります。同様に "110" の場合だと、IDは6を表します。
"0" を表すデータは、点灯時間:1000[us]、消灯時間:1000[us]。
"1" を表すデータは、点灯時間:1000[us]、消灯時間:2000[us]。

照明リモコン-ID部信号
照明リモコンのID部信号

データ部

 データ部は、照明の明るさを示す役割をします。4つのデータで表すため、16段階で明るさを変更できます。データ部信号としては、ID部信号と同様に "0" と "1" を表す2種類のデータを使用します。"0" と"1" は消灯時間の長さで判別し、"0" を表すデータよりも、"1" を表すデータの消灯時間の方が長くなります。
例えば、図の信号は左から "0100" となるため、2進数の考えを取り入れると、明るさは4となります。同様に "1100" の場合だと、明るさは12となります。なお、"0000" は消灯を表します。
"0" を表すデータは、点灯時間:1000[us]、消灯時間:1000[us]。
"1" を表すデータは、点灯時間:1000[us]、消灯時間:2000[us]。

照明リモコン-データ部信号
照明リモコンのデータ部信号

フッタ部

 フッタ部は、照明信号の終わりを示す役割をします。フッタ部信号としては下図のように、1つのデータのみで表します。
フッタのデータは、点灯時間:5000[us]、消灯時間:15000[us]以上。

照明リモコン-フッタ部信号
照明リモコンのフッタ部信号

送信側回路とプログラムの作成

 リモコンの送信側回路と、プログラムの作成をしていきます。リモコンの送信は、前章のフォーマットに従って赤外線LEDをプログラムから点滅させることで送信することができます。

送信側回路

 信号を送信する照明リモコンの回路は、ラズパイに赤外線LEDと抵抗を1つずつ使用して作成します。 回路といっても、下図のように、ラズパイGPIOのピン番号15(左側の前から8番目)とピン番号6(右側の前から3番目)の間に、抵抗1本(150Ωくらい)と赤外線LED1本を繋げるだけです。そのときの注意点として、赤外線LEDのアノード(足の長い方)を15ピン側にすることです。実用的には、出力が足りないのでトランジスタ等で出力を上げる必要がありますが、今回はやりません。

 GPIOのピン配置はラズベリーパイ2でGPIOを使うをご覧ください。

送信側回路図
送信側回路図

 完成した送信側回路は、以下のとおりです。赤色の線はいらなかったですね。つい癖で、接続してしまうんです。

実際の送信側回路の写真
実際の送信側回路の写真

送信側プログラム

 照明リモコンの出力側のプログラムを作成します。このプログラムは、自作リモコンの信号フォーマットに従った命令を送信する動作をします。 この命令には、電源OFFと照明の明るさ(15段階)の計16種類あるので、それらに従って命令を送信するプログラムを作成します。 実現方法としては、各命令が書かれたテキストを作成し、送信したい命令をテキストから読み取って送信するプログラムを作成します。

送信命令を記述したテキスト

 プログラムを作成する前に送信命令を記述したテキストを用意します。
ファイル名は、なんでもいいのですがとりあえず「light+On/Off/明るさ」とします。例えば、照明を起動させる送信命令テキストの名前は「lightOn」、明るさ5にする送信命令テキストの名前は「light5.txt」という具合です。

 テキストのデータは、「点灯時間[us]」「消灯時間[us]」の組が1行に書き出され、この組をデータの個数分だけ記述します。 以下は、明るさ5、ファイル名で言えば light5.txt の場合のテキストデータの例です。先ほどの自作リモコンの信号フォーマットと照らし合わせて頂ければ、フォーマット通りになっていることが確認できると思います。

テキストのデータ:明るさ5 (light5.txt) の場合
    2500	1000
    1000	2000
    1000	2000
    1000	1000
    1000	1000
    1000	1000
    1000	1000
    1000	2000
    1000	1000
    1000	2000
    1000	2000
    1000	2000
    5000	15000
    

 このような送信命令テキストを、各命令分だけ作成すれば下準備完了です。
いちいち作成するのは面倒くさいと思うので、Light.zipとしてまとめておきました。ご活用ください。

送信命令プログラム

 命令を送信するプログラムを作成します。プログラムの動作としては、テキストを読み込んで、そのテキストに従ってラズパイに接続した赤外線LEDを制御します。
送信命令プログラムを以下に貼っておきますので、必要であればダウンロードして下さい。

 SendInfrared-for-Light.c

 本プログラムはc言語で記述されているため、「gcc」等でコンパイルして実行してください。また、本プログラムはラズパイのGPIOを使うためにwiringPiを用いているため、コンパイル時にwiringPiを指定する必要があります。
実行手順は以下の通りです。実行時には、送信命令テキストのファイル名を指定して下さい。

[プログラムの実行手順]

  1. 本プログラムを以下のようにコンパイルする
    sudo gcc SendInfrared-for-Light.c -o SendInfrared-for-Light -lwiringPi
  2. 本プログラムを実行する (引数:送信命令テキストのファイル名)
    sudo SendInfrared-for-Light light5.txt
  3. 命令が送信される

受信側回路とプログラムの作成

 リモコンの受信側回路と、プログラムの作成をしていきます。リモコンの受信側は、赤外線LEDの光を受信し解析して照明を光らせます。

受信側回路

 図9に受信回路図を示します。信号を受信する照明リモコンの回路は、AVRマイコンのATtiny2313と赤外線受信モジュールで受信をして、トランジスタとパワーLEDで照明を光らせます。 送信側回路よりは複雑になりますが、難しくはないと思います。注意点としては、パワーLEDのプラス側を電源側、マイナス側をトランジスタ側のコレクタ側に接続することです。 また、トランジスタについては、図10の通りのピン配置になっております。
安全性を追求すると、トランジスタのベースとグランドの間に1KΩくらいの抵抗を挟んだり、エミッタとグランドの間に100Ωくらいの抵抗を挟むと動作が安定するのでオススメです。 なお値は、実際には計算していないので、ご自身で調べて適切な値にしてください。

受信側回路図
受信側回路図
トランジスタのピン配置
トランジスタのピン配置

 実際に作った回路は、以下のようになります。正直適当に作ったので、きれいではないです。 注意点は、パワーLEDと放熱板の間にシリコングリスを塗ってからそれらを合体させることです。写真では、1年前に作った物なのでグリスが広がってますが、はみ出ないように塗ってください。
電源をつける時は、パワーLEDがかなり明るくなるので直接見ないようにしてください。最悪失明する恐れがあります。 プログラムで、電源を入れたときには光らないようになっておりますが、念のためご注意ください。

実際の受信側回路の写真
実際の受信側回路の写真

受信側プログラム

 照明の受信側のプログラムを作成します。 このプログラムは、自作リモコンの信号フォーマットに従った命令を赤外線受信モジュールにより受信し、AVRから照明を光らせます。 送信命令プログラムを以下に貼っておきますので、必要であればダウンロードして下さい。
なお、このプログラムはAVR用なので、AVRにプログラムを書き込むことで、ようやく動作するものです。専用のライタとソフトが必要となります。

 MyRemocon-for-Light.c

AVRにプログラムを書き込むための方法がわからない方は、お手数ですが以下の2記事をご覧下さい。ソフトの使い方とプログラムの書き込み方法について紹介しています。

 上記の記事を見て頂いている方は、「AVRの環境構築と使い方」のプロジェクト作成時にATmeta88ではなく、ATtiny2313を指定してください。 そして、プログラムには、MyRemocon-for-Light.cの内容をコピペしてからコンパイルしてください。

照明をつけてみる

 実際にラズパイから、照明を光らせてみます。

  1. ラズパイに接続した赤外線LEDを、AVRに接続した赤外線受信モジュールに向けます
  2. ラズパイのターミナルを開いて「sudo SendInfrared-for-Light light5.txt」を実行します
  3. 光ったら「sudo SendInfrared-for-Light lightOff.txt」を実行します
オフ時の照明の様子
オフ時の照明の様子
照明の明るさ5の照明の様子
照明の明るさ5の照明の様子

 どうでしたか?最初の命令で照明が光って、次の命令で照明が消えれば成功です。

<< MPDでラズパイ2を音楽プレーヤサーバにする 未定へ >>

著作権とか

本ページの回路図は、fritzingを使用しています。