照明のリモコンが一つしかなく、
リビングと寝室をリモコンを持って移動する生活から脱却するため
寝室照明用のリモコンをマイコンで作りたいと思います。
送信編では、受信編で読み取った照明リモコンのコードを
赤外線LEDを使って送信します。
用意するもの
- 適当なマイコン
→ Seeeduino XIAOを使います - 赤外線LED
→ 秋月で5個100円で購入したOSI5FU5111C-40を使います - トランジスタ (2SC1815とか)
- タクトスイッチ
- ジャンプワイヤ 適量
- 抵抗 適量
ハードウェア接続
受信編でATOM Matrixに内蔵されている
赤外線LEDでは光量が足りなくて
信号が届かないということが分かったので
外付けで赤外線LEDを付けます。
(ついでにSeeeduino XIAOに変更)
トランジスタを使って、
Seeeduino XIAOのGPIOから
LEDに流す電流をオンオフします。
まずはLEDのデータシートをチェック。
VF = 1.35Vを考慮して5Vに繋ぐ抵抗値を計算します。
LEDに50mA前後の電流が流れるように設計したつもり。
定数が66Ωとビミョーな値なのは
ちょうどいい定数の抵抗が手持ちになくて
合成抵抗値で適当に作ったからです
赤外線LEDは可視光のLEDよりも電流量が多めで、
大体50~100mA流すみたいです。
(可視光のLEDでも色によって必要な電流量は変わります。)
リモコンとして使いたいならまあまあ流さないといけないんですね。
あとは、スイッチで操作したいのでタクトスイッチを使います。
Seeeduino XIAOとGNDの間に接続しました。
※タクトスイッチのラインに外付けで抵抗をつけない場合は
次のソフトウェア作成の工程でGPIOをINPUT_PULLUPに設定します。
ブレッドボードで接続するとこんな感じ。
トランジスタのコレクタはGPIO6に、タクトスイッチはGPIO5に繋ぎました。
ジャンプワイヤをいっぱい繋ぐと邪魔なので
抵抗の足の切れ端でブレッドボードに配線しちゃいました。
ショートには注意。
ソフトウェア作成
#include <IRremote.h>
#define IR_SEND_PIN 6
#define SW_PIN 5
void setup()
{
pinMode(SW_PIN, INPUT_PULLUP);
Serial.begin(9600);
IrSender.begin(IR_SEND_PIN, true);
}
//uint16_t sAddress = 0x1275;
//uint8_t sCommand = 0x7;
uint8_t sRepeats = 0;
void loop()
{
if(digitalRead(SW_PIN) == LOW)
{
// IrSender.sendNEC(sAddress, sCommand, sRepeats);
Serial.println("Sending...");
IrSender.sendNECRaw(0x2071275, sRepeats);
Serial.println("Done");
delay(3000);
}
}
受信編でも使った「IRremote」というライブラリを使用しました。
今回は受信編で読み取っておいたRaw-Data (0x2071275) を送信します。
タクトスイッチには外付け抵抗を入れていないので
SW_PINはpinModeでINPUT_PULLUPに設定します。
(大事なことなので2回言った)
タクトスイッチが押されていることを検知したら赤外線LEDで信号を送信し、
そのあと3秒間Sleepするというプログラムになっています。
実行してみる
プログラムを書きこんでタクトスイッチを押してみると照明が反応しました!
おわり
コメント