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では以下のようなことができます。
・テレビにつないで電源を入れればすぐにゲームが始められます。
・キーボードをつなげば、高性能BASIC言語で本格的なオリジナルのゲームを作ることができます。
・SDカードにプログラムやデータを保存したり、パソコンとやり取りしたりできます。
・ハードウェアもソフトウェアも公開されているので、全て自分で製作することができます。
・最大384×216ドット、256色同時表示可能なカラーグラフィックが使えます。
・多数の入出力ポートを備え、BASICから外部接続機器の制御ができます。
・32ビット単精度の浮動小数点演算をBASICでサポートし、各種の数学関数が使えます。
・構造化プログラミングに対応しており、GOTO文を使わないプログラムが作れます。
・従来のMachiKania type Zの上位モデルに当たり、BASICの互換性があります。
・オブジェクト指向プログラミングにより、ライブラリ利用ができます。(Ver 1.2以降)
MachiKania type M紹介動画
以下の3つの手順で製作します。
1. ハードウェアの製作
2. マイコンにブートローダプログラムの書き込み
3. SDカードに必要ファイルをコピー
MachiKaniaシリーズは回路図、ソースプログラムとも公開されたオープンなシステムです。回路図からご自身で基板を作成することもできますが、プリント基板を用意していますので、ここではプリント基板からの製作のポイントを説明します。プリント基板の入手方法はこちらを参照してください。
マイコンについて
使用するマイコンは64ピンQFPのPIC32MX370F512Hです。表面実装でピン間隔が大変狭いため、チップ直接の基板へのハンダ付けは慣れていないと難しいですが、秋月電子から変換基板に実装済み製品が販売されています。本基板はどちらでも使えるようになっているので、どちらかをお選びください。
なお、マイコンチップの取り付け向きには十分注意してください。基板の向きとチップ上の印刷の向きが異なりますので、1番ピンのマークを必ず確認してから取り付けてください。
変換基板を使用する際、基板にピンソケットを使用することも考えられますが、液晶などのシールド基板を使用する場合は上にかぶさりますので、背の低いソケットを選び、シールドとぶつからないことを確認してください。
電源コネクタについて
電源は+5V、1A程度のACアダプタなどをご用意ください。電源コネクタはセンタープラスのDCジャックおよびUSBマイクロBタイプのものが利用可能です。どちらか一方または両方のコネクタを取り付けてください。USBマイクロBのコネクタは基板裏面に取り付けます。SDカードスロット基板の裏面となりますので、SDカードスロットより先にハンダ付けが必要です。
ICSP用ピンヘッダについて
PICkit3を差した時、隣りのピンソケットに少しぶつかります。書き込みは可能ですが、この端子はマイコンにブートローダプログラムを書き込む際に1度だけしか使用しませんので、私はハンダ付けせずに、後述の写真のように書き込み時にピンヘッダを斜めに押し付けて、書き込みが終わったら外しています。
三端子レギュレータについて
表面実装品のNJM2845DL1-33となります。最初にピンセットなどでICを固定した状態で1つのピンをハンダ付けしてから、残りのピンをハンダ付けしてください。
電源 | 5V、1A程度のACアダプタ。USBマイクロBのものも対応 |
PICkit3/PICkit4 | ブートローダの書き込みに必要。PIC32に書き込みができれば他のものでもOK |
マイクロSDカード | 1GBもあれば十分 |
パソコン | PICkit3等利用時、SDカードの初期コピー作成時に使用 |
SDカードリーダライタ | パソコン連携する際に必要 |
テレビ | ビデオ入力端子のあるもの。パソコンのビデオキャプチャユニットなどでも利用可能 |
PS/2キーボード | BASICプログラムを組む際必要 |
ビデオケーブル、音声ケーブル | テレビに接続します |
※ブートローダ書き込み済みマイコン利用の場合は不要
MachiKaniaシリーズでは、SDカードに保存された実行用のHEXファイルをテレビ画面上で選択して、マイコンに書き込みを行います。このブートローダプログラムを最初に一度だけマイコンに書き込む必要があり、PICkit3などの書き込み器をICSP端子に接続して書き込みを行います。
基板の製作が完了した後、MPLAB X IDEに付属のMPLAB IPEを使用して、下記ダウンロードコーナからダウンロードして「bootloader.hex」ファイルの書き込みを行います。その際、マイコンへの通電が必要ですので、基板に電源を接続しスイッチを入れるか、PICkitからの通電するよう設定を行ってください。
(参考)Raspberry Piを使ってPIC32MXのフラッシュ書き込みを行う方法
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)
ここまでに紹介したシステムに関するファイルをダウンロードできます。
Download (2020.3.29) |
動作に必要なファイルとサンプルファイル一式(bootloader.hex以外はSDカードにコピーする) | |
bootloader.hex | ブートローダ本体。PICkit3等を用いてPICマイコンに書き込む | |
MACHIKAM.HEX | MachiKania type M BASICシステム。SDカードに入れてブートローダから書き込みと実行 | |
MACHIKAM.INI | MachiKania type M BASICシステムの設定ファイル | |
その他ファイル | 「.BAS」ファイルはBASICサンプルプログラム。「.HEX」ファイルはブートローダで起動可能な実行ファイル(C言語で作成したサンプルゲームなど) | |
Download (2021.1.24) | BASICで利用可能な各種クラスファイル集 | 展開してできるLIBディレクトリをSDカードのルートディレクトリにコピーして利用。各クラスの使用方法はそれぞれのディレクトリのhelp.txtファイルを参照 |
Download (2020.3.29) |
自分でビルドする場合に必要な、ソースファイルおよびライブラリファイル一式 | |
ps2keyboard370f.X.a | PS/2キーボード用ドライバ | |
lib_videoout_megalopa.X.a | ビデオ出力ライブラリ | |
sdfsio370fLib.X.a | SDファイルアクセス用ライブラリ | |
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ボタンを押す
ビデオ出力端子をテレビのビデオ入力端子(黄)に、音声出力端子をテレビの音声入力端子に接続し、PS/2キーボードも接続すれば、いよいよ電源を接続してください。正しく作られていれば、右図のようなMachiKaniaブートローダの画面が表示されます。
ブートローダはSDカード上のHEXファイル(マイコンの機械語プログラムをテキスト形式にしたファイル)をマイコンのフラッシュメモリに書き込むシステムです。画面上には拡張子「.HEX」を省略して表示しています。
MachiKania type M上の4方向ボタンを使って「MACHIKAM」を選択し、FIREボタンを押すと、BASICシステムのPICマイコンへの書き込みが開始されます。書き込み中は画面表示が停止されますが、数秒後に表示再開し、MachiKania type MのBASICシステムが起動します。
一度ブートローダを使って書き込みを行うと、次回電源オンやリセット時にはその書き込まれたプログラムが起動します。再度ブートローダ画面を表示するには、MachiKania本体の6個のボタンのどれでもよいので、押しながら電源オンまたはリセットします。
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プログラムを実行した場合は、キーボードやボタンによる強制終了はできず、一時ファイルが作成されることもありませんので、実行中に電源を切っても問題ありません。
ここからはMachiKania type Mのより詳細な使い方や機能の説明をします。
画面出力モードの強化
テキスト画面、グラフィック画面とも解像度アップし、またテキスト画面とグラフィック画面の重ね合わせが可能となりました。これまでワイドテレビに映した場合横長のドットとなっていましたが、ワイドテレビで正方画素となるワイド画面モードが追加されました。
従来の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、RD11 | PWM出力に対応。PWM出力は音声出力と排他利用となるので注意 |
RC13、RC14 | シリアル入出力に対応 |
G2、G3 | I2C通信に対応 |
D9、F2、F6、G9 | SPI通信に対応 |
ステレオ音声対応、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システム起動時に読み込んで初期設定を行います。ファイルに下記の項目名の行を追加することで設定します。
先頭に#を付けると無効な行となります。
項目名 | 設定内容 |
106KEY | 日本語キーボードに設定 |
101KEY | USキーボードに設定 |
NUMLOCK | 起動時Num Lockキーオン |
CAPSLOCK | 起動時Caps Lockキーオン |
SCRLLOCK | 起動時Scroll Lockキーオン |
WIDTH36 | 起動時36文字モード |
WIDTH48 | 起動時48文字モード |
WIDTH80 | 起動時80文字モード |
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で追加された主な命令、関数は以下の表の通りです。
USECLASS | クラスファイル利用命令 |
FIELD | クラスファイル中でフィールドを宣言 |
PRIVATE | クラスファイル中でプライベートなフィールドやスタティック変数を宣言 |
STATIC | クラスファイル中でスタティック変数を宣言 |
METHOD | クラスファイル中でメソッドを宣言 |
NEW | オブジェクトを作成しポインタを返す関数 |
DELETE | オブジェクトを破棄する |
CALL | メソッドを呼び出す |
POKE16 | メモリに16ビットデータを書き込む |
POKE32 | メモリの32ビットデータを書き込む |
PEEK16 | メモリから16ビットデータを読み出す関数 |
PEEK32 | メモリから32ビットデータを読み出す関数 |
SETDIR | SDカードのカレントディレクトリ変更 |
GETDIR | SDカードのカレントディレクトリ取得する関数 |
PLAYWAVE | 15.7KHzでサンプリングされたWAV形式のファイルを再生 |
SERIAL | シリアルポートの設定 |
SERIALOUT | シリアルポートに出力 |
PWM | RD10またはRD11にPWM出力 |
OUT | RB0〜RB15、RE5〜RE7の個別ビットに出力 |
OUT8L | RB0〜RB7に8ビットデータ出力 |
OUT8H | RB8〜RB15に8ビットデータ出力> |
OUT16 | RB0〜RB15に16ビットデータ出力 |
WIDTH | テキスト画面文字数設定。30、36、40、48、80から選択。80はモノクロモード |
USEGRAPHIC | グラフィック画面設定。288×216(256色)、384×216(256色)を追加 |
SPI | SPI通信速度、モード等設定(*1) |
SPIWRITE | SPIデータ送信(*1) |
SPIWRITEDATA | SPI連続データ送信(*1) |
SPIREADDATA | SPI連続データ受信(*1) |
SPISWAPDATA | SPI連続データ送受信(*1) |
I2C | I2C通信速度設定(*1) |
I2CWRITE | I2Cデータ送信(*1) |
I2CWRITEDATA | I2C連続データ送信(*1) |
I2CREADDATA | I2C連続データ受信(*1) |
PLAYWAVE | 再生中WAVファイルの位置や残り数を取得 |
ANALOG | RB0〜RB15のアナログ値を取得 |
IN | RB0〜RB15、RE5〜RE7の個別ビットの入力値を取得 |
IN8L | RB0〜RB7の8ビットデータ入力値を取得 |
IN8H | RB8〜RB15の8ビットデータ入力値を取得 |
IN16 | RB0〜RB15の16ビットデータ入力値を取得 |
SERIALIN | シリアルポートから読み込み |
SPIREAD | SPI受信(*1) |
I2CREAD | I2C受信(*1) |
I2CERROR | 直前に使用したI2C通信のエラー(*1) |
MachiKania BASICシステムのキャラクターコード表は右画面のようになっています。NEC製の往年の名機「PC-8001」とほぼ同じです。フォントについても参考にして作りました。
グラフィック文字($80〜$9F、$E0〜)はキーボードから入力する機能がありませんが、この表を参考にしてCHR$関数を使うことで利用可能です。
また、PCG(ユーザ定義文字)機能を使えば、全てのキャラクターのフォントパターンを自由に変更することができます。1キャラクターのサイズは8×8ドットです。ゲームのオリジナルキャラクター作りにも応用できます。
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プログラムが自動的に起動するようになるので、完成したゲームプログラムなどを何度もプレイする場合に便利となります。
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=インスタンス.メソッド名( )のように記述します。パブリックフィールドも同様にインスタンス.フィールド名でアクセスします。
クラスの使い方の詳細は、こちらのレファレンスを参照してください。また、ダウンロードコーナーでライブラリ(クラスファイル集)を公開しているので、参考にしてください。
2019.5.4 Ver 1.3(KM-1303)で追加
タイマー機能と割り込み機能を追加しました。
タイマーはμ秒単位で指定でき、10μ秒程度から実用的に使えます。
割り込み機能は、割り込みのトリガーとなるイベントと処理ルーチン名を宣言することで、イベント発生時に処理ルーチンを自動で呼び出すことができます。イベントは下表の種類の指定が可能です。
TIMER | タイマー値が1増えたとき |
DRAWCOUNT | 60分の1秒ごと |
KEYS | ボタンの押下状態が変化したとき |
INKEY | キーボード押下時 |
MUSIC | 音楽再生中、最後の音の再生時 |
WAVE | WAVEファイル再生終了時 |
CORETIMER | プロセッサのコアタイマーが指定の値となったとき |
右のサンプルプログラムでは、メインルーチンはIDLE命令のみの空ループですが、DRAWCOUNT、INKEY、MUSIC、KEYSが割り込みイベントとして指定されており、100分の1秒タイム表示しながら赤い丸が左右に動き、BGMが継続的に演奏され、キーボード押下で画面にキーコードが表示され、ボタンを押すと押下状態を表示します。
その他の詳細は、こちらのレファレンスを参照してください。また、7セグメントLED表示器の実験も参考にしてください。
なお、割り込みを使用する際は以下の注意が必要です。
・処理は極力短くする。
・他の部分でVAR指定で使用しているローカル変数名と同じ名前のグローバル変数を、割り込み処理ルーチン内で使用しない。
MachiKania type Mを使ったサンプルを紹介します。ダウンロードしたソースプログラムは、SDカードにそのままコピーしてご利用いただけます。
こちらで購入した64×32ドットのLEDマトリクスディスプレイを、MachiKania type Mに接続し、BASICで制御しました。下の表にしたがってMachiKaniaとLEDディスプレイのコネクタを接続します。LEDディスプレイ用に5V、2A程度の電源が別途必要です。
JA1WBYさんにいただいた2.4型液晶ディスプレイシールドを接続しました。調べてみるとよくあるパターンのピンアサインらしく、互換品でも動作するかもしれません。
液晶コントローラはILI9325で、BASICプログラムで初期化や描画を行っています。
表示している画像は、I/O誌1986年7月号に掲載(吉森昌弘氏)されたレイトレーシング(光線追跡法)という手法を用いた3Dグラフィックを、計算アルゴリズムはほぼそのままで再現したものです。
トランジスタ技術2016年9月号を参考に、WiFi機能搭載マイコンESP WROOM-02をシリアル接続しました。WiFiアクセスポイント経由で5秒おきに時刻サーバから日付と時刻を読み出して画面表示します。
118行目のAT+CWJAPコマンド行の「ssid」「password」は実際のアクセスポイントのものに変更してください。
慌てて作ったので、うるう年の計算など正しく出来ていないかもしれません。ご容赦ください。
(2020.2.29) 2024年2月28日が正しく表示されないバグがあったので修正しました。
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機器と通信することができます。簡単な使い方はサンプルプログラムと下記の表を参照ください。
接続図
(2019.6.23) AM2320のピン配置に誤記があったため修正しました。申し訳ありません。
I2C s | I2Cマスター機能の初期化、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以外を返す関数 |
マイクロチップ社製24LC256は32KバイトのEEPROMです。I2C接続の代表的なモジュールとして読み書きテストを行いました。
メモリ全領域にランダム値を書き込み、読み込んで間違いがないか比較を行います。I2CWRITEDATA、I2CREADDATA命令の使用サンプルになります。
接続図
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を制御することができます。
SPI通信はマスターによって作られるクロック信号のタイミングで、シリアルデータの送受信を行う単純な方式です。送信用と受信用の線があるため、送受信を同時に行うことが可能です。送信は上位ビットから行われます。
接続図
SPI s,i,m,p | SPIマスター機能の初期化。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に格納される |
BOSCH社のBMP280は気温と気圧をSPIまたはI2Cで出力する超小型のセンサーです。今回アイテンドーで購入したモジュールをSPI接続して、実用的な気温、気圧の記録システムを作成しました。
BMP280の出力データから気温、気圧への変換はなかなか面倒ですが、データシートを見ながら実数演算で計算しました。
本サンプルプログラムでは1分おきに気温と気圧を測定し、グラフ表示します。グラフの軸は最大値、最小値から自動的に目盛りを変更するようにしました。300サンプル後は最新の300回分の表示となります。
また、同時にSDカードへも気温と気圧をカンマ区切りで保存していますので、Ctrl+Breakキーで実行を止めて、SDカードのログファイル(TPLOG.TXT)をPCの表計算ソフトなどで確認することもできます。
普段、あまり気圧の変化を目にすることはありませんが、本モジュールは295円(税別)と低価格で接続も簡単ですので、手軽に製作することができます。
今回のシステムをより発展させ、キーボードやボタン、画面出力など不要な機能をなくし、BASICプログラムの自己実行機能を使用すれば、SDカードに気温と気圧を保存し続ける専用測定システムを製作することもできるでしょう。
バージョン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μ秒レベルまでの精度のウェイトを作ることができます。
接続図
リスト1ではまずUSETIMER命令でタイマーのカウントスピードを1000μ秒に設定します。ループではタイマー値を0にしてから、7セグメントLED1桁分を表示し、1000μ秒経過してタイマー値が1になるまでマイコンをアイドル状態にします(IDLE命令)。1000μ秒経過後は、次の桁の表示を行い、ひたすらこれを繰り返しています。
IDLE命令をDO〜LOOPで繰り返している理由は、マイコンは何らかの割り込みがあるとアイドル状態から復帰してしまうためです。MachiKaniaシリーズではビデオ出力をはじめ多数の割り込みを使用しているため、IDLE命令だけではアイドル状態は持続しません。なお、IDLE命令を削除したDO〜LOOPだけでも動作しますが、マイコンが常時全力で動作することになるため、消費電力が上がります。
リスト1 TIMER()関数による例
ダウンロード 7SEGLED1.BAS
リスト2は割り込みを使用した例です。リスト1ではひたすら同じ値だけを表示していましたが、普通は表示したい内容は変更があります。ここでは変数NUMBERの値を割り込みで表示し、メインルーチンではランダムにNUMBERを変更しています。
INTERRUPT命令は割り込み使用の宣言で、続くTIMERが割り込みの種類、ISRTMRは割り込み処理ルーチンの名前です。割り込み処理ルーチンは先頭にLABEL命令で名前指定することで場所を指定し、最後にRETURN命令で終了します。
このように、割り込みを使用することで、表示したい内容は任意のタイミングで変更することができ、メインプログラム側では意識することなくLEDをダイナミック点灯させることができます。
リスト2 タイマー割り込みを使用した例
ダウンロード 7SEGLED2.BAS
最近は非常に多くの場所で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を参照ください。
ダウンロード
虹色がぐるぐる回ります
接続図
メインプログラムリスト
応用するとこんなものも作れます プログラムリスト
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)
本作品の動作等に関してのお問い合わせや感想などは「ケンケンのホームページ掲示板」にて受けております。
こちらも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)
2020年正月のアイテンドーの福袋に入っていたDSPラジオモジュールを使って、MachiKania typeMで操作するDSPラジオシールド基板を作成しました。
使用したDSPラジオモジュールはM6959で、FM放送、AM放送のほか短波放送にも対応しています。チューニングやバンドの選択、音量調整はモジュールの各ピンの電圧でアナログ的に制御する方式となっています。そこで、MachiKania typeMにSPI接続のDAコンバーターを3チャンネル接続し、制御することとしました。
また、同じ福袋に入っていた16桁x2行のキャラクター液晶も搭載することで、ビデオ出力画面なしでも単体でラジオとして実用できるようにしました。
さらに、工作魂さん作成のリアルタイムクロック基板もつなぎ、時計表示機能も追加しました。
プログラムのダウンロードはこちらから
MachiKania type Mのプリント基板、および部品セット(ブートローダ書き込み済み)を購入することができます。
Assemblage | 秋葉原にあるハンダ付けができるスペースです。プリント基板のみですが、1枚400円で販売中です。本当はIchigoJamの展示場所ですが、同じBASICマイコン仲間として、MachiKania type Mの実機も設置していただきました。 2019年10月にラジオデパート1階に移転しました。 |
オレンジピコショップ | ORANGE picoはMachiKaniaと同じPIC32MXで動作するBASIC搭載マイコンボードです。Webショップを開設されており、MachiKania type Mの部品セットの販売を引き受けてくれました。 ブートローダの自身での書き込みが必要となりました。(2021.7.27) |
ケンケンのホームページ掲示板 | 「管理者へメール」から「TypeM基板購入希望」と記載の上、ご連絡ください。1枚400円で郵送します。 |
何かご不明点やご意見などありましたら、お気軽にこちらの掲示板に書き込みをお願いします。