Toshiba TLP-WX200

自宅にはテレビやモニタがないため、AV360でiMacに入れたり、 サーバ設定時にはプロジェクタを使用しています。 そのプロジェクタをHDタイプにアップグレードするべく、故障品を購入。 プロジェクタ事業を譲渡したのでリコー型番ですが。 ランプ部の白いふたをはずした後、裏面の深い5本のネジと端子部のネジ1本をはずすと上部カバーをはずせます。

ヒューズ(T6.3AH250Vセラミック)が飛んでいましたが、 こういう場合たいていFETも飛んでいるので1次側を追おうと思ったらランプ基板も1次側。 切り分けのため電源基板(APS-N802)だけで通電したらやっぱりヒューズ飛ぶので FETをテスタで当たったらIPA60R199CPの1つがSD間短絡。 同じ品を購入すると本体購入価格を上回る(笑)のでTK20A60Uに2つとも交換、完了。
しかしこれ、FETとダイオードブリッジに修理跡があるんだよね。 FET並列で使ってるし、待機電力減っただけの新機種が出てるし、 まあいわゆる「設計ミス」ですな。多少オン抵抗が小さいのに交換したから長持ちしてくれるといいな。

何気なく裏面見てるとWinCEのライセンスシールが。 そういえばこの機種、Vistaのネットワークプロジェクタに対応してるんですが、 これRDPプロトコルなので、事実上WinCEマシンでないと実装できないんですよね。 USBとLANとWifiが載った別基板があり、ここにTIのDAVINCIが載ってます。

ネットワーク経由で制御できるのですが普段使いにはやっぱりリモコン、 でも別買いすると本体購入価(略)なので、WinLIRC+MCEで6万通り試すコード流したら運よく3分で判明。 学習リモコンに登録できずにubuntu+lirc+mceusb使ったりしてみたところ、RM-VL501は変調38KHzでないとだめみたい。

begin remote
  name RICOH_PJ #WX3230N,Toshiba TLP-WX200
  flags REVERSE|SPACE_ENC|CONST_LENGTH
  frequency 38000
  header 9000 4500
  one 563 1687
  zero 563 562
  ptrail 563
  gap 108000
  repeat 9000 2250
  pre_data_bits 16
  pre_data 0xEB80
  bits 16
  begin codes      #CODE2
    AVMUTE  0xEE11 #5EA1
    POWER   0xED12 #5DA2
    ENTER   0xEC13 #5CA3
    INPUT   0xEB14 #5BA4
    AUTO    0xEA15 #45BA
    MENU    0xE41B #5AA5
    RETURN  0xE21D #59A6
    UP      0xBF40 #57A8
    DOWN    0xBE41 #56A9
    LEFT    0xBD42 #55AA
    RIGHT   0xBC43 #54AB
    RESIZE+ 0xBB44 #53AC
    FREEZE  0xBA45 #52AD
    RESIZE- 0xB946 #51AE
    NETWORK 0x9C63 #44BB
    0       0xFF00 #CF30
    1_NCE   0xA55A #4EB1
    2_SIZE  0x916E #4BB4
    3_GUIDE 0xFC03 #CC33
    4       0xFB04 #CB34
    5       0xFA05 #CA35
    6       0xF906 #C936
    7       0xF807 #C837
    8       0xF708 #C738
    9       0xF609 #C639
    CLEAR   0xB44B #C43B
  end codes
end remote

RICOH WX4130N

授業参観でみかけて面白そうだと思っていたら故障品が安く出ていたので購入。 …故障してないじゃんつまらん。リモコンもついてきて上の3230Nでも使えました。 コード実は微妙に違うみたいだけど、解析も面倒なのでそのまま。

故障してなくても両側網→後面→前面(フォーカス側)→上面の順に分解。 網は細いマイナスドライバーで上部ツメ2か所を押す。 前面は、内側でも黒ネジで止まっていて0.5mmのスペーサもあるので注意。 上面は金属同士を止めているネジをはずす。あとは上部ガラスはずしてそこから主鏡掃除。
なんていうか非常にコンパクトで一見華奢にもかかわらず最低限の部材で緻密に強度計算されており、 さすが東芝の系譜+リコーのカメラ技術というか。

ゲームで必要時に床置きして壁投影ってかなりいいのですが、 ここまで超短焦点だと小さなごみでも影がかなり長く出ますし、 壁って意外と平面出てないので特に上辺が歪みます。 実用上はWX4240Nぐらいが使いやすいです。 ただ、どちらも教室向けなのに取っ手がないのがダメ。 ケースで十分との判断かもしれんが、セットアップの時間が長くなるんだよ。
東芝系はPOWER+MUTE+DOWNに電源コードでランプリセットです。POWER+RETURN+MENU等の機種もあります。

NEC NP-PA803UJL

リコーの常設系プロジェクタはNECのOEMでリモコンも上記とは非互換。 このPA803Uは該当するリコー型番がないようです。 常設なら大きいほうが静音ですが、 10kg超えをご家庭に天吊りは怖いかも。 だが同等のレーザはさらに倍。
Menu長押しだとランプリセット回数等が表示され、 (Help、Enter)*3、Menu長押し、パスワードにURLRRRUUでEnterすればサービスモードに入り、 EXPERT項目が追加されます。 WX5350N(P350WJL)等ではネットワーク入力でWebパスワードの再設定も可能です。
begin remote
  name NEC_PROJECTOR #PA803U,P350W,Ricoh WX5350N
  flags REVERSE|SPACE_ENC|CONST_LENGTH
  frequency 38000
  header 9000 4500
  one 563 1687
  zero 563 562
  ptrail 563
  gap 108000
  repeat 9000 2250
  pre_data_bits 16
  pre_data 0xe918
  bits 16
  post_data_bits 16
  post_data 0xff00 #REMOTE ID=00
  begin codes
    PWON    0xf708
    PWOFF   0xeb14
    AUTO    0xf906
    MENU    0xb946
    UP      0x47b8
    DOWN    0x43bc
    LEFT    0x41be
    RIGHT   0x45ba
    ENTER   0xe817
    EXIT    0xda25
    HELP    0xb14e
    INFO    0xb04f
    SOURCE  0xb24d
    TESTPTN 0xee11
    VGA1    0xfb04
    VGA2    0xfa05
    VGA3    0xaa55
    VIDEO   0xfc03
    SVIDEO  0x39c6
    HDMI    0xab54
    HDMI1   0xe718
    HDMI2   0xe619
    DP      0xe51a
    COMPU   0xe41b
    HDBASET 0xe31c
    VIEWER  0xd827
    NETWORK 0xa956
    USB     0xad52
    CLEAR   0xbd42
    PICTURE 0xf20d
    ASPECT  0xef10
    ECO     0xe916
    PAGE+   0xd52a
    PAGE-   0xd42b
    AVMUTE  0xb847
    VOL+    0xb748
    VOL-    0xb649
    FREEZE  0xb34c
    DZOOM+  0x7689
    DZOOM-  0x758a
    ZOOM+   0xf609
    ZOOM-   0xf50a
    FOCUS+  0xf40b
    FOCUS-  0xf30c
    KEYSTON 0x7f80
    FOCUS_Z 0x5fa0
    LENSSFT 0x5ea1
    #ONSCREENMUTE 0x7c83
  end codes
end remote

Raspberry Pi Zero - KODI standalone player

ネットワークプロジェクタってtitleなのにこれ(PA803U)映像出せない… 内蔵では陳腐化するしスピーカも必要だし、SDM-Smallでもプロジェクタには大きいし、割り切りによる軽さは正義。 でもプロジェクションマッピング用に単体動画再生は欲しいのでUSBから電源とってRaspberry Pi Zeroをつなぐ。
Pi ImagerでlibreELECのRPI0/1をインストール、そのまま一度microSD抜き差しして残りの領域をFAT32、ラベルDATAでフォーマット。 そこにVideoというディレクトリを掘って動画をコピー、またルートに2つのファイル作成。メモ帳でOK。
(autoexec.py)
execfile('/media/DATA/start.py')

(start.py)
import xbmc
xbmc.executebuiltin('PlayMedia("/media/DATA/Video/","isdir")')
#xbmc.executebuiltin('PlayMedia("/media/DATA/Video/list.m3u")') #BOM無しUTF8で漢字ファイル名OK
xbmc.executebuiltin('xbmc.PlayerControl(repeatall)')
あとはPi Zeroに刺して適当にセットアップ後設定→File managerでautoexec.pyをProfile dirにコピーすれば 自動再生マシンのできあがり。 日本語ファイル名表示はSkin-FontsをArial basedに指定、 動画切替時にシークバーやビジーリングを出したくないなら標準スキン書換。
  1. 設定→Media→GeneralでShow hidden files
  2. File managerに / を場所登録、以下File managerから
  3. /usr/share/kodi/addonsのskin.estuaryを/storage/.kodi/addonsにディレクトリ毎コピー
  4. skin.estuary/xml/DialogSeekBar.xml, DialogBusy.xmlを/media/DATAにコピー、kodi終了
  5. microSD上のDialogSeekBar.xmlの3行目付近の Player.Seeking | Player.DisplayAfterSeek | を削除
  6. DialogBusy.xmlの9行目付近の + !Player.Caching の後ろに + !Window.IsVisible(fullscreenvideo) を追加
  7. kodi起動しFile managerから/storage/.kodi/addons/skin.estuary/xmlに上記ファイル2つを上書き。
上記設定にssh不要なのでWなしPiでOKですしCECでTVリモコンから操作可能 (Regzaだと機器操作→セットアップメニューで右クリック)です。 1080p60はちょっと苦しくてp30で常態0.7W。

Pi ZeroついででHDMI Lag Tester 簡易版 をインストールして測定。 1080p60、eco、グラフィック、SweetVisionオフ、壁紙オフで0.5+1+0.4=1.9フレームはゲーム可ですが、 3CCDなのに明らかに赤が速い。NV1301はDLP版と共通なのでそのあたりの都合?

Extron DSC301HD / IPCP505

PA803Uを高いところや遠いところに置くにはHDBASET経由が便利なのですが、 持ち運び可能な送信機はHDMI入力しかないので常設には不便、そこでVGA変換スケーラを導入。
ADV7842でA/D変換と入力切替、Stratix3でスケーリング、ADV7511でHDMI出力という構成になってます。 FPGA使っているためか消費電力は7W程度。
電源用コネクタは端子間にキーがあり、信号用端子には刺さらないようになってます。 一般にはユーロブロック3.5mm(phoenix contactの1894655や1862852)ですが単体購入はそこそこするので、 コネクタ目的でIPCP505を入手。
…これ、かなり良いです。12V計40Wの電源を4系統、赤外線を8系統制御可能なのに4.2W程度しか消費しません。 センターハブの横に置いて、各部屋のIR制御を一手に引き受けさせたり。

Extron EIR file format

IPCP505が吐く赤外線ファイルは、簡易エンコードされた素直なフォーマットです。 赤外線データがあるのにボタン名がないものは機器タイプにより決まるデフォルト値が表示されます。
Powershell script to decode/encode EIR file
EIRDecoded内容
INDEX e[i]=d[i]^0x4D-d[i-1]
00 4F00 02BUTTON COUNT (encode from 2nd byte)
4B 4A00 07BUTTON1 offset
46 0800 45BUTTON2 offset
08 2300 6ESTRING offset
F112const
BUTTON1 (NEC format example)
0E 0E0x4E-length
4C 4E 15 4C 4E 15const?
3C3Clength
1001const? (encode from here)
4A 7F06 C866MHz/carrier(38.0kHz)
85 4C00 01const?
6E22#of code pulses(incl.start stop pulse)
2D02#of repeat pulses(incl.start stop pulse)
08474=Minimum Repeat Count,7=#of times
06 5B00 16t0=22*carrier=0.579ms
37 0D00 40t1=64*carrier=1.683ms
0D 1B00 56t2=86*carrier=2.262ms
F7 E600 ABt3=171*carrier=4.498ms
A1 1701 55t4=341*carrier=8.969ms
F6 5406 17t5=1559*carrier=41.0ms
2C FC0E 47t6=3655*carrier=96.1ms
C743code start mark=t4,code start space=t3
0A 4D 4D 4D 4D 4D 4D 4C
4B 4B 4C 4C 4C 4C 4B 4B
4C 4C 4C 4D 4C 4C 4D 4D
4C 4C 4C 4B 4C 4C 4B 4B
00 00 00 00 00 00 00 01
01 01 00 01 00 01 01 01
00 01 00 00 01 00 00 00
01 00 01 01 00 01 01 01
code data
(mark time,space time in one byte)
4705code stop mark=t0,stop to next mark=t5
0A42repeat mark=t4,repeat space=t2
0906repeat stop mark=t0,stop to next mark=t6
7334const
BUTTON2 (SONY format example)
23230x4E-length
4C 4E 154C 4E 15const?
2727length
2501const? (encode from here)
4A 2E06 7966MHz/carrier(39.8kHz)
D4 4C00 01const?
4C00no code pulses;repeat pulse while pressing
5815#of repeat pulses
F4444=Minimum Repeat Count,4=#of times
09 5400 19t0=25*carrier=0.628ms
34 6300 2Et1=46*carrier=1.155ms
1F 1300 5Et2=94*carrier=2.360ms(not used)
EE 9201 DEt3=478*carrier=12.00ms
8F20start mark=t2,start space=t0
3D 3D 5D 3D 5D 3D 4D 4D
5D 3D 5D 4D 3D 5D 3D 4D
5D 4D 4D 4E
10 00 10 00 10 00 00 00
10 00 10 10 00 10 00 00
10 10 10 13
code data
last mark to next start mark=t3
(no individual stop mark for sony format)
6634const
STRING TABLE 1st d[i-1] is offset LSB =6E
DF 4B00 06BUTTON1 NAME offset
47 4600 0BBUTTON2 NAME offset
42 5D00 10MISC DATA offset
BUTTON1 NAME 1st d[i-1] is offset LSB =06
(if NAME="", default name for machine-type/key-number is used)
14 BE 21 48 4D 4A D357 58 34 31 33 30 4EWX4130N
BUTTON2 NAME 1st d[i-1] is offset LSB =0B
04 C7 D3 06 EC 24 4342 44 5A 2D 54 35 35BDZ-T55
MISC DATA 1st d[i-1] is offset LSB =10
3B AC06 FFlength,type ???
4E 4D 4D 4D00 00 00 00unknown, sometimes 00 00 00 01
45 BD08 88length,type Larner
F4 32 51 47 2F 4F31 2E 32 34 2E 301.24.0
1B C406 87length,type File Format
F5 32 4F 4D31 2E 30 301.00
21 AC1C 85length,type Date
94 E4 B3 FC 41 EC F7 B5
06 5C 4B 30 41 5F 4B 4F
4B 31 41 5D 4B 41 3E 46
E7 B0
54 75 65 2C 20 41 75 67
20 31 31 2C 20 32 30 32
30 2C 20 30 36 3A 35 36
50 4D
Tue, Aug 11, 2020, 06:56PM
01 C603 84length,type Version
F8311
19 C707 83length,type Type
7F CA B1 C0 DA4F 54 48 45 52OTHER
F6 C705 81length,type Manufacturer
8B CE CC41 42 43ABC
05 CA05 82length,type Model
87 C4 C644 45 46DEF
02 C605 86length,type Comments
84 BE BC47 48 49GHI
FE BA0A 89length,type File Name
7F BF D6 2A 32 FA BF D645 49 52 31 2E 65 69 72EIR1.eir
DB 1B00 56length=0,const
エンコード方法から推測するに、元々は個別にボタン名を指定する機能はないフォーマットだったのが、 STRING TABLEが付け加わった感じです。12、34、56はデコードが正しいかどうかのチェック用でしょう。

Atlona AT-UHD-EX-100CE-RX

別の部屋に画像飛ばすのにも便利なのでHDBASETの受信機を導入。 HDBASETはもっと流行っていいと思うのですが、4K60Hzが4:2:0までという制約がやっぱりアレなんでしょうね。
これはPoC(Cable)受電ですが実はminiUSBコネクタでの給電も可能で、 さらにXR21B1411のシリアルドライバを入れると、 ValUEというValensのツールでHDBASETの受信状況表示が可能で遊びたい向きにはもってこい。

Regza Z9X

いままでずっとモニタやテレビなしでしたが、ついにブラウン・カーン以来普通のテレビを入手。 ゲームモードがあるのがいいんですが、モニターD93でもpiLagTesterで計る限り差はなさそう。
/v2/public/request_connectionにuser_idとして12-34-56-AB-CD-EF等をPOSTすると、 画面上にpinが表示されるのと同時にsaltとpasswordがJSONで返ります。
var key= new System.Security.Cryptography.Rfc2898DeriveBytes(System.Text.Encoding.ASCII.GetBytes(pin)
  ,System.Text.Encoding.ASCII.GetBytes(salt),1331).GetBytes(16);
var aes= new System.Security.Cryptography.AesManaged();
aes.KeySize= 128;
aes.Mode= System.Security.Cryptography.CipherMode.CBC;
aes.Padding= System.Security.Cryptography.PaddingMode.PKCS7;
var blen= password.Length/2;
var user_pw= System.Text.Encoding.ASCII.GetString(aes.CreateDecryptor(key, new byte[16]).TransformFinalBlock(
  Enumerable.Range(0,blen).Select(x=>Convert.ToByte(password.Substring(x*2,2),16)).ToArray(), 0, blen));
32文字のuser_pwが得られるので、 /v2/remote/confirm_connectionにdigest認証(user_id,user_pw)でPOSTすれば登録されますが、 普通に本体設定したAppコネクトのユーザ名とパスワードでもいいです。
https:4430/v2/remote/supportにアクセスすれば、v2 APIの一覧を取得できます。 現在画面がついているかどうかや入力切替が何なのかを判断できるAPIがなさそうなのがなんとも。 /v2/remote/play/statusあたりしかないか。
{"status":0,"command":[
{"http_method":"POST","resource":"\/v2\/remote\/browser\/url","params":["force_startup","mode","power_on","url"]},
{"http_method":"GET","resource":"\/v2\/remote\/text_box","params":[]},
{"http_method":"POST","resource":"\/v2\/remote\/text_box","params":["text"]},
{"http_method":"POST","resource":"\/v2\/public\/cancel_connection","params":["access_code","current_time","user_id"]},
{"http_method":"POST","resource":"\/v2\/public\/request_connection","params":["access_code","current_time","user_id"]},
{"http_method":"POST","resource":"\/v2\/remote\/confirm_connection","params":[]},
{"http_method":"GET","resource":"\/public\/feature","params":[]},
{"http_method":"POST","resource":"\/v2\/remote\/search\/program","params":[
  "broadcast_type","channel","date_from","date_to","genre","keyword","mark","pay_program","rec_storage_id","target"]},
{"http_method":"GET","resource":"\/v2\/remote\/pvr\/folders\/list","params":[]},
{"http_method":"GET","resource":"\/public\/support","params":["http_method","params","resource"]},
{"http_method":"GET","resource":"\/v2\/remote\/support","params":[]},
{"http_method":"POST","resource":"\/v2\/remote\/status\/channel","params":["channel","power_on"]},
{"http_method":"GET","resource":"\/v2\/remote\/status\/foreground_dtvapp","params":[]},
{"http_method":"POST","resource":"\/v2\/remote\/status\/foreground_dtvapp","params":["foreground_dtvapp","option"]},
{"http_method":"GET","resource":"\/v2\/remote\/status\/mute","params":[]},
{"http_method":"GET","resource":"\/v2\/remote\/settings\/channel_list","params":[]},
{"http_method":"GET","resource":"\/v2\/remote\/settings\/timeshift","params":[]},
{"http_method":"GET","resource":"\/v2\/remote\/timeshift\/list\/:channel_code","params":[
  "base","count","description","duration","start"]},
{"http_method":"POST","resource":"\/v2\/remote\/timeshift\/list\/:channel_code","params":[
  "cloud_user_id","duration","play","start_position"]},
{"http_method":"GET","resource":"\/v2\/remote\/timeshift\/oldest_time","params":[]},
{"http_method":"GET","resource":"\/v2\/remote\/pvr\/storages\/list","params":[]},
{"http_method":"GET","resource":"\/v2\/remote\/pvr\/play\/list\/:rec_storage_id\/:rec_content_id","params":[]},
{"http_method":"POST","resource":"\/v2\/remote\/pvr\/play\/list\/:rec_storage_id\/:rec_content_id","params":[
  "cloud_user_id","duration","play","start_position"]},
{"http_method":"GET","resource":"\/v2\/remote\/epg\/:channel_code","params":["time"]},
{"http_method":"GET","resource":"\/v2\/remote\/pvr\/reserves\/list","params":[]},
{"http_method":"POST","resource":"\/v2\/remote\/pvr\/reserves\/list\/:rsv_id","params":[
  "cloud_user_id","duration_series","follow","indexing","keyword_series","protect","rec_folder_id","rec_storage_id",
  "repeat_series","start_time_series","title_series"]},
{"http_method":"DELETE","resource":"\/v2\/remote\/pvr\/reserves\/list\/:rsv_id","params":["cloud_user_id"]},
{"http_method":"POST","resource":"\/v2\/remote\/pvr\/reserves\/new","params":[
  "channel","cloud_user_id","duration","duration_series","epg_content_id","follow","indexing","keyword_series",
  "parental_pin","protect","rec_folder_id","rec_storage_id","repeat","repeat_series","series_rec","start_time",
  "start_time_series","title_series"]},
{"http_method":"GET","resource":"\/v2\/remote\/pvr\/reserves\/options\/names","params":["rec_mode"]},
{"http_method":"GET","resource":"\/v2\/remote\/settings\/cloud\/device_id\/pdid","params":[]},
{"http_method":"GET","resource":"\/v2\/remote\/settings\/cloud\/device_id\/sdid","params":[]},
{"http_method":"GET","resource":"\/v2\/remote\/play\/status","params":[]},
{"http_method":"GET","resource":"\/v2\/remote\/play\/status\/playing_action_info","params":[]},
{"http_method":"POST","resource":"\/v2\/remote\/play\/status\/playing_time","params":["milli_position","position"]},
{"http_method":"GET","resource":"\/v2\/remote\/csp\/direct_play_list","params":[]},
{"http_method":"POST","resource":"\/v2\/remote\/csp\/list\/:csp_name","params":[
  "cloud_user_id","csp_content_id","csp_content_opt","csp_content_type"]},
{"http_method":"GET","resource":"\/v2\/remote\/reminders\/list","params":[]},
{"http_method":"DELETE","resource":"\/v2\/remote\/reminders\/list\/:rem_id","params":["cloud_user_id"]},
{"http_method":"POST","resource":"\/v2\/remote\/reminders\/new","params":[
  "channel","cloud_user_id","duration","epg_content_id","repeat","start_time"]}
]}
(jsonはスラッシュエスケープするんだ・・・これJSONPで</script>が登場しないようにするためらしいなるほどのう。CORSプレフライト万歳。)