블루투스 없이 적외선 센싱하는 프로젝트


(출처: http://cafe.naver.com/wiiremote.cafe 의  욱스님)
 
 혹시 이 글에 관심을 가지고 계시지만, 일본어로 되어있어 이해하지 못하신 분들이 계실까봐
 
 저의 미약한 일본어 실력으로 해석해보고자 생각했습니다.
 
 혹시 해석상 문제가 있다고 생각하시는 분들은 바로 글 남겨주시면 감사하겠습니다.
 
 그럼, 욱스님 글 그대로에 해석하도록 하겠습니다.
 
-------------------------------------------------------------------------------------------------------------

일본내 프로젝트 사이트 인데, 해석이 불편하여 전체를 긁어 왔습니다.
I2C방식의 WiiRemote 방식의 IR 센서 카메라를 적출하여,
다른 MCU에 장착해서 USB 타입으로 PC에 연결하여 사용할 수 있는 제품을 만드는 프로젝트입니다.
(회로도 및 소스코드도 제공하니 간단히 여러 프로젝트에 응용이 가능합니다.) 

 
* 이 프로젝트 덕분에 눈차크 등의 extension port가 I2C 형식 임을 알게 됐습니다.

去年(2007年)、Wiiリモコンのポインティング用赤外線センサを解析して、他の機器に接続する方法を試した。
その続きで、今回は、AVRマイコンを使った
Arduinoキットに接続する回路を試作してみた。(2008-04-13)
작년(2007년), wii리모컨 포인팅용 적외선 센서를 분석하여, 다른 기기에 접속하는 방법을 시험했다.
그 연장선으로 이번에는 AVR마이콘을 사용한 Arduino 키트에 접속하는 회로를 시험적으로 만들어 보았다.


1. ハードウェア
1. 하드웨어

   
 

   基板はArduinoキットに試作用のユニバーサル基板を重ねている。
 白い棒状のケースにはWiiリモコンから取り出したセンサと
自作回路が入っている。
   기판은 Arduino키트에 시험 작품용 유니버셜 기판을 겹쳐 놓았다.
   흰색 막대기 모양 케이스에는 wii리모컨으로 빼낸 센서와 자작 회로가 들어 있다.


 接続は、この図のように接続している。
   접속은 이 그림과 같이 접속하고 있다.

 ・Wiiリモコン赤外線センサ回路

 ・I2C電圧変換シールド
 ・Arduino Diecimila
    wii 리모컨 적외선 센서 회로
    I2C전압교환실드
    Arduino Diecimila

 以上の3つの部分で構成されている。
   이상 3개의 부분으로 구성되어 있다.
 3.3Vで動作する赤外線センサを、5Vで動作するマイコンに接続するために電圧変換が必要である。
   3.3V로 동작하는 적외선 센서를 5V로 동작하는 마이콘에 접속하기 위해서 전압교환이 필요하다.

 Wiiリモコン赤外線センサ回路は、
前に作った回路と同じものを小型にして作り直した。
 I2C電圧変換シールドは、試作用のPrototype Shieldというユニバーサル基板を使って作った。
   wii리모컨 전외선 센서 회로는 앞에서 제작한 회로와 같은 것을 소형으로 다시 만들었다.
   I2C전압 교환 실드는 시험 제작 용 Prototype Shield라고 불리는 유니버셜 기판을 사용하여 만들었다.

 
 I2C電圧変換シールドは、Aruduinoの基板の上に重ねるように接続する。
   I2C 전압교환 실드는 Aruduino의 기판 위에 겹친 것처럼 접속한다.

 
 I2C電圧変換の回路は、LTC4301LというICを使用して作った。
 このICは、I2Cバスの電圧を変換する。 LTC4301Lでなく、LTC4301でも動くはず。
   I2C전압교환 회로는 'LTC4301L'이라는 IC를 사용해서 만들었다.
   이 IC는 I2C버스의 전압을 교환한다. 'LTC4301L'이 아닌, 'LTC4301'에서도 움직일 것이다.

2. ソフトウェア
2. 소프트 웨어

  前回のソースコードを元にして、Arduino用のソフトを作成した。

 [
wii_remote_ir_sensor_sample.zip - source code (download) ]
   이전의 소스코드를 바탕으로 해, Arduino용 소프트를 작성했다.

 (後日加筆 2008-09-21)
   (2008-09-21 수정)
 WinAVRを使ってソフトを書き直してみた。
 [
wii_remote_ir_sensor_sample2.zip - source code (download) ]
   WinAVR을 사용해 소프트를 고쳐 써 보았다.


Wiiリモコンの赤外線センサの使い方
Wii리모컨 적외선 센서의 사용방법

 簡単にセンサの使い方の解説を書いてみる。
   간단히 센서를 이용하는 방법을 풀어 써 보았다.

I2Cバス規格のプロトコルでは、デバイスとの通信には、デバイスのアドレス番号を最初に送信する必要がある。
   I2C버스 규격의 프로토콜에서 디바이스와의 통신에는 디바이스 어드레스 번호를 최초에 송신하는 필요성이 있다.

Wiiリモコンに使われている赤外線センサのアドレスは、0x58である。
Wii 리모컨에 사용되어지는 적외선 센서의 어드레스는 0x58이다.
 ソースコードには0xB0と書いてあったりするが、これは上位7ビットがアドレスで、下位1ビットがR/W指定ビットとなるように、シフトするからである。
  소스 코드에는 0xB0라고 써있기도 하지만, 이것은 상위 7비트가 어드레스에서 하위 1비트가 R/W지정비트라고 되는 것처럼 위치변경하기 때문이다.

   センサの初期化は、Wiiリモコン内部のセンサにBluetooth経由でアクセスする場合より簡単である。
 なぜなら、チップイネーブル制御や、クロック発振回路のON/OFF制御をしないからである。
   센서 초기화는 Wii 리모컨 내부의 센서에 Bluetooth 경유로 접속하는 경우보다 간단하다.
   왜냐면, chip enable 제어와 Clock(시계) 발진 회로의 ON/OFF 제어를 하지 않기 때문이다.

 初期化のためのコマンドの送信は、次の形式で行う。
   초기화를 위해 커맨드 송신은 다음의 형식으로 이동한다.
 [STARTコンディション] [0xB0] [制御レジスタアドレス] [書き込みデータ] [STOPコンディション]
   [START 컨디션] [0xB0] [제어 레지스터 어드레스] [기입된 데이터] [STOP 컨디션]
 制御レジスタのアドレスは、8bitで指定する。
   제어 레지스터 어드레스는, 8bit로 지정한다.
 どのアドレスがどういう機能なのかは、まだ詳しく分かっていない。
   어떤 어드레스가 어떤 기능인가는 아직 상세하게 알고 있지 않다.
 とりあえず、ある決まった値と手順で書き込むとセンサを動作させることができる。
   우선 정해져 있는 값과 순서롤 쓰면 센서를 동작시킬 수 있다.


 初期化コマンド手順
   초기화 커맨드 순서

 (1) 制御レジスタアドレス0x30に対して、データ0x01を書き込む
        제어 레지스터 어드레스 0x30에 대해, 데이터 0x01를 기입
 (2) 制御レジスタアドレス0x30に対して、データ0x08を書き込む
        제어 레지스터 어드레스 0x30에 대해, 데이터 0x08를 기입
 (3) 制御レジスタアドレス0x06に対して、データ0x90を書き込む
      제어 레지스터 어드레스 0x06에 대해, 데이터 0x90를 기입
   (4) 制御レジスタアドレス0x08に対して、データ0xC0を書き込む
        제어 레지스터 어드레스 0x08에 대해, 데이터 0xC0를 기입
 (5) 制御レジスタアドレス0x1Aに対して、データ0x40を書き込む
        제어 레지스터 어드레스 0x1A에 대해, 데이터 0x40를 기입 
 (6) 制御レジスタアドレス0x33に対して、データ0x33を書き込む
        제어 레지스터 어드레스 0x33에 대해, 데이터 0x40를 기입

   これは、以下で説明する感度設定の手順を簡略にしたようなものらしい。
   이것은 밑에 설명하는 감도 설정의 순서를 간략하게 한 것 같다.
 赤外線センサの感度の設定方法について
   적외선 센서의 감도 설정방법에 대하여
 上記で簡易的に設定されているようだが、ちゃんと設定したい場合には、4つのパラメータp0,p1,p2,p3を指定して、次の手順で書き込む
   상기에 간이식(*간이 우체국의 '간이')으로 설정되어 있는 것 같지만, 확실히 설정하고 싶은 경우에는 네 개의 파라미터  p0,p1,p2,p3를 지정하여 다음 순서를 기입 
 
    (1) 制御レジスタアドレス0x30に対して、データ0x01を書き込む
        제어 레지스터 어드레스 0x30에 대해, 데이터 0x01를 기입
 (2) 制御レジスタアドレス0x00に対して、データ0x02,0x00,0x00,0x71,0x01,0x00,p0を書き込む
        (7バイトの書き込み)
        제어 레지스터 어드레스 0x00에 대해, 데이터 0x02,0x00,0x00,0x71,0x01,0x00,p0를 기입
        (7바이트로 기입)

 (3) 制御レジスタアドレス0x07に対して、データ0x00,p1を書き込む (2バイトの書き込み)
        제어 레지스터 어드레스 0x07에 대해, 데이터 0x00,p1를 기입(2바이트로 기입)
 (4) 制御レジスタアドレス0x1Aに対して、データp2,p3を書き込む (2バイトの書き込み)
        제어 레지스터 어드레스 0x1A에 대해, 데이터 p2,p3를 기입(2바이트로 기입)
 (5) 制御レジスタアドレス0x33に対して、データ0x03を書き込む
      제어 레지스터 어드레스 0x33에 대해, 데이터 0x03를 기입
   (6) 制御レジスタアドレス0x30に対して、データ0x08を書き込む
        제어 레지스터 어드레스 0x30에 대해, 데이터 0x08를 기입
 複数バイトの書き込み時はレジスタアドレスが自動インクリメントされるので連続で書き込み可能である。
   복수 바이트 기입시는 레지스터 어드레스가 자동 인크리먼트(increment; 주어진 수에서 일정한 수량을
  증가)
시키는 것에 연속하여 기입이 가능하다.

 感度のパラメータは、
   감도 파라미터는
 感度1の場合、p0=0x72 , p1=0x20 , p2=0x1F,p3=0x03
   감도 1의 경우, p0=0x72 , p1=0x20 , p2=0x1F,p3=0x03
 感度2の場合、p0=0xC8 , p1=0x36 , p2=0x35,p3=0x03
   감도 2의 경우, p0=0xC8 , p1=0x36 , p2=0x35,p3=0x03
 感度3の場合、p0=0xAA , p1=0x64 , p2=0x63,p3=0x03
   감도 3의 경우, p0=0xAA , p1=0x64 , p2=0x63,p3=0x03
 感度4の場合、p0=0x96 , p1=0xB4 , p2=0xB3,p3=0x04
   감도 4의 경우, p0=0x96 , p1=0xB4 , p2=0xB3,p3=0x04
 感度5の場合、p0=0x96 , p1=0xFE , p2=0xFE,p3=0x05
   감도 5의 경우, p0=0x96 , p1=0xFE , p2=0xFE,p3=0x05

 初期化後(感度設定後)は、センサで検知した光点の座標を読み出すことができる。
   초기화 후(감도 설정 후)는, 센서 검지(검사하여 알아냄)한 광점의 좌표를 읽어내는 일이 가능하다.

 センサ出力の読み出し方法
   센서 출력을 읽어내는 방법
  [STARTコンディション] [0xB0] [0x36] [STOPコンティション]
      [START 컨디션] [0xB0] [0x36] [STOPコンティション]
  というコマンドを送信後、次のとおり読み出す。
      라고 커맨드를 송신한 후, 다음과 같이 읽어 낸다.
  [STARTコンディション] [0xB1] [データの読み出し] x 16bytes
      [START 컨디션] [0xB1] [데이터의 읽어냄] x 16bytes

 読み出したデータの形式
   읽어 낸 데이터 형식
  3バイトずつ下記の順に格納されている。
      3바이트 씩 밑에 적힌 순서로 격납(집어 넣어둠)되어 있다.
  [先頭1byte] [座標1... 3bytes] [座標2 ... 3bytes] [座標3 ... 3bytes] [座標4 ... 3bytes]
      [앞머리 1byte][좌표1... 3bytes][좌표2 ... 3bytes][좌표3 ... 3bytes][좌표4 ... 3bytes]
  
  この3バイトを、XX,YY,SSとすると、
      이 3바이트를 XX,YY,SS라고 한다면,
  X座標 = (SS & 0x30) <<4 + XX
  Y座標 = (SS & 0xC0) <<2 + YY
      X좌표 = (SS & 0x30) <<4 + XX
      Y좌표 = (SS & 0xC0) <<2 + YY
  という計算をすることで、座標の値を得ることが出来る。
      라고 계산 하는 것으로 좌표의 값을 얻을 수 있다.
  座標値が無効な場合に0x3FFが返ってくる。
      좌표값이 무효인 경우에는 0x3FF이 반환된다.


 制御レジスタの役割
   제어 레지스터의 역할
  アドレス 0x00~0x08 --- 検出のためのパラメータ設定
      어드레스 0x00~0x08 ---검출을 위해 파라미터 설정
  アドレス 0x1A~0x1B --- 検出のためのパラメータ設定(2)
      어드레스 0x1A~0x1B ---검출을 위해 파라미터 설정(2)
  アドレス 0x30 --- センサの動作モード(?) 最初に0x01を書き込んで, 次に0x08を書き込む
      어드레스 0x30 --- 센서의 동작모드(?) 최초에 0x01를 기입하고 나서, 0x08를 기입
  アドレス 0x33 --- センサの動作モード(?) 0x03 ( あるいは0x33 ? ) を書き込む
      어드레스 0x33 --- 센서의 동작모드(?)   0x03 ( 혹은 0x33 ? )를 기입

 検出のためのパラメータ設定
   검출을 위해 파라미터 설정
  不明
      불명
  カメラで撮影した画像を画像処理して光点を検出するためのセンサ内部のソフトウェアのパラメータ設定
      카메라에서 촬영한 영상을 영상처리하여 광점을 검출하기 위해 센서 내부의 소프트 웨어 파라미터 설정
  2値化の敷居値とか光点の大きさの敷居値とかのパラメータがあるのではないかと推測される。
      2치화(*2 + 수치화의 의미로 보임)의 문턱치(*일정수치 이상으로 넘어가야 다음 단계로 넘어간다는 의미로 보임) 라던가 광점 크기의 문턱치라던가의 파라미터가 있는 것은 아닐지 추측된다.


  (後日加筆 2008-10-06)

  (2008-10-06 수정)
 いくつかのパラメータは判明してきているらしい。
   몇 개의 파라미터는 판명된 것 같다.
 http://wiki.wiimoteproject.com/IR_Sensorというページに色々と情報が出ている。
                                                                     라는 페이지에 여러가지 정보가 나온다.

 

 

1.  *는 확실치 않은 단어의 뜻으로 문맥상과 단어의 검색으로 추측해본 단어입니다.

2.  커맨드, 파라미터와 같이 영문의 뜻은 한글로 바꾸지 않고 그대로 사용하였습니다.