ライン

I/O機器制御対応BASIC搭載テレビゲームシステム MachiKania type M

ライン

2018年8月3日
最終更新日 2022年1月9日 DOZAN氏作成XEVIOUSもどきにリンクと動画追加

 MachiKania type Mは、カラーグラフィック機能搭載のMachiKania type Zの上位モデルに当たります。より高精細で色数アップしたカラーグラフィックに加え、豊富な汎用I/Oポートを備えることで、外部入出力機器の接続に対応しました。
 これにより、テレビゲームだけではなく、様々な機器の制御を行うことができるようになりました。例えば各種センサーや小型の液晶ディスプレイを接続し、読み取った値を常時液晶画面に表示する、または、モーターを搭載した機器を接続して、動きの制御を行うことも可能です。もちろん、制御プログラムはゲーム同様に高性能BASICを使って、簡単に記述することができます。
 何をつなぐかはあなた次第。様々な機器が接続できると夢が広がります。さあ、あなたもハードウェアプログラミングで夢を形にしませんか?

Raspberry Pi Pico搭載モデルMachiKania type P」はこちら
従来バージョンMachiKania type Z」はこちら

トップ画像


MachiKania type Mでできること

 MachiKania type Mでは以下のようなことができます。
 ・テレビにつないで電源を入れればすぐにゲームが始められます。
 ・キーボードをつなげば、高性能BASIC言語で本格的なオリジナルのゲームを作ることができます。
 ・SDカードにプログラムやデータを保存したり、パソコンとやり取りしたりできます。
 ・ハードウェアもソフトウェアも公開されているので、全て自分で製作することができます。
 ・最大384×216ドット、256色同時表示可能なカラーグラフィックが使えます。
 ・多数の入出力ポートを備え、BASICから外部接続機器の制御ができます。
 ・32ビット単精度の浮動小数点演算をBASICでサポートし、各種の数学関数が使えます。
 ・構造化プログラミングに対応しており、GOTO文を使わないプログラムが作れます。
 ・従来のMachiKania type Zの上位モデルに当たり、BASICの互換性があります。
 ・オブジェクト指向プログラミングにより、ライブラリ利用ができます。(Ver 1.2以降)

レイトレーシング

I/O誌1986年7月号(吉森昌弘氏作)から移植

LEDマトリクス制御

市販のLEDディスプレイをBASICで制御



MachiKania type M紹介動画


MachiKania type Mの作り方

 以下の3つの手順で製作します。
 1. ハードウェアの製作
 2. マイコンにブートローダプログラムの書き込み
 3. SDカードに必要ファイルをコピー


(1)ハードウェアの製作

 MachiKaniaシリーズは回路図、ソースプログラムとも公開されたオープンなシステムです。回路図からご自身で基板を作成することもできますが、プリント基板を用意していますので、ここではプリント基板からの製作のポイントを説明します。プリント基板の入手方法はこちらを参照してください。

使用部品一覧表はこちら


マイコンについて
 使用するマイコンは64ピンQFPのPIC32MX370F512Hです。表面実装でピン間隔が大変狭いため、チップ直接の基板へのハンダ付けは慣れていないと難しいですが、秋月電子から変換基板に実装済み製品が販売されています。本基板はどちらでも使えるようになっているので、どちらかをお選びください。
 なお、マイコンチップの取り付け向きには十分注意してください。基板の向きとチップ上の印刷の向きが異なりますので、1番ピンのマークを必ず確認してから取り付けてください。
 変換基板を使用する際、基板にピンソケットを使用することも考えられますが、液晶などのシールド基板を使用する場合は上にかぶさりますので、背の低いソケットを選び、シールドとぶつからないことを確認してください。

電源コネクタについて
 電源は+5V、1A程度のACアダプタなどをご用意ください。電源コネクタはセンタープラスのDCジャックおよびUSBマイクロBタイプのものが利用可能です。どちらか一方または両方のコネクタを取り付けてください。USBマイクロBのコネクタは基板裏面に取り付けます。SDカードスロット基板の裏面となりますので、SDカードスロットより先にハンダ付けが必要です。

ICSP用ピンヘッダについて
 PICkit3を差した時、隣りのピンソケットに少しぶつかります。書き込みは可能ですが、この端子はマイコンにブートローダプログラムを書き込む際に1度だけしか使用しませんので、私はハンダ付けせずに、後述の写真のように書き込み時にピンヘッダを斜めに押し付けて、書き込みが終わったら外しています。

三端子レギュレータについて
 表面実装品のNJM2845DL1-33となります。最初にピンセットなどでICを固定した状態で1つのピンをハンダ付けしてから、残りのピンをハンダ付けしてください。

回路図

回路図 (クリックで拡大)


プリント基板

プリント基板  基板入手方法

完成写真

マイコンチップ直付け(左)と変換基板による実装(右)
(クリックで拡大)

USBマイクロBコネクタ

USBマイクロBコネクタは裏面に取り付け


部品表掲載以外に必要なもの
電源5V、1A程度のACアダプタ。USBマイクロBのものも対応
PICkit3/PICkit4ブートローダの書き込みに必要。PIC32に書き込みができれば他のものでもOK
マイクロSDカード1GBもあれば十分
パソコンPICkit3等利用時、SDカードの初期コピー作成時に使用
SDカードリーダライタパソコン連携する際に必要
テレビビデオ入力端子のあるもの。パソコンのビデオキャプチャユニットなどでも利用可能
PS/2キーボードBASICプログラムを組む際必要
ビデオケーブル、音声ケーブルテレビに接続します


(2)ブートローダプログラムの書き込み

 ※ブートローダ書き込み済みマイコン利用の場合は不要
 MachiKaniaシリーズでは、SDカードに保存された実行用のHEXファイルをテレビ画面上で選択して、マイコンに書き込みを行います。このブートローダプログラムを最初に一度だけマイコンに書き込む必要があり、PICkit3などの書き込み器をICSP端子に接続して書き込みを行います。
 基板の製作が完了した後、MPLAB X IDEに付属のMPLAB IPEを使用して、下記ダウンロードコーナからダウンロードして「bootloader.hex」ファイルの書き込みを行います。その際、マイコンへの通電が必要ですので、基板に電源を接続しスイッチを入れるか、PICkitからの通電するよう設定を行ってください。

 (参考)Raspberry Piを使ってPIC32MXのフラッシュ書き込みを行う方法

PICkit3接続の様子1

PICkit3接続の様子2

PICkit3接続の様子

(3)SDカードの準備

 MachiKania BASICシステムではSDカードまたはマイクロSDカードが必須です。FAT16およびFAT32フォーマットに対応しています。使い方にもよりますが、容量は1GBもあれば十分です。先ほどダウンロードしたファイルからbootloader.hex以外の拡張子「HEX」のファイルと拡張子「BAS」のファイル、および「MACHIKAM.INI」、デモ用のGIFファイルをパソコンに接続したSDカードリーダライタを使って、SDカードにコピーします。ファイルは全てルートディレクトリにコピーしてください。このSDカードはいつもMachiKaniaのSDカードスロットに挿入しておいてください。

 KM-1302以降、BASICでライブラリとして利用できる、クラスファイルが使用可能となりました。下記ダウンロードコーナーの「クラスファイル集」をダウンロードし、SDカードのルートディレクトリに「LIB」という名前のディレクトリで展開してください。(2019.3.24)

SDカードにファイルコピー

SDカードにファイルコピー


ダウンロード

 ここまでに紹介したシステムに関するファイルをダウンロードできます。

Download
(2020.3.29)
動作に必要なファイルとサンプルファイル一式(bootloader.hex以外はSDカードにコピーする)
bootloader.hexブートローダ本体。PICkit3等を用いてPICマイコンに書き込む
MACHIKAM.HEXMachiKania type M BASICシステム。SDカードに入れてブートローダから書き込みと実行
MACHIKAM.INIMachiKania type M BASICシステムの設定ファイル
その他ファイル「.BAS」ファイルはBASICサンプルプログラム。「.HEX」ファイルはブートローダで起動可能な実行ファイル(C言語で作成したサンプルゲームなど)
Download
(2021.1.24)
BASICで利用可能な各種クラスファイル集展開してできるLIBディレクトリをSDカードのルートディレクトリにコピーして利用。各クラスの使用方法はそれぞれのディレクトリのhelp.txtファイルを参照
Download
(2020.3.29)
自分でビルドする場合に必要な、ソースファイルおよびライブラリファイル一式
ps2keyboard370f.X.aPS/2キーボード用ドライバ
lib_videoout_megalopa.X.aビデオ出力ライブラリ
sdfsio370fLib.X.aSDファイルアクセス用ライブラリ
app_p32MX370F512H.ldブートローダ対応プログラムを作成するためのリンカースクリプト
その他ファイルMachiKania BASICシステムソースファイル。LGPL(v2.1)のライセンスに基づきソース公開しています。

(2019.11.3) CLASSのPUBLIC FIELD参照時のバグを修正しました。
(2020.1.26) 多重割り込み発生時のバグ、40文字モード時のフォントなどを修正しました。
(2020.3.29) 一部命令実行時の割り込み発生によるエラーを修正しました。
        bootloader.hexをRaspberry Pi + pickleでも書き込みできるように修正しました。
(2020.12.12) 240x400ドット3.2型液晶モジュールS95461C利用するためのクラスS95461を追加しました。
(2020.12.28) HD44780または互換ICを搭載したキャラクタ液晶モジュールを制御するためのクラスCHRLCDを追加しました。
(2021.1.24) キャラクター液晶クラスCHRLCDの出力時のウェイトが必要以上に大きかったため、短縮し動作を高速化しました。
  【システムバージョンアップの適用方法】
   1. 上記から展開したMACHIKAM.HEXをSDカードのルートディレクトリに上書きコピー
   2. SDカードをMachiKania type Mに挿し、本体上のいずれかのボタンを押しながら電源を入れる
   3. ブートローダが起動するので、MACHIKAMを選択してFIREボタンを押す


使い方

MachiKaniaブートローダ

 ビデオ出力端子をテレビのビデオ入力端子(黄)に、音声出力端子をテレビの音声入力端子に接続し、PS/2キーボードも接続すれば、いよいよ電源を接続してください。正しく作られていれば、右図のようなMachiKaniaブートローダの画面が表示されます。
 ブートローダはSDカード上のHEXファイル(マイコンの機械語プログラムをテキスト形式にしたファイル)をマイコンのフラッシュメモリに書き込むシステムです。画面上には拡張子「.HEX」を省略して表示しています。
 MachiKania type M上の4方向ボタンを使って「MACHIKAM」を選択し、FIREボタンを押すと、BASICシステムのPICマイコンへの書き込みが開始されます。書き込み中は画面表示が停止されますが、数秒後に表示再開し、MachiKania type MのBASICシステムが起動します。
 一度ブートローダを使って書き込みを行うと、次回電源オンやリセット時にはその書き込まれたプログラムが起動します。再度ブートローダ画面を表示するには、MachiKania本体の6個のボタンのどれでもよいので、押しながら電源オンまたはリセットします。

ブートローダ画面

ブートローダ画面

MachiKania type M BASICシステム起動画面

MachiKania type M BASICシステム起動画面

MachiKania type M BASICシステム

 MachiKania type Mに搭載のBASICシステムは、Katsumi氏作成の構造化プログラミングに対応したBASICコンパイラ KM-1300(KM-BASIC)です。
 まずは右図のプログラムを打ち込んでみてください。KM-BASICの構文ではアルファベットの大文字、小文字は区別されません。昔のBASICシステムではEnter (RETURN)キーを押すまで行入力完了となりませんでしたが、このエディタはWindowsのメモ帳や最近の普通のテキストエディタと同様の感覚で使用することができ、Enterキーはただの改行ためのキーです。
 打ち終わったら、いよいよ実行です。実行(RUN)はファンクションキーF4です。うまく実行結果画面のようになりましたか?もしエラーが出た場合、どれかキーを押してエディタ画面に戻り、エラー修正してから再度実行してください。
 このまま電源を切るとプログラムは消えるので、必要であればSDカードに保存します。保存はファンクションキーF2で行います。ファイル名は英数8文字以内+「.BAS」または「.TXT」としてください。大文字、小文字は区別されません。
 BASICプログラムエディタ上で使用できる特殊キーは右表の通りです。Shift+矢印キーで範囲選択しコピー/ペーストする機能もあります。ただしコピーできるのは1画面に収まる範囲内に限定です。
 カナ文字はScroll Lockキーまたはカタカナひらがなキー(スペースキーの2つ右)でカナモードに入り、キーボードの刻印の通り(ローマ字入力ではなく)直接入力します。もう一度Scroll Lockキーかカタカナひらがなキーを押すことで英数モードに戻ります。


終了方法

 MachiKania BASICシステムのエディタから起動したBASICプログラムは、以下のいずれかで終了できます。終了すると「OK」または強制終了の場合「Break in xxx」(xxxは行番号)と表示され、何かキーを押すことでエディタ画面に戻ります。

 1.プログラムが最後まで到達またはEND命令を実行
 2.キーボードのCtrl+Pause/Breakキーを押す

 また、電源を切る際はなるべくBASICの実行を終了させて、エディタ画面に戻ってからとしてください。MachiKania BASICシステムでは、プログラム実行前にSDカード上に「~TEMP.BAS」というファイル名でプログラムを一時保存します。実行中に電源を切ると異常終了したものと判断し、次回起動時にこのファイルを読み込みます。実際に異常終了した場合はここでF2キーを押して名前を付けてSDカードに保存することで、プログラムの消失を防ぐことができます。この一時ファイルは、プログラムの保存またはBASICプログラムの終了により自動的に消えます。

 なお後述の自己実行アプリケーションとしてBASICプログラムを実行した場合は、キーボードやボタンによる強制終了はできず、一時ファイルが作成されることもありませんので、実行中に電源を切っても問題ありません。

BASICプログラムサンプル

BASICプログラムサンプル


サンプルプログラム実行結果

サンプルプログラム実行結果


エディタ使用キー一覧
エディタ使用キー一覧




MachiKania type Mの詳細

 ここからはMachiKania type Mのより詳細な使い方や機能の説明をします。

MachiKania type Zからの主な強化点

 画面出力モードの強化
 テキスト画面、グラフィック画面とも解像度アップし、またテキスト画面とグラフィック画面の重ね合わせが可能となりました。これまでワイドテレビに映した場合横長のドットとなっていましたが、ワイドテレビで正方画素となるワイド画面モードが追加されました。
 従来のMachiKania type Z互換のテキスト、グラフィックモードにも対応しています。BASICプログラム起動時は従来との互換性を重視し、横30×縦27文字のテキストモードです。

追加された画面出力モード
標準テキストモード横36×縦27文字、256色同時表示
ワイドテキストモード横48×縦27文字、256色同時表示
モノクロテキストモード横80×縦27文字、モノクロ表示
標準グラフィックモードグラフィック横288×縦216ドット、テキスト横36×縦27文字、256色同時表示
ワイドグラフィックモードグラフィック横384×縦216ドット、テキスト横48×縦27文字、256色同時表示

 外部接続端子の追加
 MachiKania type Mでは、従来のMachiKaniaシリーズになかった汎用外部入出力端子を32ポート備えています。プリント基板では右図のように、5つのコネクタにV〜Zを割り振っています。Xを除く4つはArduino UNOを意識してピンを配置していますので、いくつかのシールドは使えるかもしれません。
 KM-BASICの命令、関数では以下のポート利用をサポートしています。

RB0〜RB15デジタル出力、デジタル入力、アナログ入力として汎用的に使用可能。1ビットごと、または8ビットおよび16ビット単位で使用可能
RE5〜RE7デジタル出力、デジタル入力、アナログ入力として汎用的に使用可能。1ビットごとに使用可能。ただし、デジタル出力時はオープンドレイン出力に限定
RD10、RD11PWM出力に対応。PWM出力は音声出力と排他利用となるので注意
RC13、RC14シリアル入出力に対応
G2、G3I2C通信に対応
D9、F2、F6、G9SPI通信に対応


I/Oポート

プリント基板のI/Oポート配置図

 ステレオ音声対応、WAVEファイル再生対応
  従来はモノラル音声出力でしたが、ステレオ音声出力に対応しました。
  また、SDカードに保存された8ビット、ステレオ(もしくはモノラル)、サンプリング周波数15.7KHzおよび16KHzのWAV形式音声ファイルの再生に対応しました。ただし、16KHzファイルも15.7KHzでの再生となるため、やや低音で再生速度が遅くなります。


主なスペック

使用マイコンMicrochip社PIC32MX370F512H
動作クロック95.45453MHz
使用可能RAM容量BASIC利用時は約100Kバイト。ただし、グラフィック機能使用時はビデオメモリとして28K〜81Kバイトを占有
搭載言語BASIC コンパイラー KM-1300
映像方式NTSCカラーコンポジット(SDTV)
記録メディアマイクロSDカードが使用可能。FAT16またはFAT32フォーマット。ファイル名は英数字と一部記号のみ、8文字+拡張子3文字まで(大文字、小文字の区別なし)
キーボードPS/2キーボードを接続可能(日本語およびUS配列に対応)
テキスト表示機能(横)30文字、36文字、40文字、48文字、80文字から選択。(縦)27文字
256色同時表示可能、カラーパレットでRGBそれぞれ8ビット指定
グラフィック機能256×224ドット(16色同時表示)、288×216ドット(256色同時表示)、384×216ドット(256色同時表示)
ユーザ定義文字(PCG)機能あり(256文字)
音楽再生機能ステレオ(ABC記譜法、WAV形式ファイル)

設定ファイルについて

 SDカードに「MACHIKAM.INI」というファイルを入れておくと、MachiKania BASICシステム起動時に読み込んで初期設定を行います。ファイルに下記の項目名の行を追加することで設定します。
 先頭に#を付けると無効な行となります。


MACHIKAM.INIファイル設定項目
項目名設定内容
106KEY日本語キーボードに設定
101KEYUSキーボードに設定
NUMLOCK起動時Num Lockキーオン
CAPSLOCK起動時Caps Lockキーオン
SCRLLOCK起動時Scroll Lockキーオン
WIDTH36起動時36文字モード
WIDTH48起動時48文字モード
WIDTH80起動時80文字モード

設定ファイルサンプル

設定ファイルサンプル

KM-BASICについて

 MachiKania type MのBASICシステムに搭載しているBASICコンパイラはKatsumi氏作成のBASIC Compiler KM-1300 (KM-BASIC)です。
 このBASICでは-2147483648〜+2147483647の数が扱える32ビット整数型のほか、32ビット浮動小数点数、文字列を扱うことができます。
 かつてBASICといえば、行頭に必ず行番号の入力が必要でしたが、KM-BASICでは必ずしも必要ありません。行番号を指定した場合、GOTO文などの飛び先を表すラベルと同様の扱いとなります。
 KM-1300の詳細な仕様については、こちらのリファレンスを参照してください。
 また、KM-BASICの詳しい使い方を解説したドキュメント入門MachiKaniaを随時更新していますので、ぜひご一読ください。
 KM-1300で新たに追加や強化された主な命令、関数は右の表の通りです。I/O関連、ビデオ画面モード関連、WAVEファイル演奏関連などが追加されています。具体的な使い方については後述のサンプルプログラムを参照してください。

 さらにKM-1300の新バージョンKM-1302ではオブジェクト指向プログラミング対応など大幅な機能強化を図りました。KM-1302で追加された主な命令、関数は以下の表の通りです。


KM-1302で追加された命令、関数
USECLASSクラスファイル利用命令
FIELDクラスファイル中でフィールドを宣言
PRIVATEクラスファイル中でプライベートなフィールドやスタティック変数を宣言
STATICクラスファイル中でスタティック変数を宣言
METHODクラスファイル中でメソッドを宣言
NEWオブジェクトを作成しポインタを返す関数
DELETEオブジェクトを破棄する
CALLメソッドを呼び出す
POKE16メモリに16ビットデータを書き込む
POKE32メモリの32ビットデータを書き込む
PEEK16メモリから16ビットデータを読み出す関数
PEEK32メモリから32ビットデータを読み出す関数
SETDIRSDカードのカレントディレクトリ変更
GETDIRSDカードのカレントディレクトリ取得する関数

KM-1300で追加、強化された主な命令
PLAYWAVE15.7KHzでサンプリングされたWAV形式のファイルを再生
SERIALシリアルポートの設定
SERIALOUTシリアルポートに出力
PWMRD10またはRD11にPWM出力
OUTRB0〜RB15、RE5〜RE7の個別ビットに出力
OUT8LRB0〜RB7に8ビットデータ出力
OUT8HRB8〜RB15に8ビットデータ出力
OUT16RB0〜RB15に16ビットデータ出力
WIDTHテキスト画面文字数設定。30、36、40、48、80から選択。80はモノクロモード
USEGRAPHICグラフィック画面設定。288×216(256色)、384×216(256色)を追加
SPISPI通信速度、モード等設定(*1)
SPIWRITESPIデータ送信(*1)
SPIWRITEDATASPI連続データ送信(*1)
SPIREADDATASPI連続データ受信(*1)
SPISWAPDATASPI連続データ送受信(*1)
I2CI2C通信速度設定(*1)
I2CWRITEI2Cデータ送信(*1)
I2CWRITEDATAI2C連続データ送信(*1)
I2CREADDATAI2C連続データ受信(*1)

  *1 KM-1301で追加


KM-1300で追加、強化された主な関数
PLAYWAVE再生中WAVファイルの位置や残り数を取得
ANALOGRB0〜RB15のアナログ値を取得
INRB0〜RB15、RE5〜RE7の個別ビットの入力値を取得
IN8LRB0〜RB7の8ビットデータ入力値を取得
IN8HRB8〜RB15の8ビットデータ入力値を取得
IN16RB0〜RB15の16ビットデータ入力値を取得
SERIALINシリアルポートから読み込み
SPIREADSPI受信(*1)
I2CREADI2C受信(*1)
I2CERROR直前に使用したI2C通信のエラー(*1)

  *1 KM-1301で追加

キャラクターコード表

 MachiKania BASICシステムのキャラクターコード表は右画面のようになっています。NEC製の往年の名機「PC-8001」とほぼ同じです。フォントについても参考にして作りました。
 グラフィック文字($80〜$9F、$E0〜)はキーボードから入力する機能がありませんが、この表を参考にしてCHR$関数を使うことで利用可能です。
 また、PCG(ユーザ定義文字)機能を使えば、全てのキャラクターのフォントパターンを自由に変更することができます。1キャラクターのサイズは8×8ドットです。ゲームのオリジナルキャラクター作りにも応用できます。

キャラクターコード表

キャラクターコード表

BASICプログラム自己実行アプリケーションの作り方

 MachiKaniaは大きく分けると、SDカード上のアプリケーションファイル(HEXファイル形式)をマイコン上のプログラムフラッシュに書き込む「ブートローダ機能」と、BASICのソースプログラムを編集・実行する「BASICシステム機能」の2つの機能を提供しています。
 ブートローダ機能を使ってプログラムフラッシュに書き込みを行うと、次回から単純に電源オンやリセットした場合、その書き込まれたアプリケーションを起動します。実際にはBASICシステムも1つのアプリケーションとして動作しています。

 これまではBASICプログラムの実行方法として、BASICシステムでエディタを起動し、ソースプログラムを読み込んでRUN(実行)するという手順を説明しましたが、エディタを起動せずにBASICプログラムがあたかも1つのアプリケーションであるかのように起動する方法があります。
 BASICシステムのエディタでプログラムを作成し、完成したら、Shift+F2キーで「自己実行アプリケーション生成」を起動します。ここでまず、BASICソースプログラムに名前を付けてSDカードに保存します。この時、拡張子は必ず「BAS」としてください。
 BASICソースプログラムの保存が終わると、続いてBASIC自己実行用ファイルのコピーが始まります。少し時間が掛かるので途中で電源を切ったりせず、終了するまでお待ちください。
 コピー終了後、基板上のどれかのボタンを押しながらリセットすることで、ブートローダを起動します。この時、先ほど名前を付けて保存したプログラム名が表示されるので、選択してFIREボタンで書き込みを行い完了すると、KM-BASICのコンパイル画面が表示された後、BASICプログラムが実行されます。
 実際の仕組みとしては、MachiKania BASICシステムは起動した自分自身のファイル名をチェックし、「MACHIKAM.HEX」であればエディタを起動、それ以外であれば例えば「HOGEHOGE.HEX」だとすると、「HOGEHOGE.BAS」というBASICのソースファイルを読み込み自動的にコンパイルと実行を行うように作られています。先ほどの「自己実行アプリケーション生成」では、SDカード上の「MACHIKAM.HEX」のコピーをBASICソースの名前でコピーしていたことになります。
 この機能により、次回電源オンやリセットを行うとこのBASICプログラムが自動的に起動するようになるので、完成したゲームプログラムなどを何度もプレイする場合に便利となります。

実行方法イメージ図

実行方法イメージ図


自己実行アプリケーション生成

自己実行アプリケーション「BLOCK」の生成。画面上「MACHIKAN.HEX」とありますが、type Mの場合実際は「MACHIKAM.HEX」です


ブートローダからBASICプログラム起動

ブートローダからBASICプログラム「BLOCK」を起動




オブジェクト指向化プログラミング

2019.3.31 Ver 1.2(KM-1302)で追加
 簡易的なオブジェクト指向化プログラミングができるようになりました。これまで実行するプログラムは1つのファイルのみで構成されていましたが、まとまった機能をそれぞれBASICで書かれたクラスファイルとして用意することで、実行時にメインプログラムから読み込んで実行することができます。
 クラスファイルのファイル名は「クラス名.BAS」で保存します。例えばクラス名が「CLASS1」の場合ファイル名は「CLASS1.BAS」となります。クラス名は2文字以上6文字以下の文字列です。
 また、クラスファイルはメインプログラムと同じディレクトリ(カレントディレクトリ)または、SDカードの「\LIB\クラス名\」ディレクトリに保存します。
   例 \LIB\CLASS1\CLASS1.BAS
 実行時(実際にはコンパイル時)にクラス使用命令(USECLASS命令)があると、まずカレントディレクトリを探し、なければ\LIBを探しにいきます。これにより、よく使われる便利な機能を共通のライブラリとして提供することが可能となりました。

 クラスでは、パブリックなメソッドとフィールド、プライベートなフィールド、スタティックメソッド、スタティック変数などを定義することができます。メインプログラムからは、USECLASS命令でクラス使用を宣言し、NEW(クラス名)関数でインスタンスを生成します。
 メソッドの呼び出しはCALL インスタンス.メソッド名( )または、戻り値がある場合A=インスタンス.メソッド名( )のように記述します。パブリックフィールドも同様にインスタンス.フィールド名でアクセスします。
 クラスの使い方の詳細は、こちらのレファレンスを参照してください。また、ダウンロードコーナーでライブラリ(クラスファイル集)を公開しているので、参考にしてください。

CLASS1.BAS

クラスファイル。ファイル名はCLASS1.BAS。実行ファイルと同じディレクトリに保存する。

TEST1.BAS

実行するメインプログラム。ファイル名は任意。実行すると赤い丸が左右に動き、上下カーソルキーで上下に移動する。



タイマー機能と割り込み

2019.5.4 Ver 1.3(KM-1303)で追加
 タイマー機能と割り込み機能を追加しました。
 タイマーはμ秒単位で指定でき、10μ秒程度から実用的に使えます。
 割り込み機能は、割り込みのトリガーとなるイベントと処理ルーチン名を宣言することで、イベント発生時に処理ルーチンを自動で呼び出すことができます。イベントは下表の種類の指定が可能です。

TIMERタイマー値が1増えたとき
DRAWCOUNT60分の1秒ごと
KEYSボタンの押下状態が変化したとき
INKEYキーボード押下時
MUSIC音楽再生中、最後の音の再生時
WAVEWAVEファイル再生終了時
CORETIMERプロセッサのコアタイマーが指定の値となったとき

 右のサンプルプログラムでは、メインルーチンはIDLE命令のみの空ループですが、DRAWCOUNT、INKEY、MUSIC、KEYSが割り込みイベントとして指定されており、100分の1秒タイム表示しながら赤い丸が左右に動き、BGMが継続的に演奏され、キーボード押下で画面にキーコードが表示され、ボタンを押すと押下状態を表示します。
 その他の詳細は、こちらのレファレンスを参照してください。また、7セグメントLED表示器の実験も参考にしてください。
 なお、割り込みを使用する際は以下の注意が必要です。
 ・処理は極力短くする。
 ・他の部分でVAR指定で使用しているローカル変数名と同じ名前のグローバル変数を、割り込み処理ルーチン内で使用しない。

INTRPT-M.BAS
ダウンロード

割り込みプログラム例

割り込みとタイマー使用サンプル実行画面。割り込みで音楽を鳴らしながら、赤い丸が左右に動く




MachiKania type M使用サンプル

 MachiKania type Mを使ったサンプルを紹介します。ダウンロードしたソースプログラムは、SDカードにそのままコピーしてご利用いただけます。

LEDディスプレイ制御

 こちらで購入した64×32ドットのLEDマトリクスディスプレイを、MachiKania type Mに接続し、BASICで制御しました。下の表にしたがってMachiKaniaとLEDディスプレイのコネクタを接続します。LEDディスプレイ用に5V、2A程度の電源が別途必要です。

ダウンロード LEDDEMO1.BAS

(参考)PIC32のDMA機能を使ったLEDディスプレイ表示実験

接続図

LEDディスプレイ接続




LCDシールド

 JA1WBYさんにいただいた2.4型液晶ディスプレイシールドを接続しました。調べてみるとよくあるパターンのピンアサインらしく、互換品でも動作するかもしれません。
 液晶コントローラはILI9325で、BASICプログラムで初期化や描画を行っています。
 表示している画像は、I/O誌1986年7月号に掲載(吉森昌弘氏)されたレイトレーシング(光線追跡法)という手法を用いた3Dグラフィックを、計算アルゴリズムはほぼそのままで再現したものです。

ダウンロード RAYTRLCD.BAS

 (2018.11.11)液晶の設定が間違っていたのを修正しました。誤ってILI9325用ではないものを使用していたため、表示が左右逆になっていました。

LCDシールド




WiFiチップ接続

 トランジスタ技術2016年9月号を参考に、WiFi機能搭載マイコンESP WROOM-02をシリアル接続しました。WiFiアクセスポイント経由で5秒おきに時刻サーバから日付と時刻を読み出して画面表示します。
 118行目のAT+CWJAPコマンド行の「ssid」「password」は実際のアクセスポイントのものに変更してください。

ダウンロード WROOM-02.BAS

 慌てて作ったので、うるう年の計算など正しく出来ていないかもしれません。ご容赦ください。
 (2020.2.29) 2024年2月28日が正しく表示されないバグがあったので修正しました。

接続図

WiFi接続
画面表示




I2C温湿度センサー/キャラクターLCD接続 (2018.12.29追加)

 MachiKania type MのKM-BASICにはI2Cのマスターとしての機能があります。
 秋月電子で購入したI2C接続の温湿度センサーAM2320と8×2キャラクター液晶AQM0802を同時に接続し、液晶画面に温度と湿度を表示します。I2C接続の場合、プルアップ抵抗が必ず必要ですが、AQM0802のキット基板の抵抗(10KΩ)を利用する場合は省略可能です。(特にこの液晶はプルアップ抵抗値が低いと正しく動作しません。)
 I2Cは各装置に固有のアドレスがあるため、複数の周辺装置に対して2本の線(SCLとSDA)で通信することができます。
 MachiKania type MではSCL(クロック線)をポートG2、SDA(データ線)をポートG3に接続することで、BASICでI2C機器と通信することができます。簡単な使い方はサンプルプログラムと下記の表を参照ください。

ダウンロード I2CSAMPL.BAS

半角カナを使用しているので、パソコンで表示する場合はシフトJISでご覧ください。

I2C温湿度センサー/キャラクター液晶

接続図
接続図

(2019.6.23) AM2320のピン配置に誤記があったため修正しました。申し訳ありません。

I2C関連命令、関数
I2C sI2Cマスター機能の初期化、sは通信速度(KHz単位)。s省略時は100KHz
I2CWRITE a,d1,d2,d3...スレーブアドレスaに任意数(0個以上)のデータ書き込み
I2CREAD (a,d1,d2,d3...)スレーブアドレスaに任意数のデータ書き込み後、1バイト読み込んで返す関数
I2CWRITEDATA a,b,n,d1,d2,d3...スレーブアドレスaに任意数のデータ書き込み後、バッファアドレスbからnバイト書き込み
I2CREADDATA a,b,n,d1,d2,d3...スレーブアドレスaに任意数のデータ書き込み後、nバイト読み込み、バッファアドレスbから格納
I2CERROR ( )直前に実行したI2C送受信で正常の場合0、エラー(NACK)の場合0以外を返す関数




I2C接続EEPROM (2018.12.29追加)

 マイクロチップ社製24LC256は32KバイトのEEPROMです。I2C接続の代表的なモジュールとして読み書きテストを行いました。
 メモリ全領域にランダム値を書き込み、読み込んで間違いがないか比較を行います。I2CWRITEDATA、I2CREADDATA命令の使用サンプルになります。

ダウンロード PROMTEST.BAS

接続図
接続図

EEPROM接続




SPI接続マトリクスLED (2018.12.29追加)

 MachiKania type MのKM-BASICにはSPIのマスターとしての機能があります。
 アイテンドーで購入したMAX7219搭載8x8マトリックスモジュール M7SEGX1R-7219BにSPI関連命令を使用して簡単な表示を行いました。
 MAX7219は8桁までの7セグメントLEDや8x8のマトリクスLEDなどを制御可能なドライバICです。制御は1ワード16ビットのSPI通信で行います。16ビットデータの上位8ビットがコマンド、下位8ビットがデータとなっています。
 複数個のモジュールを連結することもでき、その場合接続したモジュール数分の制御データを1つのSPIWRITE命令で遠い側から順に連続して送信することで、全てのLEDを制御することができます。


ダウンロード SPISAMPL.BAS


 SPI通信はマスターによって作られるクロック信号のタイミングで、シリアルデータの送受信を行う単純な方式です。送信用と受信用の線があるため、送受信を同時に行うことが可能です。送信は上位ビットから行われます。

SPI接続マトリクスLED

接続図
接続図

SPI関連命令、関数
SPI s,i,m,pSPIマスター機能の初期化。sは通信速度(KHz単位)、iは1ワードのビット数(8/16/32、省略時8)、mはSPIモード(0〜3、省略時0)、pはCSのポート指定(省略時D9)
SPIWRITE d1,d2,d3...データ書き込み。データ数は1個以上の任意
SPIREAD (d1,d2,d3...)任意数のデータ書き込み後、1ワード分データを読み込んで返す関数。書き込みデータは省略可
SPIWRITEDATA b,n,d1,d2,d3...0個以上の任意数のデータ書き込み後、バッファアドレスbからnワード分書き込み
SPIREADDATA b,n,d1,d2,d3...0個以上の任意数のデータ書き込み後、nワード分読み込み、バッファアドレスbから格納
SPISWAPDATA b,n,d1,d2,d3...0個以上の任意数のデータ書き込み後、バッファアドレスbからnワード分データ交換を行う。受信データはバッファアドレスbに格納される




気温気圧ロガー (2019.1.4追加)

 BOSCH社のBMP280は気温と気圧をSPIまたはI2Cで出力する超小型のセンサーです。今回アイテンドーで購入したモジュールをSPI接続して、実用的な気温、気圧の記録システムを作成しました。
 BMP280の出力データから気温、気圧への変換はなかなか面倒ですが、データシートを見ながら実数演算で計算しました。
 本サンプルプログラムでは1分おきに気温と気圧を測定し、グラフ表示します。グラフの軸は最大値、最小値から自動的に目盛りを変更するようにしました。300サンプル後は最新の300回分の表示となります。
 また、同時にSDカードへも気温と気圧をカンマ区切りで保存していますので、Ctrl+Breakキーで実行を止めて、SDカードのログファイル(TPLOG.TXT)をPCの表計算ソフトなどで確認することもできます。
 普段、あまり気圧の変化を目にすることはありませんが、本モジュールは295円(税別)と低価格で接続も簡単ですので、手軽に製作することができます。

 今回のシステムをより発展させ、キーボードやボタン、画面出力など不要な機能をなくし、BASICプログラムの自己実行機能を使用すれば、SDカードに気温と気圧を保存し続ける専用測定システムを製作することもできるでしょう。


ダウンロード TPLOGGER.BAS

半角カナを使用しているので、パソコンで表示する場合はシフトJISでご覧ください。

気温気圧ロガー

気温気圧ロガー画面
気温気圧ロガー画面 (クリックで拡大)
接続図
接続図




7セグメントLED表示器 (2019.5.4追加)

 バージョン1.3(BASICバージョンKM-1303)で追加されたタイマー機能および割り込み機能を使用して、8桁の7セグメントLED表示器を作成しました。

 小数点を含め1桁8個、8桁で計64個のLEDを制御する必要がありますが、LED1個にI/Oポートを1つずつ割り当てるとポートが足りません。そこである瞬間に点灯させるLEDは1桁だけとし、表示させる桁を高速で切り替えるダイナミック点灯方式を採用します。
 使用したLEDは桁側がカソードでコモン接続された4桁のZDS4-G369SRB-7.7を2個です。図のように、B7-B0ポートに1桁分のLEDのアノード側を接続し点灯するLEDをH、消灯とするLEDをLとします。B15-B8の8ポートはLEDのカソード側に接続し、表示したい桁だけをL、その他は全てHとします。このアノード側の出力とカソード側の出力を一定期間ごとに高速に更新することで、64個のLEDから任意のLEDを点灯または消灯しているように見せることができます。
 これまでMachiKaniaシリーズには60分の1秒間隔のWAIT命令しかありませんでしたが、8桁のLEDを60分の1秒ごとに表示切り替えすると、チラつきがひどく実用に耐えません。新たに追加されたタイマー機能を使用すると、最小10μ秒レベルまでの精度のウェイトを作ることができます。

7セグメントLED
接続図
接続図

 リスト1ではまずUSETIMER命令でタイマーのカウントスピードを1000μ秒に設定します。ループではタイマー値を0にしてから、7セグメントLED1桁分を表示し、1000μ秒経過してタイマー値が1になるまでマイコンをアイドル状態にします(IDLE命令)。1000μ秒経過後は、次の桁の表示を行い、ひたすらこれを繰り返しています。
 IDLE命令をDO〜LOOPで繰り返している理由は、マイコンは何らかの割り込みがあるとアイドル状態から復帰してしまうためです。MachiKaniaシリーズではビデオ出力をはじめ多数の割り込みを使用しているため、IDLE命令だけではアイドル状態は持続しません。なお、IDLE命令を削除したDO〜LOOPだけでも動作しますが、マイコンが常時全力で動作することになるため、消費電力が上がります。

7セグメントLEDリスト1
リスト1 TIMER()関数による例
ダウンロード 7SEGLED1.BAS

 リスト2は割り込みを使用した例です。リスト1ではひたすら同じ値だけを表示していましたが、普通は表示したい内容は変更があります。ここでは変数NUMBERの値を割り込みで表示し、メインルーチンではランダムにNUMBERを変更しています。
 INTERRUPT命令は割り込み使用の宣言で、続くTIMERが割り込みの種類、ISRTMRは割り込み処理ルーチンの名前です。割り込み処理ルーチンは先頭にLABEL命令で名前指定することで場所を指定し、最後にRETURN命令で終了します。
 このように、割り込みを使用することで、表示したい内容は任意のタイミングで変更することができ、メインプログラム側では意識することなくLEDをダイナミック点灯させることができます。

7セグメントLEDリスト2
リスト2 タイマー割り込みを使用した例
ダウンロード 7SEGLED2.BAS




LEDテープ(2019.5.12追加)

 最近は非常に多くの場所でLEDテープを見かけるようになりました。フルカラー版の代表例がWorldsemi社のWS2812Bを使用したものです。WS2812BをBASICで簡単に使用するためのクラスライブラリを作成しました。
 WS2812Bは1つ1つにマイコンを内蔵しており、信号線は1本のシリアル接続だけで数珠つなぎ式に多数のLEDを接続し、任意のLEDに対して24ビット色を設定することができます。1と0の区別はパルスの幅で行い、リセット後最初に届いた信号は自分が受け取り、続く信号は後続に送ります。一定期間以上信号線がLとなるとリセットされ、再度受け取りを行います。

 MachiKania type MとWS2812BのLEDテープとはD10(PWM1)ポートで接続します。なお、LEDテープの電源は+5Vが必要です。多数のLEDを同時に点灯する場合、大量の電流を消費しますので余裕のある電源を準備してください。
 実験に使用したのはこの製品で、144個のWS2812Bがびっしり直線上に並んでいます。途中で切断して複数にしたり、マトリクス上に並べることも可能です。
 制御プログラムはWS2812クラスライブラリファイルとメインプログラムファイルに分かれています。クラスライブラリはSDカードのメインプロラムと同じディレクトリ(カレントディレクトリ)または、「\LIB\WS2812」という名前のディレクトリに「WS2812.BAS」の名前で保存します。
 WS2812クラスライブラリの詳細な使用方法は、ダウンロードコーナーのクラスファイル集をダウンロードして展開されるWS2812ディレクトリのhelp.txtを参照ください。

 ダウンロード

メインプログラム TAPELED.BAS

クラスライブラリ WS2812.BAS

LEDテープ
虹色がぐるぐる回ります

接続図
接続図

メインプログラムリスト
メインプログラムリスト


応用するとこんなものも作れます  プログラムリスト




XEVIOUSもどき(2020.3.21追加)

 DOZAN氏による作品です。
 MachiKania type Mに市販のArduino用小型液晶シールドを接続し、なんとナムコの往年の名作を再現されています。「もどき」とご本人は謙遜していますが、ここまで完成度の高いものが作られると、驚きを通り越して感動的です。BGMや効果音も忠実に再現されています。このたび、ご本人の許可のもと実行用のHEXファイルを公開します。
 使用可能な液晶はArduino UNO用の解像度240×320ドット、8ビットパラレル接続で、液晶コントローラにILI9325/ILI9341/S6D0154または互換品を使用したものです。ピン接続は右図のようになります。

ダウンロード Xevious.zip (禁転載)

 解凍するとそれぞれの液晶コントローラに対応したHEXファイルがありますので、必要なものをSDカードのルートディレクトリに「XEVIOUS.HEX」という名前で保存し、MachiKania type M本体のSDカードスロットに差し込みます。
 プレイするために、まずブートローダでSDカードからマイコンにXEVIOUSをロードします。ビデオケーブルでテレビに接続し、本体のいずれかのボタンを押しながら電源オンすることでブートローダ画面を立ち上げ、上下左右ボタンで「XEVIOUS」を選択し、FIREボタンを押すとテレビ表示が消えた後、15秒程度すると液晶にゲームが画面表示されます。以後はテレビへの出力はありません。STARTボタンでゲームスタートです。

 液晶の種類によっては、画面の上下や左右が反転されるかもしれません。その場合、右図のようにE5〜E7端子を1KΩ程度の抵抗でプルダウンした状態でゲーム起動することで、反転できるようになっています。
 また、BGMや効果音はMachiKania type Mの音声出力のLおよびRから出力されますが、D10/D11(PWM1/PWM2)端子からも同時に出力されます。保護用に1KΩ程度の抵抗を挟んで圧電素子を接続することで、テレビにつながなくてもサウンド付きで楽しめるようになります。

タイトル画面
おお、これは懐かしのあのゲーム!

プレイ画面
画面もサウンドも本格的です

接続図
外側が液晶のピン名称(D8-D15はD0-D7と表記されることが多い)

<動作確認済み液晶>(2020.5.3現在)

・aitendo 2.4型液晶シールド M024C9325SLD(ILI9325)
・aitendo 2.4型液晶シールド UL024C0154D8(S6D0154)
 (2020.5.3) 現在販売中のUL024C0154D8は制御チップが異なるものがあるため、ベータ版を用意しました。
・aitendo 3.2型液晶モジュール LCD032-2P(SSD1289)
 LCD032-2PはArduino用シールドではないため、ご自身でピン接続する必要があります。
・aitendo 2.8型液晶モジュール M028C8347D8(HX8347D)
 M028C8347D8はArduino用シールドではないため、ご自身でピン接続する必要があります。
・aitendo 3.2型液晶モジュール M032C9341B3(ILI9341)
 M032C9341B3はArduino用シールドではないため、ご自身でピン接続する必要があります。
・aitendo 2.4型液晶シールド UL024S8AAA(ILI9325)
 ピンアサインが通常と異なるため修正が必要です。
・ELEGOO製2.8型液晶シールド JP-EL-SM-004(ILI9341)
・HiLetgo製2.4型液晶シールド 3-01-1292(ILI9341)


 GithubにDOZAN氏自身のページも公開されました。FM音源ボード対応などの強化や、動画へのリンクも追加されています。(2022.1.9)
 本作品の動作等に関してのお問い合わせや感想などは「ケンケンのホームページ掲示板」にて受けております。




XEVIOUSもどき(ビデオ出力版)(2020.3.28追加)

 こちらもDOZAN氏による作品です。ビデオ出力版もぜひ欲しいとお願いしたところ、作っていただけました。液晶シールドは不要で、MachiKania type M単体で動作します。ワイドテレビの場合横長になってしまうので、できれば4:3のモードにテレビを設定してプレイしてください。
 解凍したHEXファイルを「XEVIOUSV.HEX」などの名前でSDカードのルートディレクトリに保存し、ブートローダから選択して起動してください。ロードには15秒程度かかります。
 音声出力は左チャンネルのみの出力となります。また、液晶版同様にD10/D11(PWM1/PWM2)端子に圧電ブザーを接続してすることで、基板からも効果音を出力することができます。
 描画速度の問題から、残念ながらボスキャラ(アンドアジェネシス)は登場しないそうです。



ダウンロード Xevious_Video.zip (禁転載)
(2020.4.5) タイトル画面追加とチラつき軽減しました



 本作品の動作等に関してのお問い合わせや感想などは「ケンケンのホームページ掲示板」にて受けております。

タイトル画面

プレイ画面


DOZAN氏作成動画(2022.1.9)




DSPラジオシールド(2021.2.7追加)

 2020年正月のアイテンドーの福袋に入っていたDSPラジオモジュールを使って、MachiKania typeMで操作するDSPラジオシールド基板を作成しました。
 使用したDSPラジオモジュールはM6959で、FM放送、AM放送のほか短波放送にも対応しています。チューニングやバンドの選択、音量調整はモジュールの各ピンの電圧でアナログ的に制御する方式となっています。そこで、MachiKania typeMにSPI接続のDAコンバーターを3チャンネル接続し、制御することとしました。
 また、同じ福袋に入っていた16桁x2行のキャラクター液晶も搭載することで、ビデオ出力画面なしでも単体でラジオとして実用できるようにしました。
 さらに、工作魂さん作成のリアルタイムクロック基板もつなぎ、時計表示機能も追加しました。
プログラムのダウンロードはこちらから

DSPラジオ

DSPラジオ






プリント基板の入手方法

 MachiKania type Mのプリント基板、および部品セット(ブートローダ書き込み済み)を購入することができます。


Assemblage
秋葉原にあるハンダ付けができるスペースです。プリント基板のみですが、1枚400円で販売中です。本当はIchigoJamの展示場所ですが、同じBASICマイコン仲間として、MachiKania type Mの実機も設置していただきました。

2019年10月にラジオデパート1階に移転しました。

オレンジピコショップ
ORANGE picoはMachiKaniaと同じPIC32MXで動作するBASIC搭載マイコンボードです。Webショップを開設されており、MachiKania type Mの部品セットの販売を引き受けてくれました。マイコンにはブートローダプログラムを書き込み済みです。(2018.8)
ブートローダの自身での書き込みが必要となりました。(2021.7.27)
ケンケンのホームページ掲示板「管理者へメール」から「TypeM基板購入希望」と記載の上、ご連絡ください。1枚400円で郵送します。




 何かご不明点やご意見などありましたら、お気軽にこちらの掲示板に書き込みをお願いします。



Copyright (C) KenKen All Rights Reserved.