システムデザイン

RaspberryPiを使って家のエアコンを制御してみた

*本記事は旧TechblogからCOLORSに統合した記事です。

はじめに

はじめまして。 エンジニアリングソリューション事業部のS.Hです。
今回は、RaspberryPi(ラズベリーパイ)を使って家のエアコンを制御する方法をご紹介します。

RaspberryPiとは

下図に示すように、ムキ出しの基板に様々なインタフェースを搭載したシングルボードコンピュータになります。
HDMIポートにディスプレイ、USBポートにマウスとキーボードを繋ぐことでデスクトップPCとして使用することもできます。
が、RaspberryPiの魅力は何と言っても、GPIOコネクタが付いていることです。

RaspberryPI3概要:https://www.pakutaso.com/20170826214raspberry-pi-3.html

GPIOとは

General-purpose input/outputの略で、「汎用入出力」を意味します。GPIOピンにはあらかじめ定義された目的はなく、デフォルトでは使用されません。
と説明されてもさっぱり分からないと思いますので、噛み砕いて説明します。

GPIOについて説明する前に、そもそもPCやスマホなどの電子機器がどうやって動いているかご存知でしょうか?
電子機器はCPUがタッチパネルやディスプレイなど色々な電子部品を制御することで動いています。
では、CPUはどうやって電子部品を制御しているのかというと、電気を流したり止めたりすることで制御しています。
電気で電子部品を制御するために、CPUの裏には丸い金属端子が沢山ついており、この金属端子と電子部品を接続することでCPUは電子部品を制御できます。
ただし、CPUの裏にある金属端子全てと電子部品を好き勝手に接続していいわけではありません。
CPUへの電源供給用だったり、メモリ制御用だったりCPUを販売しているメーカーによって予め役割が決められ金属端子もあります。
CPUを購入したユーザーが自由に使える金属端子のことをGPIOと言います。

すごくざっくりした説明ですが、これを表したのが下図になります

RaspberryPI3断面図:https://www.pakutaso.com/20170826214raspberry-pi-3.html

ブレッドボードとは

次に、RaspberryPiのGPIOと電子部品を接続するためのブレッドボードについて説明します。
ブレッドボードは等間隔で穴が空いており、穴同士は内部で結線されています(下図参照)
この穴に対して電子部品を挿していくことで、RaspberryPiのGPIOと電子部品を接続することができます。

ブレッドボード:https://www.pakutaso.com/20170823215post-12745.html

RaspberryPiでエアコンを制御するための回路

今回制御するエアコンは、赤外線リモコンで操作するタイプです。
RaspberryPiでエアコンを制御するには、ラズベリーパイに赤外線リモコンの役割を持たせる必要があります。
そのためには、次2つの電子部品が必要になります。

  • 赤外線LED→エアコンに向けて赤外線を送るために必要。
  • 赤外線受信モジュール→リモコンが送信している赤外線データの送信パターンを学習するために必要。


この2つをブレッドボードを使ってRaspberryPiのGPIOと接続すると下図のようになります。

RaspberryPiでエアコンを制御するための回路:https://github.com/fritzing/eagle2fritzing/blob/master/LICENSE
RaspberryPiでエアコンを制御するための回路

これで、RaspberryPiでエアコンを制御するためのハード構成(見た目)のカスタマイズは完了です。
以降ではソフト部分について説明していきます。

回路に合わせてGPIOの初期設定を行う

GPIOの初期設定では、GPIOの電気の流れの向きを制御します。

  • CPUからGPIO端子に電気を流す(output)
  • GPIO端子からCPUに電気を流す(input)

設定を行うのにコードを書く必要はありません。
RaspberryPiのGPIOを制御するためのpigpioというPythonライブラリがすでに用意されているため、手順に従ってコマンドを実行するだけです。

手順1:pigpioモジュールのインストル

$ sudo apt install pigpio python3-pigpio

手順2:RaspberryPi再起動時にpigpiodを自動的に起動させる設定

$ sudo systemctl enable pigpiod.service

手順3:pigpiodを再起動させる

$ sudo systemclt start pigpiod

手順4:起動時にGPIO設定を行うようにcrontabに処理追加

$ crontab -e
  # GPIP_3(赤外線受信モジュールで使用)
  #   input(r)かつ、pull up(u)に設定する
  # GPIP_4(赤外線送信用)
  #   output(w)に設定し、出力をlow(0)
  @reboot until echo 'm 3 r   pud 3 u   m 4 w   w 4 0' > /dev/pigpio; do sleep 1s; done

以上でGPIOの設定は完了になりますが、「これで本当にGPIO設定できてるの🤔」と疑問を抱く人のために、コマンド実行で電気を流したり/止めたりできていることを確認する方法も記載しておきます。

事前準備:
ブレッドボードに指している赤外線LEDを、普通のLEDに差し替えます(※)
※スマホのカメラを介してみれば、赤外線LEDでも光っていることも確認できます。しかし、レンズをかなり近づけた状態でON/OFFを繰り返してやっと光っていることが確認できるレベルです。

LEDをONにする方法

$ echo 'w 4 1' > /dev/pigpio

LEDをOFFにする方法

$ echo 'w 4 0' > /dev/pigpio

赤外線を送受信する方法

これまた、pigpioを使って赤外線の送受信を行うためのirr.pyというライブラリが既に存在するため、手順に従ってコマンドを実行するだけです。

手順1:ライブラリのインストール

$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py

手順 2:リモコンが送信する赤外線データの学習
赤外線受信モジュールにエアコンのリモコンを向けた状態で、次のコマンドを実行し、ONボタンを押下することで、エアコンON時の赤外線データを学習できます。

$ python irrp.py -r -g3 -f code light:on --no-confirm --post 130

手順3:学習したデータの確認
赤外線データは赤外線LEDのONとOFFの繰り返しであるため、ON/OFFの時間が学習データとして保存されます。

$ cat codes
{
    "light:on":  [3295, 1490, 502, 297, ...省略],
}

手順4:学習データを使ってのエアコン制御
次のコマンドを実行することで、エアコンをON状態ににすることができます。
ただし、赤外線LEDの発光量が弱いため、RaspberryPiとエアコンの距離は30cm以下にする必要があります

$ python irrp.py -p -g4 -f codes light:on

さいごに

今回、RaspberryPiでエアコンを制御するにあたりソースコードは一切書いていません。
コマンド操作で、既存のPythonライブラリを実行しただけです。
RaspberryPiで電子部品を制御するためのPythonライブラリは他にもたくさんあります。

Python=AIのイメージが強い印象ですが、RaspberryPiと組み合わせることで自作のIoT機器をお手軽に開発することができます。

今回の記事で、AIだけではないPythonの魅力に気付いて頂けたのであれば幸いです。