2025年8月31日日曜日

12VからUSB PDの65Wを出力してみた。

 少し前にDC電源入力のUSB PD Charger基板を購入してみたんだけど、降圧しかできない仕様だったので65Wを出すには入力電圧が20Vより大きくないといけなかったのでフル性能がなかなか使えなかった。

たまたま昔購入した昇圧DC-DCコンバータを発見したので車のシガーソケットでノートPCを充電できないかということでやってみた。

注文履歴を見ると2013年10月ってなっていてなにに使ったかよくわからないけど5ドルで2つ購入していたうちの一つを発見。端子のネジも一個欠損していた。
OSKJの150W対応のDC-DCコンバータっぽい。コントローラICにはUC3843ANが乗っていた。これで12Vから22Vぐらいまで昇圧できれば、CKCS U1E互換基板で65Wまで出力できるようになるかな。Amazonで同じものを見つけたんだけど、12Vバッテリで19V 3.42A(65W)のノートPCを駆動させると温度が45℃ぐらいになるということだったので用途的にはちょうど良さそう。

端子のネジが一つないし、そもそもこの端子で大電流流すのはアレなので端子を取り外してケーブルを直結してみた。DC5521バージョンを購入したのに電源端子を外してしまってこっちも直結。

XPM52Cのほうの発熱が気になるので裏側にヒートシンクを装着できるようにはんだ付けの際はフラットにしておいた。ヒートシンク無しで65W出力すると100℃超えるらしいし。

昇圧電圧を22Vになるようにセットして、とりあえず12V 7.5Aヒューズを入れて12Vバッテリに繋いでみたけどちゃんとノートPCをつなぐとType Cからは20V出てるっぽい(モジュールの出力コンデンサをテスターで測定)

とりあえずあり物で12Vから65W(20V 3.25A)が出せるようになったので良いけども、アリエクとかで65W出力可能なシガソケ充電器が12-24V対応とかで売っているのでそっちを購入したほうが安上がりかも。Essager 120W Car Charger(FSJ-009)とかだと1500円ぐらいで、昇圧対応でPDは100Wまで行けるみたいだし。何よりアルミ製で放熱も安心だし…

このままでは実際に使いにくいのでケースに入れないと。

2025年8月25日月曜日

PCファンをUSB扇風機として使えるように整流板を作ってみた。

 以前余ったファンをUSBで使えるように、5Vから12Vに昇圧してファンガードを両面につけてUSB扇風機として使うようにしてみたのだけれども、やっぱり風量が足りない。ポータブルファンとかと比べると回転数に対しての風量が少ない気がする。

PC用のファンなので実は風量よりも風向きがあまり良くないのではないかということで調べてみると、AINEXから風の直進性を高めるアイテムが出ていたので試してみたかったのだけれども販売終了していたので同じようなものを作ってみた。

整流板としてはとりあえず形状は何でも良さそうではあるけどもオリジナルを忠実に再現してヘキサゴン形状にした。大きさもスペックから同じぐらいの大きさにしてみた。ファンと嵌合する部分の長さがわからなかったけど予想でこんな感じに。Onshapeフリープランなのでfan boosterで検索すれば見つけられるかも。

というわけで例によって3Dプリンタ持っている人にお願いしてプリントしてもらった。ファンと合わせるくぼみのせいで余計なサポートが付いてしまったようで申し訳ないけど。

これ実は反対面をサポートにしたほうが良かったのでは?と思ったけどもまぁとりあえずこれでも問題なさそう。

ファンに装着するとこんな感じ。オリジナルはきつかったみたいだけどそれを考慮してゆとりをもたせたおかげでいい感じに装着できた。
長さ方向はこんな感じ。オリジナルと同じぐらいの長さになってると思う。

効果の程は結構絶大で、ネジ止めせずにつけたり外したりして試してもかなり風の直進性が高まってることが感じられる。自分に風を向けていると今まではファンの回転数調整はいらないと思っていたが少し下げられるように回転数を調整したいぐらいに涼しい。このファンだと2mぐらいでも風が感じられるぐらいには直進性が増していた。

次は風量を調整できるようにしないと…

もう少し小さいファンで持ち手をつけてハンディーファンでも作れそう。

2025年8月3日日曜日

EEZ StudioとArduino IDEでGUIを作ってみた

 この前ESP32-S3を張り替えたJC4827W543Cだけど、ROMも8MBにアップグレードしたことだしEEZ StudioでGUIアプリを作ってみることに。逆にArduino IDEだけでGUI作るの大変そう。

まずはEEZ Studioのインストール。とりあえずWindows用のexeファイルをダウンロードしたらインストーラーに従ってインストールできた。
起動するとHomeが表示されるのでLVGLを選んで、Nameにプロジェクト名をいれて、LVGL VerisionはArduino IDEにインストールするLVGLバージョンに合わせて選択する。今回は最新版を使用した。プロジェクトの保存先は覚えておかないとuiフォルダの中身をArduinoのプロジェクトにコピーする時困るので気をつけないと。

プロジェクトを作成したらまずはSettingsでDisplay widthとheightをNV3041Aに合わせるために480と272に変更する。あとはBuildのところでLVGL includeをlvgl.hに変更しておく。Mainタブに戻っても最初に作られた画面の解像度は自動で修正されないのでこちらも同じ画面に修正した。とりあえず適当にボタンを追加してみた。

スパナのマークを押すとソースファイルがプロジェクトフォルダの中のuiフォルダに生成される。これをArduinoのプロジェクトフォルダにコピーしてやる感じ。

ということで次はArduino側のプロジェクトを作成する。lvglライブラリはEEZ Studioで指定したバージョンをArduino IDEからインストールしておく。他にArduino_GFXライブラリとタッチパネルのGT911用にTouchLibライブラリが必要だった。

inoファイルの中身は

#include <lvgl.h>
#include <Arduino.h>
#include <Arduino_GFX_Library.h>
#include "touch.h"
#include "ui.h"

#define SCREEN_WIDTH 480
#define SCREEN_HEIGHT 272

#define LCD_BL 1

Arduino_DataBus *bus = new Arduino_ESP32QSPI(45, 47, 21, 48, 40, 39);
Arduino_GFX *gfx = new Arduino_NV3041A(bus, GFX_NOT_DEFINED, 0, true);
static lv_color_t buf1[SCREEN_WIDTH * 40];

void my_flush_cb(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map)
{
    uint32_t w = (area->x2 - area->x1 + 1);
    uint32_t h = (area->y2 - area->y1 + 1);

    gfx->draw16bitRGBBitmap(area->x1, area->y1, (uint16_t *)px_map, w, h);

    lv_display_flush_ready(disp);
}

void my_touch_read(lv_indev_t *indev, lv_indev_data_t *data)
{
    if (touch_has_signal() && touch_touched())
    {
        data->state = LV_INDEV_STATE_PRESSED;
        data->point.x = touch_last_x;
        data->point.y = touch_last_y;
    }
    else
    {
        data->state = LV_INDEV_STATE_RELEASED;
    }
}

void backlight_init()
{
    pinMode(LCD_BL, OUTPUT);
    digitalWrite(LCD_BL, HIGH);
}

void lvgl_init_all()
{
    if (!gfx->begin()) {
        Serial.println("gfx begin failed!");
    }
    gfx->fillScreen(0x0000);
    backlight_init();

    touch_init(gfx->width(), gfx->height(), gfx->getRotation());

    lv_init();

    lv_display_t *disp = lv_display_create(SCREEN_WIDTH, SCREEN_HEIGHT);
    lv_display_set_buffers(disp, buf1, NULL, sizeof(buf1), LV_DISPLAY_RENDER_MODE_PARTIAL);
    lv_display_set_flush_cb(disp, my_flush_cb);
    lv_display_set_default(disp);
    lv_indev_t *indev = lv_indev_create();
    lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
    lv_indev_set_read_cb(indev, my_touch_read);
    lv_indev_set_display(indev, disp);
}

void setup()
{
    Serial.begin(115200);
    Serial.println("START");

    lvgl_init_all();
    ui_init();
    Serial.println("EEZ started");
}

void loop()
{
    lv_timer_handler();
    ui_tick();
    lv_tick_inc(5);
    delay(5);
}

こんな感じにしてみた。バックライトはとりあえず輝度固定。あとはタッチパネル用にtouch.hをDemoから頂戴してきてプロジェクトフォルダに放り込む。そんでもってEEZ Studioで生成したuiフォルダのhファイルとcファイルをすべて同じところに放り込む。

あとはビルドして書き込めば完成。最初なかなか映らなくて困っていたんだけど、loopのなかにlv_tick_inc(5);を入れ忘れいていただけだったorz。

とりあえずテスト画面が表示されたので次は各コンポーネントを試してみた。

まずはtextから。これは文字通りtextを表示させるものなんだけど、コンポーネントの設定で名前(GeneralのNameってところ)を入れておくとArduinoで関数を読み込むと表示を変えることもできる。

lv_label_set_text(objects.test, "Hello");

こんな感じでArduinoのどこかで上のように実行すればNameにtextって入れてあるtextの内容をHelloに書き換えれる。センサーの値を取ってきてそれをtextに表示するみたいなことも可能。

お次はButton。ButtonはEventsのところでイベントハンドラーを追加する。Clickedを選択して、Actionは新しいActionを作成してAction自体に名前をつける。あとはMainとかがあるタブの左側に<>User Actionsっていうタブがあるのでそこで先程作ったAction(今回はmovetotestを選択すると左の方にTipsがあって、それのコードをArduinoのコードに追加すると実行可能。

#include "actions.h"

void action_movetotest(lv_event_t *e) {
    //lv_scr_load(objects.test); 
    //Serial.println("Button");
    lv_label_set_text(objects.test, "Hello");
}

Actions.hをIncludeしてこんな感じでActionに対しての関数を追加する感じ。コメントアウトされてるけどlv_scr_loadを使えばtestっていうページを追加して表示したり、ボタンを押したらtextの内容を書き換えたり。

Buildをした後にArduinoのプロジェクトの中にコピーするのが面倒になったのでSettingsのDestination folderを直接指定してみた。これで忘れることがないはず…

EEZ Studioを使うと簡単にUIが作れるので便利かも。