Kinect v1のUSB2.0デバイス化

概要

  • 家に眠っていたXbox360用のKinectを、ゲーム機専用のAUX接続からバスパワー駆動のUSB2.0接続一本に改造してみた
  • Kinect v1の構造、仕組みを知ることができた
  • USB2.0信号ならなんとか取り扱える感触を持った

参考にしたHP

Kinect v1の分解

  • iFixitの手順通りにすすめた
  • T6とT10Hのトルクスドライバーが必要(ベッセルのドライバーがおすすめ)
  • Step6の筐体下部にある穴あき金属シートは剥がすとぐにゃぐにゃになるので元には戻せないと思ってください
  • 同じ下部のvoidシールも剥がさないと筐体を開けられません

  • 上から前面、下部(サイドの通風孔は取り外せる)、上部(表裏ひっくり返している)
  • 太いケーブルがマイクアレイ(青、白、赤、黒の4つ)との接続用

  • 上からアルミフレームとカメラセンサー・画像処理専用基板(以下センサー基板)、USBオーディオ基板、メイン基板
  • プラスチック筐体の中にこれらが入っている
  • 入っている様子は上記参考サイト「Looking into Kinect 360」 2枚目の写真を参照

  • メイン基板の裏面
  • 左側にマイクアレイの受け口となる白色の端子、隣にADコンバータ(Wolfson WM8737G 2ch x2 = 4ch)
  • 右側にMarvellのSoCとDDR2 SDRAM

  • 全体の処理の流れは以下と想像
    • 緑の矢印と横方向の青矢印でカメラとマイクからの入力を受け付け
    • マイクのオーディオ信号はUSBオーディオ化(縦方向の青矢印)
    • 黒の端子からUSB信号としてゲーム機へ(赤の矢印)

カメラセンサーのUSBデバイス

神サイトによるとセンサー基板だけでもUSBデバイスとして使えるとのこと
「Looking into Kinect 360」 最後の図に、センサー基板からの14ピン端子の説明がある
それを見るとUSB2.0に3.3Vと1.8Vが追加されているだけと解釈できる
つまり、緑の矢印部分をメイン基板ではなく、直接PCに繋いでもUSB2.0バイスになるらしい

接続ボードの作製

※以下をご自身でされる際は自己責任でお願いします

必要なもの
  • Kinect v1 Model1414
  • 工具
    • はんだごて(20Wを使用)・はんだ・吸い取り線
    • アルミを削るor切る工具
    • テスター
    • ピンセットとかメンディングテープとか
  • 接続ボード
    • ミニブレッドボード
    • SOP16基板(1.27mm-2.54mm変換)
    • ピンヘッダー(オス-オス)
      • SOP16基板をブレッドボードに接続する用
    • 接続端子
      • 自分はメイン基板のメス側端子を再利用
      • 1.27mm 2x5のピンソケットを折り曲げてSOP16基板に接着でもいけそう(未確認)
        • 端の3.3V/GND 2x1ピンはなくても残りの2x2ピンでどうにかなるかなと
        • または2x10の2x4ピンを頑張って削るか…
    • DC-DC降圧コンバータ x2
    • ジャンパーワイヤー(これとか)
      • ブレッドボード上の配線用
メインボードからメス側端子を剥がす
  • 一番しんどかった…
  • はんだを取り切れず、コンタクトがバリバリと基板側に残る惨事
  • ピンセットで一個ずつソケットに埋め戻す羽目に…
  • 一応使えている?(ノイズの原因かもしれん)

  • 転生元(下)と転生先(上)

  • 2x10のピンソケットを削ってオス側端子を90度曲げるでもいいかもしれん(試していません)
SOP16基板に接続端子をはんだ付けする
  • めっちゃ目が疲れる
  • 短絡してないか導通チェックしてなんとかOK
DC-DC降圧コンバータのキットを組み立てる
  • ピンヘッダーと可変抵抗を基板にはんだ付け

  • USBケーブルからの給電ができるようになったら可変抵抗をグリグリ回して出力が所定の電圧になるよう調整
ブレッドボードに配線する
  • Fritzingというソフトでブレッドボード上の配線をシミュレートしてから実際の作業を行った
    • 実作業の前に試行錯誤できる
    • 各配線の導通具合を確認できるので安心

  • ブレッドボードは右上の[パーツペイン]->[CORE]タブのブレッドボードビューにある「RSR 03MB102 Breadboard」
    • size : mini に変えれば画像の見た目に
  • ジャンパーワイヤーはブレッドボードか基板の端子部分からドラッグ&ドロップ
    • 後から配線の色を変えられる
    • ドラッグ中に接続先が見つかると青紫色になるのでそこで離す(吸着があまり上手くいかない…)
  • DCDCコンバータは[Power]にある「voltage regulator 5v/3.3v」(1.8vがない…)
  • ピンヘッダーは[Connection]にある「Generic female header」
  • 基板は[虫眼鏡]タブで「sop16」で検索
    • [Edit Pin Labels]で各端子に名前をつけられる
  • USBコネクタは「usb connector」で検索

  • 気になる端子(画像はGND)を左クリック押しっぱにすると導通する箇所が黄色でハイライト表示される

  • 実際に配線した結果が以下の画像

  • 左下にある青(Fritzingでは赤黒黄)の3本は太さ的に並べられなかったので真ん中の1本を横に通した

USBケーブルの改造

必要なもの
  • USB2.0 Type-Aケーブル
    • ニッパー
    • ピンヘッダー(オス-メス)
    • ジャンパーワイヤー(これとか)
USBケーブルを切断し4つの信号線を取り出す
  • ニッパーで完全に切って、先っちょだけ黒い被覆を取り、赤、黒、緑、白の信号線を取り出す
ピンヘッダーに各信号線をはんだ付けする
  • 4連のピンヘッダーに各信号線の被覆を剥がしてはんだ付け
  • 一応熱収縮チューブで絶縁した(できてない)
  • 短絡してないか確認した

  • やり直したい…
ブレッドボードと接続し、電圧が来ているかを確認する
  • ジャンパーワイヤーでピンヘッダーとブレッドボードをつなげる
  • Type-A側をPCに接続し、センサー基板との接続端子に所定の電圧が来ているかテスターで確認

アルミフレームを削る

  • センサー基板と接続基板をつなげるとアルミフレームに干渉するので頑張って削った
  • 細い糸鋸みたいので切っていくのがよいかと

動作確認

確認環境

  • 改造Kinect v1(アルミフレーム・カメラセンサー・センサー基板)に接続基板をくっつけたもの
  • シングルボードコンピュータ
    • ARM Cortex-A53 4core 2GB RAM
    • USB2.0 x4(端子いっぱい~)
    • 確認用に電圧・電流チェッカーを間に挟む
    • Armbian 23.02 (Debian)

USBデバイスの認識

  • USBケーブルを電圧・電流チェッカーに接続する
    • 最初、約4.5V 0.7Aのロードが10秒弱発生
    • アイドル時は約4.75V 0.32Aのロード
    • キャプチャ動作時は約4.55V 0.57Aのロード
    • USB2.0規格では、5V 0.5Aまで供給できるとあるので規格外ですありがとうございました
      • 機器によっては電圧降下でリセットがかかったり壊れたりするかも

  • lsusbを実行してUSBデバイスとして認識していることを確認

libfreenectのインストール

  • libfreenectは非公式のKinectのユーザ空間ドライバ
    • 有志が開発、Apache 2.0 ライセンス
  • 以下でソースビルド&インストールを行った
mkdir -p ~/kinect_ws/src
mkdir -p ~/kinect_ws/libs
cd ~/kinect_ws/libs
git clone https://github.com/OpenKinect/libfreenect.git
cd libfreenect

sudo apt install freeglut3-dev libusb-1.0–0-dev
mkdir build
cd build
cmake -L ..
make
sudo make install
sudo ldconfig /usr/local/lib64 // 拙環境では必要だった
  • /usr/local/以下にツール、ライブラリ、ヘッダーがインストールされる
  • また、ユーザ空間ドライバをroot以外で動作できるようにするためのおまじないがあるらしい
    • これやってもダメだったのでsudo付きで実行した(再起動が必要?)

ツールの動作と修正

  • /usr/local/binにツールがあり、freenect-camtestを実行してみる

    • エラーが出る
    • Kinect 完全体を前提にしていて、オーディオなど他の関連デバイスが見つからないため
  • fakenect-recordを実行してみる

    • 指定したディレクトリ以下にINDEX.txt device.json a-hoge.bin r-hoge.ppm d-hoge.pgmがダンプされる
      • r- がRGB画像、d- がDepth画像(PPM, PGMは画像フォーマット) 、a- が加速度センサーの値
      • INDEX.txtにダンプファイルリストが追記されてく
      • device.jsonはデバイス情報(よくわからない)
    • 以下で実行

      mkdir ~/session
      sudo ./fakenect-record ~/session
      
    • エラーが出る(原因は同じ理由)

    • /libfreenect/fakenect/record.cinit()FREENECT_DEVICE_MOTOR | FREENECT_DEVICE_CAMERAの両方を指定しているため、チルトモーターが見つからずエラーになっていた
    • FREENECT_DEVICE_CAMERAだけ指定してリビルドしたところ動作した
    • リビルドしたのは~/kinect_ws/libs/libfreenect/build/bin/にある
    • PPM, PGMファイルはirfanviewなどの画像ビューアで見れる

RGB画像とDepth画像(画角が違うのでDepthは微妙に寄ってる)

おわりに

  • とりあえずハードの改造からシングルボードコンピュータで動作するところまで確認した
  • 接触具合によって電流チェッカーに低すぎる値が出たり、キャプチャできなかったりするケースがままあった
  • また、キャプチャし続けていると画像にノイズが入る場合があり、ハード的な問題がありそう
  • コネクタを変えたバージョンなどもう少し試してみたい気持ち