自作ライブラリ

Arduinoの自作ライブラリの備忘録です。

ライブラリのインストール

ライブラリをインストールする場合は、各ライブラリのzipファイルをダウンロードして展開し、各ライブラリのフォルダを、Aruduinoがインストールされているフォルダのhardware\librariesフォルダにコピーしてください。

赤外線リモコン受信

リモコン受信ユニットから送られるデータを解析して読み出すライブラリ。
リモコン受信ユニットは、Arduinoのデジタルピンの2番または3番に接続する。

IrRecv::start() 開始
IrRecv::stop() 終了
IrRecv::available() 読み出し可能なバイト数
IrRecv::read() 1バイトの読み出し
IrRecv::interrupt() 割り込み処理

ライブラリ : IrRecv

サンプル
#include "Arduino.h"
#include "IrRecv.h"

#define INTERRUPT  (0)   // 0:D2, 1:D3

IrRecv  recv ;

struct {
    int     n ;
    char    *s ;
} t[] = {
    6, "KASEIKYO   ",
    4, "NEC        ",
    0, "NEC_REPEAT ",
    2, "SONY 12bit ",
    2, "SONY 15bit ",
    3, "SONY 20bit ",
    0, "Error"
} ;


void setup()
{
    recv.start() ;
    attachInterrupt( INTERRUPT, intFunc, CHANGE ) ;
    Serial.begin( 115200 ) ;
}

void loop()
{
    byte    n ;
    byte    i ;

    if( recv.available() ) {
        n = recv.read() ;
        Serial.print( t[n].s ) ;
        for( i = 0 ; i < t[n].n ; i++ ) {
            Serial.print( " " ) ;
            Serial.print( recv.read(), HEX ) ;
        }
        Serial.println() ;
    }
    delay( 1 ) ;
}

void intFunc()
{
    recv.interrupt() ;
}

説明

このライブラリは、Ir受信機からのパルスを割り込みで受けるため、Ir受信機からの信号をデジタルポートの2番または3番(サンプルでは2番)に接続してください。
サンプルの通りに初期化と割り込み関数を記述し、割り込み処理の中からライブラリのinterrupt関数を呼び出してください。

準備が終わり、Ir受信機からパルスを受けると、解析を行い、ライブラリ内部のバッファに格納します。 このデータを、available, read関数を使って読み出します。
入力されたデータは、以下の順番で読み出されます。
1バイト目--形式
  • 0:家製協
  • 1:NEC
  • 2:NECリピートコード
  • 3:Sony12bit
  • 4:Sony15bit
  • 5:Sony20ビット
  • 6:エラー
2バイト目以降--受信データ(バイナリ)
形式ごとに受信データ(2バイト目以降)のバイト長が以下のように決まっています。
  • 家製協 6バイト
  • NEC 4バイト
  • NECリピートコード 0バイト
  • Sony12bit 2バイト ※
  • Sony15bit 2バイト ※
  • Sony20bit 3バイト ※
  • エラー 0バイト
※最終バイトは、有効データをLSB側に詰めています。

赤外線リモコン送信

ポートに接続されたLEDを、赤外線リモコンの出力パターンに従って点滅させます。LEDはHIGH出力で点灯するように接続してください。
LEDを接続するポートは初期化の際に設定してください。
IrSend::write() : 送信

ライブラリ : IrSend

サンプル

#include "Arduino.h"
#include "IrSend.h"

byte	t[5] = { NEC, 0x45, 0xBC, 0x17, 0xE8 } ;

IrSend	send(13) ;


void setup()
{
}

void loop()
{
    send.write( t ) ;
    while(1) ;
}

説明

このライブラリは、初期化の際に指定されたデジタルポートに接続されたLEDを点滅させて、Irリモコンの代わりをするものです。 (上記のサンプルでは、ポート13になります)
以下のフォーマットの送信データを配列に設定し、write関数を呼び出すと送信します。送信が完了したら、関数から 戻ります。

送信データのフォーマット
(IrRecvライブラリの受信データと同じです)
1バイト目--形式
  • 0:家製協
  • 1:NEC
  • 2:NECリピートコード
  • 3:Sony12bit
  • 4:Sony15bit
  • 5:Sony20ビット
2バイト目以降--受信データ(バイナリ)
形式ごとに受信データ(2バイト目以降)のバイト長が以下のように決まっています。
  • 家製協 6バイト
  • NEC 4バイト
  • NECリピートコード 0バイト
  • Sony12bit 2バイト ※
  • Sony15bit 2バイト ※
  • Sony20bit 3バイト ※
※最終バイトは、有効データをLSB側に詰めてください。

なお、Ir送信LEDのON/OFF時間はdigitalWrite()とdelayMicroseconds()の処理時間で決めているので、Arduinoの種類やバージョンによっては、正しく動かないかもしれません。 この場合、以下のプログラムを実行した結果によって、ライブラリのIrSend.hの以下の時間を変更してください。
#define IrOnTime (6)
#define IrOffTime (12)
このプログラムは、duty=1/3のパルスを38000回出力する時間を1秒に近づけることで、IrOnTimeを求めるものです。 IrOffTimeは、IrOnTimeの2倍ぐらいに設定してください。

#include "Arduino.h"

#define IrLED   13      /* LEDの接続先。High=ON, Low=OFF */

void setup()
{
  pinMode( IrLED, OUTPUT ) ;
  Serial.begin( 115200 ) ;
}

void loop()
{
  unsigned long t ;
  unsigned int  i, j, k ;

  Serial.println( "start" ) ;

  k = 10 ;
  while( 1 ) {
    t = millis() ;
    for( i = 0 ; i < 38000 ; i++ ) {
      digitalWrite( IrLED, HIGH ) ;
      delayMicroseconds(k);
      digitalWrite( IrLED, LOW ) ;
      delayMicroseconds(k*2);
    }

    t = millis() - t ;
    Serial.print( k ) ;
    Serial.print( " -- " ) ;
    Serial.print( t ) ;
    Serial.println( "mSec" ) ;
    
    if( t > 1000 ) {
       k-- ;
    }
    else {
       k++ ;
    }
  }
}

注意事項

家製協のデータのバイト長は、現仕様では6バイトに固定しています。 これは、作者が所有しているリモコンがPanasonic製のSTBのみだったため他のパターンを見ていないためです。他のパターンのリモコンへの対応は今のところ考えていません。
NECフォーマットは規格が公開されているため、4バイトで固定で良さそうです。
Sonyフォーマットも、作者所有のリモコンの解析結果に従っていますので、他のビット長があるかもしれません。

IrRecvとIrSendを一つのスケッチで使う場合、送信と受信を同時に行わないでください。 (送信中に受信が起きると、パルス出力の時間が狂うため)
例えば、送信の前後で割り込みの禁止と許可をするなどして、送信中に受信割り込みを受け付けないような処理を組んでください。

ご意見,質問は、ブログのほうに。