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分は動かせそう。

2019年7月13日土曜日

ESP32用の自動書き込みアダプタを作ってみた。

前にESP-WROOM-02用に自動書き込みアダプタを作ったんだけど、ESP32-CAMとかのESP-WROOM-32にはうまく書き込めなかったので改良も兼ねて新しく作ってみた。
今回の改造ベースは秋月のFT232RQ USBシリアル変換モジュールキット。これも前回同様6Pinの出力だし、ピン配置も同じなのでベースとしてはいい感じ。USB端子もMiniUSBからMicroUSBになるし(これが大きいかも)。本当はTypeCが良かったなぁ

このモジュールは表面にDIPスイッチがあって3.3Vと5V切り替えたりLEDオンオフできたりするんだけど、今回はこちらのディップスイッチを外してそこに3.3Vレギュレータ設置できるかな。
ESP-WROOM-32だとリセットじゃなくてENを操作してるみたいなんだけど、タイミングによってはIO0がLOWになる前に立ち上がってしまったりして書き込みモードに入れないことがあるようなので起動遅延用にENとGNDの間にコンデンサを入れるといいらしい。

というわけで今回は前回の回路にコンデンサを一つ追加しただけ。
定数は環境にもよるらしいんだけど、0.1uFだと不具合が出ているような人がいるっぽいので念の為0.47uFにしてみた。1uFでも良さそう。

DIPスイッチ剥がせば全部表面に実装できそうだったので、DTRのパターンを途中でカットしてそこにトランジスタを載せてしまった。EN側のトランジスタの下で切れてコレクタはそのままパターン上にはんだ付けした。
RTSはICのピンからそのまま引き出した。ついでにFT232RQのCBUS4がLEDの近くだったのでLEDを駆動できるように改造した。FtProgでCBUS4のモードをTX/RXに変更すれば送受信時に点滅してくれる。
ちなみにDIPスイッチを剥がしてしまってもVIOは3.3Vに固定されるのでこのボードだと3.3V化はしなくてもオッケー。ダイオードを0Ωに変更しようか悩んだがとりあえずそのままで
レギュレータ用のコンデンサはディップスイッチの隣のVIAのところでパターンをカットしてそこに3.3Vを流せばいい感じにそのまま使えそう。

裏面にはわかりやすいように適当に印刷した紙をセロテープで貼って完成。
ESP32-CAMとかにつなぐときはEN端子が出ていないのでグラバークリップとかでENにつながってるコンデンサとかをつまむしかない…。
ESP-WROOM-02で使う場合はENをリセット品につなぐだけなので前と変わらず使える。
ESP32で3Mbps書き込みする場合はboards.txtを編集する必要がある。

CooltermのようにDTRの状態をいじれるターミナルを使えばPC側からリセットもかけられて便利だわー

2019年7月10日水曜日

Yinyoo BT4を買ってみた

iPhone 8のジャンクをお安く手に入れたので修理して使ってみてるけどイヤホン端子がない。ということで中華イヤホン用のBluetoothケーブルをこれまたジャンクで購入してみた。
MMCXではなくて2ピンタイプだった。

今回購入したのはYinyoo BT4のピン折れジャンク。
アマゾンの1/5以下ぐらいで手に入ったのでラッキー

片方はピンが折れて、もう片方は曲がってる。
とりあえず曲がった方のピンは真っ直ぐにして、折れてるところはヤスリで削ってから穴を開けた。


穴を開けたらそこに適当なピンヘッダのピンをはんだ付けして長さを合わせてハンダをデザインナイフで削って調整。


結構簡単に治ってラッキー。

Yinyoo BT4はCSR8645らしいのでApt-xとAAC対応してるみたい。
音質的には問題なさそう。音量も結構出てるのでハイインピーダンス系も行けそう。
とりあえずKZ ZSNで使用してるけど、端子の形状が微妙に違うけどピッチが同じなので刺さるからいいか

2019年7月6日土曜日

ESP32-CAMのサンプルスケッチを便利にしてみた

とりあえず技適対応のためにESP-WROOM-32に張り替えたり、ケースに入れたりしてそこそこ便利になってきたESP32-CAMなんだけど、面倒なフラッシュLED実装以外はほぼできたのでメモがてらおいておこうかな。
変更点はIO33につながってる赤色LEDを使えるようにWifiマネージャーのサンプルを移植。そしてmDNSで2台目つないだときにかぶらないように対策したぐらい。2台以降用に色々いじってみたものの変数をMDNS.begin()に入れるとうまく設定できなかったので…
WiFiマネージャーで設定したときに接続できないのもソフトリセットで対応…
本体のストリームもAsync対応させたいなぁ
以下サンプル編集したやつ。どこ編集したかわからなくなったのでメインのスケッチだけコピペしておいた。