2019年6月22日土曜日

ESP32-CAM単体でWifi設定できるようにしてみた

前回技適対応にしたESP32-CAMですが、サンプルスケッチそのままだとSSIDとパスワードを変更するたびに書き換えなかったりしないといけなかったり少し不便なのでWiFiマネージャーを使用して少し便利にしてみた。

まずWiFiマネージャーっていうのはESP-WROOM-32などのWifi搭載マイコンで家のWifiに接続する際にSSIDとパスワードをスマホなどから設定できるようにできるライブラリ。仕組み的にはステーションモードで接続できなかった場合は自分自身がAPモードで立ち上がってWebサーバを立て、そこにスマホなどでWifi接続してSSIDとパスワードを設定できる。一旦設定すればあとは自動で家のWifiに接続してくれるようになる。接続できなくなると自動的にAPモードで立ち上がってまた設定できるようになるというすぐれもの。

ライブラリ自体は何種類かあるようだけど今回はAsyncに対応しているESPAsyncWiFiManagerを使用させてもらった。このライブラリを動作させるために必要なライブラリもあるので3つ入れる必要があった。

ESPAsyncWiFiManager
ESPAsyncWebServer
AsyncTCP

そんでもってCameraWebServerサンプルをベースに変更を加えていく。
ついでにmDNSにも対応してみた。
主に変更するのはスケッチの上の方なので変更する付近のみ紹介。(コピペする場合はサンプルを開いて相当する箇所に変更箇所のみ上書きしないと動かない)

#include "esp_camera.h"
#include <WiFi.h>
#include <ESPmDNS.h>//追加
#include <ESPAsyncWebServer.h>//追加
#include <ESPAsyncWiFiManager.h>//追加
AsyncWebServer server(80);//追加
DNSServer dns;//追加

//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//

// Select camera model
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM  //コメントアウト
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM //コメント外す
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM

#include "camera_pins.h"

//const char* ssid = "*********"; //コメントアウト
//const char* password = "*********"; //コメントアウト

void startCameraServer();

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  AsyncWiFiManager wifiManager(&server,&dns);//追加
  wifiManager.autoConnect("ESP32-CAM");//追加

中途半端なところで切ってるけど上の方はこんな感じで編集。
あとは下の方でWiFi.begin(ssid, password);してるところを変更。

  //WiFi.begin(ssid, password);//コメントアウト
  WiFi.begin();//追加
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  MDNS.begin("cam");//追加

これで完成。

あとはこれを書き込むとWiFiの設定がされていない場合はESP32-CAMというWifiネットワークが作成されるのでそれにスマホからアクセスして、http://192.168.4.1を開いて設定すればOK。ライブラリにはCaptive Portal機能も埋め込まれているのでiPhoneなどの対応機種であればAPに接続して少しすると自動で設定画面が開くはず。あとはSSIDとパスワードを設定画面から設定すれば完了である。

あとは家のWifiに接続されてからはmDNSが動くのでhttp://cam.localにアクセスすればmDNS対応(Windows 10やiOS)であればIPアドレスを調べる必要がないので便利。Androidの場合は.Local FinderとかでmDNSからIPアドレスを調べられるので便利かも?
エラーコード500が出る場合はESP32-CAMを一旦再起動すると良さそう…多分これはESPAsyncWiFiManagerのバグ?で初回設定時にポートが閉じられていなさそう。

とりあえずこのレベルでも結構使いやすくなったのであとはUPnPとかでポートも自動で開けられたりDDNSに自動で登録できるようにすれば完璧かな…

ちなみにESP-WROOM-32内に保存されたSSIDとパスワードを消去するときはsetup直下とかで一旦以下の2行を実行すれば良いらしい。(デバッグとかでよく使った…

WiFi.mode(WIFI_STA);
WiFi.disconnect(true,true);

一旦WiFiマネージャーで設定完了してしまうと勝手につながってWiFiマネージャーのテストができなくなってしまったときに多用した…

そういや小さいケースが欲しかったけどタカチとかのケースで基板ピッタリのサイズが無かったので設計してみた。電源はmicroUSBから取れるようにしてみた。

ESP32-CAM ケース
ケースに入れることによってハンドリングがしやすくなった反面、ファームの書き換えが面倒に。一応折れないギリギリでスナップフィットにしてみたのでかなり小型化できたと思う。
micro USBの穴とmicroSDの穴が開いてる。結構ぎりぎり突っ込んだのでmicro USB基板はESP-WROOM-32のシールドの上に乗ってる感じ。カプトンテープで一応絶縁しておいたけど。

2019年6月15日土曜日

ESP32-CAMを技適対応にしてみた

ESP-32SとOmnivisionのOV2640が一つのPCBに乗っていてかなりお安いモジュールが合ったので買ってみた。その名もESP32-CAM。PSRAMとしてIPUS IPS6404も搭載されているっぽい。
ピンヘッダもはんだ付け済みでカメラを繋いでファームウェアを書き込めば動く感じ。
Aliexpressで6.99ドルだった(送料込み)
ただし、開発ボードみたいにUSBシリアル変換アダプタが内蔵されていないので別途必要。

ESP-32Sが乗っているが、Ai-Thinkerのではなさそう?
この手のIPEX端子がついてるESP32-Sって書いてあるモジュールってロゴ違いで何種類かあるのかな?
残念なことにこのモジュールは技適マークが付いていないっぽい。ピン配置はESP-WROOM-32と同じ。

ということで早速解体。
ピンヘッダも5V入力側IOはmicroSDカードにつながってるのと共通だし、反対側はデバッグと書き込みにしか使わなそうなので外してしまった。ケースに収めるとき邪魔だし。
部品が飛んでいかないようにカプトンテープでマスキングしてヒートガンの細ノズルを使っていい感じに温めて剥がす!
マキタの温調付きのヒートガンで風量と温度最大でちょうどよいぐらい。

そんでもって手持ちのESP-WROOM-32を取り付けてみた。これも使わなくなったESP-WROOM-32をピッチ変換基板からヒートガンで剥がしたんだけどね!
ちなみに剥がしたあとは吸い取り線できれいに掃除してから隙間ができないように取り付けた。
これで技適対応のESP32-CAMあらため、ESP-WROOM-32-CAMが完成した。
ピン配置同じなのでプログラムは同じものが動くはず。
外部アンテナが使いたい場合はESP32-WROOM-32Uをつければ良さそう。
ちなみに取り付けたのはRevision1でした。取り外したやつは不明…

カメラ側には白色LEDがついててこれはGPIO4で駆動用のFETらしきものを介して制御できるようになっている。HIGHで光るんだけど超眩しい。PWMで調光したほうが良さそう。
反対側にはGPIO33にLED1とシルクで書かれている赤色LEDがついていた。これはLOWで光る。

とりあえずArduinoでESP32のCAMERAのサンプルにESP Asynk WiFi Managerを組み込んでテストしてみた。
LED1はWiFi ManagerのステータスLEDとしてプログラムしてみた。
あとはフラッシュを使えるようにプログラムを修正すれば良さそう。

ちなみにVCCはデフォルトでは3.3Vにつながってるっぽいので、もしVCCから電源を供給したい場合はジャンパー抵抗を交換しないと行けないので注意。まぁ5Vか3.3Vって書いてあるところに電源を繋げばいい話なんだけれども。


最後にシルクの向きで縦置きかと思ったんだけど実際はこの向きなのね
SVGAで1時間ぐらい放置してみたけど問題なさそう。このぐらいの解像度だと10FPSぐらい出る。そしてESP-WROOM-32がめっちゃ熱くなる
安定化電源で3.3V入れてると表示が170mAぐらいだしな…

今回使用したスケッチは長くなりそうなのでもう少し編集してから次回紹介したいと思います。
Arduinoで開発する場合はライブラリや情報も豊富なので、FTPとかクラウドに一定間隔で画像をアップロードするWebサイト埋め込みのライブカメラ的なやつとかも簡単に作れそう。もはやPCいらずで単体マイコンでできる時代とは…

2019年6月8日土曜日

ESP32のBluetoothでSPPを使ってみた

ESP-WROOM-32にはBluetoothも搭載されているけれど、実はBluetooth Classicにも対応しているみたいなので、SPPでHC-05やRN42みたいにBluetoothシリアル変換アダプタとして使ってみた。

とりあえずArduino core for the ESP32のサンプルプログラムとしてBluetoothSerial→SerialToSerialBTで事足りるんだけど、RN42みたいにPCから未接続時はLED点滅で接続後に点灯みたいなインジケータを追加してみた。
あとは開発ボードのデフォルトのシリアルポートはUSBシリアル変換ICに直結されていて起動時に情報などが流れてきてしまうので別なポートをシリアルポートとして設定してみた。

#include "BluetoothSerial.h"
#include "Ticker.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;

Ticker ticker;

#define BUILTIN_LED 2

void setup() {
  //インジケータ用LEDピンの設定
  pinMode(BUILTIN_LED, OUTPUT);
  //BluetoothのMACアドレス取得
  uint8_t macBT[6];
  esp_read_mac(macBT, ESP_MAC_BT);
  //BluetoothのMACアドレスの下4桁を使用して固有のデバイス名作成
  char btname[11];
  sprintf(btname,"ESP32-%02X%02X",macBT[4],macBT[5]);
  //Bluetoothのcallback関数設定
  SerialBT.register_callback(callbackBT);
  //先ほど作成したデバイス名でBluetooth開始
  if(SerialBT.begin(btname)){
    //Bluetoothが開始できたらLED点滅開始(接続待ち)
    ticker.attach(0.5, ledBlink);
  }
  //Serial2(RX=GPIO16,TX=GPIO17)を開始
  Serial2.begin(115200);
}

void loop() {
  if (Serial2.available()) {
    SerialBT.write(Serial2.read());
  }
  if (SerialBT.available()) {
    Serial2.write(SerialBT.read());
  }
}

void callbackBT(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) {
  if (event == ESP_SPP_SRV_OPEN_EVT) {
    //接続後LEDを点滅→点灯
    ticker.detach();
    digitalWrite(BUILTIN_LED,HIGH);
  }else if (event == ESP_SPP_CLOSE_EVT) {
    //切断後LEDを点滅させる
    ticker.attach(0.5, ledBlink);
  }
}

void ledBlink() {
  volatile static int led = HIGH;
  digitalWrite(BUILTIN_LED, led);
  led = !led;
}

Bluetooth SPP用にBluetoothSerial.hと、LED点滅用にTicker.hを使用した。
デバイス名はRN42みたいにBluetoothのMACアドレスの下4桁を使用してデバイス固有のデバイス名にするようにしてみた。
LEDの方はBluetooth接続待ちになったらTickerで点滅させて、PC等にペアリングしてSPPの仮想COMポートをオープンするとLEDが点灯する感じ。切断すると点滅に戻る。
ここらへんもRN42ライクにしてみた。


Bluetoothデバイスを検索するとこんな感じに表示される。
あとはBluetoothとその他のデバイスからその他のBluetoothオプションを開くとどのCOMポートに繋がっているかがわかる。

例によってWindowsではSPPはなぜか仮想COMポートが2ポートできるんだけど、名前にESP32SPPがついてるほうが通信できるポート。この場合はCOM5なのでCOM3は削除しても問題なかった。

こんなに単純なプログラムなのにシリアルデバイスとは問題なく通信できてる。
RS-232CからBluetooth変換とか結構高級品だけど、これを使えばかなりお安く作れるんじゃないだろうか?RN42より安いし。ついでにESP32はWiFi搭載なので将来的にソフトウェア変更でWiFiシリアル変換にもできたり…

ちなみに例によってシリアルデバイス側のボーレートとESP32に書き込んだSerial2のボーレートは合わせておかないと通信できない。Bluetooth SPPは仮想COMポートのボーレート設定ではデバイス側のボーレートまでは変更できない仕様っぽいので…
なのであとはRN42みたいにコマンドモードでボーレートとかIOをいじれたら便利そうだなぁ
Bluetooth SPPとBLEは同時に使用できる。ただしデバイス名が一緒になってしまう…
ESP-WROOM-32はRN42より安いのにいろいろ盛りだくさんだなぁ。

RN42と違ってESP32は5Vトレラントじゃないので5Vで駆動しているマイコンとかに接続するときはi2c用とかのレベルコンバータ使ったほうがいいかも。


2019年5月25日土曜日

BTS7960モータドライバを改造してみた。

とりあえずPWMで制御できたBTS7960だけど、電流検出機能がせっかくついているので使いやすいように改造してみた。 ついでにEN端子もまとめて更に使いやすくしてみた。
(Hブリッジとして使うならあんまり分かれている意味ないし…)

というのもこのBTS7960モータドライバ基板、電流検出のISピンが2つのICから別々に出ている。この端子はハイサイドの電流しか測れないのでこのままだと正転と逆転で別々のピンから電流をセンシングする必要がある。データシートのサンプルではHブリッジとして使う際にこのピンをまとめてしまっているのでまとめてしまう改造をしてみることにした。漏れ電流はほぼ無視できるだろうし回路的には問題なさそう。
ついでに抵抗値が高すぎるので1kΩに変更した。全部の抵抗が10kΩだったんだけど全部はずして交換してしまった。

PWMのプルダウンは100kΩ、ENはどっちもまとめてしまってから5.1kΩでプルダウン、電流検知抵抗もどっちもまとめてから1kΩプルダウン、Slew Rate設定は5.1kΩに変更した。
基本的にデータシートのHブリッジ参考回路と同じ配線で、ISとENをまとめた感じ。抵抗値は適宜変更した。ISは1kΩにしたことによって、1Aあたり120mVぐらいになったはず。

実際にモータを正転、逆転してみてISをモニタリングしてみると、テスターだと結構振れている。PWMで制御すると電流波形もそうなってしまうのでローパスフィルタが必要そう。フォーラムを覗くと10kΩと1uFで良さそうな感じ。でもこれはPWMの周波数によって変える必要がありそう。

そんでもってこのISピン、データシートからも分かる通りばらつきがすごい。正転と逆転でLとRのBTS7960の電流測定値が切り替わるわけなんだけど、同じぐらいの電流が流れているはずなのに結構値が違う。これはまとめたのが原因ではなくてセパレートしても同じ感じだった。これフィードバックに使えるのかな…
INA219とかACS724みたいな外付けの電流センサつけたほうが良さそうな気も…

EN端子はとりあえずまとめてしまっても使い勝手は問題なさそう。ENをずっとHighにしているとFast Decayってことなんだろうけど、結構いい感じに制御できる。Slow Decayを使うときはバラバラのほうが使い勝手が良いとかで分けてんのかなぁ…とりあえずまとめた状態でPWMぶっこんでもSlow Decay使えそうだけど。

まずはどのArduino対応ボードで試そうかな。UnoだとISの抵抗もう少し高いほうがいいかもしれないし、ESP32だとADCの美味しいところが難しそうな印象だし。Bluepillあたり良いのかもしれないなぁ

2019年5月18日土曜日

ESP32とBTS7960でモータを回してみた

前回はBTS7960の動作確認と熱対策をして、仕様を調べるところまでで終わってしまったので、今回はArduinoからPWMを出してモータを回してみた。
ArduinoのボードとしてはESP32搭載ボードを使用してみることに。これならPWMの周波数も高くできるし。Arduino UNOでも分周比を変えれば周波数を高められるんだけどちょうどほしいところができなさそう。BTS7960が25kHzまでだったので、20kHzぐらいで使いたいし。

とりあえずシリアルコンソールからコマンドを打ってPWMのDutyを変更できるようにしてみた。ESP32でPWMを使う場合はanalogWriteではなくてledcWriteを使うんだけど、これだとベース周波数も変更できるし、解像度も8ビット以外が使えるので便利。
周波数は20kHz、解像度は10bit(0~1023)にしてみた。
//ピンアサイン
#define EN 19
#define LPWM 22
#define RPWM 23

void setup() {
  //PWMタイマ設定
  ledcSetup(0, 20000, 10); //ch0,20kHz,10bit
  ledcSetup(1, 20000, 10); //ch1,20kHz,10bit

  //PWMタイマに出力PIN関連付け
  ledcAttachPin(LPWM, 0);
  ledcAttachPin(RPWM, 1);

  //ENピン初期化
  pinMode(EN, OUTPUT);

  //Serial初期化
  Serial.begin(115200);
}

void loop() {
  if (Serial.available() > 0) { // check serial
    char in = Serial.read();
    if (in == 'k') {
      digitalWrite(EN, LOW);
      Serial.println("Stop Motor");
    }else if(in == 'p'){
      int input = Serial.parseInt();
      Serial.println(input);
      Serial.println("PWM control");
      setMotor(input);
    }
  }
}

void setMotor(int pwm) {
  if (pwm == 0) { //ブレーキ
    digitalWrite(EN, HIGH);
    ledcWrite(0, 1023);
    ledcWrite(1, 1023);
  } else if (pwm > 0 && pwm <= 1023) {
    digitalWrite(EN, HIGH);
    ledcWrite(0, pwm);
    ledcWrite(1, 0);
  } else if (pwm < 0 && pwm >= -1023) {
    digitalWrite(EN, HIGH);
    ledcWrite(0, 0);
    ledcWrite(1, abs(pwm));
  }
}

ESP32とは19にL_ENとR_ENをどっちも接続し、22にLPWM、23にRPWM、VCCに3.3V、GNDにGNDを繋ぐ。今回はまだ電流フィードバックを試せる状態にしていないのでISはどっちも繋がなくてオッケー。(ISの抵抗変えないと危ないし、ローパスフィルタとか入れないといけないかも。)

サンプルプログラムを書き込んだらシリアルコンソールからbaudrate 115200で
p512とかp-512って打つとモータが回るはず。kを送信するとスタンバイモードになって、p0とかにすればブレーキが掛かるはず。ブレーキはオン抵抗が小さいハイサイドにしてみた。

ESP32は何も考えなくてもPWMの周波数をいい感じに設定できるから便利だなぁ
ただしちょっとADが使いにくそうな感じがする。バッテリモニタとかにならいいけど、下の方と上の方の精度が悪そう。

まぁ何にせよフィードバックなしでは簡単にモータが回せるのでBlynkとかと併用すればWiFiとかBluetoothのラジコンが簡単に作れちゃうな。

2019年5月12日日曜日

BTS7960モータドライバが届いた

540モータを回すにはL298Nあたりだと電流が足りないのでAliexpressでモータドライバを探していたところ、BTS7960を使ったモータドライバがお安くて良い感じだったのでポチってみた。5ドルちょいだった。

BTS7960自体はInfenionのNovalithICシリーズで、ワンチップのハーフブリッジらしい。これを2つ使えばフルブリッジとして使えるということで、このボードにはBTS7960Bが2つとSL74HC244D(3ステートバッファ)が乗っていた。抵抗は全部10kΩだった。
InfenionのHexFETシリーズとかもオン抵抗が低かったりしてモータドライバならInfenion強そうなイメージが。

基板はさすが5ドル品、リワーク品なのかICのハンダが手半田の雰囲気。ロジックICはリフローっぽいんだけれども。さすが43A流せるだけあってヒートシンクもでかい。

基板のサイズは50mmx50mmぐらい、穴ピッチは40mmx40mmなんだけど、結構際どいところにパターンが通ってるのでネジ止めするときは気をつけないと行けないかも。
樹脂ワッシャーを挟んで止めるとかしたほうが安全かも。

とりあえず動作確認。
VCCとL_ENとR_ENに5Vを入れて、L_PWMに5Vを入れてみるとモータが回った。R_PWMに5Vを入れてみるとちゃんと逆転したので行けそう。(Duty100%相当)
電圧は7Vぐらいから動きそう。データシート的にはフルブリッジで使うならピーク36Aぐらいまで使えるっぽい?Attiny85ぐらいのマイコンと組み合わせれば安価で30Aぐらいのラジコン用ESCが作れちゃうかも。

まずは回ることが確認できたので一件落着。リワーク品っぽい見た目だったので不安だったけど。
ためしにねじ2本で止まっているヒートシンクを剥がしてみると基板直付けだった…
これじゃこんなにでかいヒートシンクつけてる意味無いんじゃないかな…

とりあえずパーツクリーナーでフラックスをきれいにしてから絶縁タイプのCPUグリスを塗って見た。レジストはちゃんとした絶縁じゃないし、ヒートシンクの塗装も絶縁とはいえないような気がするので本当はサーマルパッドとかのほうがいいんだろうけど手持ちがなかったのでとりあえずこれで。一応テスターで測って抵抗値が出ないことは確認した。
あとで熱伝導シート買って交換しよ…

BTS7960のデータシートを見るとApplication Exampleのフルブリッジとして使うパターンの図では、INH(EN)とIS(電流検出)ピンが左右で接続されているが、このボードではL_ENとR_ENのようにバラバラにピンヘッダに出ているっぽい。
このあたりはデータシートのサンプルのように共通化してしまったほうが使い勝手が良さそう。

せっかく電流検出付いてるので電流フィードバックや電流リミット用に電流検出部を改造したいな。電流検出のISが正転と逆転で別のピンに出てしまうとADが2つ必要なので面倒だし。データシートのサンプル回路ではISをLとRで共通化してある。これは電流検知がハイサイド側にしかついていないので正転と逆転時はどちらかのISピンからしか電流が流れない(僅かなリーク電流を除く)ということらしい。FETのリーク電流は電流の測定オーダからするととても小さいから多分無視できるのだろうけど。
何にせよ電流検出の抵抗が10kΩは大きすぎる。ちなみにデータシートでよく出てくる1kΩにした場合は120mV/A。例えば最大20Aとして3.3V系のマイコンに接続するなら1.4kΩぐらいとか。ダイオードのクランプ回路とかツェナーを入れたほうがいいかもしれない…
電流測定っていうよりは電流フィードバック用なのかな。ISピンとハイサイドの電流比の範囲結構でかいし。

L_ENとR_ENも同様にデータシートのサンプル回路みたいに単純に同じピンで制御しちゃって良さそう。そうすると一般的なモータドライブICみたいにEN、IN1、IN2の3ピンで制御できちゃうし。このボードでわざわざISとENが分かれているのは単方向で2モータを使うときのためかな?今回はHブリッジとして使うので共通化してしまっても良さそう。

このモータドライバ、探していると何種類かバージョンがありそう。Arduinoのロゴが違ったり、ネジ穴のところの銅箔の逃しとか細かいところに違いがある感じがする。
あと抵抗値もプルダウンの抵抗値が30kのと10kのがあったり。コピー品なのかな。
ちなみにBTS7960はもうディスコンらしい…
新しいICが出ていて、IFX007Tだと40Vまで対応するっぽい。ピンコンパチでそのまま使えそう。

ISピン用に抵抗と、ローパスフィルタ用の部品でも手配しておこうかな。まずはPI制御で電流フィードバック試してみたい。
次回はArduinoでとりあえずPWMでモータを回せるようにしてみる。

2019年5月7日火曜日

Mini DisplayPort→HDMI2.0変換アダプタを買ってみた

MacBook Proで4Kディスプレイを使うために変換アダプタを買ってみた。
というのも現在所有しているMBPはLate 2013と結構古いのでHDMIも2.0に対応していなければ、miniDPなThunderbolt2ポートが2ポートあるのみ。
ディスプレイ側は標準サイズのDPがあるのだけれども、どうせケーブル買わないといけないのでデスクトップマシンと切り替えられるようにHDMI2.0で接続してみることに。


ちなみに一応HDMIポートはHDMI2.0に対応していないけれども4K30Hzであれば表示可能っぽい。

さてと変換アダプタの方だけれども、miniDPからHDMIに変換するにはパッシブタイプとアクティブタイプの変換アダプタがある。
パッシブタイプはデュアルモードDisplayPortとしてのDVIもしくはHDMIの信号を物理的に変換するので、HDMI1.4相当になってしまう模様。アクティブタイプはディスプレイポートからの信号を変換処理をしてHDMIにするので、アダプタがHDMI2.0に対応しているICを使っていればDPの出力と同じく4K60Hzが出力可能。

つまりアクティブタイプは高い。
でも見た目がほぼ同じなので気をつけなければいけなさそう。

ということでアクティブタイプをうたっていて4K60Hz対応って書いてあるものを購入してみた。Amazonで999円だった。
Aliexpressとかでも同じものが売っていたがむしろAmazon(しかも当日発送)のほうが安かったという…

いかにも4K60Hz出ますよと言わんばかりの外見。


接続は簡単、MBPのminiDPにこの変換アダプタをつないで、この変換アダプタとディスプレイ間をHDMI2.0ケーブルで繋げば良い。ちゃんとここもHDMI2.0ケーブルを使わないとうまく映らないこともあるらしい。同じ形状だけどスピードが早くなっているからなのかな?

しかしなぜかMBPで60Hzで認識されない。

どうやらOSバージョンなどによってはDPからHDMIに変換するときに30Hz制限がかかる場合がある模様。
その場合、SwitchResXのようなツールを使って強制的に変更してやらないといけないらしい。
ということでSwitchResXの体験版を入れてみた。

ツール側からは認識するっぽいので試しに設定してみた。

するとちゃんと60Hzでも認識される!
多少面倒だけど一応60Hzで使用することができた。
フリーウェアとかでないかなぁ…