2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

寒くて布団から出られない問題とその対策

Last updated at Posted at 2025-12-29

この記事では IoT アプリケーション Research について解説する。

Research では Web ブラウザ上から赤外線を使う機器を制御できる。

以下はエアコンの電源を入れるデモである。

デモ1

プロローグ

冬の時期、河原は布団から出るのが辛かった…。(気合を出せば起きられる程度ではあるけど)

プロローグ

借りている部屋にはエアコンが備え付けられていて、そのリモコンを使えば自動で暖房を入れることができるのだが、以下の制約があった。

  • n 時間後に ON/OFF しかできない
  • 一回発火したら設定が消える

リモコン

つまりこの機能を使う場合、「6:00に暖房をONにしたいんだけど、今は22:00だから8時間後に暖房ONにしないと…」みたいな計算を毎晩行わないといけない。非常に面倒である。

しかしこの機能を使わない場合、翌朝の起床には気合が必要になる。

エアコンを高機能なものに替えることはできない。エアコンは借りている部屋の設備であり、自分の所有物ではないからだ。

現状にうんざりした河原は、問題の解決に取り組み始めた…。

システムの構想と原理

今回は上記の通り使いにくいリモコンの替わりになるシステムを考えることにした。

リモコンは赤外線を使ってエアコンに信号を送っている。

世の中には赤外線信号受信モジュールという、名前の通り赤外線信号を受信するモジュールが出回っている。

OSRB38C9AA

この赤外線信号受信モジュールを使うと、リモコンの出す赤外線信号の波形を見ることができる。

波形を見る

リモコンからは以下のような信号が出ている。(サンプリング周波数が低い都合で若干鈍っているが矩形波である。また赤外線信号受信モジュールは Active Lowである。つまり何も受信していないときはHigh、受信したときはLowということ)

波形

赤外線信号のフォーマットはメーカーによって異なる。
この記事では解説しないが、知りたい場合は以下が参考になる。
http://elm-chan.org/docs/ir_format.html

エアコンはこの信号を受信したら暖房を動かすのだから、この信号を送ってやりさえすればリモコンでなくても暖房を入れられるわけだ。

そこで以下のようなシステムを思いついた。

1

2

3

4

ハードウェア

エアコンの暖房を入れるには上記の波形のとおりに赤外線 LED を点滅させてやれば良い。

電子工作の初学者の多くは可視光 LED(赤とか緑とか、目に見える色の LED)の点滅制御から始めると思うが、今回やることの本質はそれと同じである。

L12170

ただし赤外線 LED は可視光 LED に比べると必要な電流が多く、Raspberry Pi の GPIO に直接繋いでも光が弱すぎて、エアコンまで届かない。

Raspberry Pi の GPIO で赤外線 LED を制御しようと思ったらトランジスタなどを使って電流を増幅してやる必要がある。

2SC2120-Y

このトランジスタを使った回路の例は以下である。

トランジスタ電流増幅回路

$R_B$と$R_C$を計算する必要がある。

LED に 瞬間的に 1A くらいの大電流を流したいのでコレクタ電流$I_C=I_{FP}=1[A]$とする。

これによって、以下の特性図から LED の順電圧$V_{F}=1.5[V]$となる。(見切れているので、心の目で見る)

VF

なおグラフが見切れているのはメーカーがグラフの範囲外で使ってほしくないからである。

グラフの範囲外の大電流を LED に流した場合、LED の破損や事故の危険が考えられる。

しかし今回の波形のように極めて短い時間のパルスであれば LED は大電流に耐えられるかもしれない。

プログラミングするときはうっかり大電流を流し続けないように確認し、実験を行うときはいつでも電源を遮断できる状態にしておくなど、十分に注意すべきである。

また、以下の特性図から直流電流増幅率$h_{FE}=140$となる。(見切れているので、心の目で見る)

HFE

また、以下の特性図から $V_{BE}=0.9[V]$となる。(見切れているので、心の目で見る)

VBE

また、以下の特性図から $V_{CE}=0.2[V]$となる。(見切れているので、心の目で見る)

VCE

コレクタ抵抗RCとベース抵抗RBを算出する

$$
V_{OUT} = R_CI_C + V_F + F_{CE}
$$

これを$R_C$について解く。

$$
R_C = \frac{V_{OUT} - V_F - V_{CE}}{I_C} = \frac{5 - 1.5 - 0.2}{1} = 3.3[Ω]
$$

次に$R_B$について考える。

$$
V_{GPIO} = R_BI_B + V_{BE}
$$

これを$R_B$について解く。

$$
R_B = \frac{V_{GPIO} - V_{BE}}{I_B}
$$

ここで、$I_B$について考える。直流電流増幅率$h_{FE}$はコレクタ電流$I_C$とベース電流$I_B$の比で、以下で表せる。

$$
h_{FE} = \frac{I_C}{I_B}
$$

これを$I_B$について解く。

$$
I_B = \frac{I_C}{h_{FE}} = \frac{1}{140}[A]
$$

$$
R_B = (3.3 - 0.9) \times 140 = 336[Ω]
$$

以上から、$R_C = 3.3[Ω]$、$R_B = 336[Ω]$となる。

抵抗値の設計が終わったら実際に基板を作成するのだ。

Raspberry Pi 向けのユニバーサル基板に部品を実装する。

基板

出来上がった基板を Raspberry Pi に載せてエッジデバイスのハードウェアは完成である。

エッジデバイス

システム構成

エッジデバイスのハードウェアができたので、システム構成を考える。

今回は IoT 的な構成にした。

ユーザーがフロントエンド Web アプリケーションから設定を切り替えたとき、フロントエンド Web アプリケーションは REST API 経由でバックエンド Web アプリケーションに設定を保存する。

バックエンド Web アプリケーションは設定に従って REST API 経由でエッジデバイスへリクエストを送る。

エッジデバイスは赤外線 LED を使ってエアコンを制御する。

構成図1

またエッジデバイスは定期的に温湿度センサやフォトダイオードから部屋の温湿度や明るさを取得し、MQTT 経由でバックエンド Web アプリケーションへ情報を送信する。

バックエンド Web アプリケーションは WebSocket 経由でフロントエンド Web アプリケーションへ情報を送る。

構成図2

フロントエンドのアプリケーションは主に Angular と Bootstrap で作成した。

バックエンドのアプリケーションは REST API 部分を Express.js、WebSocket 部分を ws で作成した。

エッジデバイスのアプリケーションは FastAPI で作成した。

デモ

以下はエアコンの電源を入れるデモである。

デモ1

ちなみにこのシステムはエアコンでなくても赤外線信号を使っている機器であれば制御できる。以下は部屋の照明を制御するデモである。

デモ2

費用

材料 値段[円]
Raspberry Pi (エッジデバイス側) 8000
Raspberry Pi (バックエンド側) 8000
Raspberry Pi 用ユニバーサル基板 330
5mm 赤外 LED L12170 300
トランジスタ 2SC2120-Y 150
抵抗とか 100
ABS 樹脂ケース 180
合計 17060

Raspberry Pi は 8000 円程度で買える時代があったのだ。(今は倍以上するかもしれない)

エピローグ

こうして問題を解決し、自動的に部屋が暖かくなる環境を得た河原は、冬場の朝に起きるのが楽になった。

エピローグ

河原は冬になったらこのシステムを動かして、寒い日々を乗り越えている。

おわり

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?