電子ブロック工房 https://www.rad51.net/blog/mycom/ IC・トランジスタで出来たコンピューターを設計・製作するためのブログ ja Jeans CMS © Weblog http://backend.userland.com/rss https://www.rad51.net/jeans/skins/jeans/images/jeans2.gif 電子ブロック工房 https://www.rad51.net/blog/mycom/ PicoCalc用MachiKaniaの紹介 https://www.rad51.net/blog/mycom/?itemid=995 ver 1.6 から、ClockworkPi 社の PicoCalc で使えるようになりました。

20250809-picocalc-photo.png

ResTouch 版と同じく、こちらもはんだ付けなしで、MachiKania を走らせることができます。

PicoCalc で MachiKania を走らせるには

まずは、PicoCalc を入手します。ClockworkPi のページから注文してください。2025 年 8 月現在、注文から受け取りまで、2-3ヶ月かかるようです。気長に待ちましょう。

目的の、Raspberry Pi Pico を PicoCalc のソケットに挿入します。次のものが使えます。すでにピンヘッダーが取り付けられている H タイプでも、通常タイプでも、どちらでも構いません。H タイプのものはそのまま、通常タイプのものは、左右に 20 ピンずつのピンヘッダーを、半田付けして使います。

・Raspberry Pi Pico
・Raspberry Pi Pico W
・Raspberry Pi Pico 2
・Raspberry Pi Pico 2 W
(PicoCalc を購入すると Raspberry Pi Pico H が付属しているので、そのまま使えます。)

MachiKania は、GitHub のリリースページからダウンロードできます。ダウンロードできる ZIP アーカイブの中から、「machikania-pc-xxx.zip」(xxxは、バージョン番号)を選んでください。この ZIP アーカイブの中に、必要なファイルがすべて入っています。

MachiKania をインストールします。ResTouch の電源を切り、裏返します。PC に micro B の USB ケーブルを接続し、ResTouch 裏側の隙間から爪楊枝などの細い棒で Raspberry Pi Pico の白い「BOOTSELボタン」を押しながら、micro B のコネクターを接続します。

20250809-picocalc-install.png

PC 上に、「RPI-RP2」ドライブもしくは「RP2350」ドライブが現れるので、そこに上記の ZIP アーカイブに含まれる「phyllosoma_kb.uf2」ファイルをドラッグ&ドロップすれば、インストールされます。ただし、

・Pico の場合は、pico_picocalc ディレクトリーの物を
・Pico W の場合は、pico_w_picocalc ディレクトリーの物を
・Pico 2 の場合は、pico2_picocalc ディレクトリーの物を
・Pico 2 W の場合は、pico2_w_picocalc ディレクトリーの物を

それぞれ選んでください。

最後に、ダウンロードした ZIP アーカイブに含まれている次のファイル・ディレクトリーを、MMC/SD カードにコピーしてください。

・MACHIKAP.INI ファイル
・LIB ディレクトリー
・samples ディレクトリー

必要に応じて、MACHIKAP.INI ファイルを編集します。細かくは、ZIP アーカイブの document ディレクトリー内の文書を読みながら設定する必要がありますが、とりあえず MachiKania を立ち上げたいだけならば、そのままでよいです。

これで、PicoCalc で MachiKania を走らせる準備ができました。

MachiKania の起動

上記の作業を進めた後に PicoCalc の電源を入れれば、MachiKania が起動するはずです。下の画像のようになります。

20250809-picocalc-editor.png

これでエディターが立ち上がっていますから、そのまま BASIC プログラムを書くことができます。また、「F1」キーでプログラムをロードすることもできます。下は、「F1」キーを押して、プログラム一覧を表示させたものです。「SAMPLES」ディレクトリーに移動した後の表示です。

20250809-picocalc-dir.png

ファイル選択画面では、上下矢印キーを押すと、青い矢印で示された選択項目が変わります。矢印で指定のファイルをロードするには、「Enter」キーを押してください。プログラムをロードすると、下の例のようになります。

20250809-picocalc-program.png

プログラムの実行には、「F4」キーを押してください。上の画像で表示した「RAYTRACE.BAS」の実行結果が、このページ最上部に表示されています。

PicoCalc 版 MachiKania を使うときの注意点

readme.txtにも書きましたが、いくつか注意点があります。まず、キーボードに関しては、以下の点に注意してください。

・「Shift + Right」「Shift + Left」が使えないので、代わりに「Alt + Right」「Alt + Left」を使う。
・「Page Up」「Page Down」ボタンが無いので、代わりに「Alt + Up」「Alt + Down」を使う。
・「Shift」キーなしで「Home」「End」を使いたい場合は、「Alt + Tab」「Alt + Del」を押す。

MachiKania の制御に使うボタンは、キーボードでエミュレートしています。上下左右矢印キーが上下左右ボタンに、スペースキーが「Fire」ボタンに、改行キーが「Start」ボタンに対応しています。これらの対応付けを変更したいときは、MACHIKAP.INIを編集してください。

BASICプログラムを実行途中で停止したい場合、Ctrl+Alt+Delキーを同時に押してください。プログラムが途中停止します。ただし、PRINT命令などを一切使わないループの中などでは、停止しない場合もあります。

MachiKania の高速実行を体験

MachiKania は、高速で BASIC プログラムを実行できるのが特徴です。C の半分、Python の数倍の速度です。サンプルプログラムの「MADELBR.BAS」を実行してみてください。

20250810-picocalc-mandr.png
動画はこちら

これは、MMBasic 用の「mand.bas」を、MachiKania 用に移植したものです。MMBasicでは全体の描画に5分ほどかかりますが、MachiKania では10秒ちょっとで表示できます。これは、MMBasicがインタープリター形式でプログラムを実行するのに対し、MachiKaniaがコンパイラー形式でプログラムを処理するからです。

PicoCalc で GPIO を使うには

PicoCalc 本体の左側に、GPIO ポートに接続された端子があり、それを使う事ができます。PicoCalc の説明書には、下のように記載されています。

20250809-picocalc-ports.png

見てわかるように、GP2, 3, 4, 5, 21, 28 と、3.3 V, GND が出ています。これ以外に、「UART0_RX」はGP1として、「UART0_TX」はGP0として使用することができます。ただし、GP1(UART0_RX) を使う場合は、内部基板の「SEL1」ディップスイッチを「M_WART_RX」の指定にしないといけないので、注意が必要です(これを怠ると、最悪、機器の故障が起こりえます)。

PicoCalc での GPIO の使用については、qiita.com で Kazuhisa Sakabe さんが精力的になさっているので、ご参照ください。MACHIKAP.INIの設定なども含めて詳細を解説してくださっているので、非常に参考になります。

PicoCalc版MachiKaniaでADT7410を利用する(I2C通信)
PicoCalc版MachiKaniaでADT7310を利用する(SPI通信)
PicoCalc版MachiKaniaでBME280を利用する(I2C通信・SPI通信)

]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=995 Sat, 16 Aug 2025 11:03:13 PDT ITEM995_20250816
ResTouch用MachiKaniaの紹介 https://www.rad51.net/blog/mycom/?itemid=994 ver 1.6 から、Waveshare 社の Pico-ResTouch-LCD-3.5 で使えるようになりました。

20250809-restouch-running.png

これにより、一切半田付けなしで、MachiKania が楽しめるようになりました。

必要な物は、以下の写真の通りです。
20250809_parts_restouch.png

・Waveshare Pico-ResTouch-LCD-3.5
・Raspberry Pi Pico H (もしくは WH, 2 H, 2 WH)
・Micro SD カード
・USB キーボード
・USB-OTG ケーブル(電源入力付き、micro-B)
・USB-micro B ケーブル

これだけあれば、半田付けなど一切することなく、組み立てるだけで MachiKania が使えるようになります。以下、順を追って説明します。

部品の購入

まず、Pico-ResTouch-LCD-3.5を入手します。アマゾンやマルツなどで、取り扱いがあるようです。「Pico-ResTouch-LCD-3.5」であることを確認してください。類似の「Pico-ResTouch-LCD-2.8」は、使えません。

Raspberry Pi Picoは、半田付けしないで使いたいのであれば、ピンヘッダー付きの H シリーズを購入してください。次のものが使えます。マルツやDigiKeyなどで、取り扱いがあるようです。

・Raspberry Pi Pico H
・Raspberry Pi Pico WH
・Raspberry Pi Pico 2 H
・Raspberry Pi Pico 2 WH

Micro SD カードは、何でも構いません。通常の SD カードとして使えるアダプターが付属しているものが、便利です。

USB キーボードも、何でも構いません。日本語配列キーボードもしくは、US配列キーボードを使ってください。

USB-OTG ケーブルは、micro B で、電源入力端子が付いているものを使ってください。アマゾンなどで、「usb-otg micro B power」などの検索語で検索すれば、見つかるはずです。上の写真のような、二股の物を使います。

同様に、USB micro B ケーブルを入手してください。

MachiKania のダウンロード

MachiKania は、GitHub のリリースページからダウンロードできます。ダウンロードできる ZIP アーカイブの中から、「machikania-rt-xxx.zip」(xxxは、バージョン番号)を選んでください。この ZIP アーカイブの中に、必要なファイルがすべて入っています。

MachiKania のインストール

次に、MachiKania を、Raspberry Pi Pico にインストールします。USB micro B ケーブルを PC に挿入し、Pico 基板上の白い「BOOTSEL」ボタンを押した状態で、接続します。

20250809-restouch-install.png

PC 上に、「RPI-RP2」ドライブもしくは「RP2350」ドライブが現れるので、そこに上記の ZIP アーカイブに含まれる「phyllosoma_kb.uf2」ファイルをドラッグ&ドロップすれば、インストールされます。ただし、

・Pico H の場合は、pico_restouch ディレクトリーの物を
・Pico WH の場合は、pico_w_restouch ディレクトリーの物を
・Pico 2 H の場合は、pico2_restouch ディレクトリーの物を
・Pico 2 WH の場合は、pico2_w_restouch ディレクトリーの物を

それぞれ選んでください。

必要なファイルの micro SD へのコピー

20250809-restouch-copy-files.png

Micro SD カードに、必要なファイルをコピーしておく必要があります。次のファイルもしくはディレクトリーを、ZIP アーカイブから SD カードにコピーしてください。

・MACHIKAP.INI ファイル
・LIB ディレクトリー
・samples ディレクトリー

必要に応じて、MACHIKAP.INI ファイルを編集します。細かくは、ZIP アーカイブの document ディレクトリー内の文書を読みながら設定する必要がありますが、とりあえず MachiKania を立ち上げたいだけならば、そのままでよいです。

組み立て

組み立ては、コネクターを接続していくだけです。まずは、Raspberry Pi Pico を、ResTouch に挿入します。この時、向きを間違えないように(「USB」の印刷があるので、Pico の micro B USB ポートをそちらの方向に)。
20250809-restouch-insert-pipico.png

次に、上の要領でファイルをコピーしておいた micro SD カードを挿入。
20250809-restouch-insert-sd.png

USB OTG ケーブルを接続。
20250809-restouch-otg-connected.png

USB キーボードを接続。
20250809-restouch-keyboard-connected.png

最後に、電源用の USB micro B ケーブルを接続。
20250809-restouch-power-connected.png

これで、すべての接続が完了です。

MachiKania の起動

電源を投入すれば、液晶ディスプレイの表示が、以下のようになるはずです。上で白い四角が点滅、下に「LOAD|SAVE| |RUN | LINE:1」のように表示されれば、動いています。
20250809-restouch-assembled.png

これで、ResTouch で MachiKania が走るようになりました。この画面で直接 BASIC コードを入力するのも良し、「F1」キーからサンプルプログラムをロードするのもよし。プログラムの実行は、「F4」キーです。

ResTouch の特徴

MachiKania を使う上での、Pico-ResTouch-LCD-3.5 の特徴は、次の通りです。

・液晶のピクセルサイズが 480 x 320 と、少し大きめ
・タッチパネル搭載
・液晶からの情報を、Raspberry Pi Pico から読み取ることができない
・音が出ない

まず、ピクセルサイズですが、MachiKania type P では、320 x 240 ピクセルの ILI9341 液晶を使うのがデフォルトですから、480 x 320 と、大きめの液晶を使えることがポイントです。画像はより鮮明にできるし、文字表示を行う場合など、より多くの情報を表示できます。

タッチパネルが付属しているので、これがそのまま、MachiKania で簡単に使えます。クラスライブラリーの TSC2046 クラスを用いてください。使い方は、クラスの help.txt を参照してください。

液晶からの情報が読み取れないことがデメリットです。具体的には、BASIC の GCOLOR 関数が使えません。例えば、この機能を使ったサンプルプログラム、INVADE.BAS が正常動作しないので、ResTouch 用のサンプルプログラムには同梱していません。ただ、 GCOLOR 関数が必要になるプログラムはめったにないので、殆どの場合で問題なく使えるはずです。

ResTouch には音声出力用の部品が搭載されていないので、音が鳴りません。ResTouch で音を鳴らせたい場合は、次のセクションを参考にしてください。

ResTouch で音を鳴らせたい場合

上で述べた通り、ResTouch には音声出力のための部品が搭載されていません。音を鳴らしたい場合は、次の例を参考にしてください(半田付けが必要です)。

まず、ResTouch を裏返して、Raspberry Pi Pico を取り外します。下の画像で赤矢印のところから音声出力を取り出すことができます。上の赤矢印が接地 (GND) で、下の赤矢印が音声出力端子(GP27)です。
20250809-restouch-audio-ports.png

上の画像の赤矢印の位置に、1-10 KΩの抵抗を取り付けます。
20250809-restouch-audio-resistor.png

次に、その抵抗に並列に、圧電ブザーを取り付けます。
20250809-restouch-audio-buzzer.png

これで、ResTouch でも、音が鳴るようになります。ただし、圧電ブザーは小さな音なので、WAV ファイルの再生などでは聞こえないぐらいの小さな音しかでません。そういった場合は、圧電ブザーの代わりにイヤホンジャックなどを同じ位置に取り付け、イヤホンで聞くかアンプに接続すればよいです。]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=994 Sat, 16 Aug 2025 11:02:59 PDT ITEM994_20250816
MachiKania type P/PU ver 1.6.0を公開 https://www.rad51.net/blog/mycom/?itemid=993
https://github.com/machikania/phyllosoma/releases/tag/Ver1.6.0

今回の更新の目玉は、以下の通りです。

・LCD用のコードエディターで、予約語・文字列・コメントの色付けに対応
Waveshare Pico-ResTouch-LCD-3.5に対応
ClockworkPi PicoCalcに対応
・IPSタイプのLCDに対応
・ボタン操作を、キーボードでもエミュレートできるようにした
・AVI動画ファイルの再生ができるようになった(Type PUのみ)

20250810-editor.png

GitHub リリースページはこちら
Type P 公式ホームページはこちら
Type PU 公式ホームページはこちら

コードエディターでの色付け

エディターでの BASIC ソースコードの表示・編集の際、予約語・文字列・コメントに色付けがされるようになりました。これにより、ソースコードが見やすくなりました。色は、予約語に青、文字列に赤、コメントに緑と、一般的なソースコードエディターと似せた色にしました。

ただし、type PUはこの色付けは対応していません。NTSC ディスプレイの場合、色を付けると逆に読みにくくなったりするからです。ですので、type PUの場合は、今まで通り白黒のディスプレイでソースコードを編集してください。

ResTouch 及び PicoCalc に対応

Waveshare 社の Pico-ResTouch-LCD-3.5 と、ClockworkPi 社の PicoCalc で、MachiKania が使えるようになりました。従来、何らかの電子工作をしないと MachiKania が使えませんでしたが、これらのガジェットへの対応により、半田付けを一切することなく MachiKania を楽しめるようになりました。

ResTouch 対応についてはこちらの記事に、PicoCalc 対応についてはこちらの記事に、それぞれ詳細を書きましたので、詳しくはそれらの記事をご覧ください。

IPSタイプのLCDに対応

従来の MachiKania を IPS タイプの LCD で使うと、色が反転した状態で表示されていましたので、それに対応しました。IPS-LCD をお使いの場合は、MACHIKAP.INI で、「LCDINVERT」のコメントを外して、有効にしてください。

ボタン操作をキーボードでエミュレート

MachiKania は、ボタン操作でゲームを楽しんだりすることができます。今回の更新では、ボタンが無くてもキーボードが接続されていれば、ボタン操作と同じことができるようにしました。必要な場合は、MACHIKAP.INIで、「EMULATEBUTTONUP=」等の行のコメントを外して有効化し、右にキーコードを指定してください。特定の キーの仮想キーコードを知りたいときは、次のBASICプログラムを実行して、キーを押せば、表示されます。

DO:PRINT INKEY():LOOP

AVI動画ファイルの再生

Type PU では、AVI 動画ファイルを再生できるようになりました。そのための、PLAYAVI クラスを追加しました。この、AVI 動画ファイルの再生については別に記事を書きましたので、そちらを参照してください。

MachiKania type PUで動画再生
MachiKania type PUで動画再生、その2
MachiKania type PUで動画再生、その3]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=993 Sat, 16 Aug 2025 11:02:43 PDT ITEM993_20250816
MachiKania type PUで動画再生、その3 https://www.rad51.net/blog/mycom/?itemid=992
250519-withSound.png

まず、PLAYAVIクラスで音声付きで再生することができるのは、15 fpsの動画だけである。また、AVIファイルは、音声データーを含まないことが前提だ。従って、動画の再生と同時に音声も再生するには、別途音声ファイルを準備する必要がある。PLAYAVIクラスでは、音声ファイルとしてWAVファイルを扱うので、これをAVIファイルとは別に用意する。

ここで使用するWAVファイルは、次の条件を満たしている必要がある。

1.音声データーは、圧縮なしのPCM
2.8ビットモノラル
3.サンプリングレートは、およそ15825 Hz

ここでは、このようなwavファイルを作成する方法の例について述べる。mp4ファイルから音声を抽出し、aviファイルに変換する方法を例示する。次のツールを用いる。

FFmpeg:MP4ファイルをWAVファイルに変換するために用いる

MP4ファイルを準備

まず、元となるMP4ファイルを準備する。この記事の説明では、以下のwebサイトからダウンロードした。「NHKクリエイティブ・ライブラリー」著作の、フリー素材だ。

https://www2.nhk.or.jp/archives/movies/?id=D0002030736_00000

このMP4ファイルは、29.97 fps(1秒間に29.97フレーム)で1分39秒の動画である。ここでは、最終的に15 fpsのAVIファイルと、別にWAVファイルに変換する例を挙げる。また、動画の初めの30秒だけ使用する。

AVIファイル作成

AVIファイルの作成方法は、「その2」で述べた方法と同じである。ただし、最初の30秒だけ使うため、FFmpegを使う時のパラメーターに「-t 30」を加える。その他は、同様に進める。ここでは、最終的なAVIファイルを、「crick15.avi」として保存する。

WAVファイルのサンプリングレートの算出

ここで使うWAVファイルのサンプリングレートの値は、少し複雑だ。最初に述べた「15825 Hz」というサンプリングレートは、元のmp4動画のサンプリングレートが、ぴったり 30 fps の場合である(30*1055/2)。ここで使うmp4動画はサンプリングレートが29.97 fps なので、微調整が必要である。

この、29.97 という値は、正確には 30000/1001 なのだが、この値は、FFmpegに含まれている「ffprobe」によって調べることができる。
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate input.mp4
ただし、「input.mp4」は任意のmp4ファイル。

この例の場合、作成するWAVファイルのサンプルレートは、次のように計算する

 15825 * (30000/1001) / 30 = 15809.190809...

サンプリングレートは整数値で設定する必要があるから、15809 Hzを使う。ただし、0.190809...(191/1001)の誤差があるので、それについては後で考察する。

WAVファイルの作成

サンプリングレートが確定したら、WAVファイルを作成する。FFmpegを利用し、一般的には次のように実行する。

ffmpeg -i input.mp4 -ac 1 -ar 15825 -f wav -acodec pcm_u8 -t 31 result.wav

ただし、「input.mp4」は任意のmp4ファイル名、「result.wav」は任意の出力wavファイル名。

ここの例では、「最初の31秒だけ抽出する」ためと「音量を上げる」ために、それぞれ「-t 31」と「-af "volume=32, dynaudnorm, alimiter=limit=0.9"」のパラメーターを追加し、上の計算通りサンプリング周波数を15809 Hzとするために「-ar 15809」として、次のコマンドを実行した。

ffmpeg -i D0002030736_00000_V_000.mp4 -ac 1 -ar 15809 -f wav -acodec pcm_u8 -t 31 -af "volume=32, dynaudnorm, alimiter=limit=0.9" crick15.wav


いよいよ再生

必要なAVI、WAVの両方のファイルがそろったので、MachiKania type PUで再生する。RP2350搭載のRaspberry Pi Pico 2を使う。BASICファイルは、次の例のようにする。

useclass PLAYAVI

cls
system 51,15
system 50,315000000
system 57, 40000000

a=new(PLAYAVI,"crick15.avi")
a.SETWAVE("crick15.wav")

do
  wait 1
loop while a.play()

end


音声と映像のずれの修正

元のmp4ファイルのサンプリングレートが、ぴったり 30 fps の場合、ここで述べた方法で動画再生しても理論的に音と映像がずれることはない(WAVファイルは、15825 Hzで作成)。しかし、元のmp4ファイルのサンプリングレートが29.97 fpsの場合などは、長く再生していると音と映像が少しずつずれてくる。

元のmp4ファイルのサンプリングレートが29.97 fps (30000/1001)の場合、本当ならサンプリングレートを

15809.190809190809190809190809...

でWAVファイルを作成しないといけないところ、15809 Hzで作成することになる。0..190809...(191/1001) Hz分のずれがある。3分の動画ならおよそ0.002秒、30分の動画ならおよそ0.02秒のずれだからほとんど気が付かないレベルだが、2時間の動画なら0.087秒ずれる(音声が遅れる)ので、気になるかもしれない。

そこで、こういった場合は再生中に音声再生位置を微調整する。画像を 1001 x 15 フレームだけ再生したときに 音声データーが191 ビットずれる計算だ。なので、BASICプログラムのメインループを次のようにすればよい。

w=15015
do
  w=w-1
  if 0=w then
    w=15015
    a.MOVEWAVPOINTER(191)
  endif
  wait 1
loop while a.play()


もう一つの方法は、動画を15分ぐらいずつのものに分割しておき、それらを順次再生する方法だ。ファイルサイズが4 GBまでという制限があるFAT32ファイルシステムでは、336x216ピクセルサイズの動画はおよそ60分までしか対応できないので、長い動画を再生したいときはこちらのやり方の方が現実的かもしれない。この場合、上で述べた「MOVEWAVPOINTER」メソッドによる微修正は必要ない。]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=992 Sat, 24 May 2025 19:13:53 PDT ITEM992_20250524
MachiKania type PUで動画再生、その2 https://www.rad51.net/blog/mycom/?itemid=991
MachiKaniaで再生するAVIファイルは、以下のような条件を満たさないといけない。

1.幅は、336ピクセル以下
2.高さは、216ピクセル以下
3.上下反転
4.画像データーは圧縮なし
5.画像は256色パレット
6.音声データーを含まない

ここでは、このようなaviファイルを作成する方法の例について述べる。mp4ファイルをaviファイルに変換する方法を例示する。次に示す、2つのツールを用いる。

FFmpeg:MP4ファイルをAVIファイルに変換するために用いる
Fiji:AVIファイルを編集するために用いる

MP4ファイルを準備

まず、元となるMP4ファイルを準備する。この記事の説明では、以下のwebサイトから960x540ピクセルサイズのものをダウンロードした。

https://pixabay.com/ja/videos/カメ-海洋-野生動物-水中-244754/

このMP4ファイルは、30 fps(1秒間に30フレーム)で30秒の動画である。ここでは、最終的に15 fpsのAVIファイルに変換する例を挙げる。

AVIファイルに変換

まず、編集が容易なAVIファイルに変換する。これには、FFmpegを用いる。コンソールで、以下のように呼び出す。
ffmpeg -i original.mp4 -c:v rawvideo result.avi
「original.mp4」の部分には使用するMP4ファイルのファイル名を、「result.avi」の部分には任意のファイル名を指定する。

AVIファイルを編集

作成したAVIファイルを、Fijiで開く。この時、"Flip Vertical"にチェックを入れる。
open.png

次に、横幅を調整する。プルダウンメニューの、「Image->Adjust->Size」を選択する。
size.png
ここでは幅を336に変更するため、「Width」に「336」を入力する。「Height」は自動的に「189」になるはずだ。
resize.png

256 色パレットモードに変更する。プルダウンメニューから「Image->Type->8 bit Color」を選択する。
8-bit-color.png
通常は「256」を入力し、「OK」を押す。もし、動画再生時にキャプションをつけたいのなら、2色減らして「254」などとすることもできる。
mediancut.png


次に、フレームレートを 30 fps から 15 fps に変更する。半分の動画データーを捨てることになる。プルダウンメニューの「Image->Stacks->Tools->Deinterleave」を選択する。
deinterleave.png
半分の動画データーを捨てるので「2」を入力し、「OK」を押す。
de-interleave.png


「#1」と「#2」の2つができるので、どちらかを選択し、保存する。プルダウンメニューから「File->Save As->AVI」を選択する。
saveas.png
ここで「Compression」には「None」を選び、Frame Rateを「15.0」とする。
saveasavi.png

これで、MachiKaniaで再生できるAVIファイルが作成された。

アスペクト比を変えたいとき

上の例では、336x189のピクセルサイズの動画になる。MachiKania type PUでは336x216のピクセルサイズが画面いっぱいなので、上下が開いてしまう。336x216の動画にするには、以下のように操作する。

上の操作の「Image->Adjust->Size」のところ、「Height」に216を入力する。「Width」は自動的に「384」になるはずである。
resize-2.png


次に、画像ウィンドウ上で長方形の領域を、336x216のサイズで選択する。
rectangleroi.png
これは、ドラッグ&ドロップでも行えるが、「Edit->Selection->Specify」で数値指定することもできる(ただし、(384-336)/2 = 24 であることに注意)。
specify.png


ここで、プルダウンメニューから「Image->Duplicate」を選択する。この時、「Duplicate stack」のチェックボックスを有効にすること。
duplicate.png


あとは、上記と同じ方法で256色パレットに変更し、フレームレートを15 fpsに変更し、保存すればよい。]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=991 Sat, 24 May 2025 19:13:41 PDT ITEM991_20250524
MachiKania type PUで動画再生 https://www.rad51.net/blog/mycom/?itemid=990
加えて、ver 1.6.0 以降ではファイルシステムの動作周波数もクロックアップできるようになるので、より高速なファイルアクセスが行える。
(注:ver 1.6.0 は、2025年8月に公開しました 2025年5月24日現在、ver 1.6.0 は未公開です。GitHub レポジトリーのプロダクションブランチのソースコードからビルドするか、こちらのバイナリーを用いてください。PLAYAVI クラスは、ここにあります

これらの向上した機能を用いて、MachiKania type PU で動画を再生することができるようになったので、メモ。主に、RP2350 を搭載した、Raspberry Pi Pico 2 を用いる。

typePUmovie.png
動画は、こちら


動画の再生には、クラスライブラリーの PLAYAVI クラスを用いる。上の画像下のリンクで紹介した動画を再生する BASIC コードは、以下の通り。
useclass PLAYAVI

for i=3 to 0 step -1
  wait 60
  print i;" ";
next

cls
system 51,15
system 50,315000000
system 57,40000000

a=new(PLAYAVI,"crick15.avi")

do
  wait 1
loop while a.play()
end

「system 51」「system 50」「system 57」はそれぞれ、CPU の電圧、CPU のクロック速度、MMC(ファイルシステム)のクロック速度を設定する命令。CPU のクロックを 315 MHz (デフォルトは157.5 MHz)、MMC のクロックを 40 MHz(デフォルトは 10 MHz)に設定するようにしている。この設定により、高速でファイルを読み込み、表示することが可能になる。

「a=new(PLAYAVI,"crick15.avi")」で、PLAYAVI クラスのインスタンスを一つ作成している。「crick15.avi」が動画ファイル名で、別途用意しておく。この AVI ファイルの作成方法は、別の記事に詳細を書いた。336x189のピクセルサイズで、15 fps のものである。

フレームレート調整

下のグラフは、336 ピクセル幅で高さを色々と変えたときに、10 MHz - 40 MHz のファイルシステムクロックでどれぐらいのフレームレートで動画再生ができるかを、fps (Frames Per Second) 値で示したもの。なお、Pico 2を利用し、CPU クロックは 315 MHz で実験を行った。「height (pixels)」は縦のピクセル幅、「total pixels」は、縦x横の総ピクセル数である。(生データーはこちら
250519-AllData.png
250519-axis-2.png

下は、データーのうち、最もよく使うと思われる「40 MHz」だけを表示したもの。
250519-40MHzData.png
250519-axis-2.png
グラフを見てわかるように、幅が336ピクセルの場合、高さが168ピクセル以上で(総ピクセル数が56448以上で)、40 MHz のファイルシステムクロックを用いれば安定して 15 fps で動画再生される。それより少し小さめの113-167 の場合は 20 fps になってしまうので、こういった場合は

1.ファイルシステムクロックを下げる(例えば、20 MHz)
2.ソースコード中の「wait 1」を「wait 2」に変更する

等の方法で、fps 値を調整する。ほかの条件、例えば 336x216 ピクセルの動画で、15 fps ではなく 12 fps で再生したい場合なども、ファイルシステムクロックを変更するか、「wait」値を変更するか、で対処すればよい。

なお、フレームレート(fps 値)は、MachiKania type PU の特性上、60 の約数でなければならない。論理的に、60, 30, 20, 15, 12 fps 等は可能だが、48, 24 fps 等にすることはできない。また、ここでいう「15 fps」は、正確には 15.0467 (157500000/11/908/262/4) fps である。

30 fps で再生するには

上のグラフを見てわかるように、336x216 ピクセルのフルサイズの動画では、フレームレートは 15 fps が最大だ。しかし、総ピクセル数が 36000 以下の、小さめの画面サイズなら、30 fps で再生することも可能である。下は、230x148 ピクセルサイズ(総ピクセル数:34040)で、動画再生した例。
250519-30fps.png

キャプションをつけることも可能

再生する AVI は、基本的に 256 色で作成するが、少し色数を落として(例えば 254 色)AVI ファイルを作成すれば、キャプションをつけることも可能だ。
250519-caption.png
254 色の AVI を使って PLAYAVI クラスのインスタンスを作成すれば、パレット番号 254, 255 の2つが開くので、これらを使って「GPRINT」ステートメントで容易にキャプションが入れられる。

音声付き動画も再生可能

下の例のように、音声付き動画も再生できる。これについては、別記事に詳細を述べる
250519-withSound.png]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=990 Sat, 24 May 2025 19:13:24 PDT ITEM990_20250524
MachiKania type P/PU ver 1.5.2を公開 https://www.rad51.net/blog/mycom/?itemid=989 https://github.com/machikania/phyllosoma/releases/tag/Ver1.5.2

今回のバージョンアップの目玉は、以下の通りです。

・Raspberry Pi Pico 2 W に対応した
・CPU のクロック速度を変更できるようにした
・Type PU で、横幅80文字モードで起動できるようにした
・Type PU で、描画用と表示用に、別々の RAM 領域を使えるようにした

polygon.png

GitHub リリースページはこちら
Type P 公式ホームページはこちら
Type PU 公式ホームページはこちら

Raspberry Pi Pico 2 W 対応

去年の11月に、Raspberry Pi Pico 2 W が公開されました。日本でも、今年の3月から販売が開始され、現在では多くの人が入手可能になっています。私も去年の12月に入手し、MachiKania で対応できるかどうかを調べていました。Raspberry Pi Pico 用の SDK ver 2.1.0 の段階で Type P が、SDK ver 2.1.1 では Type PU も対応できることが分かりましたので、今回の MachiKania ver 1.5.2 では正式対応してバイナリーも公開しました。使用方法は Raspberry Pi Pico W と同じです。環境によっては、ネット通信速度の改善も見られるようです。また、Pico W に比べて RAM 容量が2倍になりましたので、より大きな RAM 容量が必要な場合(クラスをたくさん読みこむなど)に、効力を発揮します。

オーバークロック

Pico-SDK の ver 2.1.1 のリリースノートに、以下のような表記があります。

RP2040 has now been certified to run at a system clock of 200 Mhz when using a regulator voltage of at least 1.15 volts
(RP2040 は、少なくとも 1.15 ボルトのレギュレータ電圧を使用する場合、200 MHz のシステム クロックで動作することが認定されました)


RP2040 (Raspberry Pi Pico や Pico W など) 対応の Machikania では、システムクロックは 125 MHz です。200 MHz で動かせば1.6倍の速度なので、対応させない手はありません。そこで、SYSTEM ステートメントにより、CPU のクロック周波数と使用電圧を変更できるようにしました。配布アーカイブの document フォルダーにある cpuclock.txt で、少し説明をしています。

例えば公証のように、1.15 V で 200 MHz のクロック周波数にしたいときは、次のようにします。
SYSTEM 51, 12
SYSTEM 50, 200000000

「SYSTEM 51,12」は CPU 電圧を変更するための、「SYSTEM 50,200000000」はCPUクロック周波数を変更するための命令です。使い方は、help.txt と cpuclock.txt を参照してください。

クロック周波数は、RP2040 (Pi Pico) の場合 300 MHz ぐらいまで、RP2350 (Pi Pico 2) の場合 400 MHz ぐらいまで上げられるようです。ただしどちらの場合も、CPU 電圧1.30 V (SYSTEM 51,15) でテストしています。また、どんな周波数でも使えるわけではないようで、cpuclock.txt に、使える周波数の一覧を載せました。CPU クロックは初期状態より遅い設定にすることもできます(消費電力を少なくできる)。ただし、20 MHz を切ると CPU が不安定になり、動かないようです。

Type PU の場合、NTSC ビデオシグナルを作成することが必要なため、使用できるクロック周波数は 157.5 MHz と315 MHz の2つだけです(デフォルトは、157.5 MHz)。従って、ほとんどの場合オーバークロックは RP2350 だけで可能という事になります。ただし、ビデオ出力をする必要がない場合は、Type P と同様、様々な周波数が使えます。

Raspberry Pi Pico W や Pico 2 W の場合は、オーバークロックには注意が必要で、速くしすぎると CPU は動くけれど、WiFi 接続ができなくなることがあります。今のところ、システムクロックを上げるのは、公証値の 200 MHz までにしておいた方が良さそうです。

横幅80文字モード

Twitterで、工作魂さんから次のリクエストがありました。
request.png
もともと Type M に実装されていた機能ですが、Type PU 開発にあたり、実装を失念していたようで、さっそく取り込みました。ご指摘いただき、有難うございます。今後も、ユーザーの皆さんからこういったリクエストを下されば、嬉しいです。

ダブルバッファリング

Twitter の次のポストは、MachiKaniaのオーバークロックを実装する途中でケンケンさんが行った Type PU でのダブルバッファリングのテストです。

dbuffer.png
これはすごい、という事で、ver 1.5.2 で使えるようにしました。サンプルプログラムの「POLYGON.BAS」がそれです。RP2040 でも RP2350 でも動きます。RP2350 の場合は、「POLYGON.BAS」の8-9行目の「REM」を外せば CPU が倍の 315 MHz で動きますので、より素早い描画を楽しめます。お試しあれ。

その他

その他、様々な修正と追加を行っています。以下、readme.txt と readme-pu.txt からです。

 ・「Break」キーだけでなく、「Ctrl + Alt + Del」キーでプログラムの実行を停止できるようにした。
 ・SYSTEM(40), SYSTEM(41), SYSTEM(42), SYSTEM(43)により、キーボードの状態を取得できるようにした。
 ・SYSTEM 50, SYSTEM 51により、CPUのクロック速度と電圧を変更できるようにした。
 ・システムクロック315MHz動作時に正常にビデオ信号出力できるように対応
 ・STARTボタンを押しながら起動することにより、起動時のMACHIKAP.BAS自動実行をスキップすることが可能に。
 ・USEGRAPHICステートメントの第二引数指定により、2つのグラフィックRAM領域を用いた描画と表示が可能に。
 ・MACHIKAP.INIで、WIDTH80を指定することにより、起動時に横80文字表示にすることが可能に。
 ・サンプルプログラムのRAYTRACE.BASを修正し、Type PUで表示できるようにした。
 ・クラスライブラリーにCPUCLOCKを追加。使用可能なCPUクロック周波数を調べることが可能に。
 ・Raspberry Pi Pico 2 Wに対応。
 ・Raspberry Pi Pico 2 使用時のLCD液晶転送速度を改善。
 ・SPI 使用時の転送速度を改善。
 ・サンプルプログラム(MAZE3D.BAS, STARTREK.BAS)を修正。
 ・サンプルプログラム(POLYGON.BAS)を追加。]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=989 Fri, 11 Apr 2025 17:40:58 PDT ITEM989_20250411
Raspberry Pi Pico用のC/C++ビルド環境を構築する https://www.rad51.net/blog/mycom/?itemid=988 MachiKania のソースコードからビルドする方法について述べるが、他の Raspberry Pi Pico 用のプログラムでも同じであり、また、Pico 2, Pico W, Pico 2 W にも対応できる。

Raspberry Pi Pico 用のソースコードからビルドするには、VS code の extension を用いる方法があるが、私自身がその extension の中身をよく理解しておらず、どういう操作を行っているか分からないので、使っていない。この記事でも、VS code は使わず、必要なソフトウェアーを個々に揃えて利用する方法をとる。

success.png
(画像は、ビルドに成功した時のスクリーンショット)


必要なツール

Raspberry Pi Pico 用の C/C++ プログラムをビルドするのに必要なツールは以下の通り。

1.Git
2.pico-sdk
3.CMake
4.MinGW
5.ARM CC (ARM C コンパイラー)
6.Python

Git は、バージョン管理システムと呼ばれるもので、多くのソフトウェアーが Git で管理されている。次に述べる pico-sdk が Git で管理されているため、これが必要になる。また、目的の C プログラムをビルドするときにも、Gitが必要になる場合がある。

pico-sdk は、Raspberry Pi Pico 向けの C/C++ 開発用ソフトウェア開発キットだ。必要なライブラリーを含んでおり、ビルドの方法も提供する。

CMake は、ソフトウェアプロジェクトの構築を管理するためのクロスプラットフォームツールだ。プロジェクトの構造や依存関係を記述するスクリプトを基にプラットフォームに応じたビルドシステム生成するためのものだ。

MinGW(Minimalist GNU for Windows)は、Windows 向けの軽量な開発環境で、GNU コンパイラコレクション(GCC)を使用して C、C++ などのプログラムをコンパイルするためのツールである。

ARM CC (ARM C Compiler)は、Raspberry Pi Pico で採用されている CPU、ARM cortex M0+ もしくは ARM cortex M33 用に、C/C++ ソースコードをコンパイルするためのコンパイラーだ。

Python は汎用性の高いプログラミング言語で、シンプルな構文と豊富なライブラリが特徴である。pico-sdk によるビルドの際にもこれが使われる。

では、順番に見ていく。ここでは、これらのツールのうち Windows のインストーラーを用いてインストールするのは Git のみで、他のものは ZIP アーカイブをダウンロードして、解凍してできたファイル群を特定のフォルダーに配置する形をとる。

環境によっては、Git や Python などがすでにインストール済みであったりするケースもあるだろうが、その場合はそれぞれの項をスキップしていただきたい。また、それぞれのツールのインストール先、配置先が異なる場合は、後に説明するパス指定を、適宜修正する必要がある。

Git

Windows 用の Git は、次の場所から入手できる。
https://git-scm.com/downloads/win
64-bit Windows 用には「Click here to download」もしくは「64-bit Git for Windows Setup」をクリックすれば、インストーラーがダウンロードされる。2025/03/15 現在、「Git-2.48.1-64-bit.exe」である。

インストーラーをダウンロードしたら、ダウンロードファイルをダブルクリックしてGitをインストールする。基本的にデフォルトの設定のまま「Next」ボタンを押し続けてインストールすればよい。
Git.png

pico-sdk

Git をインストールすると、スタートメニューの検索欄に「git bash」と打つことで、次のようなアプリケーションが出るようになっているはずだ。これをクリックして、起動する。
gitClone.png
このコンソール上で、順に「cd Desktop/」 「git clone --recurse-submodules https://github.com/raspberrypi/pico-sdk.git」とタイプする。デスクトップ上に「pico-sdk」が現れる。すべてのファイルを取得するのに、数分かかる。エラー無く作業が済めば、「pico-sdk/libs」内にある5つのフォルダー(btstack, syw43-driver, lwip, mbedtls, tinyusb)のすべてが、空ではなくファイル・フォルダーが含まれている状態になっているはずなので、確認する。もし空のフォルダーがあれば、「git clone」に失敗しているので、一度「pico-sdk」フォルダー全体を削除してやり直す。

ここでは、「pico-sdk」フォルダーを「c:\pico」に移動して使用することとする。「c:\」に「pico」という名で新規にフォルダーを作成し、デスクトップ上の「pico-sdk」をそこに移す。

「c:\pico\pico-sdk」フォルダーの中身は、次のようになる。
picoSdkFolder.png

CMake

Windows 用の CMake は、次の場所で手に入る。
https://cmake.org/download/
「Latest Release」のZIPアーカイブのものを選べばよい。ここでは、Windows x64 ZIP(cmake-3.31.6-windows-x86_64.zip)を選んだ。

ZIPアーカイブに含まれているフォルダーを展開し、フォルダー名を「cmake」に変更して、「c:\pico」に移す。「c:\pico\cmake」フォルダーの中身は、次のようになっている。
cmakeFolder.png

MinGW

MinGW (MinGW-w64)は、次の場所で手に入る。
https://winlibs.com/
Web ページの上から4分の1ぐらいのところに、「Help! I don't know which download to choose!(助けて!どのダウンロードファイルを選択したらよいかわからない!)」 「Don't worry. For most purposes the latest Windows 64-bit release version with MSVCRT runtime and POSIX threads is a good choice.(心配しないで。ほとんどの目的には、MSVCRTとPOSIX対応の64ビットバージョンを選ぶのがよい選択だよ!)」という記述の後に「Download it here.(ここで、それをダウンロード)」というリンクがあるので、それを選ぶ。ここでは、「winlibs-x86_64-posix-seh-gcc-14.2.0-mingw-w64msvcrt-12.0.0-r3.zip」をダウンロードした。

ダウンロードした ZIP アーカイブには「mingw64」というフォルダーがあるので、それを解凍して「c:\pico」に展開する。「c:\pico\mingw64」フォルダーの中身は、次のようになる。
migw64Folder.png

ARM CC

ARM C コンパイラーは、次の場所で手に入る。
https://developer.arm.com/downloads/-/gnu-rm/product-release
Windows 用の ZIP アーカイブを選択する。2025/03/15現在、最新版は「Version 10-2020-q4-major」なので、ここでは「gcc-arm-none-eabi-10-2020-q4-major-win32.zip」を選んだ。

ZIP アーカイブのフォルダーを解凍し、フォルダー名を「gcc-arm」に変更して、「c:\pico」フォルダーに移す。「c:\pico\gcc-arm」フォルダーの中身は、次のようになる。
gccFolder.png

Python

Python は、次の場所で手に入る。
https://www.python.org/downloads/windows/
「Windows installer」ではなく、「Windows embeddable package」を選ぶ。ここでは、「python-3.13.2-embed-amd64.zip」を選択した。

「c:\pico」フォルダーに「python」という名のフォルダーを作成し、そこにZIPアーカイブのすべてのファイルを展開する。「c:\pico\python」フォルダーの中身は、次のようになる。
pythonFolder.png

ソースコードを入手して配置

必要なツールのインストールが終了したので、いよいよビルドの準備を行う。まず、ソースコードを入手して、配置する。次の場所から、開発中の MachiKania を入手する。
https://github.com/machikania/phyllosoma/tree/production
「Code:」ボタンを押して、「Download ZIP」を選択すると、「phyllosoma-production.zip」がダウンロードできる。

ダウンロードしたZIPアーカイブの「phyllowoma-production」フォルダーを解凍し、フォルダー名を「phyllosoma」に変更して「c:\pico」フォルダーに移す。「c:\pico\phyllosoma」フォルダーの中身は、次のようになる。
phyllosomaFolder.png

ビルド用のフォルダーを作成

「c:\pico」フォルダーに、「build」という名で新規にフォルダーを作成する。このフォルダー内に、「cmake.bat」 「make.bat」の2つのバッチファイルを作成する。バッチファイルの中身は、次の通り。

cmake.bat
@cd "%0\.."
@SET PATH=%PATH%c:\pico\cmake\bin;c:\pico\gcc-arm\bin;c:\pico\mingw64\bin;
@SET PICO_SDK_PATH=c:\pico\pico-sdk
@SET PARAMS=
@SET PARAMS=%PARAMS% -DPython3_EXECUTABLE="c:\pico\python\python.exe"
@SET PARAMS=%PARAMS% -DPICO_BOARD=pico -DPICO_PLATFORM=rp2040
cmake.exe -G "MinGW Makefiles" %PARAMS% ..\phyllosoma
pause

make.bat
@cd "%0\.."
@SET PATH=%PATH%c:\pico\cmake\bin;c:\pico\gcc-arm\bin;c:\pico\mingw64\bin;
mingw32-make
pause

ただし、これらのバッチファイルの中で、「cmake」 「gcc-arm」 「mingw64」 「pico-sdk」 「python」のインストール先を指定している。もしこれらが実際の場所と異なる場合は、適宜書き換える必要がある。また、「..\phyllosoma」はソースコードを含むフォルダーの指定なので、これが異なる場合も、書き換えなければならない。


「c:\pico\build」フォルダーの中身は、次のようになる。
buildFolder.png

これで、すべての準備ができた。「c:\pico」フォルダーの中身は、次のようになった。
picoFolder.png

いよいよビルド

まず、「c:\pico\build」フォルダーに作った「cmake.bat」のアイコンをダブルクリック。エラーなしに終了すると、次のような結果になる。
cmake.png

次に、「make.bat」のアイコンをダブルクリックすると、ビルドが開始される。1分から数分でビルドが終了し、エラーがなかった場合、次のような結果になる。
make.png

上記のような結果でビルドがうまく行くと、「c:\pico\build」フォルダーに、「phyllosoma.uf2」と「phyllosoma_kb.uf2」の2つのバイナリーが作成されているが、これらがビルドできたファームウェアーだ。「BOOTSEL」ボタンを押しながら Raspberry Pi Pico を USB スロットに差し込むと、「RPI-RP2」もしくは「RP2350」ドライブが出現する。ここに「*.uf2」ファイルをドラッグ&ドロップすると、これらのファームウェアーが Raspberry Pi Pico に書き込まれる。

Pico 2, Pico W, Pico 2 W 用のビルド

上記で説明した方法は、Raspberry Pi Pico 用のビルドであるが、Pico 2, Pico W, Pico 2 W用のビルドもできる。「cmake.bat」の内容で「-DPICO_BOARD=pico -DPICO_PLATFORM=rp2040」の部分をそれぞれ、次のようにすればよい。
Pico:     -DPICO_BOARD=pico -DPICO_PLATFORM=rp2040
Pico2:    -DPICO_BOARD=pico2 -DPICO_PLATFORM=rp2350-arm-s
Pico W:   -DPICO_BOARD=pico_w -DPICO_PLATFORM=rp2040
Pico 2 W: -DPICO_BOARD=pico2_w -DPICO_PLATFORM=rp2350-arm-s

また、「build」というフォルダー名ではなく「build_pico2」などの名でフォルダーを作って「cmake.bat」 「make.bat」を配置すれば、4つの異なる Raspberry Pi Pico 用のファームウェアーをそれぞれ別々に作成することも可能である。

ソースコードに変更があった場合のビルド

ソースコードに変更があった場合は、「make.bat」を実行しなおすだけでよい。「cmake.bat」の実行は不要である。

SDKに変更があった場合のビルド

pico-sdk に変更があった場合は、「c:\pico\build」ディレクトリーにあるファイルのうち、「cmake.bat」 「make.bat」以外のファイルを全部削除し、「cmake.bat」の実行からやり直す。これをやらないと、おかしなファームウェアーがビルドされる可能性がある。]]>
Raspberry Pi Pico https://www.rad51.net/blog/mycom/?itemid=988 Sat, 15 Mar 2025 21:26:43 PDT ITEM988_20250315
MachiKaniaの「auxcode」機能について https://www.rad51.net/blog/mycom/?itemid=987
MachiKania では、BASIC で様々なことを行う機能を提供してきた:

1.液晶ディスプレイや NTSC ビデオに、(日本語を含む)文字やグラフィックスを容易に表示
2.キーボードを接続して、BASIC コードを編集しながら実行する、スタンドアローンPCとしての機能
3.SPI・I2C・UART などの I/O 機能を、BASIC コードから容易に使用する方法を提供
4.複雑な動作を行うコードを、容易に利用するためのクラスライブラリーを提供

ここで書いた3の部分は、MachiKania 本体で提供、4の部分はクラスで提供している。ほとんどのクラスが BASIC で書かれているが、いくつかは C で書かれたコードを BASIC から呼び出す形をとっている(方法1方法2)。

C で書かれたコードの中には、容易に MachiKania から呼び出すように修正できるものもあれば、そういったことが非常に難しいものがある。例えば、RP2040 の PIO 機能を使ったものは、BASIC で利用できるように実装するのは非常に難しい。

「auxcode 機能」は、そういった C のコードを MachiKania で実行できるようにするものだ。「auxcode 機能」を使うには MachiKania 本体のビルドが必要になるが、どうしても必要な機能を MachiKania に取り込むのには汎用性が高いと言える。

auxcode 機能を使うには

auxcode 機能は、MachiKania 本体に次のような機能追加を行うものだ

1.BASIC ステートメントの追加
2.整数型関数の追加
3.文字列型関数の追加
4.浮動小数点型関数の追加
5.上記ステートメント・関数を実行する機能の追加

auxcode 機能はすべて、ソースコード中の「auxcode」ディレクトリーに収める形で提供する。MachiKania のソースコードにはデフォルトで auxcode ディレクトリーがあり、そこには次の2つのファイルが収められている。

  auxcode.c
  auxcode.cmake

これらのファイルは、デフォルトでは次の通り。

auxcode.c
#include "pico/stdlib.h"
#include "../compiler.h"

int aux_statements(void){
	return ERROR_STATEMENT_NOT_DETECTED;
}
int aux_int_functions(void){
	return ERROR_STATEMENT_NOT_DETECTED;
}
int aux_str_functions(void){
	return ERROR_STATEMENT_NOT_DETECTED;
}
int aux_float_functions(void){
	return ERROR_STATEMENT_NOT_DETECTED;
}
int lib_aux(int r0, int r1, int r2){
	return r0;
}

auxcode.cmake
add_library(aux_files
	auxcode/auxcode.c
)
target_link_libraries(aux_files 
	pico_stdlib
)

auxcode.c に書かれている5つの関数は、少し上のパラグラフで述べた5つの機能に相当する。auxcode.cmake は、デフォルトの auxcode.c をコンパイルするための、必要最小限の構成である。追加する機能は、これらのファイルを編集し、必要であればファイルを追加する。

auxcode 機能の使用例

ここでは、どのようにして auxcode 機能を使うのか、使用例を挙げて説明する。次のレポジトリーでは、HB01B0 というカメラを MachiKania で使うためのコードを、収めた。
https://github.com/kmorimatsu/hm01b0_machikania
追加したい機能は、以下の通り

1.HM01B0_INIT ステートメント
2.HM01B0_CAPTURE ステートメント
3.HM01B0_DRAW ステートメント
4.HM01B0_REG_WRITE ステートメント
5.HM01B0_ZOOM ステートメント
6.HM01B0_CAPTURE ステートメント
7.HM01B0_ANALYZE([x]) 関数(整数型)

上記の目的のため、次のコードを用意する。

1.上記1-6のステートメントを BASIC コンパイラーが認識できるように、「aux_statements()」関数を編集
2.上記7の関数を BASIC コンパイラーが認識できるように、「aux_int_functions()」関数を編集
3.上記1-7の構文を実行する際に呼び出されるコードを記述
4.カメラを制御するための C コードを、修正して追加
5.MachiKania のビルドの際に、追加の C ファイルがコンパイルされるように、auxcode.cmake を編集

順に見ていこう。

1.ステートメントを認識させる

hm01b0_machikania の auxcode.c の、aux_statements() 関数は次の通り。
int aux_statements(void){
	if (instruction_is("HM01B0_INIT")) return hm01b0_init_statement();
	if (instruction_is("HM01B0_CAPTURE")) return hm01b0_capture_statement();
	if (instruction_is("HM01B0_DRAW")) return hm01b0_draw_statement();
	if (instruction_is("HM01B0_REG_WRITE")) return hm01b0_reg_write_statement();
	if (instruction_is("HM01B0_ZOOM")) return hm01b0_zoom_statement();
	return ERROR_STATEMENT_NOT_DETECTED;
}

ステートメントを認識させるには、ここで
  「if (instruction_is("HM01B0_INIT"))」
のように記述する。続けて、
  「return hm01b0_init_statement();」
の例のように続ける。

「hm01b0_init_statement()」は、次のように書かれている。
int hm01b0_init_statement(void){
	// The first argument is the pointer to video buffer (324*324 bytes)
	return argn_function(LIB_AUXCODE,
		ARG_INTEGER<<ARG1 |
		LIB_AUX_HM01B0_INIT<<LIBOPTION);
}

コメントにあるように、「HM01B0_INIT」ステートメントは、整数型の引数を一つ取る(ポインターを整数として処理)。
  「ARG_INTEGER<<ARG1」
の部分の記述は、そのためのものだ。引数が文字列なら「ARG_INTEGER」ではなく「ARG_STRING」と、浮動小数点型なら「ARG_FLOAT」とする。

「LIB_AUXCODE」は、BASIC コードを実行中に制御を「lib_aux()」に移すために必要なので、そのままにして使う。また、
  「LIB_AUX_HM01B0_INIT<<LIBOPTION」
は「lib_aux()」内で「HM01B0_INIT」ステートメントの実行であることを認識させるために必要なコードで、
  「LIB_AUX_HM01B0_INIT」
等にはそれぞれ、固有の値を割り当てておく。

2.関数を認識させる

「aux_int_functions()」関数は、次の通り。
int aux_int_functions(void){
	if (instruction_is("HM01B0_ANALYZE(")) return hm01b0_analyze_function();
	return ERROR_STATEMENT_NOT_DETECTED;
}

上の「aux_statements()」の例と同様だが、「"HM01B0_ANALYZE("」のように、「(」が付加されている。文字列型関数の場合は「"XXXX$("」のようにして「aux_str_functions()」に記述、浮動小数点型関数の場合は「"XXXX#("」のようにして「aux_float_functions()」に記述する。

「hm01b0_analyze_function()」関数は、次のように記述されている。
int hm01b0_analyze_function(void){
	// The first argument is number of raws to analyze (default 240).
	g_default_args[1]=240;
	return argn_function(LIB_AUXCODE,
		ARG_INTEGER_OPTIONAL<<ARG1 |
		LIB_AUX_HM01B0_ANALYZE<<LIBOPTION);
}

ここで実装する「HM01B0()」関数の引数は実数値で、省略された場合のデフォルト値は240である。そういった場合は、
  「g_default_args[1]=240;」
のようにデフォルト値を指定したのちに、
  「ARG_INTEGER_OPTIONAL<<ARG1」
のように記述して対処する。

3.構文を実行する際に呼び出されるコードを記述する

ステートメントや関数を実行する際に呼び出されるコードは、「lib_aux()」関数内に記述する。
int lib_aux(int r0, int r1, int r2){
	switch(r2){
		case LIB_AUX_HM01B0_INIT:
			hm01b0_init((uint8_t*)r0);
			break;
(略)
		case LIB_AUX_HM01B0_ANALYZE:
			return (int)hm01b0_analyze(r0);
			break;
		default:
			break;
	}
	return r0;
}

この C 関数は、r0, r1, r2 という3つの引数を持つが、これらは、CPU (ARM Cortex-M0+) のレジスター値である。r2 に上で述べた「LIBOPTION」の値が入っているから、それで分岐して使う。

ここで紹介している「HM01B0_INIT」と「HM01B0_ANALYZE」というステートメント・関数は、引数が1つだ。そういう場合は、引数は「r0」に格納されている。なお、引数が2つの場合は第一引数が「r1」、第二引数が「r0」に格納される。引数が3個以上の場合は最後の引数が「r0」に、それ以外の引数は「r1」ポインターで指定される配列に格納される。

ここではそれぞれ、「hm01b0_init()」と「hm01b0_analyze()」という関数を呼び出すようになっている。これらは、別のCファイル(hm01b0.c)で記述されている。

4.C ファイルを追加する
多くの場合、auxcode.c という単一のファイルにすべてのコードを収めることはできないだろう。機能の実装のために、複数の C ファイルを auxcode ディレクトリーに展開することになる。

hb01b0_machikania の場合、auxcode ディレクトリーに含まれるCファイルは次の3つである。
  auxcode/auxcode.c
  auxcode/hm01b0.c
  auxcode/arducam/arducam.c
必要な機能の実装のために、これらのCファイルは別のところからコピーして修正するか、自分で一から書いて使うことになる。

5.C ファイルをビルドの際に認識させる

デフォルトでは MachiKania のビルドの際に「auxcode.c」しかコンパイルされないので、「hm0xb0.c」と「arducam.c」もコンパイルされるように指定する。これには、「auxcode.cmake」ファイルの編集が必要だ。

例では、「auxcode.cmake」ファイルは次の通り。
add_library(aux_files
	auxcode/auxcode.c
	auxcode/hm01b0.c
	auxcode/arducam/arducam.c
)
target_link_libraries(aux_files 
	pico_stdlib
	hardware_dma
	hardware_i2c
	hardware_pio
	hardware_pwm
)
pico_generate_pio_header(aux_files ${CMAKE_CURRENT_LIST_DIR}/image.pio)

「add_library()」に、コンパイルが必要な C ファイルを追加する。それぞれで使用する必要な Pico の機能(hardware_i2cやhardware_pwm等)については「target_link_libraries()」に追加する。例では PIO も使っているので、それに必要な行(pico_generate_pio_header)も追加されている。

C のプログラムを MachiKania にどんどん取り込もう

Raspberry Pi Pico 用の周辺機器には、C でサンプルプログラム等が供給されているものが多い。簡単なものなら BASIC に移植して MachiKania で使えるが、多くの場合は簡単には移植できない。そういった C のコードでも「auxcode」機能を使えば MachiKania でも使えるようになるものは、多いだろう。この機能を利用して、より多くの周辺機器が MachiKania で使えるようになることを期待する。]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=987 Sun, 02 Mar 2025 18:07:17 PST ITEM987_20250302
MachiKania type PU を公開 https://www.rad51.net/blog/mycom/?itemid=986

MachiKania type PU を、公開しました。
GitHub リリースページはこちら
公式ホームページはこちら

MachiKania type PU は、MachiKania type P の姉妹バージョンです。type P は、ILI9341 等の液晶ディスプレイに表示しますが、type PU では NTSC のビデオ画面に表示するようにしました。これにより、大画面での表示が可能になりました。

typePU2.png

液晶ディスプレイではなく NTSC ビデオ出力にした事で、回路が type P より簡潔になっています(回路図は、GitHubページのpuerulusの項を参照)。NTSC ビデオ出力は、抵抗1本とコンデンサー1個の簡単なものです。上の写真は、私の type PU のプロトタイプ版です(Raspberry Pi Pico は、外してあります)。Pi Pico 用のソケット以外は、micro SD のソケット、NTSC 用のプラグ、タクトスイッチ、圧電ブザーと、少数の抵抗・コンデンサーだけです。

XIAO-RP2040 等のピン数が少ない基板でも画面表示が出来るようになったので、これらの小さな基板を使った組込み開発が容易になりました。現在の所、次のマイコン基板に対応しています。

・Raspberry Pi Pico
・Raspberry Pi Pico W
・Raspberry Pi Pico 2
・Seeed studio XIAO RP2040
・Pimoroni Tiny 2040
・Waveshare RP2040-Zero
・Seeed studio XIAO RP2350
・Pimoroni Tiny 2350
・Waveshare RP2350-Zero

keyboard.png

また、type P と同様、USB キーボードに接続可能です。これにより、MachiKania type PU・NTSC モニター・USB キーボードによるスタンドアローンな BASIC プログラム開発環境を構築することができます。BASIC は今まで通りコンパイラーなので、高速実行が可能です。

開発裏話

Type PU 開発のきっかけは、Twitter でらびやんさんの、Raspberry Pi Pico による NTSC ビデオシグナル作成デモを見た事です。
lovyan03.png
これを、なんとか MachiKania に取り込めないかと言う事で、らびやんさんとライセンスの交渉をし、MIT ライセンスとして使わせていただくことができるようになりました。

その後、ケンケンさんと私の双方で、この NTSC ビデオ信号プログラムを MachiKania に取り込む方法を模索しました。ケンケンさんは Raspberry Pi Pico の1ボードで MachiKania と NTSC ビデオルーチンの両方を実装、私は、2枚の Raspberry Pi Pico ボードをそれぞれ MachiKania と NTSC ビデオルーチンに割り当てて並列で実行する方法です。最終的にケンケンさんがうまく行った方法を取り入れる事になりました。

この、NTSC 版 MachiKania の開発コードは、ケンケンさん命名で、"puerulus"です。Wikipediaによると、puerulusというのはイセエビの幼生で、phyllosoma から一段発生が進んだものらしいです。MachiKaniaの開発コードは、nauplia -> zoea -> megalopa -> phyllosoma -> puerulus と、甲殻類の発生をなぞっています。ちなみに、MachiKania は、待兼山と言う地名にちなんだ造語です。

MachiKania のソースコード管理はずっとオープンでやってきて、初期のころは SVN で、今は Git(GitHub) でソースコードの管理を行っています。puerulus のソースコードと phyllosoma のソースコードで異なるのは、モニター表示部分だけ(NTSC 出力か LCD 出力か)です。ソースコードを別々に管理すると、今後のアップデートの際に同じ変更を両方のコードに対して行う事になり、煩雑なだけでなく、思わぬバグを混入してしまう原因となります。そこで、puerulus のソースコードと phyllosoma のソースコードを統合して一つにし、config の設定を変えることで type PU をビルドするのか、type P をビルドするのか、選択できるようにしました。Type PU の公式版の公開が、ケンケンさんのテスト版の公開から3か月以上遅れたのは、統合化に時間がかかったのが大きな理由です。ソースコードの統合により、Pico だけでなく Pico 2 にも対応できることが分かり、それによる微修正等を行っていたこともありますが。

MachiKania type PU の正式公開に伴って、同じ NTSC ビデオ出力版の type Z とtype M の開発を終了する事になりました。もともと、ずっと新規バージョンを公開していなかったので、実質的に開発は中断状態だったのですが、ケンケンさんとの相談で、完全に開発停止する事になりました。

今後の MachiKania の発展は、type P と type PU で行っていくことになります。使っていただいている皆様、今後とも、MachiKania をご贔屓に、よろしくお願いします。]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=986 Sat, 28 Dec 2024 15:47:25 PST ITEM986_20241228