諸々の記録

その時々 興味にある事について

BrainuxでMachiKaniaのプログラム開発環境構築(pcconnectカスタマイズ)

前回、BrainuxをリビルドしてUSB CDC ACMを有効にしたことで、MachiKaniaとのpcconnect接続ができるようになりました。

電子辞書 Brain のLinux (Brainux) をリビルドしてUSB CDC ACMを有効にする(Windows11 WSL2でクロスコンパイル)

今回はその続きで、MachiKania用のpcconnectをBrainux上で動かしつつ、BASICファイルの転送・実行・結果表示・リセット復帰までを自動化するよう改良してみました。

Raspberry Pi Picoで動作するMachiKania Type-Pと、SHARP Brain上で動作するBrainuxを組み合わせて、BrainuxからMachiKaniaのプログラムを開発できる環境を作っています。

MachiKaniaはBASICインタプリタではなく、BASICプログラムをその場でコンパイルして実行する仕組みになっています。(自動でコンパイルされる)

今回の目的は、

  1. Brainux上でBASICファイルを編集
  2. MachiKaniaへ転送 & コンパイル・実行
  3. 実行結果をBrainuxのターミナルで確認
  4. MachiKaniaをリセット(手動)
  5. 再度自動的にBASICを転送

という開発サイクルを、できるだけ簡単に繰り返せるようにすることです。

そのため、MachiKania用のPC接続プログラムpcconnectをBrainux上で動作させ、さらにUSB接続が切れた場合や、MachiKaniaをリセットした場合にも自動的に復帰できるよう(ChatGPTの力を借りてw)改良しました。


1. MachiKaniaのpcconnectの動作を確認

MachiKaniaにはPCとのファイル転送を行うためのpcconnectがあります。
詳細は下記

MachiKania type Pの開発環境 » 電子ブロック工房


Brainuxをリビルドして USB CDA ACMを有効化することで、このプログラムをBrainux上でコンパイルして動かすことができ、MachiKaniaへMACHIKAP.BASなどのBASICファイルを転送できるようになりました。

Brainux側ではUSB CDC ACMを使用しているため、MachiKaniaとの通信には /dev/ttyACM0 を使用します。

オリジナルの connect.c は、MachiKaniaから決められた16バイトのコマンドを受信すると、それに応答してファイルを転送するという構造でした。

基本的な通信シーケンスは次のようになっています。

MachiKania → Brainux

MACHIKAP

Brainuxから

OK

を返すと、MachiKaniaから

SENDCMDS

が送られてきます。

その後、Brainux側からディレクトリ変更、ファイル名、ファイルサイズ、ファイル本体などを送信します。

最終的には

DONEDONE

を送信し、MachiKaniaから

ALL DONE

が返ってくる。という流れです。
これを繰り返します。


2. 「MachiKaniaは何を送っているのか」を調べる

BrainuxからMahciKaniaにファイル転送はできるようになりました。
そして、これは偶然なのですが、何度かMachiKaniaでリセットを繰り返しているうちにMachiKaniaの画面で表示されるはずのPRINT文での表示がBrainux画面に表示されたことがあり、もしやと思いChatGPTと相談しながらMachiKaniaから何が送られてきているのかの解析を開始しました。

ChatGPTの指示のもと pcconnect にデバッグ処理を追加して、USBシリアルから受信したデータを記録して確認しました。

すると、MachiKaniaをリセットした後には、

MachiKania BASIC System
 Ver Phyllosoma 1.7.1.0
BASIC Compiler KM-1513 by Katsumi
LCD, File, & Keyboard systems by KENKEN

Compiling MACHIKAP.BAS
3848 micro seconds spent for compiling

といった文字列が送られてきていることが分かりました。

さらに、送信したプログラム(PRINT "HELLO MachiKania")の実行結果

HELLO MachiKania

もUSBシリアル経由で送られてきていることを確認。

つまり、「MachiKaniaのLCDに表示されている情報の一部を、Brainux側でもUSBシリアルから受信できる」ことが分かりました。

ここで重要なことが分かりました。

USB CDC ACMの通信では、

read(fd, buf, sizeof buf);

を1回呼んだからといって、必ず1つのメッセージが返ってくるわけではありません。

例えば、

MACHIKAP........

を受信した直後に、

MachiKania BASIC System

まで同時に受信することがあります。

逆に、1つの通信データが複数回のread()に分割される場合もあります。

そのため、read()したデータ = 1つのコマンド、と考えてしまうと、通信処理が不安定になります。

また、元のwait4command()は、受信したデータを16バイト単位のコマンドとして検索していました。

例えば、

char request[16];

に1バイトずつ入れて、

if (!strncmp(request,command,16))
    return;

という方法です。

これは基本的な通信には使えますが、1回のread()で、

MACHIKAP........
MachiKania BASIC System...

のように複数の情報を受信した場合、目的の16バイトを見つけたところで関数から戻ってしまい、その後ろに続いていたデータを取りこぼす可能性があります。

そこで今回の改修版では、

unsigned char g_rx_buffer[RX_BUFFER_SIZE];
int g_rx_length=0;

という受信バッファを追加しました。

受信したデータを一度バッファに保存し、その中から目的の16バイトコマンドを検索します。

コマンドを見つけても、その後ろに続くデータは消さずに残します。

これが今回の改修で重要なポイントの一つです。


3. MachiKaniaをリセットするとttyACM番号が変わる

さらに実際に使っていると、

/dev/ttyACM0

だったMachiKaniaが、リセット後に

/dev/ttyACM1

になることが稀にですがありました。

これはUSBデバイスが一度切断されて再接続されるためです。

そのため、/dev/ttyACM0 を一度開いたらそのデバイスをずっと使い続ける、という設計では不十分でした。

そこで改良版では、

/dev/ttyACM0
/dev/ttyACM1
/dev/ttyACM2
...
/dev/ttyACM9

を順番に探すようにしました。

これにより、MachiKaniaのリセット後にLinux側でttyACM0からttyACM1へ変わっても、自動的に再接続できます。

また、USBケーブルを抜いたりMachiKaniaをリセットしたりすると、シリアルデバイスが一時的に消えることがあります。

そこで通信待ちにはpoll()を使用しました。

poll(&pfd,1,100);

でシリアルポートの状態を監視し、POLLERR / POLLHUP / POLLNVAL などを検出した場合は、

  1. 古いファイルディスクリプタを閉じる
  2. /dev/ttyACM0~/dev/ttyACM9を探す
  3. 新しいシリアルポートを開く
  4. 通信を再開する

という処理を行います。

これによって、USB接続が一度切れても、プログラムを再起動せずに復帰できるようになりました。


4. ファイル転送後のMachiKaniaの出力を受信する

元のpcconnectではファイル転送が完了すると、「All done!」となりますが、ここでプログラムを終了するのではなく、そのままMachiKaniaから送られてくる文字を表示するようにしました。

例えば、

--- MachiKania output ---  Hit any key to continue.

MachiKania BASIC System
 Ver Phyllosoma 1.7.1.0
BASIC Compiler KM-1513 by Katsumi
LCD, File, & Keyboard systems by KENKEN

Compiling MACHIKAP.BAS
3848 micro seconds spent for compiling

HELLO MachiKania

というように、MachiKania側の実行結果をBrainuxのターミナルで確認できます。

ここで表示している「--- MachiKania output --- Hit any key to continue.」は、一時停止するためのプロンプトではありません。そのままMachiKaniaからの出力を表示し続けます。


5. BASICが無限ループしてもキー入力で戻れるようにする

この機能を作っていて、もう一つ重要な問題がありました。

例えば、

10 PRINT "HELLO"
20 GOTO 10

のようなプログラムをMachiKaniaで実行すると、いつまでもHELLOと出力され続けます。

そこでBrainux側では、MachiKaniaの出力を受信している最中でもキーボードを監視するようにしました。

Brainux側で何かキーを押すと、

Key pressed. Waiting for the next MachiKania reset...

と表示され、MachiKaniaからの出力表示を抜けます。

そして「Waiting for request...」に戻り、MACHIKAPという次のリセット要求を待ちます。

つまり、

  1. BASIC実行
  2. MachiKania出力を表示
  3. 無限ループしてもOK
  4. Brainuxでキー入力
  5. 次のMachiKaniaリセット待ち
  6. MachiKaniaをリセット
  7. BAS転送
  8. コンパイル・実行

という開発サイクルになりました。


6. 最終的な動作

最終版では、Brainux上でプログラムを起動すると、

Opening INI file...
found
Serial port: /dev/ttyACM0
Transfer files in : machikap/

Transfer following files:
machikap/MACHIKAP.BAS

open serial port...opened as 5
Waiting for request...

という状態になります。

MachiKaniaをリセットすると、

Request detected!
Waiting for SENDCMD...OK
...
All done!

となり、続いて

--- MachiKania output ---  Hit any key to continue.

MachiKania BASIC System
 Ver Phyllosoma 1.7.1.0
BASIC Compiler KM-1513 by Katsumi
LCD, File, & Keyboard systems by KENKEN

Compiling MACHIKAP.BAS
...
HELLO MachiKania

と表示されます。

何かキーを押すと、

Key pressed. Waiting for the next MachiKania reset...

となり、再びリセット待ちになります。

この状態でMachiKaniaをリセットすれば、再度BASファイル転送から自動的に始まります。


7. 確認手順

今回の環境を再現する場合は、次の順番で確認できます。

① MachiKaniaを接続する

BrainuxとMachiKaniaをUSBで接続します。

まず、

ls -l /dev/ttyACM*

でUSB CDC ACMデバイスを確認します。例えば /dev/ttyACM0 が表示されます。

② 転送するBASICファイルを用意する

connect.iniの設定に合わせたディレクトリにMACHIKAP.BASを置きます。

ls machikap/

としてMACHIKAP.BASが確認できればOKです。

③ コンパイル

gcc -O2 -Wall -o connect_receive_wait_reconnect connect_receive_wait_reconnect.c

④ プログラムを起動

./connect_receive_wait_reconnect

すると「Waiting for request...」となります。

⑤ MachiKaniaをリセット

MachiKaniaをリセットすると「Request detected!」となり、BASICファイルの転送が始まります。転送完了後「All done!」となります。

⑥ MachiKaniaの実行結果を確認

続いて「--- MachiKania output --- Hit any key to continue.」の後ろにMachiKaniaの起動メッセージ、コンパイル結果、BASICプログラムの出力などが表示されます。

⑦ キー入力で次のリセット待ちへ

MachiKaniaの出力表示中にBrainux側で何かキーを押します。

Key pressed. Waiting for the next MachiKania reset...

となれば成功です。そのままMachiKaniaをリセットすると、再びBASファイル転送が始まります。


8. 通信プロトコル

今回使用している通信プロトコルは、元のpcconnectに記載されているものを基本的に維持しています。

概要は次の通りです。

MachiKania → Brainux

MACHIKAP + 8個のBS

↓

Brainux → MachiKania

OK + 4組のOK/BS

↓

MachiKania → Brainux

SENDCMDS + 8個のBS

↓ ファイル転送(CD: / CP: / SIZE: / SENDFILE / BASICファイル本体を256バイト単位で送信 / DONEDONE)

↓

ALL DONE

という流れです。

今回の改修では、この既存プロトコルを変更するのではなく、USB切断・再接続への対応、受信バッファ、MachiKania出力の受信、キー入力による復帰を追加しています。


9. 改修版プログラム(connect_sndrcv.c)

改修したプログラムはGitHubにアップしています。

GitHub - momoji-san/mk_connect_sndrcv: MachiKania file send and receive · GitHub

( [<>Code] ボタンをクリックして Download ZIP でダウンロード)

ダウンロードした zipファイルの中にある connect_sndrcv.c をBrainに転送して、下記でコンパイルしてください。(実行ファイルを b.out とした場合)

gcc -O2 -Wall -o b.out connect_sndrcv.c


基本的な使い方はオリジナルのconnect.c(a.out)と同じですが、上記 GitHubに使い方を記載しています。


まとめ

今回の改良で、MachiKaniaとBrainuxの関係が、「単にBASICファイルを転送するだけ」から、「BrainuxをMachiKaniaの開発環境として使う」ところまで可能になりました。

そして、MachiKaniaからプログラムの実行結果をターミナルに表示できることが確認できたので、AIを利用した最近はやりの「バイブコーディング」も将来的には可能になるかもしれません。

下記、このプログラムの実行動画です。
動画では、ターミナルを Alt+矢印キーで切替えて、転送するプログラムを修正しています。

 

 

BrainuxでPW-G5200のサブディスプレイを操作してみる(タッチ操作andバックライトON/OFF)

前回は、PW-G5200のサブディスプレイへBrainuxから表示ができることを確認して、PythonとC言語でサブディスプレイに表示をするプログラムを作成してみました。

 今回は、このサブディスプレイのタッチパネルの機能がBrainuxのプログラムで認識できるかを確認して簡単なプログラムを作成してみます。

作成したプログラムは、サブディスプレイのタッチ操作によってバックライトをON/OFFするもので、デーモン(バックグラウンド実行するプログラム)として動作させて、いつでもON/OFFできるようにし、最終的にはBrainuxを起動するだけで自動的にこの機能が使えるように設定します。


1.作業用フォルダを作る

専用の作業フォルダを作成して一連の作業を行っていきます。
次のコマンドを入力します。

mkdir -p ~/subdisp

続いて、

cd ~/subdisp

 


2.タッチパネルの入力先を確認する

ChatGPTの指示するまま確認してみたところ、PW-G5200では、タッチパネルは /dev/input/event0
から読み取りできるということが分かりました。

タッチパネルの動作確認用プログラムを作成して、実際のタッチ座標を確認します。


3.タッチ確認プログラムを作って確認

次のコマンドを入力します。

nano touchtest.c

以下の内容を入力して保存します。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>

int main(void)
{
    int fd;
    struct input_event ev;
    int x = 0, y = 0, pressure = 0, touch = 0;

    fd = open("/dev/input/event0", O_RDONLY);
    if (fd < 0) {
        perror("open");
        return 1;
    }

    while (1) {
        if (read(fd, &ev, sizeof(ev)) != sizeof(ev))
            continue;

        if (ev.type == EV_ABS) {
            if (ev.code == ABS_X)
                x = ev.value;
            else if (ev.code == ABS_Y)
                y = ev.value;
            else if (ev.code == ABS_PRESSURE)
                pressure = ev.value;
        } else if (ev.type == EV_KEY && ev.code == BTN_TOUCH) {
            touch = ev.value;
        } else if (ev.type == EV_SYN) {
            printf("TOUCH=%d  X=%d  Y=%d  PRESSURE=%d\n",
                   touch, x, y, pressure);
            fflush(stdout);
        }
    }

    close(fd);
    return 0;
}

保存方法は、Ctrl+O → Enter → Ctrl+X です。

作成したプログラム touchtest.c をコンパイルします。

gcc -O2 -Wall -o touchtest touchtest.c

エラーが出なければ成功です。

次に、

./touchtest

と入力します。

サブディスプレイ画面をタッチペン等でタッチすると、例えば次のように表示されます。

TOUCH=1 X=3881 Y=2024 PRESSURE=2288


画面からタッチペンを離すと TOUCH=0 ... と表示されます。

実際にサブディスプレイのいろいろな場所をタッチして、X座標が変化することを確認しました。

PW-G5200では、実測値としておおよそ左端 X ≒ 228、右端 X ≒ 4015 となりました。

したがって、今回は X >= 3500 を「サブディスプレイの右側」として扱うことにします。

この範囲はちょうどサブディスプレイの音量 大/小 とか バックライトの表示がある場所になります。


確認が終わったら、Ctrl+C でプログラムを終了します。


4.バックライト制御を確認する

次に、サブディスプレイのバックライトの制御方法について確認しました。
その結果、サブディスプレイのバックライトは、次のファイルで制御できることを確認しました。

/sys/class/backlight/backlight@1/brightness


最大値は3で、0 は OFF です。 

例えば、

echo 3 | sudo tee /sys/class/backlight/backlight@1/brightness

と入力すると、サブディスプレイのバックライトが最大の明るさで点灯します。

これで、タッチパネルとバックライトの両方を個別に動作することを確認できました。


5.タッチでバックライトをON/OFFするプログラムを作る

タッチ操作とバックライトの操作の方法が分かったので両方を組み合わせます。

プログラム fbtouchbl.c を作成します。

nano fbtouchbl.c

以下の内容を入力して保存します。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <string.h>
#include <stdlib.h>

#define EVENT_DEV "/dev/input/event0"
#define BL_PATH   "/sys/class/backlight/backlight@1/brightness"
#define RIGHT_X   3500

static int get_brightness(void)
{
    FILE *fp = fopen(BL_PATH, "r");
    int v = 0;
    if (fp) {
        fscanf(fp, "%d", &v);
        fclose(fp);
    }
    return v;
}

static void set_brightness(int v)
{
    FILE *fp = fopen(BL_PATH, "w");
    if (fp) {
        fprintf(fp, "%d\n", v);
        fclose(fp);
    }
}

int main(void)
{
    int fd;
    struct input_event ev;
    int x = 0, y = 0, touch = 0;
    int prev_touch = 0;
    int bl_on = 1;

    fd = open(EVENT_DEV, O_RDONLY);
    if (fd < 0) {
        perror("open event");
        return 1;
    }

    /* 現在の状態を取得 */
    bl_on = (get_brightness() > 0) ? 1 : 0;

    while (1) {
        if (read(fd, &ev, sizeof(ev)) != sizeof(ev))
            continue;

        if (ev.type == EV_ABS) {
            if (ev.code == ABS_X)
                x = ev.value;
            else if (ev.code == ABS_Y)
                y = ev.value;
        } else if (ev.type == EV_KEY && ev.code == BTN_TOUCH) {
            touch = ev.value;
        } else if (ev.type == EV_SYN) {
            /* 押した瞬間だけ判定(押しっぱなしで連続切替しない) */
            if (touch == 1 && prev_touch == 0) {
                if (x >= RIGHT_X) {
                    bl_on = !bl_on;
                    set_brightness(bl_on ? 1 : 0);
                    printf("X=%d → backlight %s\n", x, bl_on ? "ON" : "OFF");
                    fflush(stdout);
                }
            }
            prev_touch = touch;
        }
    }

    close(fd);
    return 0;
}

保存して終了します(Ctrl+O → Enter → Ctrl+X)。


プログラムをコンパイルします。

gcc -O2 -Wall -o fbtouchbl fbtouchbl.c

エラーが出なければ成功です。


6.実際に動かしてみる

次を入力して作成したプログラムを実行します。

sudo ./fbtouchbl

プログラムが起動したら、サブディスプレイの右側をタッチします。

右側をタッチ → バックライト OFF
もう一度右側をタッチ → バックライト ON

このようにON/OFFが切り替われば成功です。

このプログラムは、タップしたままでは切り替わらないようになっています。

確認が終わったら、Ctrl+C で終了できます。



7.Brainux起動時に自動起動するように設定

サブディスプレイをタップしてバックライトをON/OFF出来るようになりましたが、このままでは、都度 sudo ./fbtouchbl を実行しないといけませんので、このプログラムをバックグラウンドで自動的に起動するようにします。

PW-G5200のBrainuxでは、システムの起動に「systemd」が使われています。

確認するには、

ps -p 1 -o pid,comm,args

と入力します。

次のように表示されればOKです。

PID COMMAND COMMAND
1 systemd /sbin/init



8.systemdのサービスを作る

システム起動時に自動実行するようにするために、systemdのサービスを作ります。

sudo nano /etc/systemd/system/fbtouchbl.service

以下の内容を入力します。

[Unit]
Description=PW-G5200 Sub Display Touch Backlight Control
After=graphical.target

[Service]
Type=simple
ExecStart=/home/user/subdisp/fbtouchbl
Restart=always
RestartSec=1

[Install]
WantedBy=graphical.target

保存して終了します(Ctrl+O → Enter → Ctrl+X)。

次に、sysytemdに設定を読み込ませます。

sudo systemctl daemon-reload

自動起動を有効にします。

sudo systemctl enable fbtouchbl.service

これで、Brainuxを起動したときに自動的にプログラムが起動するようになります。

再起動する前に、動作を確認します。

sudo systemctl start fbtouchbl.service

次に、

systemctl status fbtouchbl.service

と入力します。

Active: active (running) のように表示されれば正常です。

ここまでできれば、sudo ./fbtouchbl を実行する必要はありません。

サブディスプレイの右側をタッチすると、ON → OFF → ON → OFF ... と切り替わります。


9.Brainuxを再起動して確認

Brainuxを再起動してみます

sudo reboot


Brainuxが起動したら、ターミナルから何も実行せずに、サブディスプレイの右側をタッチします。

バックライトがON/OFFすれば成功です。

完成後の動作

最終的には次のようになります。

PW-G5200の電源を入れる
  ↓
Brainuxが起動
  ↓
fbtouchblが自動起動
  ↓
バックグラウンドで待機
  ↓
サブディスプレイ右側をタッチ
  ↓
バックライトON/OFF


動作しなくなった場合

サービスの状態を確認します。

systemctl status fbtouchbl.service

詳しいログを見る場合は、下記。

journalctl -u fbtouchbl.service --no-pager

 

自動起動を停止したい場合

自動起動を無効にするには、

sudo systemctl disable fbtouchbl.service

と入力します。

現在動作しているプログラムも停止する場合は、下記。

sudo systemctl stop fbtouchbl.service

 


これで、PW-G5200のサブディスプレイ右側をタッチするだけで、バックライトをON/OFFできるようになります。

さらに、Brainux起動時にプログラムが自動的に起動するため、普段はコマンドを入力する必要もありません。

前回投稿のように、プロガムからサブディスプレイの表示を変えることが出来るようになったので、必要に応じてバックライトをON/OFF出来るようになって便利になりました!



電子辞書 Brain のLinux (Brainux)でPW-G5200のサブディスプレイに表示をしてみる

シャープの電子辞書Brainを入手してBrainuxを動かして色々試しているのですが、Brainの電池モデルも欲しくなり、PW-G5200を購入しました。


このPW-G5200ですが、電池駆動というだけでなくてキーボードの手前にサブディスプレイがあるのが特徴です。

最初は、このサブディスプレイはBrainuxからは使えずバックライトも消せないと思っていたので、分解してサブディスプレイの配線を抜こうとまで思っていました。

ですが、X で keybase.io/yanorei32 さんから、このサブディスプレイのバックライトを消す(というか制御する)プログラム(下記)を教えてもらいBrainux上からサブディスプレイが制御できると知り、さらに、AI (ChatGPT) に手伝ってもらって(てか、全面的にやってもらってw)Brainux上のプログラムからサブディスプレイへの表示ができるようになったので、確認した手順も含めて記事にしました。



結論から言うと、Brainuxのカーネルがすでに brain-st7586drm というframebufferドライバを提供してくれているので、SPIを直接叩く必要はなく、/dev/fb1 に普通に書き込むだけでサブディスプレイに表示できることが分かりました。

手順は下記になります。


1. サブディスプレイの framebuffer を確認

まず、

cat /proc/fb

を実行します。

今回のPW-G5200では、

0 brain-2gdrmfb
1 brain-st7586drm

となります。つまり、

  • /dev/fb0 → メインディスプレイ
  • /dev/fb1 → サブディスプレイ

brain-st7586drm がPW-G5200のサブディスプレイ用ドライバです。

さらに、

cat /sys/class/graphics/fb1/name

を実行して、

brain-st7586drm

となることを確認しました。

 


2. サブディスプレイのサイズを確認

Brain wiki などを見ればあるのですが、ちゃんとBrainuxで認識できるのかを確認。

cat /sys/class/graphics/fb1/virtual_size

これを実行した結果

240,120

となったのでサブディスプレイは、想定通り 240 × 120 ドット です。さらに、

cat /sys/class/graphics/fb1/bits_per_pixel

で、

32

となります。

つまり、Linux framebufferとしては

1ピクセル = 4バイト (8ビット x 4バイト = 32)

として扱います。

したがって全画面のデータサイズは、

240 × 120 × 4 = 115200 bytes

です。


3. /dev/fb1 にアクセスできることを確認

サブディスプレイへの権限を確認します

ls -l /dev/fb1

を実行すると、

crw-rw---- 1 root video ... /dev/fb1

となるとなりました videoグループに権限が付いています。

自分が video グループに入っているか、

id

で確認します。

groups=1000(user),44(video),100(users)

のように表示され video が含まれてるので、通常は sudo なしでアクセスできます。


4. Pythonから framebuffer にアクセスしてみる

BrainuxではPythonが使えるので、まずPythonで動作確認してみます。

python3

を実行し、以下を1行ずつ入力します。

f = open("/dev/fb1", "r+b", buffering=0)
f.write(b"\xff" * 115200)
f.close()

この操作で画面のバッファ全体をエラーなく書き換えられることを確認できましたが、この時点ではサブディスプレイの表示は変わらないため、実際に表示するにはまだ他に手順が必要です。



5. framebufferからサブディスプレイ表示を更新

CatGPTの指示のもと、いろいろ調べたところ、今回対象としているサブディスプレイの ioctl のリクエストコードは

FBIOGET_VSCREENINFO = 0x4600
FBIOPAN_DISPLAY     = 0x4606

ということが分かりました。
なので、framebuffer に表示したいデータを書き込んだあとに、下記を実行することで実際にサブディスプレイへの表示を行います。

# DRMに「表示を更新して」と通知
vinfo = bytearray(fcntl.ioctl(
    fb,
    FBIOGET_VSCREENINFO,
    bytes(160)
))

fcntl.ioctl(fb, FBIOPAN_DISPLAY, vinfo)




6. 四角を表示してみる

これで、サブディスプレイへの表示の方法が分かったので、まず、Pythonで簡単な図形を表示してみます。

中央付近に黒い四角を描きます。

vi subdtest.py

で subdtest.py に下記を記述します。

import fcntl

WIDTH = 240
HEIGHT = 120
FBIOGET_VSCREENINFO = 0x4600
FBIOPAN_DISPLAY = 0x4606

fb = open("/dev/fb1", "r+b", buffering=0)

# XRGB8888 framebuffer
buffer = bytearray(b"\xff" * (WIDTH * HEIGHT * 4))

# ここでbufferを書き換えて絵を描く
x0,y0,x1,y1=80,40,160,80
p=bytes([0,0,0,0])
[buffer.__setitem__(slice((y*WIDTH+x0)*4,(y*WIDTH+x1)*4),p*(x1-x0)) for y in range(y0,y1)]

fb.write(buffer)

# DRMに「表示を更新して」と通知
vinfo = bytearray(fcntl.ioctl(
    fb,
    FBIOGET_VSCREENINFO,
    bytes(160)
))
fcntl.ioctl(fb, FBIOPAN_DISPLAY, vinfo)

fb.close()


ファイルを保存したら、下記を実行

python3 subdtest.py

無事表示に成功!!


これで、Brainuxのプログラムからサブディスプレイに図形を描くことができました。

 



ここまでで、Brainuxから PythonのプログラムでPW-G5200 のサブディスプレイへの表示する方法が分かりましたが、 この方法で BMPファイルを読み込んでサブディスプレイ煮表示する C プログラムを ChatGPT に作成してもらったので、 GitHub で公開しました。


下の写真は、このプログラムを使って、Brainux のキーアサインをBMPファイルにしたものを表示しています。
このBMPファイルを、サンプルとしてGitHubにアップしておきました。
alias を使って表示する内容を切り替えたりして、いろいろ応用できそうですね。



電子辞書 Brain のLinux (Brainux)でUSB WiFiアダプタ WI-U2-433DM も使えるようにしてみた

先日、バッファローのWLI-UC-GNMでBrainuxからWiFi接続できるようにしましたが、手持ちのもう一つのUSB WiFiアダプタ バッファローWI-U2-433DM も使えるようにしてみました。

前回のWLI-UC-GNMの記事はこちら。
電子辞書 BrainのLinux (Brainux) でUSB wifiアダプタ WLI-UC-GNM を使う - 諸々の記録

WLI-UC-GNM はBrainのUSBに接続しただけでBrainuxでデバイスとそては認識しましたし、ドライバもバイナリがネットでダウンロードできたのであまり手間がかかりませんでしたが、WI-U2-433DM の方はBrainのUSBに接続してもデバイスとして認識しません。


WLI-UC-GNM で使っていればよいのですが、WLI-UC-GNM はWifiに接続して使っているとやけどするほど熱くなるので、できれば WI-U2-433DM の方を使いたくてAI(Grok)に相談しながらWifi接続にトライしたら、なんとかWifi接続できましたので記事にします。

WI-U2-433DMはRealtek RTL8811AUチップセットのアダプタです。
このチップセットのドライバはバイナリでは見つからないので、ソースからコンパイルする必要があります。
Brainux実機は非力なので、ドライバは先にWindows11のWSL2上でクロスコンパイルしてから実機に持っていきました。

今回使ったWSL2の環境は下記の記事で構築したものです。
電子辞書 Brain のLinux (Brainux) をリビルドしてUSB CDC ACMを有効にする(Windows11 WSL2でクロスコンパイル) - 諸々の記録


1. WSL2上でドライバをクロスコンパイル

Brainux実機上でドライバをビルドするのはメモリやCPUの制約で厳しいので、先にWindows11のWSL2(Ubuntu)環境でクロスコンパイルします。

WSL2のUbuntuターミナルを開いて、以下を実行します。(スタートメニューからUbuntuで検索して実行)

git clone https://github.com/morrownr/8821au-20210708.git
cd 8821au-20210708

クロスコンパイル用に環境変数を設定してビルドします(Brainuxのアーキテクチャに合わせてarmを指定)。

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make clean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- KSRC=/home/user/buildbrain/linux-brain -j$(nproc)

ビルドが成功すると 8821au.ko が生成されます。これをWindows側から取り出せるようにコピーしておきます。
WSLのUbuntuからは /mnt/c/ が Windows の C: ドライブなので、C:\tmp にコピーする場合は下記のようにします。

cp 8821au.ko /mnt/c/temp/

(パスは環境に合わせて変更してください。WindowsのエクスプローラーからUbuntuのフォルダ \\wsl.localhost\... 経由でも取り出せます)

 


2. Brainux実機側での準備

PCにUSB接続してインターネットが使える状態にしておきます(sudo brain-config を実行してUSBモードをペリフェラルに変更して再起動)。

USBケーブルでPCに接続してインターネット接続する方法は下記を参照

電子辞書 Brain でLinux (Brainux) を動かしてみる(インストール~ネット接続) - 諸々の記録

 

必要なパッケージを入れます。

sudo apt update
sudo apt install -y wpasupplicant ifupdown

 


3. クロスコンパイルしたドライバをBrainuxにコピーしてインストール

WSL2で作った 8821au.ko をBrainuxのmicroSD経由(WindowsPCにmicroSDカードを差したときに参照できるFAT32領域 Brainuxでは /boot )などでコピーし、適切な場所に配置します。
メモ: Brainuxのカーネルビルドをして zImage を入れ替えるとこの設定がリセット
されるので、この部分だけ再実行必要

sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/wireless
sudo cp 8821au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/
sudo depmod -a
sudo modprobe 8821au

これでドライバがロードされます。
(sudo depmod -a で WARNING が表示されるが大丈夫)
下記を実行して再起動後も自動で読み込まれるようにしておくと便利です。

echo "8821au" | sudo tee -a /etc/modules

インストール後、USBモードをホストモードに戻して再起動し、給電付きOTGアダプタ経由でWI-U2-433DMを接続します。

ip a や lsusb で認識されているか確認してください。インターフェース名は wlxoooooooooooo のような形になります。(oooooooooooo はMACアドレス)


4. 設定ファイルの作成(固定IP + 自動接続)

インターフェース名を確認したら、/etc/network/interfaces を編集します。
(BrainをPCに接続してインターネット接続している場合は、再度USBのモードをペリフェラルに変更してPCのTera Termから下記作業をして、終わったらUSBのモードをホストモードに戻してください)

sudo nano /etc/network/interfaces

以下の内容を追加・修正します(インターフェース名とIPなどは自分の環境に合わせてください)。

auto lo
iface lo inet loopback

auto wlxoooooooooooo
iface wlxoooooooooooo inet static
    address 192.168.xxx.xxx
    netmask 255.255.255.0
    gateway 192.168.xxx.xxx
    dns-nameservers 8.8.8.8 1.1.1.1
    wpa-ssid "あなたのSSID"
    wpa-psk "あなたのパスワード"

address に 本機に設定したい IPアドレス
geteway にWifi親機のIPアドレス
保存して終了(nanoなら Ctrl+O → Enter → Ctrl+X)


5. 手動接続テスト

一度手動で上げてみます。

sudo ifdown wlxoooooooooooo 2>/dev/null
sudo ifup wlxoooooooooooo

確認コマンド:

ip a show wlxoooooooooooo
ping -c 3 8.8.8.8

指定した固定IPが付いていて、pingが通ればOKです。


6. 再起動して自動接続を確認

sudo reboot

起動後にもう一度確認します。

ip a show wlxoooooooooooo
ping -c 3 8.8.8.8

固定IPで接続できていれば完了です。


これでWLI-UC-GNMに続いてWI-U2-433DMも使えるようになりました。RTL8811AUはドライバを別途クロスコンパイルする必要がありましたが、WSL2の環境を使えば比較的簡単にドライバが作成できました。

これでWI-U2-433DMが使えるようになりました。

私はこのWI-U2-433DMを2つ持ってて、WLI-UC-GNMと合わせてUSB Wifiアダプタを3つ持っていて、BrainはPW-H7800とPW-SH2とPW-G5200で3台持ってるので、それぞれに1つずつ専用で使える様になりました。




電子辞書 Brain のLinux (Brainux) をリビルドしてUSB CDC ACMを有効にする(Windows11 WSL2でクロスコンパイル)

これまで電子辞書BrainにBrainuxを入れて、各種初期設定やPicoへのuf2書き込みまでやってきました。

電子辞書 Brain でLinux (Brainux) を動かしてみる(各種初期設定)
電子辞書 Brain でLinux (Brainux) を動かしてみる(インストール~ネット接続)
電子辞書 BrainのLinux (Brainux) からRaspberry pi picoにファームウエア(uf2)を書込む


Brainuxを使う用途としてMachiKaniaとの連携があるのですが、Brainux は最小限の構成になっているので、USBで接続する機器を使おうとしてもドライバーが無くて使えないケースがあります。

私がMachiKaniaとの接続関連で確認したところ、pcconnect接続で必要な USB ACM(CDC ACM) のドライバーがありませんでした。
また、

MachiKania のキー入力をPCのキーボードでできる基板の制作 - 諸々の記録

で使ったシリアル変換IC CH340 のドライバーもありませんでした。

このように、Brainuxは容量削減のために最小構成になっているのでBrainuxをインストールしたデフォルトの状態だと使えないドライバがあるのですが、設定を書き換えてリビルドすれば使える様になるものもあるので、今回はBrainuxをリビルドしてUSB ACM(USB CDC-ACMドライバ)を使える様にしてみて成功したので記事にしました。

Brainuxではマシンも非力でメモリなども少なくBrain実機上でのリビルドは難しいため、Windows11に WSL2(Windows標準のバーチャルマシン)をインストールし、WSL2上にUbuntuをインストールして、そのUbuntu上でBrainuxをビルド(クロスコンパイル)します。

WSL2+Ubuntuのインストールは下記が大変参考になりました。
この記事のまま作業を進めればUbuntuがWindows11上で使えるようになります。

私のPCの環境ですと、上記で紹介されている「方法1」の方ではUbuntuのインストールまでできず、「方法2」の手順でUbuntuがインストールできました。


1. Windows 11 で WSL2+Ubuntu をインストールする

Windows 11なら、管理者権限でPowerShellを起動してWSL2およびUbuntuをインストールしていきます。

手順

  1. 管理者としてPowerShell(またはターミナル)を起動
    スタートメニューで「PowerShell」を検索 → 右クリック → 「管理者として実行」
  2. 次のコマンドを実行します
wsl --install

インストールが終わったら再起動を求められますので、再起動します。


再度、PowerShell を管理者として実行し下記コマンドで、インストール可能なディストリビューションを確認します。

wsl --list --online

Ubuntu-22.04があるのを確認して次のコマンドでインストールを実行します。

wsl --install -d Ubuntu-24.04

画面にインストールの進行状況が表示され、完了すると、ユーザ名とパスワードの設定になるので、(Windowsのユーザ名/パスワードでなくUbuntu用の)ユーザ名とパスワードを設定したらUbuntuのインストールは完了です。
(ユーザ名 はデフォルトでは user )

これでWindows PC上でUbuntuが使える環境ができました。
今後は、スタートメニューからアプリの検索で Ubuntu を検索してクリックすればUbuntuのターミナル画面(黒い画面)が表示されます。

 

補足
・仮想化がBIOS/UEFIで無効になっているとエラーになることがあります。その場合はBIOSでIntel VT-x / AMD-Vを有効にしてください。
・すでにWSLが入っている場合は wsl --install -d Ubuntu-22.04 だけでも追加インストールできます。

 


2. ビルドに必要なパッケージをインストール

Ubuntu 22.04のターミナルを開いて、以下を実行します。

sudo apt update
sudo apt install -y build-essential bison flex libncurses5-dev \
  gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf libssl-dev bc lzop \
  qemu-user-static debootstrap kpartx libyaml-dev python3-pyelftools git

 


3. buildbrain をクローン

Brainuxのビルド環境をgitからクローン(ダウンロード)します。

git clone --recursive https://github.com/brain-hackers/buildbrain.git

結構時間がかかりますが、完了するまで待ちます。
クローンが完了したら、作業ディレクトリは
/home/ユーザー名/buildbrain
になるので(ユーザー名 はデフォルトでは user )

cd /home/ユーザー名/buildbrain

でカレントディレクトリを移動しておきます。


4. デフォルト設定を生成

make ldefconfig

5. カーネル設定を変更してCONFIG_USB_ACMを有効にする

ここまでで WSL2上のUbuntuでBrainuxをリビルドする環境が構築できましたので、カーネル設定の変更を行います。

設定ファイルを編集します。

vi linux-brain/.config

(エディタに nano を使う場合は nano linux-brain/.config )

次の行を探して変更します(私の環境では 3113行目にあった)
( 検索は vi の場合 /   nanoの場合 Ctrl+W )

# CONFIG_USB_ACM is not set

これを ↓ こう書き換える

CONFIG_USB_ACM=y

保存して終了します。


6. カーネルをビルド

make lbuild

これも結構時間がかかるが、完了するまで待つ。
成功すると以下のファイルが生成されます

  • linux-brain/arch/arm/boot/zImage
  • linux-brain/arch/arm/boot/dts/*.dtb

ここまでで、WSL2 (Ubuntu) での作業は終了です。


7. BrainuxのSDカードにコピー

  1. Brainuxの起動用microSDカードをPCに挿す
  2. 生成された zImage と必要な xxxxxxx.dtb をmicorSDカードに上書きコピーする

WSL2(Ubuntu)で作成されたファイルはWindowsのエクスプローラーから下記のパスでアクセスできます。
コピー元のパス(windowsのエクスプローラーでのパス)

\\wsl.localhost\Ubuntu-22.04\home\user\buildbrain\linux-brain\arch\arm\boot\
\\wsl.localhost\Ubuntu-22.04\home\user\buildbrain\linux-brain\arch\arm\boot\dts\

※ユーザー名がuser以外の場合はuserの部分を適宜置き換えてください。
※上記のdtsフォルダには多数のファイルがありますが、sdカードにコピーするのは下記の9つになります

BrainuxのSDカードにも同じ名前のファイルがあるはずなので、それを上書きする形になります。


 

上記でファイルを上書きしたmicroSDカードをBrainに挿してBrainuxを起動します。
これでUSB ACM(CDC ACM)が有効になったBrainuxカーネルが使えるようになります。

今回の目的である、MachiKaniaに接続してpcconnectでのファイル転送もうまくいきました。(写真のBrainの画面にあるようにポートは /dev/ttyACM0 )

Linuxでの pcconnectの使用方法は、下記に説明があります。
(Brainux上でconnect.cをgccでコンパイルして、 a.out を生成)

MachiKania type Pの開発環境 » 電子ブロック工房


Brainuxのリビルド自体はそれなりに時間がかかりますが、作業としては難しくないので一度やって環境を作成しておけば、また設定変更したい場合の再ビルドは比較的楽だと思います。

 

電子辞書 BrainのLinux (Brainux) でUSB wifiアダプタ WLI-UC-GNM を使う

これまで、シャープの電子辞書BreinにBrainuxというLinuxを入れていくつかの設定をしてきましたが、パッケージのインストールなどでネットに接続するときに、いちいちPCにUSBで接続して、USBモードをホストからペリフェラルに変えて、Brainuxを再起動するのがとても面倒くさくなってきました。

ネットで検索すると、USBのWiFiアダプタを使えるようにしている人もいるので、私もトライしてみることにしました。
USBのWiFiアダプターを使えば、USBはホストモードのまま使えます。

AIに質問しながら試行錯誤した結果、手持ちのUSB WiFi アダプタのうち、バッファローの WLI-UC-GNM で動作WiFiに接続することができましたので、忘備録もかねて記事にしておきます。


また、Brainux起動時に自動認識して固定IPアドレスを取得できるようにもしました。
単に接続するだけだと毎回IPアドレスが変わったりするので、固定IPにしておくとPCのTeraTermからの接続などで毎回IPアドレスを変える手間がなくなります。

 


1. ファームウェアのインストール

まず、必要なファームウェアを入れます。
WLI-UC-GNM は rt2870系とのことなので、rt2870.binというファームウエアをダウンロードしてきて、/lib/firmware/ に配置します。 
インターネット接続が必要なので、PCにUSBで接続してインターネット接続できるようにしてから下記のコマンドを順に実行します。

cd /tmp
wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rt2870.bin
sudo cp rt2870.bin /lib/firmware/
sudo chmod 644 /lib/firmware/rt2870.bin

PCに接続してのインターネット接続については下記の記事の後半をご覧ください。

電子辞書 Brain でLinux (Brainux) を動かしてみる(インストール~ネット接続) - 諸々の記録


2. 必要なパッケージのインストール

WiFiに接続するのに必要なパッケージをインストールします。

sudo apt update
sudo apt install wpasupplicant ifupdown

AI (Grok) に相談しながら進めていたのですが、Grok からは最初 nmcli (NetworkManager)を使えばできると教えてもらったのですが、どうしてもうまく動作させることができず、結局この wpasupplicant を使たらうまくいきました。


3. 設定ファイルの作成

接続のための設定を行います。

注:
PCに接続してTera Term等でSSHしている場合、まず下記の interfaces の作成はIPアドレスやインターフェース名を仮で登録しておき、brain-config でUSBモードを変更して再起動してから、Brain 本体で interfaces のインターフェース名等を修正した方が楽です。

USBモードをホストモードにして再起動したら、Wifiアダプタ WLI-UC-GNM を給電付きのOTGアダプタでBrainのUSBに接続します。

そして、
ip a
を実行して、インターフェース名 を確認しておきます。これを実行して

3:  wlxoooooooooooo: <NO-CARRIER,BROADCAST,MULTICAST,UP>

と表示された  wlxoooooooooooo の部分がインターフェース名 です。
(oooooooooooo はMACアドレス)

接続情報は、/etc/network/interfaces に設定します。

sudo nano /etc/network/interfaces

以下の内容を追加してください

auto lo
iface lo inet loopback

auto <インターフェース名>
iface <インターフェース名> inet static
address 192.168.xxx.xxx
netmask 255.255.255.0
gateway 192.168.xxx.xxx
dns-nameservers 8.8.8.8 1.1.1.1
wpa-ssid "SSID"
wpa-psk "パスワード"
  • address … 使いたい固定IP
  • gateway … ゲートウエイIPアドレス (通常はWifiルーターのアドレス)
  • wpa-ssid / wpa-psk … 接続するWiFiのSSIDとパスワード

修正したら保存して終了します。(nano の場合、Ctrl + O、Ctrl + X)

 


4. 手動で一度接続テスト

sudo ifdown <インターフェース名> 2>/dev/null
sudo ifup <インターフェース名>

を実行行し、下記で確認

ip a show <インターフェース名>
ping -c 3 8.8.8.8

(8.8.8.8 は Googleが提供している公開のDNSサーバ、-c 3  は3回実行)
ip a で、指定したIPアドレスが表示され、ping で Unreachable にならないことを確認します。
これでWiFiでネットワークにつなぐことができました。
PCからTeraTermでSSH接続もできます。


5. 再起動して自動接続を確認

再起動してもWiFi接続できるか確認します。

sudo reboot


起動後に再度確認します

ip a show <インターフェース名>
ping -c 3 8.8.8.8


固定IPが付き、インターネットに出られれば完了です。(ip a と pingで確認)



これでPC経由の共有接続せずに、USBモードの変更も必要なくBrainux単体でネットに接続することが出来るようになりました。
PCからもTeraTermを利用してWiFiでSSH接続できるようになって便利ですw

 

電子辞書 BrainのLinux (Brainux) からRaspberry pi picoにファームウエア(uf2)を書込む

シャープの電子辞書BrainにLinux (Brainux)を入れて使いやすいように設定をしてきましたが、実際に使うケースを考えてみました。

まず思いついたのが、Picoへファームエア(uf2)をインストールすることです。
通常は

PCにPicoのBOOTSELボタンを押しながらUSBで接続して、エクスプローラーで表示されたフォルダにuf2ファイルをコピーする

という操作になるので、PCが必要になります。
これを Brainux でできればよいなと思いました。

uf2ファイルは、あまり頻繁に入れ替えるものではないですが、MachiKaniaでもキーボード対応版と非対応版(非対応版でないと pcconnectが使えない)がありますし、ゲームの uf2 に入れ替えたりって場合もあるので便利かと思います。

BrainuxでPicoにuf2ファームウエアをインストールする概要はざっくりこんなイメージ

ここで、一番のポイントが、「Brainux上で行う Picoが接続されたらマウントしてuf2ファイルをコピー」ってのをどのようにするか? です。

Grok に相談しながら試しましたが、Picoが接続されたら自動でマウントするってのが実現できませんでした。(一般ユーザ権限だからかも)
なので、Picoを接続してからマウントは手動にしますが、できるだけ簡単で手間のかからない方法にします。

最終的にこんな手順になりました。

1.uf2ファイルをまとめてBrainuxのmidorSDにコピーしておく
2.Pico のBOOTSELを押しながら BrainにUSBケーブルでPicoを接続
3.接続されたPicoデバイスを検索して /media/pico にマウントするコマンドを実行
4.FDで /boot/MachiKania/uf2 を初期表示
5.配下の uf2ファイルを FD で選択して Enter で /media/pico にコピー

以下詳細です。

1.uf2ファイルをまとめてBrainuxのmidorSDにコピーしておく
Brainの起動用のmicfroSDカードをPCに挿すと、下記の記事で拡張した FA32 の領域へのファイルの書き込みが可能です。

電子辞書 Brain でLinux (Brainux) を動かしてみる(各種初期設定) - 諸々の記録

ここに、分かりやすい様に /MachiKania/uf2 等のフォルダを作成し、各種uf2ファイルをコピーして、BrainのmicroDSスロットに挿しBrainuxを起動します。

2.Pico のBOOTSELを押しながら BrainにUSBケーブルでPicoを接続
 あらかじめBrainux のUSBモードをbrain-configでホストモードにしておきます。
 
PicoのBOOTSELボタンを押しながらBrainに接続すると下記のような文字が表示されてデバイスが接続されます。(このような表示がされなかったらpicoがデバイスとして認識されていないのでやり直す)


3.接続されたPicoデバイスを検索して /media/pico にマウントするコマンドを実行
2の手順でデバイスとしては認識されましたが、これだけだとファイルをコピーできないので、マウントします。
下記コマンドを実行してマウントポイントを作成しておきます。

sudo mkdir  /media/pico

マウント操作もコマンドを打てばできるのですが、できるだけ簡単にしたいので、下記のようなshellコマンドを作成して /usr/local/bin に置いておきます。

pico-mount

#!/bin/sh

MOUNTPOINT="/media/pico"

# old mount point unmount
if mount | grep -q "$MOUNTPOINT"; then
    echo "Cleaning old mount..."
    umount -l "$MOUNTPOINT" 2>/dev/null
    sleep 0.5
fi

# serch RPI-RP2 / RP2350 label
DEVICE=$(lsblk -o NAME,LABEL -n -l | grep -E "RPI-RP2|RP2350" | awk '{print "/dev/"$1}')

if [ -z "$DEVICE" ]; then
    echo "Pico or Pico2 not found"
    exit 1
fi

echo "Found: $DEVICE"
mount -t vfat -o rw,umask=000 "$DEVICE" "$MOUNTPOINT"

if [ $? -eq 0 ]; then
    echo "Mounted successfully to $MOUNTPOINT"
    ls "$MOUNTPOINT"
else
    echo "Mount failed"
    exit 1
fi


sudo chmod +x /usr/local/bin/pico-mount
を実行して実行権を設定します

これで

 sudo pico-mount

とコマンドを打てば実行できますが、このままだとパスワードを打たないといけない(しかもパスワード入力まで少し時間がかかる)ので、パスワードを入れなくても実行できるように設定をしていきます。

sudo visudo

で、エディタ(vi か nano)が起動して、設定ファイル sudoers の編集ができますので、一番最後に下記を追加して保存。(保存後すぐに反映される)

user ALL=(ALL) NOPASSWD: /usr/local/bin/pico-mount

これで、sudo pico-mount を実行してもパスワードを入れなくてすみます。
次に、打つキーの数も少なくするために alias を設定します。

cd ~
でホームディレクトリに移動して

vi .bashrc

ファイルの最後に下記を追加して保存します。

alias picom="sudu pico-mount"

エディタを閉じたら

source ~/.bashrc

を実行して、変更を反映させます。

これで、 picom  と打つだけで pico が /media/pico にマウントされます。

4.FDで /boot/MachiKania/uf2 を初期表示
次に、FD (fdclone) を使って uf2 ファイルをコピーするのですが、uf2 ファイルを保存した /boot/MachiKania/uf2 をコマンド一発で表示するようにします。
(PCから micorSD に保存したファイルは Brainux上では /boot/ 配下にある)

これは、下記のようにFD のコマンドの後にディレクトリを指定するだけです。

fd /boot/MachiKania/uf2



これも、いちいちディレクトリをタイプするのは面倒なので、alias で設定しておきます。
.bashrc に下記を追加。

alias fdmk="fd /boot/MachiKania/uf2"

これで、 fdmk  と打つだけで、/boot/MachiKania/uf2 を表示した状態で FD が起動しますので、余計な操作なしで pico に送りたい uf2 ファイルを選択することができます。

5.配下の uf2ファイルを FD で選択して Enter で /media/pico にコピー
最後に、FDで選択した uf2 ファイルにカーソルを合わせて Enter(決定) を押すだけで、選択したファイルを /media/pico にコピーする設定をします。
この設定は、FDのランチャー機能を使います。

FDを起動して、E (大文字)を打つと設定画面になります。

右矢印キーを3回押して、/Lancher を選択し、下矢印キーで一番最後までページを送ると、NewEntory があるので、カーソルを合わせて、Enter

Extention for launcher: uf2
Command for launcher: cp %C /media/pico/
Registoration as archive browser: N

と順に設定して、
/Save  →   Save  →   Lancher
で保存します。(設定の終了は Esc)

これで、 FD で uf2 ファイルを選択し、Enter を押すと /media/pico にファイルがコピーされます。

ファイルがpicoにコピーされると、自動的にpicoデバイスが切り離されるので、FDの画面に文字が表示されてしまいますが、ESCキー → Y で終了します。

これで一通りの設定が完了です。
以降は、
     Pico の BOOTSELを押しながら USBケーブルで Brainに接続
     picom を実行
     fdmk を実行
     fd で uf2ファイルを選択して Enter
の手順で Pico に uf2 ファイルを簡単に書き込むことができる様になりました。

【追記】
picom の alias の設定を下記に変えると、fdmk も打つ必要がなくなります。

alias picom="sudu pico-mount ; fd /boot/MachiKania/uf2"

alias に何が設定されているかは、コマンドラインで
alias
と打てば現在有効な alias 設定がリストされます。

【追記2】
FDでpico(動画では RP2040-Zero)にuf2を書き込む動画です。