はじめての電子工作超入門

番外編② XOceanを使ってみた〜ArduinoとEnOceanを使用した温湿度表示(その2)

みなさん、こんにちは。新米ライターの小西です。前回はXOceanのデータ把握までを試行錯誤してやってみました。なかなかしんどい作業でしたが、これでどのようなEnOcean製品のデータでも理解できるようになりました。

今回はXOceanにカラー漢字LCDシールドを接続して、温湿度モニタリングシステムを作りたいと思います。これで独立した機器として動作しちゃいますね。

ちなみにLCDシールドの購入先やここまでの工程は、前回の記事にまとめています。ぜひ併せてご覧下さい!

では早速、完成形をお披露目します。表示が付くと一気に機器としてそれらしくなります。

entry-spinoff002_ph01

LCDシールドとこれまでに作ったArduino+XOceanとの接続をやっていきましょう! まずはLCDシールドについて調べました。

カラー漢字LCDシールドについて

LCDシールドについては作者の方のホームページに詳しく書かれています。
http://www.bs21-lab.com/products/p006-ColorKanjiLCD/

LCDシールドは画像の表示ができたり、2画面の重ね合わせができたりするようなので、いろいろ楽しいことができそうですが、今回はシンプルに温度と湿度の表示のみをさせます。このLCDシールドを動作させるサンプルスケッチが用意されているようなので、まずはサンプルスケッチをArduino IDEの中でライブラリ化します。ちなみにArduino IDEのバージョンは1.0.5までしか動作確認はされていないようなので、注意してください。

図1.カラー漢字LCDシールドのサンプルスケッチ取得

図1.カラー漢字LCDシールドのサンプルスケッチ取得。上記作者の方のホームページ中程にあります。

取得したサンプルスケッチをArduino IDEをインストールしたフォルダ内にある “library” というフォルダへコピーします。

図2.カラー漢字LCDシールドのライブラリをコピー

図2.カラー漢字LCDシールドのライブラリをコピー

コピーした後、Arduino IDEを起動して、”ファイル” → “スケッチの例” → “ColorKanjiLCD” を選択するとLCDシールド用のサンプルスケッチを立ち上げることができます。

図3.カラー漢字LCDシールドのサンプルスケッチ

図3.カラー漢字LCDシールドのサンプルスケッチ

スケッチがいろいろ入っているので試してみると、楽しくてついつい時間を忘れて遊んでしまいますが、目的はXOceanと接続してLCDに表示させないといけないので、一つサンプルを選びます。今回は “cklcd_mini_sketch”を選びました(一番簡単なサンプルスケッチです)。
それではいよいよソフトウェアを作成していきましょう。

LCDシールド+XOceanのソフトウェア

基本的には前回作成したソフトウェアを移植するだけで、あとは画面表示部分を追加するだけです。

/*
  Color Kanji LCD Shield - Minimum sketch example

  本スケッチは "カラー漢字 LCD シールド" の最小スケッチ例です。

  Circuit:
    pins A4(SDA), A5(SCL) for TWI communication in Arduino standard.
    pins SDA, SCL for TWI communication in Arduino UNO R3, Leonardo.

  created 15/july/2013 by I.Kato @ BS21 Lab

  This code is in the public domain.
*/

// TWI 通信用ライブラリ:必須です
#include <Wire.h>

// カラー漢字 LCD 用ライブラリ
#include <ColorKanjiLCD.h>

/********* EnOcean add *********/
#define TEMPID  0x040179BD           // EnOceanモジュールID
#define SYNC    0x55                 // SYNCバイト
float Temp=0 ;                 //温度データ
float pastTemp=0 ;             //前回の温度データ
float Hum=0 ;                  //湿度データ
float pastHum=0 ;             //前回の湿度データ

/********* EnOcean end *********/

// カラー漢字 LCD シールドの TWI アドレスを 0x3C 以外に設定した場合は、以下の値を書きかえてください。
// TWI 通信できていない時は、カラー漢字 LCD シールド自身に現在設定されている TWI(i2c) アドレスが
// 表示されているはずなので、御確認ください。
#define CKLCD_TWI_ADDR  0x3C


// カラー漢字 LCD のインスタンス生成
ColorKanjiLCD cklcd (CKLCD_TWI_ADDR); // カラー漢字 LCD シールドの TWI アドレスを指定する


// 初期化関数
void setup()
{
  // 必ず、最初に Wire ライブラリを初期化させておいてください。
  // 注意:"CKLCD_Wire" は Arduino Due では "Wire1" を、それ以外では "Wire" になります。
  CKLCD_Wire.begin();

  // 続いて、カラー漢字 LCD ライブラリを初期化します。
  // 符号化方式は UTF-8 方式がデフォルトなので、特に指定しなくても OK です。
  // 初期化に成功すると、画面はクリアされ、LCD 表示方向はランドスケープ(横向き) に、カーソル位置は (0,0) になります。
  // カラー漢字 LCD は、電源投入直後は自動的に Version と TWI アドレスを表示していますので、
  // 初期化に失敗した場合は、TWI アドレスが、上記の CKLCD_TWI_ADDR と一致しているか確認してください。
  // 仮想画面1(160×256) を背景面に設定します。仮想画面2(160×128) は使用しません。
  cklcd.begin (CKLCD_ORIENT_LANDSCAPE + CKLCD_DISP_SCREEN_B1);

  // 日本語のメッセージを表示させます(仮想画面1を使用)。
  // Arduino IDE の符号化方式は UTF-8 方式なので、これだけで表示できます。
  // ※ JIS 漢字規格の第一水準字~第三水準字のみ表示できます。第四水準字は表示できません。
  //  cklcd.v1.print ("日本語で表示");

  /**************** EnOcean add ****************/
      //Pin 0/1
  Serial.begin(57600);              // 57600-EnOcean Serial Protocol 3 

  cklcd.v1.print ("\n   XOcean \n\n");
  cklcd.v1.print ("温湿度モニタリング \n");
  cklcd.v1.print ("           システム \n");
  /**************** EnOcean end ****************/
  
}


// ループ関数
void loop()
{
/********* EnOcean add *********/
  unsigned char   dataReceive = 0 ;  //受信確認フラグ
  unsigned char   aChar = 0 ;        //データ格納用変数
  unsigned char   pos = 0 ;          //ESPデータ位置
  unsigned long   senderID = 0 ;     //温湿度モジュールのID
  unsigned short  dataLength = 0 ;   //データ長  
  unsigned char   optLength = 0 ;    //オプションデータ長
  unsigned char   packettype = 0 ;    //パケットタイプ
  char buf[1] ;

  while(Serial.available()>0){    // XOcean受信したか?
    aChar = Serial.read();
    switch(pos){
      case(0):
      if( SYNC == aChar){          // SYNCバイトだったら受信開始
        delay(5); 
        pos++;                     // pos移動 SYNC -> dataLength
        dataReceive = 1 ;
      }
      break;
      case(1):
      dataLength = 0x00FF & aChar ;  // dataLength 上位1バイトです。
      pos++;                        // pos移動 dataLength -> dataLength
      break;
      case(2):
      dataLength = (dataLength<<8) + aChar ; // dataLength 下位1バイトです。
      pos++ ;                                // pos移動 dataLength -> optLength
      break;
      case(3):
      optLength = aChar ;          //  optionLength  
      pos++ ;                      // pos移動 optLength -> packet type
      break;
      case(4):
      packettype = aChar ;        //   packettype
      pos++;                      // pos移動  packet type -> crc
      break;
      case(5):
      pos++;                      // pos移動 crc -> header 
      break;
      case(6):
      pos++;                      // pos移動  header -> ID1
      break;
      case(7):
      senderID =  0x0000FF & aChar ;  // ID1バイト
      pos++;                      // pos移動  ID1 -> ID2
      break;     
      case(8):
      case(9):
      case(10):
      senderID =  (senderID<<8) + aChar ;  // ID2-4バイト
      pos++;                      // pos移動  ID2 -> ID4 -> data1
      break;     
      case(11):
      pos++;                      // pos移動  data1 -> data2
      break;
      case(12):
      if(TEMPID == senderID ){
        pastHum = Hum ;
        Hum = (float)aChar * 100/250 ;    //  humdata
      }
      pos++;                      // pos移動  data2(hum) -> data3(temp)
      break;
      case(13):
      if(TEMPID == senderID ){
        pastTemp = Temp;
        Temp = (float)aChar * 40/250 ;    //  Tempdata
      }
      pos++;
      break;
    default:
      break;
    }  
  }
  if(dataReceive ==1){
    if(TEMPID == senderID ){
      cklcd.v1.clear(); // 一旦、仮想画面をクリアする
            
      cklcd.v1.print ("\nTemperature  前回 \n");
      cklcd.v1.print (" ");
      cklcd.v1.print (Temp , 2);
      cklcd.v1.print ("℃ ");
      cklcd.v1.print ("  ");
      cklcd.v1.print (pastTemp , 2);
      cklcd.v1.print ("℃ \n");
      cklcd.v1.print ("Humidity     前回 \n");
      cklcd.v1.print (" ");
      cklcd.v1.print (Hum , 2);
      cklcd.v1.print ("% ");
      cklcd.v1.print ("  ");
      cklcd.v1.print (pastHum , 2);
      cklcd.v1.print ("% \n\n");


    }
    dataReceive = 0 ;
  }

/********* EnOcean end *********/

}

前回と違う部分は表示部分をLCDシールドに合わせたところと、1回前の値も表示させるようにしたところです。

図4.動作結果

図4.動作結果

使ってみた感想

前回までのセッティングでEnOceanのデータが受信できるようになっていたのと、LCDシールドのサンプルスケッチが充実していたので、簡単にできちゃいました! EnOceanのセンサは買ってきたままの状態で動作しましたし、XOceanはデータを理解することさえクリアできれば、通信プロトコルは規格で決まっているので他のEnOceanセンサを使うときでもすぐに対応できそうです。使ってみると意外と簡単に動作するのが実感できました。

今回はLCDで表示をさせましたがモータとつないだり、照明とつないだりといろいろな機器と連動させて動作できそうです。ちょっとしたIoTやM2MがEnOceanでも実現できそうですね。夢が広がります。

図5.機器全体構成

図5.機器全体構成

図6.運用中(温湿度センサはパーティションに設置しています)

図6.運用中(温湿度センサはパーティションに設置しています)

また、EnOceanのラインナップとしては今回使用した温湿度センサの他にスイッチやマグネットコンタクトセンサがあるようなので、また機会を見つけてこれらの製品も動作させていこうと思います!

 


 

……さてと、さっそく完成したことを上司に報告だ!!

entry-spinoff002_ph02

上司「……(ニタニタ)」

entry-spinoff002_ph03

上司「GOOD JOB!やるねえ~!!」

や、やった!!
いただきました!GOOD JOB!

上司に認めてもらえたXOcean+Arduinoの電子工作のパワー恐るべし。

これからも精進することを心に決めた僕でした★

電子工作マニュアル Vol.3
小西さん

ローム株式会社 LSI商品開発本部 無線モジュール商品開発部所属。名古屋大学工学部物理工学科卒業後、紆余曲折を経てローム株式会社に入社。音楽が好きでトランペットやベースなど様々な楽器をやっていますが、今は子育てに夢中です!

http://www.rohm.co.jp/web/japan/