諸々の記録

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

電子辞書 Brain でLinux (Brainux) を使いやすくする

これまで、下記2回の投稿で、電子辞書Brain に BrainuxというLinuxを導入し、PCを経由したインターネット接続と、SDカード上の領域をWindowsからアクセスできる領域とLinuxが動作する領域の両方を最大限使える様に拡張するところまでやってみました。

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

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

今回は引き続き、Brainuxを使いやすいように設定していきます。
「使いやすい」といっても、Brainuxをどのように使うかによって異なると思いますが私の場合は、
  MachiKaniaと接続してファイルの編集やファイルの送受信をしたい
というのが目的となりますので、ここでは下記設定と確認を行っていきます。

1.shell のCUIの環境で使いやすくするする
       文字フォントの変更
2.でファイル操作や編集をしやすくする
        nanoの環境設定およびFDclone のインストールと設定
3.MachiKaniaとファイルのやり取りを簡単にできるようにする
       TeraTermを使ったPCとのファイル送受信の動作確認

1.shell のCUIの環境で使いやすくする
まず、CUIでのログイン方法ですが、Brainux のログイン画面で、カーソルキーの上キーを2回押すと Jwm と表示されているところにカーソルが移動するので、カーソルキーの左キーを押して shell にしてからまた下キーでパスワード入力に戻ってパスワードを入力してログインすると、CUI画面でログインできます。


Xwindowsシステム(GUI)が起動しないので動作が早いです。
単にコマンド実行やCUIのプログラムを実行するのでしたらサクサク軽快に動作するようになります。

次に、そのままでは文字が小さいので(ろーがんにはきついw)フォントサイズを大きくします。

事前に、下記の記事で説明したPC経由でのインターネット接続をしておきます。

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


下記コマンドを実行します。
 sudo apt update
のあと
 sudo apt install console-setup kbd

これで、/usr/share/consolefonts/ 配下にフォントがインストールされます。
次に、下記のようにコマンドを実行することで、フォントを変更できます。

sudo setfont /usr/share/consolefonts/Lat2-TerminusBold20x10.psf.gz

/usr/share/consolefonts/ 配下にあるフォントをいくつかためしてみましたが
 Lat2-TerminusBold20x10.psf.gz
がちょうどよいサイズと思いました。
下記、 フォントを Lat2-TerminusBold20x10.psf.gz に設定した画面。


これを、ログイン後自動で適用する設定をします。
vi などのエディタで ~/.bashrc に下記を追加して再起動ます。

.bashrc

if [ "$TERM" = "linux" ]; then
 setfont /usr/share/consolefonts/Lat2-TerminusBold20x10.psf.gz
fi


2.CUI環境でファイル操作や編集をしやすくする
Brainuxには、初期状態でテキストエディタは vi (vim) と nano が使えます。

vi も慣れれば使いやすいのですが、やはりモード(コマンドモードと編集モード)の切替があるのでちょっと面倒です。(特に初心者には)
nano は 私は Brainuxで初めて使いましたが、モードもなくWindowsのエディタと同等の感覚で使えて使いやすいと思いました。
コマンドがちょっと特殊ですが、画面下部に常に表示されていますし、カスタマイズも可能です。

とりあえず、下記のサイトを参考にキーアサインをWindows風に変えてみました。

ホームディレクトリに .nanorc というファイルを作成して設定を記述します。
^ は Ctrl を表します。

.nanorc

bind ^C copytext    main
bind ^F whereis     main
bind ^G gotoline    main
bind ^I indent      main
bind ^N exit        main
bind ^M enter       main
bind ^S writeout    main
bind ^R replace     main
bind ^V paste       main
bind ^X cut         main
bind ^Y redo        main
bind ^Z undo        main


次にファイル操作を簡単にするためファイラー(Windowsのエクスプローラみたいなもの)を入れます。
MS-DOS時代にパソコンを使っていた人には懐かしい FDのLinux用のもの(fdclone)があるので、これを入れます。
FD を apt ででインストール 場合は fdclone を指定します。

sudo apt update
のあとに
sudo apt insutall fdclone
を実行

起動コマンドは 大文字でなく小文字の fd になります。
コマンドラインで fd と打つと下記の画面になり、カーソルキーで選択、Enterキーで決定で、ディレクトリならディレクトリ移動、テキストファイルなら表示(q で終了)で、ファイルの拡張子によって起動するプロブラムを設定することも可能です。
(FDの終了は、ESCの後 Yを選択)

基本的な操作説明は下記を参考に。

【初心者】FDclone: Linux用ファイラー - SEO対策の賢者

E (大文字) を打つとFDの設定画面になります。
最低、SORTTYPE(並び順)は filename にしておいた方が見やすいです。
設定は右矢印キーで上方のタブみたいなところで Save を選択して、下矢印キーで Saveを選択し、最後に保存したいカテゴリ(Variables等のタブを選択)を選択して保存します。

FDは拡張子によって起動するプログラムを設定したり、ファイルを選択してから指定したマクロを読んだりと、色々なことができるので、今後活用していきたいです。

3.PCとファイルのやり取りを簡単にできるようにする

Brainux とPCとのファイルの受け渡しですが、Linuxならsambaが思いつきますが、Grokに相談したらメモリを多く消費するのでおすすめできないとのこと。

他の方法として思いつくのは、SDカードでの受け渡しですが、Brainuxを一旦シャットダウンしてSDカードを抜き差ししないとできません。なので、ちょっと手間がかかります。

Windowsから読み書きできる領域は、Brainux からみると /boot/ になります。
このディレクトリ配下には起動用のシステムファイルがあるためBrainuxからは読込専用になっています。
もし、一時的に書込みしたい場合は

sudo mount -o remount,rw /boot

を実行して書込み可にして、必要なファイルを書き込んだら、

sudo mount -o remount,ro /boot

で読込専用に戻しておきます。
また、/boot には Windowsからみると アプリ とうフォルダがありますが、Brainuxからみると文字化けしています。
これを修正するには下記をします。

sudo systemctl daemon-reload
sudo systemctl start boot.mount
を実行して、Brainuxを再起動。


その他にPCとのファイルのやり取りの方法が無いかGrokに相談したら、SSH/SCP があるとのことで、TeraTerm でも使えるので試してみたら簡単にできました。

TeraTerm は下記の記事で Brainux と TeraTermで接続してターミナルとして使っているので、新たなインストールや設定は不要です。

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

Brainuxに上記のブログ記事にある方法で接続したPCからTeraTermでログインして、そのターミナル画面のままファイルをその画面にドロップするとBrainux側のカレントディレクトリにファイルが転送されます。
逆にTeraTermのメニューの ファイル ⇒ SSH SCP ではBrainuxからPCへファイル転送できます。

Brainuxからファイル転送する場合は、上の画像の下側の方で指定をします。
From はBrainux上のカレントディレクトリのファイルならパスは不要でファイル名だけ指定します。
To には受け側のWindowsのフォルダを指定し、 Receive ボタンをクリックすればファイルが転送されます。

この様に、TeraTermを使えば PC(Windows) と Brainux とで簡単にファイルが送受信できることが確認できました。

ここまでの設定で、BrainをLinux機として使う環境がだいぶ整ってきました。(起動に時間がかかるのが難点ですが)
今後、MachiKaniaと連携などして実用的面での使い方を考えたいと思います。




 

電子辞書 Brain でLinux (Brainux) を動かしてみる(各種初期設定)

前回の記事では、シャープ電子辞書の Brainに Brainux (Linux) をインストールしてネットに接続するところまでやりました。

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

Brainux はインストール直後は最小限の環境となっているので、少し環境を整える設定をしていきます。

これらの設定については下記の記事に詳しく、丁寧に説明してありますので、この通りに作業すればよいです。
(Brainux のインストールは完了しているので、 「6.現在のストレージ系の情報を表示させてみる」から)


基本的に上記の記事通りに作業すればよいのでここであまり説明する必要はないのですが、SDカードの領域拡張の部分だけ補足します。

私は、8GB のSDカードを使ったので、Brainux のインストール直後はMiniTool Pertition で確認すると下の様になっていました。

一番左の boot(FAT32) の領域は、Windows から認識できるFAT32領域なので D: になっていますが、たったの64MB しかありません。
また、この boot の領域は Brainux 上からもアクセスできるので、この boot領域をできるだけ多く確保しておいた方が Windows、Brainux どちらからもアクセスできる領域になり便利に使えます。(Brainux 上で /boot は初期設定では参照のみ)

また、その右隣にある rootfs(Ext4) の領域は Brainux からしかアクセスできない領域ですが、Brainux 上でアプリケーションのインストールやスワップファイルなどで消費するのでSDカードに余裕があれば拡張しておいた方が無難です。

そして、boot領域 は連続した領域を確保しないといけないので、rootfs を後ろにずらす作業を最初にしています。

私は8GBのSDカードなので、下記の様に rootfsを3GB後ろにずらして boot(FAT32) 領域を3GB拡張しました。(残りの 未割当の 1.5GB は Brainux 上で拡張)


brain-config を使用してBrainux側での拡張完了後は下記のようになりました。


そして、次にSWAP領域の確保ですが、私は

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

として 1024MB (= 1GB) を確保しました。

最後に SWAP領域の永続化のために /etc/fstab を viエディタで修正しますが、viの操作を知らない(or忘れちゃった人)は、↓ こちらを参照

viの使い方/基本操作

ざっくり説明すると、i で入力モードにして1行追加したら ESC でコマンドモードにして、: (コロン)を押して wq [Enter] で書込み&終了です。

ここまでで Brainuxを使う上で基本的な設定はできましたので、Brainuxにアプリを入れたりして遊んでみます。
特にMachiKaniaと連携して何ができるかなど試してみたいです。

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

最近Youtubeのサムネに表示された電子辞書(Brain)で動くLinuxの開発者の人のインタビュー動画(下記)をみて、面白そう! と思ったので シャープのBrain を某フリマサイトで購入して遊んでみました。



Brainは 少し前までに機種ではPDA向けにリリースされていたWindowsである Windows CE をベースになっている機種があり(最新の Brainは違うらしい)その世代の Brain は有志の人達によってハッキングが進んでいて、素のままの Windows CE として使えるようにしたり、MSXなどのエミュレータも公開されています。

Linux については、Debianをベースに作られているとのこと。
詳細は下記。

上記サイトの「とりあえず動かす」のページに動作する機種の一覧があり、下記一覧はそこから転載。

それぞれどんな機種なのかは下記の Brain wiki に写真付きで詳しく説明されているのでこれを参照

カテゴリ:世代別詳細 | Brain Wiki | Fandom


上記の世代別詳細を確認すると現状でBrainuxが動作する対象機種では CPUやRAMの違いは無いようです。

私は、このなかで PW-H7800 をゲットしました。(送料込み2000円)
型番が Hxxxx は高校生専用モデルで高校入学時に半強制的に購入させられる機種のようなので中古でのタマ数は多そうです。

付属品はタッチペンのみでしたが、充電はmicroUSBで一般のスマホ用充電機で充電できるので特に問題ありません。

購入時はあまり考えずに選んだのですが、この機種で良かったのは電子辞書で使っている時にディスプレイ右側にあるメニューがLCDで表示されているものなので、Brainuxを起動すると右側のメニューが表示されないことです。

Brainuxサイトのトップページにある写真(下記)に6台のBrainで Brainux 起動画面が表示されていますが、左下2台はディスプレイ右側のメニューがLCD表示でなく物理的なメニューなので Brainux 起動時も(当たり前ですが)メニューが表示されたままになっています。


さて、Brain への Brainux 導入ですが、これはすごく簡単で、下記の「とりあえず動かす」にある通りに作業すれば良いです。

初めての方へ ─ とりあえず動かす - Brainux Wiki

また、下記動画でも簡単に(3分クッキングでなく3分ハッキングw)説明されてます。



私のBrainでも無事Brainuxが起動
(この黒い画面に小さな文字がずらずら表示されていくのを見てるとワクワクしてしまうのは私だけ?)

ログインでパスワードを入力してもカーソルが点滅したままなので無反応かと思ってしまいますが、10秒くらいでログイン処理が始まります。

無事起動したので、「3分ハッキング」の動画にあるような動作確認をしました。
逆にこの状態だとそれくらいしかすることがありません。

気になったのが、私の機種 PW-H7800 だとどうも電源ボタンが効かないみたいです。
Brainuxを終了するには、poweroff コマンドで終了して、電子辞書が起動するので電子辞書が起動したらフタを閉じるという形になります。
(Bainuxではサスペンドもできないため通常の電子辞書を起動してから閉じることでサスペンドさせる)

これでBrainuxが起動はしましたが、インストール直後の環境はBrainuxが動作する最小限の設定になっているようなのでいくつか設定を行います。

ですが、この設定をBrain上でやっていくとキーボードが特殊ですし、ネットやAIから得た情報をコピペすることもできず大変なので、まず最初にBrainuxをネットに接続してBrainにはPCのターミナルソフトからSSH接続して作業した方が圧倒的に楽です。

どうせネットワークの接続はパッケージのインストールなどでいずれは必要になりますので、まず最初にしてしまいましょう。

Brainのネットへの接続は、BrainにWiFiなどのネット接続機能が無いのでUSB経由でネットに接続します。
USBにUSBから有線LANへの変換アダプタを接続する方法もありますが、一番手軽なPCへUSBで接続してPCの接続環境を共有する方法でネット接続します。

まず、準備ですが、BrainをUSBケーブル(通信可能なもの)でPCと接続します。
OTGケーブルでなくてよく、100均などで売っている充電だけでなく「通信」と書いてあるものを用意します。  
BrainuxでUSB接続をする場合、BrainのUSBはバスパワーがないので給電できるものが必要な場合がありますが、この場合は給電も不要で単にUSBケーブルでPCとBrainを接続すれば良いです。

そして、基本的には下記の Brainux wikiの説明の手順で設定を進めていきます。

USBモードの変更(host から peripheralsに変更)は brain-config で設定すればよいです。

brain-config - Brainux Wiki

あとは、PC側の設定ですが、上記の Brainux wiki のページに説明してあるものと私のPCの環境ではデバイスマネージャーの設定が異なっていました。
Brain を接続してデバイスマネージャーのネットワークアダプタに UsbNcm Host Device が認識されていればそのままで特に設定やドライバの更新は不要のようです。

設定 ⇒ ネットワークとインターネット
で確認すると、私のPC環境の場合通常使うアダプタ(Hi-Fi)以外に 「イーサネット 2」というの表示されており、これが Brainです。

さらに、上記画面の下の方にある「ネットワークの詳細設定」⇒ WiFi をクリック
その他のアダプターオプション で [編集] をクリックし、

表示されたウインドウの共有タブで下記設定をします。
ホームネットワーク接続 に何も表示されない場合、ネットワークとインターネット
の画面まで戻って 「モバイルホットスポット」のスライドスイッチをオンにしたらイーサーネット 2 が表示されました。

ここまでできたら、brain側の Terminal で、下記を実行します。

 sudo dhclient -v usb0

すると、数行表示された最後に bound to xxx.xxx.xxx.xxx と表示されればこれが BrainのIPアドレスです。

BrainのIPアドレスが分かれば、PC側から TeraTermで接続します。
TeraTermは下記からダウンロードしてインストールします。

Releases · TeraTermProject/teraterm · GitHub


TeraTermをインストールして起動したら、接続先(Host)に Brain のIPアドレスを入れ、ユーザ/パスワード は Brainux デフォルトの user/brain でログインできます。
(初回の接続はセキュリティ警告が表示されますが、続行をクリック)


ログインに成功すれば下の様な画面になりますので、PC上でBrainuxの設定作業を進めることができます。


もし、うまくいかなかったらGrokやGemini、Chat-GPT等のAIに相談してみましょう。
私も Grokさんにはお世話になりましたw

私の環境では、BrainをUSBケーブルで接続してBrainuxを起動したら、Windows側で
 設定 ⇒ ネットワークとインターネット ⇒ モバイルホットスポット
をONにするだけでインターネット接続できるようになりました。

【追記】
モバイル ホットスポットのオン設定は、ONに設定しても一定時間経過すると接続中でも勝手に オフ になり、apt などでのインターネット接続ができなくなってしまいますが、下記の設定で省電力を オフにすることにより 勝手にモバイルホットスポットの設定がオフになることを防げます。
ただ、これを設定していてもPC起動直後はOFFになっています。





MIT App Inventorで作成したスマホアプリでPico WにBluetooth Classicで接続してみる

MachiKania ではRaspberry pi Pico Wを使ってwifiへの接続ができますが、Raspberry pi  Pico Wにはwifiだけでなく、Bluetooth の機能もあります。

現状では、MachikaniaではBluetooth接続の機能はありませんが、Pico WでBluetooth接続を試したくなり、下記の書籍を参考に、スマホアプリは MIT App Inventorで作成し、Pico W側は Arucuino IDEでプログラムを作成して、Bluetooth接続を試してみました。

ラズパイPico W 本格入門 with MIT App Inventor2 [Pico W / Pico 2 W 対応] | 後閑 哲也 |本 | 通販 | Amazon

MIT App Inventor はスクラッチ(https://scratch.mit.edu/studios/1168062)の様なGUIでブロックを組み合わせてプログラミング(ビジュアルプログラミング)を行い簡単にスマホのアプリが作成できるものです。
ですが、日本語での情報があまり多くなく(特にBluetooth関連)この書籍は大変参考になりました。

MIT App Inventer はiPhoneアプリも作れるようですが基本的にAndroid向けのようです。(以前はGoogleが開発していたため)

2026年7月現在、下記のようにiOS版は BETA 版です。
私はAndroidユーザなのでiPhoneでは試せていません。


MIT App Inventerを使うにはまず、下記にアクセスして、googleアカウントでログインします。(googleアカウントが必要)

MIT App Inventor

上記URLにアクセスして 表示された画面で Create Apps! をクリックして google アカウントでログインすればインストール不要ですぐに使えます。


MIT App Inventerでのアプリ作成のファーストステップとしては、下記の動画が参考になります。(Androidスマホ向け)
バージョンが少し古いので表示が少し異なっていますが現バージョンと基本的な操作は同じです。



現バージョンとの違いで気になったのは、アプリの動作確認で、
「接続」 ⇒ 「AI2コンパニオン」
を選択とありますが、現在は 「AIコンパニオン」 となっています。
AIと言っても人口知能のAIでなく、App Inventer の略ですw
(最近は 2を付けなくなっているらしい)


上記動画の最後で、ビルドメニューからapkのコンパイルの説明がありますが、QRコードの読込までの説明しかありません。

実際は、このQRコードを読み込むとスマホ上で、

apkのダウンロードの確認 ⇒ OK でダウンロード ⇒ ダウンロードした apk ファイルを、ファイルマネージャーアプリ等でタップしてインストール(本当にインストールするかの確認あり)

といった手順でアプリをインストールします。

apkでアプリをインストールすれば、いつでもアプリアイコンをタップして実行できるようになりますし、apkファイルを他の人と共有も可能です。

あと、ラベルやボタンの横幅の設定で、「横幅いっぱい」が現バージョンでは「塗りつぶしペアレント」になっていたり、ブロックの「いつも~」が「いつ~」 になっていたり(どちらも英語では when )、特に日本語訳がバージョンによって異なっている様です。

英語のプログラムサンプルを参照する時など、画面右上の言語設定で「English」に切り替えて確認すると良いと思います。


これでMIT App Inventor でスマホアプリが作れる環境はできたので、Pico W と Bluetooth接続して動作するアプリを作っていきます。

このアプリの機能は、Pico W の内蔵の温度センサーの温度を取得表示し、Pico W の内蔵の LED の ON OFF ができるものとします。
接続は、MIP App Inventor は  Bluetooth Classic と  BluetoothLE(BLE)のどちらもサポートしていますが、今回は Bluetooth Classic の SPPプロファイルを利用します。
 SPPプロファイルは、シリアル転送のプロファイルなので、これまでUARTと同様の感覚で取り扱いができます。
Pico W 側のプログラムは、Aruduino IDE で作成します。

これを図にするこの様になります

このプログラムの機能は、Pico W のオンボードの温度計の温度をスマホで表示して、Pico W のオンボードのLEDを ON/OFF できるものとします。
MIP App Inventor のプログラムですが、 画面デザイン(デザイナー)は下記のようにしました。
時計(Clock)は「センサー」、Bluetoothクライアントは「接続性」のカテゴリにあります。時計(Clock)は時間を表示するのではなく、タイマー機能を使うために選択します。
この2つは画面に表示するものが無いので、下の方に「非可視コンポーネント」として配置されます。


各アイテムの名称の変更ですが、画面右側にあるアイテムリストのアイテムをクリックして「名前の変更」で変更します。
ここで指定した名称がプロブラム(ブロック)で参照されます。

ブロックの全体図はこちら。


これは、なかなか説明が難しいので作成したプロジェクト(プログラム)を下記からダウンロードできるようにしましたのでご参考にしてください。

https://img.atwiki.jp/machikania/attach/25/33/BT_TEST.aia

ダウンロードしたプロジェクトは、メニューの
プロジェクト ⇒ コンピューターからプロジェクト(.aia)をインポートします...
でインポートできます。


Pico W 側の Aruduino IDE のプログラムは下記になります
(すべて Grokに作成してもらった)

/***********************************************
 *  Raspberry Pi Pico W の Arduinoで
 * 内蔵温度計の温度をBluetoothで送信
 * 内蔵LEDを制御
 **********************************************/
#include 

// グローバル変数定義
float temp;
char  data[32], rcv;

/***** 設定関数 ***********/
void setup(){
  pinMode(LED_BUILTIN, OUTPUT);         // 内蔵LEDの設定
  Serial.begin(115200);                 // モニタ用
  SerialBT.begin();                     // Bluetooth用
}

/***** メインループ *******************/
void loop(){
  // Bluetooth受信データ処理 コマンドで分離
  while(SerialBT){
    while(SerialBT.available()){                // 受信レディーチェック
      rcv = SerialBT.read();                    // 1文字受信
      Serial.println(rcv);                      // モニタへ出力
      
      // 計測要求の場合
      if(rcv == '1'){                           
        // 内蔵温度センサから温度読み出し
        temp = analogReadTemp();                // 温度(℃)
        
        //*** データ編集しBluetoothで送信
        // 形式: 温度,ステータス(0or1)
        dtostrf(temp, 4, 1, data);              // 文字列に変換(例: " 23.5")
        data[4] = ',';                          // 区切り
        
        // LEDステータス(ON:1, OFF:0)を追加
        data[5] = (digitalRead(LED_BUILTIN) == HIGH) ? '1' : '0';
        data[6] = 0;                            // 終端
        
        Serial.println(data);                   // モニタへ出力
        SerialBT.write(data, strlen(data));     // Bluetooth送信             
      }
      // LED制御の場合
      else if(rcv == '2'){ 
        digitalWrite(LED_BUILTIN, HIGH);        // 内蔵LED ON
      }
      else if(rcv == '3'){ 
        digitalWrite(LED_BUILTIN, LOW);         // 内蔵LED OFF
      }
    }
  }
}

Aruduino IDE の設定では通常のマイコンの選択に加え、下記の ツール ⇒ IP/Bluetooth の設定で 「IPv4 +  Bluetooth」 を選択しておきます。


Pico W に Aruduino IDE でコンパイルしたプログラムをインストール完了したら、スマホ側で MIP App Inventer のプログラムを AIコンパニオン または apkインストールして実行。
インストールしたアプリを開いたら、「端末選択」 ボタンをタップ。
すると Bluetoothのリストが表示されるので、PicoW Serial  をタップ。(タップした後少しタイムラグあり)
その後、温度の値が表示されれば成功です。(Pico Wのオンボード上の温度なので室温と異なる)
ON ボタンをタップして Pico W のLEDが点灯、OFFボタンでPico W のLEDが消灯します。

これで、Pico W とスマホ間でBluetoothでデータ通信をすることができました。

今回使った BluetoothのSPPプロファイルは双方向でシリアル通信が可能ですので、スマホでデバイスを操作したり、Pico Wに接続したセンサーからの情報を受信してスマホで表示(MIT App Inventor にはチャート表示機能もあり)したり、色々なことができそうです。

MachiKania のキー入力をPCのキーボードでできる基板の制作

2026年6月20日に MachiKania の Ver.1.7 がリリースされました。
このリリースで、PCのターミナルソフトからシリアル変換モジュールで接続した MachiKania へのキー入力ができる機能が実装されました。

詳細は下記

http://www.ze.em-net.ne.jp/~kenken/machikania/typepu.html#uartkb

この機能は、PCのキーボードが使えるというだけでなく、ターミナルソフト(TeraTerm )で文字列を貼り付けもでき、Type PU でビデオ出力をPCの画面に表示すれば、まるでPC上でプログラミングしている感覚でMachiKaniaのプログラム開発が可能になります。

文字列の貼り付けは日本語も可能なので、PC上のメモ帳などに日本語をタイプして、その文字列をTeraTermにコピペすればMachiKania単体では不可能だったMachiKaniaのエディタでの日本語の書込みも可能です。(エディタ上での表示は化けたままですが)

この機能を使うには、シリアル変換アダプタだけでなく、Raspberry pi pico (または互換機)が必要です。

Type PU の公式ページで紹介されている例RP2040-Zeroを使った接続例は下図になります。MachiKaniaとの接続は、通信可能なUSBケーブルだけでOTGアダプタは不要です。

普通の Raspberry pi pico でも動作しますが、サイズが小さくUSB-C 接続できる RP2040-Zeroを使うのが最適です。

これらを絵にするとこのようになります

これはMachiKaniaでプログラミングする上で非常に便利な機能なので、シリアル変換モジュールと RP2040-Zero を1つにコンパクトにまとめた専用基板を作ってみました。

回路図は下記です。
スイッチを付けてTXD、RXDを直接接続も可能とし、普通のシリアル変換アダプタとしても使えるようにしています。


シリアル変換ICは最低限の機能があり、手ハンダが(ぎりぎり)可能なCH340Nを採用。これまで大分長い時間この回路で使ってみましたがMachiKaniaとの通信も特に問題なく使えているので、この回路との相性も良いみたいです。
CH340Nは秋月電子通商で販売しています。(aitendoでも販売あり)

https://akizukidenshi.com/catalog/g/g116305/


基板レイアウトはこのようにしました


USB-C コネクタは下記を取付できるように設計(電子工作ステーション、Amazonで販売)

https://electronicwork.shop/items/63f459f062239643ab817cb9


基板以外のパーツリスト

パーツ パーツ詳細 主な入手先
 RP2040-Zero   ピンヘッダは無しでも可  秋月電子, 電子工作sta, Amazon
 シリアル変換IC  CH340N  秋月電子, aitendo
 コンデンサ  積層セラミック 0.1μF x2個  秋月電子, 電子工作sta
 USB-Cコネクタボード    電子工作sta, Amazon
 スライドスイッチ  基板用(1回路2接点) x2個  秋月電子, 電子工作sta
 ピンヘッダ  L型 1列x3  秋月電子, 電子工作sta

秋月電子: 秋月電子通商( https://akizukidenshi.com/catalog/default.aspx )
電子工作sta:電子工作ステーション( https://electronicwork.shop/ )
aitendo : aitendo ( https://www.aitendo.com/

RP2040-Zero の端子は、下記の黄色丸の端子だけハンダ付けしればよいです。

ピンヘッダでハンダ付けしてもよいのですが、必要はピン数が少ないのでずれない様にマスキングテープで固定してから表面実装でハンダ付けしてしまった方が楽かもしれません。

表面実装でのハンダ付けは、RP2040-Zero のスルーホールの横の側面にハンダ付けすればよいです。

USB-Cコネクタボードの取付はこんな感じにしました。
高さがでないように、ピンヘッダを上側から挿してます。


全てのパーツの取付が完了すると、このようになります。


スライドスイッチは、Zero側(上の写真で左)にすると、RP2040-Zero のUSBに接続されたMachiKaniaへのキーボード出力になります。
スライドスイッチを Pin側(上の写真で右)にすると、真ん中にある3つのピンヘッダへの出力になります。
スイッチが2つありますが、別々に動かしても動作しないので、かならず両方のスイッチを同じ側にして使います。

さらに、この基板を使いやすいように裏面だけを覆うハーフケースを3Dプリンタで作成しました。


これを、MachiKaniaミニミニ基板とUSBビデオキャプチャアダプタと組み合わせて使用した動画です。
日本語もちゃんとPC上でコピペできています。

これの接続を図にしたものが下記です

MachiKaniaのUSBキーボードエミュレーターとシリアル変換モジュールを1つにすることでコンパクトにできました。
この基板のガーバーデータとハーフケースの3Dモデル(STL形式)を下記からダウンロードできます。

https://img.atwiki.jp/machikania/attach/25/32/Serial_key.zip
ダウンロードしたzipファイルに下記2つのファイルがありますので、ご自由にお使いください。
  Serial_key2.zip:PCBガーバーデータ(このままJLCPCBの発注画面にアップロード可)
  Serial_key2.stl : ハーフケース3Dモデルデータ

MachiKaniaでPCとファイル送受信できる簡易ファイルマネージャーを作ってみた

前回、前々回の記事で、MachiKaniaとPCでファイルの送受信のプログラムをPowerShellを使って作ってみました。

このファイルをMachiKaniaからPCを送信するプログラムでは、ファイル名をプログラムに書いておく必要があり、これはちょっと手間がかかり、使い勝手がよくありません。
なので、MachiKaniaのSDカードにあるファイルを選択するプログラムを作成してプログラム中にファイル名を書く必要がない様にしたいと思い、簡易的なファイルマネージャーを作ってみました。

MachiKaniaの SAMPLES にSDカードのファイルを操作するファイルマネージャーのサンプル(FILEMAN.BAS)があるので、ファイル名を配列に格納して表示する方法やキーのスキャン方法等を参考にさせていただきました。

この簡易ファイルマネージャーのプログラムリストは下記。

FMANL.BAS

REM -------------------------------------
REM  File Manager lite
REM    for Machikania Ver. 1.7 or later
REM -------------------------------------
USEGRAPHIC
USEVAR PX,PY,FCNT,SELF,REDISP,MODE,BRTE
MODE=0:REM Set File mode (1:Dir mode)
BRTE=9600:REM Set Baud Rate

LABEL TOP
REDISP=0
DIM F(280):REM MAX (40Col*22Row)/4Byte
CLS:LINE 0,195,310,195,5

COLOR 4:PRINT "Dir: "+GETDIR$()
GOSUB FOOTDSP:REM Print foot area

REM Read file/dir FINFO=16:Dir
COLOR 7:N=0
IF MODE=1 AND LEN(GETDIR$())!=1 THEN GOSUB STRCPY,F,"/[Root]":N=1
S$=FFIND$("*")
DO WHILE LEN(S$)
 IF MODE=0 AND FINFO(3)!=16 THEN
  GOSUB STRCPY,F+N*13,S:N=N+1
 ELSEIF MODE=1 AND FINFO(3)=16 THEN
  GOSUB STRCPY,F+N*13,S:N=N+1
 ENDIF
 IF N>=66 THEN BREAK:REM MAX 66 items
 S$=FFIND$()
LOOP
FCNT=N-1:REM FCNT=Item count

REM Print file/dir list
E=F:COLOR 7
IF MODE=1 THEN COLOR 6
PX=0:PY=0
FOR I=0 TO FCNT
 PX=I%3:PY=I/3:REM Calc disp position
 CURSOR 1+PX*13,PY+2:PRINT E$
 E=E+13
NEXT
DELAYMS 10:REM Wait 10mS

REM Select file/dir
SELF=0:REM Selected file No.
GOSUB DSPCUR,SELF,0
DO
 IF J=KEYS() THEN
  L=0
 ELSE
  L=KEYS():J=L
 ENDIF
 K=((READKEY() AND $FF00)>>8)
 IF K=27 OR L=33 THEN BREAK
 IF (K=39 OR L=8) AND SELF=1 THEN
  GOSUB DSPCUR,SELF,-1:SELF=SELF-1
 ELSEIF (K=38 OR L=1) AND SELF-3>=0 THEN
  GOSUB DSPCUR,SELF,-3:SELF=SELF-3
 ELSEIF (K=40 OR L=2) AND SELF+3<=FCNT THEN
  GOSUB DSPCUR,SELF,3:SELF=SELF+3
 ELSEIF K=82 OR L=20 THEN
  GOSUB RCVFIL
  IF REDISP=1 THEN BREAK
 ELSEIF K=13 OR L=32 THEN
  GOSUB FILOPE
  IF REDISP=1 THEN BREAK
 ELSEIF K=68 OR L=16 THEN
  MODE=MODE+1
  IF MODE>=2 THEN MODE=0
  REDISP=1:BREAK
 ELSEIF K=191 THEN
  SETDIR "/":REDISP=1:BREAK
 ENDIF
 DELAYMS 10:REM Wait 10mS
LOOP
IF REDISP=1 THEN GOTO TOP

CLS:GCLS
IF SYSTEM(40)=0 Then PRINT "Push START button to RESET"
END

REM ----Subroutin-----
REM Copy a string -----
LABEL STRCPY
 VAR D,S
 D=ARGS(1):S=ARGS(2)
 DO WHILE PEEK(S)
  POKE D,PEEK(S)
  D=D+1:S=S+1
 LOOP
 POKE D,0
RETURN

REM Disp cursor N:ItemNo M:Relative ----
LABEL DSPCUR
VAR N,M:N=ARGS(1):M=ARGS(2):COLOR 5
CURSOR (N%3)*13,N/3+2:PRINT " "
N=N+M
CURSOR (N%3)*13,N/3+2:PRINT ">"
RETURN

REM File operetion -----
LABEL FILOPE
VAR S
S=F+13*SELF
IF MODE=1 THEN
 MODE=0
 IF LEN(GETDIR$())!=1 AND SELF=0 THEN
  SETDIR "/":REDISP=1:RETURN
 ELSE
  SETDIR GETDIR$()+"/"+S$:REDISP=1:RETURN
 ENDIF
ENDIF
COLOR 7:CURSOR 0,25: PRINT S$+"                    "
COLOR 6:PRINT "D/"+CHR$($1D)+":Del R:ReName S/"+CHR$($1C)+":Send ESC/"+CHR$($1E)+":Camcel":COLOR 7
DO
  K=((READKEY() AND $FF00)>>8)
 IF K=27 OR KEYS()=1 THEN
  GOSUB FOOTDSP:BREAK
 ELSEIF K=68 OR KEYS()=4 THEN
  CURSOR 15,25:PRINT "Delete ? Y(F)/N "
  K=0:J=0:WAIT 10
  DO WHILE K=0 AND J=0
   K=INKEY()
   J=KEYS()
  LOOP 
  IF K=89 OR J=32 THEN
   FREMOVE S$:REM Delate a file
   GOSUB FOOTDSP:REDISP=1:BREAK
  ELSE
   CURSOR 15,25:PRINT "                   "
  ENDIF
 ELSEIF K=82 THEN
  CURSOR 13,25:PRINT ">>New name= ";
  A$=INPUT$()
  IF A$!="" THEN
   FRENAME S$,A$:REM Rename a file
   GOSUB FOOTDSP:REDISP=1:BREAK
  ELSE
   CURSOR 13,25:PRINT "                     "
  ENDIF
 ELSEIF K=83 OR KEYS(8) THEN
  GOSUB SNDFIL:REM Send a file
  REDISP=1:BREAK
 ENDIF
 DELAYMS 10:REM Wait 10mS
LOOP
RETURN

REM Disply foot area -----
LABEL FOOTDSP
CURSOR 0,25:COLOR 6
IF MODE=0 THEN PRINT "Enter/(F:Select file                      "
IF MODE=1 THEN PRINT "Enter/(F:Select Dir                       "
CURSOR 0,26
IF MODE=0 THEN PRINT "D/(S:Dir R/"+CHR$($1D)+"+(S:Recv ESC/"+CHR$($1E)+"+(F:End     "
IF MODE=1 THEN PRINT "D/(S:File ESC/"+CHR$($1E)+"+(F:End            "
COLOR 7
RETURN

REM Send file -----
LABEL SNDFIL
DIM B(0)
CURSOR 0,26:PRINT "Run receive program on PC(start with #)"
SERIAL BRTE,0
DO
 K=((READKEY() AND $FF00)>>8)
 IF K=27 OR KEYS()=1 THEN RETURN
LOOP WHILE NOT(SERIALIN()=ASC("#"))
WAIT 100:D=0
FOPEN S$,"r"
FOR I=0 TO LEN(S$)-1
 SERIALOUT ASC(S$(I)):REM Send file name
NEXT
SERIALOUT 13
WHILE FGET(B,1)>0
 D=D+1:SERIALOUT B(0)
 CURSOR 20,25:PRINT D;:PRINT " bytes sent"
WEND
FCLOSE:WAIT 10
RETURN

REM Receive file -----
LABEL RCVFIL
CURSOR 0,25:PRINT "                        "
COLOR 6:CURSOR 0,26:PRINT "ESC"+CHR$($1E)+":Camcel                       ":COLOR 7
CURSOR 0,25:PRINT "Start file send from PC";
A$="":SERIAL BRTE,0,1000

DO
 C=SERIALIN()
 IF ((READKEY() AND $FF00)>>8)=27 OR KEYS()=1 THEN REDISP=1:RETURN
 IF C>=0 THEN
  IF C=13 THEN BREAK
  A$=A$+CHR$(C)
 ENDIF
LOOP

WAIT 30:FOPEN A$,"w":D=0:USETIMER 1000
DO
 C=SERIALIN()
 IF C>=0 THEN
  FPUTC C:D=D+1
  CURSOR 0,25:PRINT "Recive ";:PRINT A$+" ";:PRINT D;:PRINT " bytes"
  TIMER 0
 ENDIF
 IF ((READKEY() AND $FF00)>>8)=27 THEN BREAK
 IF TIMER()>=3000 THEN BREAK
LOOP
FCLOSE:REDISP=1
RETURN

ファイルの送受信以外の機能で、標準のファイルマネージャーの補助的なファイル操作として、ファイルの削除、リネームもできる様にしてSDカードの抜き差しせずにSDカード内のファイルの整理もできるようにしました。
(標準のファイルマネージャーではディレクトリの作成可能で、ファイルコピーはエディタで一度読み込んでから別名で保存すればよいので)

キーボード接続していなくても、MachiKania標準のボタン方向ボタン、Start、Fire でもリネーム以外の操作はできる様にしています。(画面上の表記はそれぞれ (S(F
操作説明は下記。
(画面下部にも表示されます)

・ファイル/ディレクトリ表示時
   ファイル/ディレクトリの選択: 方向キー/方向ボタン
   ファイル決定: Enter/Fireボタン
   表示モード(ファイル/ディレクトリ)変更: Dキー/Startボタン
     ディレクトリ表示モードでディレクトリを選択した直後はファイル表示モード
   ファイル受信: Sキー/右方向ボタン+Startボタン
   終了: Escキー/上方向ボタン+Fireボタン

・ファイル操作時(ファイル決定後)
   ファイル削除: Dキー/左方向ボタン
   ファイル名変更: Rキー (ボタンでは操作不可)
   ファイル送信: Sキー/右方向ボタン
   ファイル選択に戻る: Escキー/上方向ボタン 
 
MachiKaniaにキーボード接続していない状態でボタンで終了した場合は Hit Any Key が表示されずリセットするしかなくなりますので、Startボタンを押してリセットしてください。

プログラムの起動直後は、プログラムのカレントディレクトリにあるファイルの一覧が表示されます。

Rキーを押すと、カレントディレクトリにPCからファイルを受信します。
表示可能なファイル数は最大66ファイルです。
プログラムをシンプルにするため(というかメンドクサかった)スクロールはできず66を超える数のファイルは表示できません。まあ、実用上はあまり問題にならないと思います。
この状態でDキーを押すとディレクトリ一覧が表示され、ディレクトリを選択してEnterキーを押すとカレントディレクトリがそのディレクトリに移動し、そのディレクトリのファイル一覧が表示されます。
プログラムをシンプルにするため(というかメンドクサかった)一つ上のディレクトリには戻れず、上位のディレクトリに戻りたい場合は、[Root]を選択して一旦ルートディレクトリに戻ります。

方向キーでファイルを選択してEnterキーを押すと、ファイル操作モードになります。

画面下部に選択したファイル名が表示され、Dキーで削除、Rキーでリネーム、Sキーでファイル送信が可能です。

実際に操作したMachiKaniaの画面の動画はこちら

PC側の操作は、前回、前々回の記事の通りです。

MachiKaniaにPCからファイルを送信をしてみる(PowerShell版) - 諸々の記録

MachiKaniaからPCにファイルを送信をしてみる(PowerShell版) - 諸々の記録

PCからファイルを送信するときは、ファイルを右クリックして「送る」を選択、PCにファイルを送るときは、フォルダを道クリックして「送る」を選択します。

必要なファイルが複数のブログに分かれているので、必要なファイルを1つにまとめて下記からダウンロードできるようにしました。

https://img.atwiki.jp/machikania/attach/25/31/fmanl.zip

拡張子が ps1 のファイルは、C:\ttl に配置。
拡張子が bat のファイルは、ウインドウズキー + R で shell:sendto と入れて OK で表示されたフォルダに配置します。

また、MachiKania 側は、 MACHICAP.INI の UART pins の設定で URRT で使うピンを設定する必要があります。

詳しくは下記の記事を参照してください。(TeraTermは不要です)

これでSDカードを抜き差ししなくても、ファイルの送受信とファイルの整理が出来るようになりました。
自分で使ってみて、結構使い勝手が良いものが出来たと思っています。

MachiKaniaからPCにファイルを送信をしてみる(PowerShell版)

前回はMachiKaniaにPCからファイルを転送するプログラムをPC側はPowerShellにしたことでエクスプローラーの「送る」を使って簡単にファイルを送れるようにしました。

今度は、逆にMachiKaniaからPCにファイルを送信するプログラムをPC側はPowerShellを使って作成してみます。

以前作成したPC側に TeraTermを利用した例はこちら。


まず、MachiKaniaからPCへファイルを送信するための、PC側のPowerShellスクリプト。


recv.ps1

# --- 設定 ---
$portName = "COM17"
$baudRate = 9600

# --- SerialPort オブジェクト作成 ---
$port = New-Object System.IO.Ports.SerialPort $portName, $baudRate, "None", 8, "One"
$port.ReadTimeout = 3000   # 必要に応じて調整
$port.Open()

Write-Host "Receiving data..."
$port.Write("#")
Start-Sleep -s 1

# Write-Host "Waiting for file name..."

# --- ファイル名を受信(改行まで) ---
$filenameBuilder = New-Object System.Text.StringBuilder

while ($true) {
    try {
        $b = $port.ReadByte()
        if ($b -eq 10 -or $b -eq 13) {  # LF or CR
            break
        }
        $null = $filenameBuilder.Append([char]$b)
    }
    catch {
        continue
    }
}

$recvFile = $filenameBuilder.ToString()
Write-Host "File name: $recvFile"

# --- 受信バイト数カウンタ ---
$byteCount = 0

# --- 受信ループ ---
$fs = [System.IO.File]::Open($recvFile, [System.IO.FileMode]::Create)

try {
    while ($true) {
        $byte = $port.ReadByte()   # 1バイト受信
        if ($byte -ge 0) {
            $fs.WriteByte([byte]$byte)
            $byteCount++

            # 受信バイト数を表示
            Write-Host "`rReceived: $byteCount bytes" -NoNewline
        }
    }
}
catch {
    Write-Host "`r`nReceive stopped."
}
finally {
    $fs.Close()
    $port.Close()
}

Write-Host "Saved to $recvFile"

これもほとんど copilot に作ってもらいましたw
設定 の $portName は環境に合わせて変更してください。
このプログラムは、以前作ったTeraTerm版と同様、# が送られてきたらファイルの受信を開始するようにしています。
この recv.ps1 を任意のフォルダに置いておきます。
私は、 前回の send.ps1 と同じ C:¥ttl¥ に置きました。

そして、これを実行するための batファイル

MKファイル受信.bat

@echo off
rem カレントディレクトリを引数のディレクトリ(エクスプローラーで右クリックしたフォルダ)に移動
cd /d %~1

rem PowerShellスクリプトを実行
powershell -NoProfile -ExecutionPolicy Unrestricted -File "C:\ttl\recv.ps1"

pause

このファイル名は、エクスプローラーの「送る」で使うので、この例のように日本語で分かりやすいファイル名にしておくと良いです。

次に、この bat ファイルを、「送る」フォルダにおきます。
「送る」フォルダは、Windowsキー + R を押して「ファイル名を指定して実行」で shell:sendto と入れて [参照] ボタンをクリックすると表示されます。

 

そして、MachiKania で実行する受信プログラムは下記。

SEND.BAS

S$="SEND.BAS":REM Set send file name
DIM B(0)
CLS
PRINT "Run receive program on PC(start with #)"
PRINT "Send "+S$
SERIAL 9600,0
DO
 IF INKEY()=27 THEN RETURN
LOOP WHILE NOT(SERIALIN()=ASC("#"))
WAIT 100:D=0
FOPEN S$,"r"
FOR I=0 TO LEN(S$)-1
 SERIALOUT ASC(S$(I)):REM Send file name
NEXT
SERIALOUT 13
WHILE FGET(B,1)>0
 D=D+1:SERIALOUT B(0)
 CURSOR 0,2:PRINT D;:PRINT " bytes sent"
WEND
FCLOSE
ENDこ

送信するファイル名を1行目に記述しておきます。
このプログラムをMachiKaniaで実行します。


次に、PCのエクスプローラーで受信したファイルを保存するフォルダをマウス右クリックして、「その他のオプションを確認」をクリックし「送る」から「MKファイル受信.bat」を選択します。
ファイルを受信するのですが「送る」を選択しますw


すると、ファイル転送が始まり、MachiKaniaとPCの方で転送byte数が表示されます。

MachiKania側の画面

PC側の画面

転送が終わると、PCのフォルダに受信したファイルができています。


これで、前回は PCからMachiKania、今回は MachiKania から PCへファイル転送がエクスプローラーの「送る」を使ってできるようになり簡単にファイルを送受信できるようになりました。

欲をいえば、MachiKaniaからファイルを送信するときに、プログラムの中に送信するファイル名を記述しないといけないのが面倒なのでなんとかしたいですね。
それには、MachiKania側でファイル選択プログラムを作る必要があるので簡単ではないですが。