2019年9月28日土曜日

KTV-FSUSB2のドライバを簡単にインストール

OS入れ替えたらWindows 10ではKTV-FSUSB2のドライバがデジタル署名の問題とかでテストモード使ったり、自己署名のセットアップしないといけなかったりと面倒だったので掲示板で見かけたzadigを使う方法を試してみた。

ちなみに今回使用したKTV-FSUSB2のシリアルナンバーはK0806。(いわゆるKTV-FSUSB2N)
シリアルナンバーによってPIDが変わるかもしれないのでWikiとかで確認するといいかも。K0905ファーム化してからPatchV2当ててるパターンだとみんなPIDは0x0029になってると思うけど。(KTV-FSPCIE含む)
GUIDはktv-fsusb2n.infの中のDeviceInterfaceGUIDから持ってきているのでここも変更するとUS-3POUTとかでも応用できるかも。

用意するものはzadigとコンフィグファイルのみ。

[device]
Description = "ISDB-T DTV Tuner KTV-FSUSB2"
VID = 0x0511
PID = 0x0029
GUID = "{b35924d6-3e09-4a9e-9782-5524a4b79ba4}"
コンフィグファイルはこれを適当にメモ帳とかに貼り付けてfsusb2n.cfgとかにしておく。(ファイル名は関係ない)

ちなみにzadigでセットアップが完了するまでKTV-FSUSB2は接続しないほうがいいかも。
まずはzadigを起動。
Device→Load Preset Deviceをクリックするとファイルを開く画面が出るので先程作成したfsusb2n.cfgを選択。

WinUSBが選ばれていることを確認してInstall Driverボタンをクリック。
そこそこ待って完了したらKTV-FSUSB2を挿せばちゃんと認識するようになってるはず。

これは便利だ…
あとはBonDriver_FSUSB2NとTvTestで視聴できる。

ちなみにこのドライバのアンインストールするときはデバイスマネージャーのユニバーサル シリアル バス デバイスのところにあるISDB-T Full Segment Deviceを右クリックしてデバイスのアンインストールを押せばオッケー

そのときに「このデバイスのドライバー ソフトウェアを削除します。」にチェックを入れないとだめなので注意。

ちなみにZadig起動前にKTV-FSUSB2を指しておくとZadigでそのままWinUSBのドライバをインストールできそうな感じだったんだけど、それでインストールしてもBondriverから認識されなかった…
どうやら上のコンフィグファイルが重要らしい?何回か試してみたけどZadigでドライバインストール完了するまでKTV-FSUSB2を接続しないほうがうまくいくと思う。
configファイルミスってドライバのインストールがうまくいかなかったときはデバイスマネージャで"表示"→"非表示のデバイスの表示"でデバイスが出てくると思うのでアンインストールできるとおもう。

ちなみにKTV-FSPCIEでも同様の手順で使えると思う。

2019年9月22日日曜日

Micron 1300 2TBを買ってみた。

というわけでちょっくら東京に行く用事があったので秋葉原でSSDを買ってきた。

現在のストレージ構成はM.2 SSD 500GBと2.5インチSSD 500GBの合計1TBなんだけど、ゲームとか入れてると結構カツカツになるので2.5インチの方を2TBに交換してみた。


Micron 1300というSSDでツクモで税抜2万円切るぐらいの低価格。
コントローラICはMX300と一緒で、NANDが96層の3D TLCらしい。
バルク品で3年保証付き。

早速速度を測定してみた。
速度の方はMX200よりランダムが遅い感じ。まぁ今回はデータ用だから問題ないかなぁ
シーケンシャルは同じぐらい出ているしね。


Crystal Disk Infoで確認してみるとファームウェアバージョンはM5MU000だった。
MicronのサイトからM5MU030がダウンロードできるっぽいんだけど、Micron Strage Exectiveでみると最新のファームウェアが適応されていますというふうに出ててよくわからん…


2019年9月7日土曜日

WiiクラシックコントローラProのジャンクを買ってみた。

ブックオフに行ったらクラシックコントローラProがジャンクボックスの中で500円で売っていたので買ってきてみた。

といってもWii用ではなくArduino用。この前ヌンチャクをESP32にi2cで接続して使ってみたけど、クラシックコントローラならi2c接続でアナログスティックが2つも。ボタンもたくさんあるし。本当はトリガがアナログなProじゃない方のクラシックコントローラが欲しかったんだけど売ってなかった…

ProはLとRがデジタルスイッチになって、ZLとZRが押しやすいところに移動されている。グリップも付いて持ちやすくなってるけど。

中を掃除するために分解してみた。意外ときれい。分解にはY型ドライバが必要。

ZRスイッチとZLスイッチのところ凝ってるなぁ…
ちなみにケーブルはSDAが緑、SCLが黄色につながっていた。赤が3.3Vで白がGNDで黒いところはシールド(GND)。

スティックのところもキレイだった。

全体的にはスティックとか十字キーが少し黄ばんでるかなぁ?ぐらいで結構キレイだった。スティックがちょっとベタついていたのでシリコンスプレーを布に付けて拭いておいた。(シリコンスプレーはアナログスティックの可変抵抗の接触不良のもとになったりするので直接吹きかけないほうが良い)

Arduino環境のESP32でヌンチャク使ったときと同じくNintendo Extension Controller Libraryを使って認識することができた。ちなみにクラシックコントローラのプロトコルの解析結果を公開してくれているサイトによると、データフォーマットが3種類切り替えられるようでアナログスティックは最大10Bitの分解能を持っていそう。PS3のコントローラでも8bitっぽいので8bitあれば足りるんだろうけど…


2019年8月16日金曜日

Raspberry PiでRetina液晶を使ってみた

前回作成した自作液晶をRaspberry Piで使用してみることに。しかしiPadのRetina液晶の解像度はRaspberry Piには標準的に組み込まれていない解像度設定になるためにカスタム解像度として登録する必要がある。

iPad3のRetina液晶の解像度はQXGA、数字でいうと2048x1536でXGA(1024×768)の面積4倍なのでQuad-XGAということらしい。
今どき4:3の液晶も少ないし、確かフラットブラウンの17~19インチぐらいで対応してた解像度だった気もしなくもない…

とりあえずそのままの状態でRaspberry Pi 3B+に接続して起動してみた。

するとフルHDの解像度のまま引き伸ばされて表示されている。液晶コントロール基板のスケーリング自体が比率固定に対応してないっぽいので(ファームの問題?)結構見ずらい。
この液晶の解像度自体はフルHDよりも高解像度のため、文字もぼやけた感じに。
まぁデフォルト解像度の中でも4:3を選べばとりあえずは縦横比合うけどせっかくのRetina液晶が無駄に…

というわけでカスタム解像度の設定。
config.txtをいじれば良いっぽい。

hdmi_group=2
hdmi_mode=87
hdmi_cvt=2048 1536 60 1 0 0 1
max_framebuffer_width=2048
max_framebuffer_height=1536
hdmi_pixel_freq_limit=224000000

これをconfig.txtの一番最後に追記するだけである。
一応どういう意味かというと
hdmi_groupは1または2を選択できる。
1はCEAで主にテレビなど。2はDMTで主にPC用ディスプレイ。
CEAは例えば1080pみたいな表記で、DMTは1920x1080みたいな表記になるはず。
今回はPC用ディスプレイの解像度フォーマットなので2を選択。
hdmi_modeは解像度設定番号みたいなもので、86までは定義されているので空いている87を使用。
hdmi_cvtはカスタム解像度の定義
縦の解像度、横の解像度、リフレッシュレート、縦横比、マージン、インターレース、リデュースドブランキング
2048x1536@60Hzで縦横比は今回は4:3なので1番を指定。マージンもインターレースもなし。リデュースドブランキングは今回はLCDなので1にしてみた。
max_framebuffer_widthとmax_framebuffer_heightはフレームバッファのサイズ設定。フレームバッファのサイズが解像度と合っていないと引き伸ばされたり縮小されたりしてしまう。
hdmi_pixel_freq_limitはピクセルクロックのリミット設定。Raspberry Piのピクセルクロックのデフォルト値ではRetina解像度には足りないためリミットを増やす必要がある。
単純にドット数×周波数ではないのが面倒なところなんだけど、ここはLCDのデータシートのクロック周期の最大値を持ってきて計算すると2348x1584x60で切り上げて224Mhzに設定。

再起動してみると
うまく認識した。ピクセルクロックは209.4Mhzだったみたいなので足りてるみたい。


いやーQXGAめっちゃ広いわー
そして結構発色が良い。さすがIPS液晶。

Retina液晶ネタもうちょっと続きそう。ケースとかスピーカーとか。

2019年8月15日木曜日

iPadの液晶で自作液晶を作ってみた

Raspberry Piで使えるような小型なモニタがほしかったけど、モバイルディスプレイ意外と高いし、Raspberry Pi用として売られているLCDって安いやつは結構解像度が低い。
ということで自作液晶の部品を探していたらiPadのRetinaディスプレイを使えば結構安価で作れるんじゃないかということで作ってみた。解像度もフルHDよりあるし。

iPadのRetinaディスプレイを使った自作液晶は何年か前に結構話題になっていたけど、ディスプレイポートしか使えないということが微妙だった。というのもiPadのLCD自体がeDP対応なのでバックライト駆動用回路さえあればコネクタを変換してそのままディスプレイポートに繋がるというのを誰かが発見したところから始まっていた気がする…
まぁHDMI→ディスプレイポート変換アダプタを利用すればHDMIでも行けるっぽかったんだけど、結局そのケーブルも結構高くて…

そして数年ぶりに変換基板を探してみたらHDMI対応になってるし、iPadのLCDはむしろジャンクのiPadから外せば安いじゃんというぐらいにiPadの価格が下がっていた。


というわけでジャンクのiPad 3を入手。
こちらはガラス割れ&アクティベーションロックでアクティベートできないという代物。
ガラスが割れているだけでLCDはちゃんと写っているように見えたのでオクで購入した。
送料含めて1100円ぐらいだったので、修理用のLCDが4500円ぐらいするのと比べるとだいぶ安い。


LCDコントローラはVS-RTD09703-V1というやつを購入した。有名なのはAbuseMarkの変換基板みたいだけど、こちらは低価格な上に入力ポートが2ポート(HDMI+miniHDMI)だったりeDP対応の液晶コントロールIC搭載なので、OSDが使えたりするらしいので。
HDMI+miniDPの基板もあったけどHDMIのほうが使いやすそうなのでこちらにした。
どちらもRealtekのRTD2556というコントロールICを使っていて、Retinaの解像度2048×1536(QXGA)で使用できるらしい。
Aliexpressで3500円ぐらいだった。
しかしOSD用のスイッチ基板とコントロール基板のケーブル、どっちもピン数あってないし。まぁコントロール基板は赤外線リモコンにも対応してるモデルもあるっぽいのでその兼ね合いでピン数が多いのかね。


早速ジャンクのiPad 3を分解。
ドライヤーで温めながら薄いヘラを突っ込んで一周すれば結構かんたんに開く。今回はヘラがなかったのでナイフで代用したけどナイフが進まなくなったら温めればサクッと進むので温めるの重要かも。突っ込みすぎると液晶やってしまうので注意。
開いたらもう一度液晶の動作確認もしておく。
何種類か品番あるみたいだけど、ついていたのはLP097QX1-SPA2だった。


このiPadはガラス割れジャンクなんだけど、多分そのときの衝撃で液晶が1mmずれてたw
液晶固定用のタブもちょっと曲がってるし、ネジは真ん中に来てなかった…
なんか起動したときに右側に黒い線あるなーと思ったら液晶がずれていたわけね…

まぁ液晶パネルの表示自体は問題ないので気を取り直してLCDコントローラ基板に接続してみる。今回購入したコントロール基板は液晶パネルとの間にバックライト制御回路(昇圧回路)が乗っている基板(RTD-IPAD3 V02)を接続するようになっている。購入ページの説明には長時間使う場合は熱を分散させろと書いてあった。
ICにはY58Mと刻印があったのでLED用昇圧ICのYB1518っぽい。


フレキケーブルの差し込み方向に注意かも。あとLCD側のフレキはちょっと固めなので白い線が隠れるまで入れること。
写真だと液晶の裏面に小基板つけちゃってるけどここは絶縁したほうが良さげ。
ちなみにこの小基板はiPad 5用の液晶バージョンもあるみたい(LCD側コネクタが違う)
小基板にすることにより汎用性を高めているのかもしれない。


電源は5-12Vらしいのでとりあえず12V1AのACアダプタを付属の変換アダプタにつないで接続し、電源ボタンを押したら写ったー
ちゃんと解像度も2048×1536で映っているっぽい。DPIが推奨200%なぐらい文字が小さいけど結構きれいだ。


しばらくすると画面がちら付き始めた、どうやらLCDとコントローラの間の小基板が結構発熱するようで、小基板に扇風機の風を当てるとチラツキが収まった。
ここらへんはどうにかして放熱を考えないとなぁ
液晶の裏面に熱伝導シートとかで張っちゃってもいいのかなぁ

OSDも使えるんだけどバックライトの明るさは固定っぽい?バックライト基板を追ってもそんな感じするし。YB1518のFBピンあたりの回路にちょっと細工すれば輝度変えられそう。
スケーリングも項目があるんだけど設定しても反映されないので16:9のゲーム機とかつなぐと引き伸ばされてしまう。

9.7インチで2048×1536なHDMIとminiHDMI入力がついた液晶、結構小さくてこの解像度はすごい。DPI設定上げないと文字読みにくいけど。
今の所かかった費用は4742円なんだけど、あとはケースどうしようかな。
昔自作液晶を作ったときはダイソーの書類ケース使ったり、アルミアングル材を加工して作ってたりしたけど、ちょうどいいのがあればいいな。Aliexpressで専用のケースも3000円ぐらいで売ってるみたいだし。
ちなみにアンプも付いているのでスピーカーを繋げばHDMIからの音声を出力できる。
静電容量タッチパネルキットも25ドルぐらいで出てるっぽい。それ用のタッチパネル制御基板につなげる端子もついている。

長くなってしまったのでラズパイの設定は次回

 

2019年8月3日土曜日

CH340でESP32に自動書き込みしてみた。

この前FTDIのFT232RQを使った書込みアダプタを作ってみたんだけど、このアダプタ便利なので繋ぎっぱなしにしてもいいように増産してみた。
同じものを作っても面白くないので試しにCH340っていうICが乗ったモジュールで作成してみることに。WCHっていうメーカのIC搭載のモジュールでとってもお安い。
そんでもってWindows Updateからドライバが入れられるらしいので安心だし。Windows 10ならネットに繋がってれば自動で入るらしい?

アマゾンで3つセットで600円ぐらいというとても安いやつ。
ケーブルもおまけで付いてきた。

ジャンパが付いてるんだけど、どうやらTXとRXのレベルを3.3Vか5Vか選べるらしい。ガラス管ダイオード2つ見えるけどこれで3.3Vを生成してるって、全然3.3Vじゃないじゃんという… 赤色LEDが一つ、青色LEDが2つついていて、赤が電源、青が送受信になっていた。

まずはいらない部品を取り外す。ダイオード2本と、3.3VとVCCのコンデンサ2つ。赤色の電源LEDとその抵抗も外した。これでauto reset回路用スペース確保完了。

そしたら部品の実装。ダイオード2つ外したところにはいい感じにSOT-23の3.3Vレギュレータが乗るスペースが。3.3VレギュレータでVBUSから3.3Vを生成することにより、ESP32にも電源がそのまま供給できる。そもそもこのモジュールの3.3V出力そのまま使えなさそうだったし…
3.3Vレギュレータを搭載したことにより、VCCとV3ピンをショートさせる。これで3.3V専用仕様に。
ESP32の自動リセットは前回と同様にNPNトランジスタ2つと抵抗2つを使用した。デジトラしか余ってなくて10kのデジトラ使ったんだけど問題なかった。
ENとGND間には1uFを入れておいた。

裏側は5VとVCCのパターンをビアの手前でカット。そんでもってこの前作ったアダプタとピンアサインを合わせるために、GNDのパターンをカットして5VのところをGNDにした。前回つくたアダプタと完全品コンパチにすることができた。
外した電源の赤色LEDを受信LEDに変更することにより、青で送信、赤で受信という風にわかるようにしてみた。

ちょうどいいESP32がなかったので、ESP-WROOM-02で動作確認してみたんだけど、これで3Mbpsで書き込むことができた。意外とやるぞCH340…
CH340GはCH340Cの様なオシレータ内蔵のチップと違ってクリスタルが付いてるのでそのおかげで高速書込みできちゃってるのかな?
CP2102とかでも2Mbpsいけなかったりして1.5Mbpsがいいところだったりするんだよね。
200円ぐらいなのでこいつを何個か作っておくと便利かも。結局指しっぱになってしまうし。


2019年7月27日土曜日

ESP32でラジコンサーボを動かしてみた

ESP32でTower ProのSG92Rっていうマイクロサーボを動かしてみた。秋月とかでも結構お安く売っている。Aliexpressだと一個250円ぐらいかも。

このサーボは4.8VなんだけどとりあえずUSBの5Vで動かしてみた。

今回はサーボ用のライブラリを使わずにESP32のPWM(ledc)だけで動かしてみた。サーボの標準的な通信は20ms周期の中でHighの割合が0.5ms~2.4msの間で角度が変化するようになってるのでESP32のPWMタイマーを50Hzにセットして0.5msから2.4ms相当のDutyで制御してみた。

#define servoPin 21 //入力Pin設定
#define servoPWMch 0 //サーボ用PWMチャンネル(0-15)
#define servoMin 102 //サーボ最小角度 0.5ms / 20ms * 4096(12bit)
#define servoMax 492 //サーボ最大角度 2.4ms / 20ms * 4096(12bit)

void setup() {
  Serial.begin(115200);
  ledcSetup(servoPWMch, 50, 12);//PWMタイマ初期化 0ch,50Hz(20ms),12bit
  ledcAttachPin(servoPin, servoPWMch);//PWMタイマに出力Pin割当
  //ledcWrite(servoPWMch, servoMin);//最小角度にセット
}

void setServo(uint8_t servoIn){
  uint16_t servoDuty = map(servoIn,0,255,servoMin,servoMax);//0-255で指定した角度をduty比に変換
  ledcWrite(servoPWMch, servoDuty);//指定角度にセット
}

void loop() {
  while (Serial.available() > 0)
  {
    char incomingCharacter = Serial.read();
    int val;
    switch (incomingCharacter)
    {
      case 's':
      {
        //Serial.print(incomingCharacter);
        val = Serial.parseInt();
        uint8_t servoOut = constrain(val, 0, 255);
        setServo(servoOut);
        Serial.println(val);
        break;
      }
      case 'S':
      {
        Serial.println(incomingCharacter);
        ledcWrite(servoPWMch, 0);//サーボオフ
        break;
      }
    }
  }
}
とりあえずこんな感じでシリアルコンソールでs0とかs255とか送れば0から255の間でサーボが0~180°の間で動いてくれる感じ。大文字のSを送るとPWM信号が止まるのでサーボもフリーになる。

ledcWriteを使えばLEDの調光やDCモータ制御だけじゃなくてラジコンサーボも動かせちゃうの便利だなぁ。一応16ch分タイマはあるっぽいのでこの単純なプログラムだけで16ch分は動かせそう。