IoT何をいまさら(65) WioからUnoへ、IR通信

Joseph Halfmoon

Wio Terminal裏側の拡張端子をそろそろ使いたい気持ちがあるのですが、そこに接続すると使えなくなってしまうものがあって気になってました。わざわざ裏面の透明な窓の中に鎮座しているIR(赤外線)エミッタです。拡張端子を何かに使ってしまう前に動かしておかないと。

まずは、Wio Terminalの裏側写真を御覧いただきましょう。上部に黒一色で並んでいるのが、Raspberry Piの拡張端子群と「互換性」のある拡張端子です。Raspberry Pi互換の信号線を引き出して使うのかと思いきや、なんと、Raspberry Piのピンソケットをここに差し込んで使えるみたい。どう使いましょうか?

ここにはRaspberry Piでなく、他のものも差し込むことが可能。前回消費電力を測っていてちょっと欲しくなった Wio Terminal Chassis Batterey(650mAh) もここに「刺さる」のです。ここに刺せばM5Stack的にバッテリで駆動することが可能になる筈。その上、Groveポート数も大幅拡張。

一方、IR Emitterへと目を転ずると、ありました、SDカードスロットの横あたりに(1/14訂正, 写真入替)。こうしてWio Terminal単体では窓を通じて見えていますが「裏側に刺さるやつら」を刺したら見えなくなること必定。

Wio Terminal IR emitter

今回は、このIR Emitterの動作検証が主目的です。しかし、エミッタだけでは通信できない。誰か受け止めてくれるモノがいります。そこで思いだしたのが、お楽しみの中華部品キット Kuman社K4なのであります。お求めやすいお値段にてArduino Uno関係の部品一式揃ってしまうキット。お世話になってはいるのですが、時々?な事がある(特にドキュメンテーション)のは、「いたしかたない」

このキットの中にIR ReceiverとTransmitterとなる赤外線リモコンの両方が含まれているのです。よって、このIR ReceiverをArudino Uno(互換機だけれども)に接続すれば受側はOK. 付属の赤外線リモコン使えば受側の動作テストもできてしまう。

Arduino Uno(互換機だけれども)上のIR Receiverの準備

単にIR Reciverとしての動作検証の目的なので、例のちょっと残念な日本語のマニュアルに掲載されているサンプルプログラムをそのまま書きこめば良いかとも思ったのです。しかし、ちょっと嫌な予感がしたので掲載されているサンプルプログラムに若干手を加えました。それがこちら。

#include <IRremote.h>

int RECV_PIN = 11;
int RED_PIN = 2;
int GREEN_PIN = 3;

IRrecv irrecv(RECV_PIN);
decode_results results;
int redLED = 0;
int greenLED = 0;

void setup() {
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  digitalWrite(RED_PIN, redLED);
  digitalWrite(GREEN_PIN, greenLED); 
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch(results.value) {
      case 0x9716BE3F:
        redLED = !redLED;
        digitalWrite(RED_PIN, redLED);
        break;
      case 0x3D9AE3F7:
        greenLED = !greenLED;
        digitalWrite(GREEN_PIN, greenLED);
        break;
    }
    irrecv.resume();
  }
}

サンプルプログラムは、キット付属のIRリモコンのボタン「1」と「2」で、赤と緑のLEDの点灯状態がトグルし、動作を確かめられるようになっているのです。しかし、それであると上手く通信できていないときに何が何だかサッパリなので、一応、受信したコードをシリアルポートに垂れ流すようにしてみました。

やっぱりと言うか、お約束通りというか、付属のリモコンのボタンを押したときに送信されるコードは、日本語資料「赤外線レシーバー+NEC符号化遠隔制御.pdf」に記載のコードと違っていました。

  • 1のボタン、文書では0xFF30CF、実際には0x9716BE3F
  • 2のボタン、文書では0xFF18E7、実際には0x3D9AE3F7

お楽しみの中華部品キットを使うときには、この手のことにイチイチ怒っていたら血圧あがり過ぎます。この頃は至って静穏。試した結果で即座に修正。ボタンを押せばLEDが点灯、消灯するようになりました。レシーバー側はこれでよし、と。

一応、リモコンのボタンを押して赤のLEDが点灯している様子はこちら。緑のLEDの隣に見えるのがIR Receiver, DP838です。例によってデータシートは付属しているのだけれど、メーカ名の記載がないやつ。なおキット付属のリモコンは MP3プレイヤー向け? みたいです。

Uno compatible as IR Receiver

Wio Terminal上のIR Transmitterの準備

さて今度は、Wio TerminalをIR Transmitterに仕立てる番ですが、それについてはSeeedStudio社の以下のページのサンプルほぼそのまま流用させていただきました。送信する切っ掛けと送信コードのところを「わずかに」改造しただけです。ソースレベルでは非常に簡単。

Getting Started with Infrared Emitter

前回も使用していたプログラムの一部に組み込む形で、Bボタンを押したらば、赤色LEDの点灯をトグルさせる0x9716BE3Fを送信し、画面にも”IR-SIGNAL-SEND.”と表示するだけのもの。前回のコードに追加した部分はこれだけ。

#include <IRLibSendBase.h>
#include <IRLib_P01_NEC.h>
#include <IRLib_P02_Sony.h>
#include <IRLibCombo.h>

//~途中略~

IRsend irSender;

//~途中略~

  if (digitalRead(WIO_KEY_B) == LOW) {
    irSender.send(NEC, 0x9716BE3F, 0);
    txtPrint("IR-SIGNAL-SEND.");
  }

ライブラリパスを見ると、NECとSony以外にも10種くらいのヘッダ(プロトコル)があったのですが、上記のサンプルコードがNECとSonyをインクルードしていたのでそのまま。そして、Receiver側が一応NECと書いているので、ここはそれを信じてNEC(プロトコル)で行きました。

無問題にて、Wio TerminalからのIR信号にArduino Uno(互換機だけども)側が反応し、赤色LEDが点灯、消灯します。

いつもこれくらい何も無いと楽なのだがな。いや、お楽しみが無くなってしまうか。

IoT何をいまさら(64) Wio Terminal、消費電力? へ戻る

IoT何をいまさら(66) UnoとWio、TIMER、PWM違い へ進む