電子ブロック工房 / MachiKania https://www.rad51.net/blog/mycom/ IC・トランジスタで出来たコンピューターを設計・製作するためのブログ / マチカニア BASIC システム 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/ MachiKania用ゲームパッド、2種 https://www.rad51.net/blog/mycom/?itemid=997
20260130-gamepads.png

Dual ゲームパッド

Twitterで情報交換させてていただいている工作魂さんから、ゲームパッド用の基板と部品を送っていただきまして(基板は、電子工作ステーションで販売されています)、作ってみました。また、工作魂さんから 3D プリンター用の STL ファイルを頂いたので、筐体もプラスティックで作成して、そこに収めました。

この基板の使い方は、GitHubに説明がありますMachiKania type P 開発基板こちらも、電子工作ステーションで販売されています)や、オレンジピコの ORABGE-BUS につないで使う事ができます。私は、MachiKania type P 開発基板で使うように作成してみました。

下の写真は、基板と 3D プリンターの印刷物です。基板には、タクトスイッチを半田付けしてあります。
20251227_143356.png

下の写真は、基板を筐体にはめて、蓋を閉める直前のものです。10ピンの IDC コネクターもはんだ付けしてあります。
20251231_155902.png

完成させて、MachiKania type P 開発基板に接続した状態がこちら。
20260119_180258.png

この基板は優れもので、十字の上下左右ボタンを、パッドの右側に配置させることも左側に配置させることもできます。IDC コネクターが二か所に取り付けられるので、その選択でどちらか選べます。矢印ボタンが右側の配置は PC でゲームをやり慣れた人用、左側の配置はファミコンなどでゲームをやり慣れた人用、という所ですね。また、中央にリセットボタンがあるので、MachiKania をリセットする事も出来ます。

USB ゲームパッド

ResTouch や、RP2350-LCD-1.47 で MachiKania を走らせる場合、ボタンが無いので USB キーボードで操作する事になります。また、これらのボードには、スピーカーやブザーが無いので、音が鳴りません。そこで、それ用の、USB 接続で音が出せるゲームパッドを開発中です。これは、2026 年 1 月現在の最新版、ver 1.6.1 ではまだ使えませんが、その次の公開バージョンで使えるように準備中のものです(試用なさりたい方は、GitHub レポジトリーの production ブランチをどうぞ)。

下の写真が、開発中のものです。RP2040-Zero を工作魂さんから頂いた基板に接続し、ボタン用の配線を行いました。また、圧電ブザーと10 kΩの抵抗を音声出力端子に接続しています。3D プリンターのデーターを微修正して、圧電ブザーが表に出るようにしました。
20260119_161631.png

下の写真が、ResTouch に接続したときの様子です。ボタン操作ができ、音も鳴ります。
20260119_164715.png

なお、この目的のために、pid.codes という、オープンソースプロジェクト用に USB の PID(プロダクト ID)を取得できるサービスを用いて、0xF800 という PID を取得しました(VID(ベンダー ID)は、0x1209 です)。MachiKania 本体では、この VID/PID をチェックする事で、USB ゲームパッドかどうかを認識するようにする予定です。]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=997 Fri, 30 Jan 2026 15:26:02 PST ITEM997_20260130
MachiKania type P/PU ver 1.6.1を公開 https://www.rad51.net/blog/mycom/?itemid=996
https://github.com/machikania/phyllosoma/releases/tag/Ver1.6.1

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

・ Waveshare RP2350-LCD-1.47に対応
・ エディター使用時に、ステートメントもしくは関数のヘルプを表示できるように
・ RND#()関数を追加
・ ネット接続におけるTLSハンドシェイクを改善
・ クラスライブラリーのWGETを更新。301 Movedなどに対応
・ PWM4~PWM9の使用をサポート

20251225-RP2350LCD.png

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

Waveshare RP2350-LCD-1.47に対応

Waveshare 社の RP2350-LCD-1.47 に対応しました。RP2350-LCD-1.47 は小型の液晶ディスプレイ(36 mm x 20 mm)に RP2350 マイクロコントローラーと micro SD ソケットが付属しており、GPIO ピンも15本出ているので、小型で液晶ディスプレイ付きの組み込みデバイスの作成にもってこいです。加えて、USB ポートにキーボードを接続することができ、半田付けしなくても MachiKania が使えるボードの一つになりました。USB キーボードの接続には、電源入力付きの USB Type C OTG ケーブルを用いてください。

この液晶ディスプレイは、この小ささの割にドット数が 320 x 172 ピクセルもあるので、PRINT ステートメントで表示した内容は非常に読みづらいです。クラスライブラリーの GEN3O クラスを用いれば大きなサイズのフォント(29, 44, 58, 88, 118 ピクセル)での表示が可能になるので、利用してください。

このデバイスには、上下左右ボタン・FIRE/START ボタンがありません。ボタン機能を用いる際は、キーボードを接続するか、ピンヘッダーを半田付けしてタクトスイッチなどを接続してください。接続するポート番号は、GitHub の記載を参考にしてください。

エディター使用時に、ステートメントもしくは関数のヘルプを表示できるように

エディターでBASICプログラムを編集中に、ステートメント・関数のヘルプを表示できるようにしました。表示できるのは英語もしくは半角カタカナです。この機能を有効にするには、配布アーカイブの「docs」ディレクトリーを、MMC/SDカードのルートにコピーしておいてください。また、MACHIKAP.INI を編集する事で、英語表示かカナ表示を選択することできます(デフォルトは、英語表示; HELPFILE=/docs/help-e.txt)(カナ表示にするには HELPFILE=/docs/help-k.txt)。ヘルプを表示させたい場合は、目的の命令もしくは関数にカーソルがある状態で、F3 キーもしくは Ctrl + H を押してください。下のような表示になります。

20251225-help.png

本当は日本語でのヘルプ表示ができるようになればよかったのですが、エディター使用中での漢字表示は、テキストディスプレイではなくグラフィックディスプレイを用いないといけない都合上、実装のハードルが高く、今回は見送りました。その代わり、半角カタカナ表示にも対応しましたので、非常に見づらくはありますが、ご活用ください。

RND#()関数を追加

久しぶりに KM-BASIC の仕様変更を行い、RND#() 関数を追加しました。これは、0以上1未満の乱数を浮動小数点型で返すものです。Ver 1.6.0 までは整数型の 0 以上 32768 未満の乱数しか対応しておらず、浮動小数点型で使用するときにはそれを変換する必要がありましたが、そういった煩雑さが無くなりました。

ネット接続におけるTLSハンドシェイクを改善

Raspberry Pi Pico W もしくは Pico 2 W を利用してインターネット接続する際の、TLSハンドシェイク(https 通信のためのプロトコル)を見直しました。Ver 1.6.0 までは、およそ 16 kb までの大きさのファイルしかダウンロードできませんでしたが、Ver 1.6.1 からは、それを超えるサイズでも問題なくダウンロードできるようになりました。従来通り、WGET クラスを用いて、必要ファイルをダウンロードしてください。

クラスライブラリーの WGET を更新

クラスライブラリーの WGET を更新し、301 Moved などのリダイレクトに対応できるようにしました。以前のバージョンまでだと、サーバーが 301 Moved を返した場合、BASIC プログラム側でリダイレクトアドレスを読み取って新たに接続する必要がありましたが、それが自動でなされるようにしました。従来通り、HTTP レスポンスステータスが"30x"の際にリダイレクトをせずにレスポンスヘッダーだけを取得したい場合は、「WGET::IGNOREREDIRECT( 1 )」を実行してください。

PWM4~PWM9の使用をサポート

Ver 1.6.0 までは、PWM1 から PWM3 までの3つのPWMしか使えませんでしたが、PWM4 から PWM9 までも使えるようにしました。また、これらの PWM は、MACHIKAP.INI でポート番号を指定して用いることができるので、従来より、使い勝手が増しました。

下は、RP2350-LCD-1.47 での MACHIKAP.INI の設定例です。GP21を、PWM に割り当てています。この設定を行うと、PWM4 を用いることで、画面のバックライト強度を調整することができるようになります。

PWM4=21

その他

その他の変更点は、次の通りです。ST7789 液晶への対応・バグ修正・FFTLIB クラスの追加などを行っています。

・ ST7789搭載液晶に対応(バイナリ提供なし)
・ PicoCalc、ResTouch、type PU miniで、OUT8L/IN8L、OUT8H/IN8H、OUT16/IN16ステートメントの挙動を修正
・ クラスファイル中で別のクラスを使っている際、特定の環境でコンパイルできなくなる不具合を修正
・ クラスライブラリーに高速フーリエ変換および逆変換を行うためのクラス、FFTLIBを追加
・ class.txtを修正
・ help-k.txtを追加 ]]>
MachiKania https://www.rad51.net/blog/mycom/?itemid=996 Sat, 27 Dec 2025 00:00:02 PST ITEM996_20251227
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
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