テレビなどをつけているのかな~?
どういった仕組みなのかぇ?
調査してみるか!
この記事では、「Raspberry Pi Pico W」を使って、「赤外線リモコンの通信内容を分析する」方法をご紹介します。
「Raspberry Pi Pico W」は、Raspberry Pi の中でも、省電力なCPUを搭載したマイコン開発ボードです。
他のRaspberry Pi 製品とは異なり、Linux OSを搭載することは難しいですが、
省スペース、省電力の専用CPU「RP2040」を搭載しており、Arduino IDEや、MicroPythonなどで開発することができます。
しかも、Wi-FiとBluetoothが使用できるモジュールも搭載されているので、スタンドアロンでの稼働のみならず、他のマイコンと無線通信することが可能です。
今回は、家の中にあるリモコンの赤外線通信を「Raspberry Pi Pico W」で受信し、通信内容を分析するためにシリアルモニタへ出力させます。
無線通信としては、Bluetoothや、Wi-Fiを使う手段がありますが、ある程度固定されたものとの通信は赤外線も便利に使えそうです。
受信した信号を確認してみましょう。
赤外線リモコンの通信を受信するために使うのが、「赤外線リモコン受信モジュール」です。
使用した部品は、「SPS-440-1(38kHz)」です。
駆動電圧は、5Vですので、センサーからの信号も5Vです。
「Raspberry Pi Pico W」で使う場合は、5V→3.3Vに変換して使用する必要があります。
このあたりも確認していきます。
「Raspberry Pi Pico W」に接続する際の環境構成や、プログラムを紹介します。
ぜひ、皆さんも挑戦してみてくださいね!
この記事の前提となる「Raspberry Pi Pico W」のはじめかたは、次の記事で紹介しています。
すけろく ついに、国内でもRaspberry Pi Pico Wを手に入れたぞ! げんろく Wi-Fiモジュールがついているので、 国内の技適取得が必要だったからな。 すけろ[…]
あわせて読みたい!「Raspberry Pi Pico W」関連の便利記事
すけろく ん~。 このエラーの時の変数の値が知りたいな~ げんろく どうした? プログラムがうまく動かないのか? すけろく そうなのだ。 Raspberry Pi Pico[…]
今回使用したマイコンはこちら!
ピンヘッダ実装済み
ピンヘッダを自分ではんだ付けするもの
赤外線リモコン受信モジュール
電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作赤外線リモコン受信モジュール SPS-440-1(38kH…
テレビのリモコンなどにも使われている「赤外線」。
「赤外線通信」「赤外線カメラ」「遠赤外線ヒーター」などなど、「赤外線」というキーワードがついたものも目にすることがありますよね。
この「赤外線」とは一体どのようなものでしょうか?
赤外線とは?
赤外線(せきがいせん)は、可視光線の赤色より波長が長く(周波数が低い)、電波より波長の短い電磁波のことである。ヒトの目では見ることができない光である。分光学などの分野で IR (infrared) と略称される。
電磁波を波長で分類すると下記の図のようになります。
赤外線通信の仕組み
赤外線リモコンなどは、赤外線をどのように利用して、通信を行っているのでしょうか。
リモコンの発信部は、赤外線LEDの点灯・消灯を切り替えて命令を送っています。
点灯・消灯の長さやタイミング(スイッチスピード)を使って信号を送るのです。
この点灯・消灯の切り替えパターンは、家電などで利用されている赤外線リモコンの場合、共通のフォーマットを利用している場合がほとんどです。
代表的なフォーマットは下記の3種類です。
- NECフォーマット
- AEHA家電協フォーマット
- Sonyフォーマット
各フォーマットを少し掘り下げてみましょう。
NECフォーマット
NECフォーマットでは、主に940nmの赤外線をキャリア、周波数38kHz・デューティー比1/3の信号をサブキャリア(副搬送波)として用います。
これにより、キャリアである940nmの赤外線が、38kHz(周期26.3μ秒)で点滅します。
デューティー比とは、一周期のうち赤外線が点灯している時間の割合のことです。
デューティー比が3分の1なので、点灯時間は8.79μ秒となります。残りの17.51μ秒は消えています。
後述するフレームやリピートと呼ばれる赤外線信号(infrared signal)をもとに、点灯・消灯を制御します。
赤外線が点滅している時間帯(赤外線信号がHのとき)と完全に消えている時間帯(赤外線信号がLのとき)を制御すること(変調)で、目的とする情報を送信側(赤外線リモコン)から受信側(テレビやエアコンなど)へ送ります。
変調単位T=562μsになります。
フレーム構成
NECフォーマットでは、送信できる情報として、16bitのカスタムコード(メーカー識別コード)と、8bitのデーターコードがあります。
これらの情報を含む赤外線信号をフレームといい、開始を示すリーダーコード・カスタムコード・データーコード・終了を示すストップビットで構成されます。
データーコードは、8bitの送信データー(データーコード1)に、ビット反転したもの(データーコード2)を付加して、合計16bitとなります。
(注)
初期の仕様では、カスタムコードもデータコード同様に8bit+8bit反転でしたが、拡張されて16bitとなり、表現できる値が「0x00~0xFF」から「0x0000~0xFFFF」へ増えました。
リピート
リピートは、繰り返しを意味するもので、赤外線リモコンのボリュームボタンなどを押しっぱなしにしているときに送出される赤外線信号です。
リーダーコードとストップビットのみで構成されています。
フレームに続いて、108m秒の周期で送出します。(図1-1の左下)
ビットデーター(1・0)の表現方法
カスタムコードとデーターコードに含まれるビットデーター(1・0)は、信号の長さによって表現されます。
信号の長さが2.25m秒で先頭の0.56m秒がHの場合は「1」、同様に長さが1.125m秒の場合は「0」を表します。(図1-1の右下)
赤外線信号を見る
変調された赤外線を元に戻すこと(これを復調という)で、赤外線信号に含まれるカスタムコードとデーターコードを見ることができます。
AEHA(家電協)フォーマット
家電製品協会フォーマットでは、主に940nmの赤外線をキャリア、周波数38kHz・デューティー比1/3の信号をサブキャリア(副搬送波)として用います。
これにより、キャリアである950nmの赤外線が、33~40kHz (38kHz typ.) 代表値では周期26.3μ秒で点滅します。
デューティー比とは、一周期のうち赤外線が点灯している時間の割合のことです。
デューティー比が3分の1なので、点灯時間は8.79μ秒となります。残りの17.51μ秒は消えています。
後述するフレームやリピートと呼ばれる赤外線信号(infrared signal)をもとに、点灯・消灯を制御します。
赤外線が点滅している時間帯(赤外線信号がHのとき)と完全に消えている時間帯(赤外線信号がLのとき)を制御すること(変調)で、目的とする情報を送信側(赤外線リモコン)から受信側(テレビやエアコンなど)へ送ります。
変調単位T= 350~500μs (425μs typ.)になります。
フレーム構成
家電製品協会フォーマットでは、送信できる情報として、16bitのカスタムコード(メーカー識別コード)とチェック用パリティ(4bit)と、4bitのデーターコードがあります。
その後、データを含めるための部分があり、1~48bitで可変長です。
これらの情報を含む赤外線信号をフレームといい、開始を示すリーダーコード・カスタムコード・データーコード・終了を示すトレーラで構成されます。
リピート
リピートは、繰り返しを意味するもので、赤外線リモコンのボリュームボタンなどを押しっぱなしにしているときに送出される赤外線信号です。
フレームに続いて、点灯8T、消灯8Tで送出します。(図1-1の左下)
ビットデーター(1・0)の表現方法
カスタムコードとデーターコードに含まれるビットデーター(1・0)は、信号の長さによって表現されます。
信号の長さが1.6m秒で先頭の0.4m秒がHの場合は「1」、同様に長さが0.8m秒の場合は「0」を表します。(図1-1の右下)
赤外線信号を見る
変調された赤外線を元に戻すこと(これを復調という)で、赤外線信号に含まれるカスタムコードとデーターコードを見ることができます。
Sonyフォーマット
Sonyフォーマットでは、主に950nmの赤外線をキャリア、周波数40kHz・デューティー比1/3の信号をサブキャリア(副搬送波)として用います。
これにより、キャリアである950nmの赤外線が、40kHz 代表値では周期25μ秒で点滅します。
デューティー比とは、一周期のうち赤外線が点灯している時間の割合のことです。
デューティー比が3分の1なので、点灯時間は8.33μ秒となります。残りの16.66μ秒は消えています。
ビットデーター(1・0)の表現方法
カスタムコードとデーターコードに含まれるビットデーター(1・0)は、信号の長さによって表現されます。
赤外線信号を見る
変調された赤外線を元に戻すこと(これを復調という)で、赤外線信号に含まれるデーターとアドレスを見ることができます。
赤外線受信モジュールの回路を作る
さて次に赤外線受信モジュールが受信した信号を取得する回路を作成します。
回路を作る際に注意したポイントは次の通りです。
- 電源電圧
- Raspberry Pi Pico Wへのセンサー値入力電圧
- 赤外線受信モジュールへの電源供給
電源電圧
今回使用した「SPS-440-1(38kHz)」は、「5V」で駆動します。
そのため、電源電圧は「5V」にしました。
当然、「SPS-440-1(38kHz)」から取得する信号も「5V」として出てきます。
また、「Raspberry Pi Pico W」は、パソコンへ解析した赤外線信号の情報を送信するために、USBケーブルでパソコンとつなぎます。そのため、電源もパソコンとのUSBケーブル経由で取得するようにしています。
Raspberry Pi Pico Wへのセンサー値入力電圧
今回は信号を受信して解析するマイコンとして、「Raspberry Pi Pico W」を使います。
「Raspberry Pi Pico W」のGPIO(接続ポート)は「3.3V」が基準になっています。
先ほど記載したとおり、赤外線受信モジュール「SPS-440-1(38kHz)」からくる信号は「5V」ですので、信号を「3.3V」に変換する必要があります。
この「5V」の信号を「3.3V」に変換する方法して、今回は抵抗による分圧を使用しました。
赤外線受信モジュール「SPS-440-1(38kHz)」の資料を見ると、信号出力経路上に50kΩ程度の内部抵抗がついています。
そのため、信号出力経路に40kΩ程度の抵抗を分圧構成にして接続しています。
これにより、入力電圧は約3V付近になります。
赤外線受信モジュールへの電源供給
赤外線受信モジュール「SPS-440-1(38kHz)」のデータシートを見ると、電源供給経路に100Ω抵抗と22μFのキャパシタを入れるよう記載がありました。(R=100Ω、C=22μF)
そのため、今回は、抵抗100Ωと、47μFのコンデンサを入れています。
※ジャストサイズなコンデンサが手元になかったので、47μFのものを使っています。
回路構成イメージ
ここまで記載したポイントを踏まえ、次の図のような回路を作成しました。
「Raspberry Pi Pico W」のGPIOは次のように使用しています。
Raspberry Pi Pico W 側 | 接続先 |
GPIO15(20) | 赤外線モジュールとの接続 |
GND(23) | 回路のGNDと接続 |
実際にブレッドボード上で作成した回路は次のようになりました。
ブレッドボード右側にある「Raspberry Pi Pico W」には、GPIOをわかりやすくする「GPIO Master」を取り付けています。
気になる方は、こちらからどうぞ。
Boothショップで販売中!
この商品は、電子工作でRaspberry Pi Pico/Wを使う場合に便利なツールです。Raspberry Pi Pi…
実際の試験回路は、以下のものを使っています。
C1:22μFで十分でしたが、手持ちにはなかったので今回は47μFの電解コンデンサを使っています。
R2:40kΩの抵抗器が手持ちになかったので、10kΩの抵抗器を直列に4つ並べて40kΩを作っています。
上記条件で、赤外線受信モジュール「SPS-440-1(38kHz)」からの出力(Vout)を確認すると2.9~3.0Vとなりました。
作成の際には、「Raspberry Pi Pico W」に接続する前に、Voutの信号電圧をテスターで確認してください。
実際に確認に使ったテスターはこちら!
回路作成に使った部品はこちら!
電子部品(秋月電子から購入) | |
赤外線受信モジュール:SPS-440-1 電解コンデンサ:47μF16V105℃ ルビコンPX カーボン抵抗:100R カーボン抵抗:10kR |
秋月電子サイトはこちら |
Raspberry Pi Pico Wのプログラミング
先ほど構成した回路から赤外線受信モジュール「SPS-440-1(38kHz)」のセンサー出力を受け取り、内容を解析してシリアル出力するプログラムを作ります。
赤外線送受信用のライブラリを準備する
赤外線の送受信に使えるArduinoのライブラリ「IRremote」を使用します。
今回のプログラミングでは、受信のみ使っていますが、送信に使える機能も実装されています。
こちらのライブラリは、「Raspberry Pi Pico W」で使用されている「RP2040」チップに対応しています。
上記の2つのライブラリは、Arduino IDEのライブラリマネージャでダウンロード、設定ができます。
ライブラリのインストールは、次の記事で紹介しています。
本記事は、Arduino IDE 1.8.xバージョンのライブラリ管理方法を紹介した記事です。 Arduino IDEは、より新しいバージョン「2.0.x」が発表されています。 機能がよりリッチになった「Ardu[…]
プログラムを作成する
Arduino IDEを起動して、「ファイル」メニューから「新規ファイル」を選択し、表示されるスケッチに以下のように記述します。
Arduino IDE スケッチ例
Raspberry Pi Pico Wへの書き込み
2回目以降
- Raspberry Pi PicoをパソコンにUSB接続します。
- Arduino IDEで前述のプログラムを記載して、 「ファイル」メニューから「名前を付けて保存」で任意の名前を付けて保存します。
- 「ツール」メニューから「ボード」情報を確認し、次のものを選択します。
「Raspberry Pi Pico/RP2040」-「Raspberry Pi Pico W」 - 「シリアルポート」にマイコンを接続したCOMポートが指定されているかも確認します。
- 「ツール」メニューから「シリアルモニタ」を選択してシリアルモニタを起動します。(転送速度は「115200」です)
- 「スケッチ」メニューから「マイコンボードに書き込む」を選択します。
プログラム実行結果
5V電源をオンにし、書き込みが完了した後にエアコンやテレビのリモコンを操作します。
受信できた内容が、シリアルモニターに表示されます。
Protocol=NEC Address=0xE880 Command=0x14 Raw-Data=0xEB14E880 32 bits LSB first Send with: IrSender.sendNEC(0xE880, 0x14, <numberOfRepeats>); Raw result in internal ticks (50 us) - with leading gap rawData[68]: -65535 +181,-88 +13,-10 +12,-10 +13,-10 +12,-10 +13,-10 +12,-10 +13,-10 +12,-33 +12,-10 +12,-11 +12,-10 +12,-33 +12,-10 +13,-32 +13,-32 +13,-32 +12,-11 +12,-10 +12,-33 +12,-11 +12,-33 +12,-10 +12,-11 +12,-10 +12,-33 +12,-33 +12,-10 +13,-32 +12,-11 +12,-33 +12,-33 +12,-33 +12 Sum: 1293 Raw result in microseconds - with leading gap rawData[68]: -3276750 +9050,-4400 + 650,- 500 + 600,- 500 + 650,- 500 + 600,- 500 + 650,- 500 + 600,- 500 + 650,- 500 + 600,-1650 + 600,- 500 + 600,- 550 + 600,- 500 + 600,-1650 + 600,- 500 + 650,-1600 + 650,-1600 + 650,-1600 + 600,- 550 + 600,- 500 + 600,-1650 + 600,- 550 + 600,-1650 + 600,- 500 + 600,- 550 + 600,- 500 + 600,-1650 + 600,-1650 + 600,- 500 + 650,-1600 + 600,- 550 + 600,-1650 + 600,-1650 + 600,-1650 + 600 Sum: 64650 Result as internal 8bit ticks (50 us) array - compensated with MARK_EXCESS_MICROS=0 uint8_t rawTicks[67] = {181,88, 13,10, 12,10, 13,10, 12,10, 13,10, 12,10, 13,10, 12,33, 12,10, 12,11, 12,10, 12,33, 12,10, 13,32, 13,32, 13,32, 12,11, 12,10, 12,33, 12,11, 12,33, 12,10, 12,11, 12,10, 12,33, 12,33, 12,10, 13,32, 12,11, 12,33, 12,33, 12,33, 12}; // Protocol=NEC Address=0xE880 Command=0x14 Raw-Data=0xEB14E880 32 bits LSB first Result as microseconds array - compensated with MARK_EXCESS_MICROS=0 uint16_t rawData[67] = {9050,4400, 650,500, 600,500, 650,500, 600,500, 650,500, 600,500, 650,500, 600,1650, 600,500, 600,550, 600,500, 600,1650, 600,500, 650,1600, 650,1600, 650,1600, 600,550, 600,500, 600,1650, 600,550, 600,1650, 600,500, 600,550, 600,500, 600,1650, 600,1650, 600,500, 650,1600, 600,550, 600,1650, 600,1650, 600,1650, 600}; // Protocol=NEC Address=0xE880 Command=0x14 Raw-Data=0xEB14E880 32 bits LSB first uint16_t address = 0xE880; uint16_t command = 0x14; uint64_t rawData = 0xEB14E880; Send with: IrSender.sendNEC(0xE880, 0x14, <numberOfRepeats>); Pronto Hex as string char prontoData[] = "0000 006D 0022 0000 015C 00A9 0019 0013 0017 0013 0019 0013 0017 0013 0019 0013 0017 0013 0019 0013 0017 003F 0017 0013 0017 0015 0017 0013 0017 003F 0017 0013 0019 003E 0019 003E 0019 003E 0017 0015 0017 0013 0017 003F 0017 0015 0017 003F 0017 0013 0017 0015 0017 0013 0017 003F 0017 003F 0017 0013 0019 003E 0017 0015 0017 003F 0017 003F 0017 003F 0017 06C3 ";
編集後記
いかがだったでしょうか。
「Raspberry Pi Pico W」のプログラミングといえば、「microPython」と考えていましたが、Arduino IDEでプログラムできるとうれしいですね。
赤外線リモコンの信号をしっかりと受信し、解析できました。
「Raspberry Pi Pico W」と同じRP2040というチップを搭載している機器にも使えるので応用ができそうです。
これで、「Raspberry Pi Pico W」を使って、家電などをコントロールするための第一歩が完成しました。
記事は、以上になります。
最後までご覧いただきありがとうございました。
記事内でご紹介した「Raspberry Pi Pico W」はこちら!
ピンヘッダ実装済み
ピンヘッダを自分ではんだ付けするもの
実際に確認に使ったテスターはこちら!
回路作成に使った部品はこちら!
電子部品(秋月電子から購入) | |
赤外線受信モジュール:SPS-440-1 電解コンデンサ:47μF16V105℃ ルビコンPX カーボン抵抗:100R カーボン抵抗:10kR |
秋月電子サイトはこちら |
Raspberry Pi Pico Wの他の記事はこちらからどうぞ!
すけろく ウーム。 センサーなどの情報を記録したいな。 げんろく なに。Raspberry Pi Picoで記録媒体を 使いたいのか。 すけろく そうだ。 センサーやカメラのデータを保存したいのだ。 げんろく データの保管には、microSDカードが 使いやすいそ。使ってみるか! この記事では、「Raspberry Pi Pico/W」に「microSDカードスロット」を接続して読み書きしてみま […]
すけろく うーむ。 げんろく どうした?浮かない顔をして。 すけろく LEDを火のように光らせる方法を知りたくてな。 げんろく それなら、1/fの揺らぎを使って 再現してみるか。 この記事では、「Raspberry Pi Pico W」を使って、「LEDを揺らぎを加えて点灯させる」方法をご紹介します。 Raspberry Pi の中でも、省電力なCPUを搭載したマイコン開発ボードです。 他のRa […]
すけろく うーむ。 どうしたものか。 げんろく どうした。 暗い顔をして。 すけろく カーモデルのウィンカー点滅を再現したくてな。 明滅回路を作ろうか悩んでおる。 げんろく ん!? そんなときは、メインプロセッサと切り離して 動作するPIOの出番ではないのか! この記事では、「Raspberry Pi Pico/W」に実装されている「PIO(Programmable I/O」を実際に使ってみます […]
すけろく Raspberry Pi Pico/WのPIO機能を使ってUARTの送信には成功した。 しかし、まだ受信側ができていないのぉ。 げんろく そうだな。 今度は受信側を試してみるか。 すけろく どうせなら、パソコンから送った文字を返すような やり取りができるといいな。 げんろく よし。 UART送受信を実装してみよう。 この記事では、「Raspberry Pi Pico/W」に実装されてい […]
すけろく Raspberry Pi Pico/WのPIO機能については前回調べた。 今度は実際に使ってみたいの~ げんろく そうだな。 実際にプログラムする際の注意事項などを見ていこう。 すけろく Arduino IDEでも使用できるのか? げんろく ああ。 使えるぞ! Arduino IDEで使う場合を例にやっていこう。 この記事では、「Raspberry Pi Pico/W」に実装されている […]
すけろく Raspberry Pi Pico/Wには、PIOという機能があるらしいな。 げんろく そうだ。 UARTなどのインタフェース不足や、実装されていない機能を GPIOに対してプログラムできる機能だ。 すけろく Raspberry Pi Pico/Wをもっと知るために PIOを調べてみたい。 げんろく よし! PIOについて少し調べてみるか! この記事では、「Raspberry Pi P […]
すけろく うーむ。 げんろく どうした浮かない顔して。 すけろく これまで、Raspberry Pi Pico / Wをいろいろ確認してきたが 外付けのボタンの認識ってやったかぇ? げんろく たしかに!まだ取り上げていない基本的なものがあるな よし、今回はボタン押下時の状態を Raspberry Pi Pico / Wで認識してみよう。 この記事では、「Raspberry Pi Pico W」を […]
すけろく 宅内で使っているリモコンは、どういった仕組みで テレビなどをつけているのかな~? げんろく 赤外線を使って信号を送っているのだ。 すけろく しかし、たくさんある機器のリモコンが混信しないのは どういった仕組みなのかぇ? げんろく よし、今回は赤外線リモコンの通信を 調査してみるか! この記事では、「Raspberry Pi Pico W」を使って、「赤外線リモコンの通信内容を分析する」 […]
すけろく うーむ。 対応付けが難しいな。 げんろく どうした? Raspberry Pi Picoで悩んでいるようだな。 すけろく Raspberry Pi PicoやPico Wの GPIOピンの情報がボード上にプリント されていないから資料との対応付けがやりづらくてな。 げんろく そうか。そういう課題があるのだな。 よし、解決するグッツを作って提供してみよう! 皆さんは、「Raspberry […]
すけろく うーむ。 モーターを毎回同じくらい回転させることはできんのかな。 げんろく DCモーターや、サーボモーターだと、 回転量を正確に制御することは難しいぞ。 すけろく では、何か解決策はあるのかぇ? げんろく ステッピングモーターというものがある。 モーターの回転をステップとして制御できる。 今回はこのあたりを動かしてみるか。 この記事では、「Raspberry Pi Pico W」を使っ […]