小さなマイコン「UIAPduino」で、ゲームやキーボードを作ってみました

290円の安価なマイコン「UIAPduino」を使ったものづくりに取り組んでいます。

UIAPduinoに搭載されているCH32V003は、フラッシュメモリ16KB、RAMはわずか2KBという小さなマイコンです。高性能なマイコンではありませんが、工夫次第で画面表示やゲーム、入力装置など、さまざまな作品を作ることができます。

今回は、これまでUIAPduinoを使って作ってきたものをまとめて紹介します。

OLEDディスプレイに文字や図形を表示する

最初に取り組んだのは、SSD1306という128×64ドットのOLEDディスプレイです。

画面に文字を表示するだけでなく、点や線、四角形を描いたり、小さなキャラクターを動かしたりできるようにしました。

ただし、UIAPduinoのRAMは2KBしかありません。一般的なライブラリのように画面全体のデータをメモリに保存すると、それだけで約1KBを使用してしまいます。

そこで、画面を8ドットずつに分けて処理する「ページバッファ方式」を使いました。メモリの使用量を抑えながら、文字や図形、スプライトを表示できるようになりました。

また、I2C通信の速度を400kHzに設定することで、画面の書き換えもかなり速くなりました。

スプライトを使ったミニゲーム

画面表示ができるようになると、次はキャラクターを動かす仕組みを作りました。

画面上で動くキャラクターを「スプライト」として管理し、座標や移動方向、速さなどを指定できるようにしています。

これを使って、ボールを壁やパドルで跳ね返すスカッシュ風のゲームを作りました。

ゲームを作ると、単にキャラクターを表示するだけでは足りません。

ボールが壁に当たったか、パドルの範囲に入っているか、どのタイミングで進行方向を反転させるかなど、細かな判定が必要になります。

数値上では正しいはずでも、実際に動かしてみるとボールがパドルにめり込んだり、少しずれて跳ね返ったりします。そのたびに条件式を調整し、自然に見える動きを探していきました。

こうした試行錯誤も、ゲームづくりのおもしろいところです。

音とボタンを使ったゲーム

圧電ブザーとタクトスイッチを使い、音を鳴らすプログラムや、タイミングよくボタンを押すゲームも試しました。

単純にランダムな音を鳴らすだけでは、なかなかゲームとしておもしろくなりません。

どのタイミングで押すのか、成功や失敗をどのように伝えるのか、少しずつ速くするのかなど、遊びとして成立させるためにはルールの工夫が必要です。

プログラムが動くことと、遊んでおもしろいことは別です。実際に作って遊んでみることで、ゲームにはプログラム以外の設計も必要だと分かります。

パソコンのショートカットキーを送信する

HID対応のUIAPduinoを使い、パソコンにキーボード入力を送るミニキーボードも作りました。

タクトスイッチを押すと、次のようなショートカットキーを送信します。

Ctrl+Zによる「元に戻す」、Ctrl+Yによる「やり直し」、Windows+Shift+Sによる画面の切り取りなどです。

市販のキーボードでは押しにくい組み合わせも、専用のボタンに割り当てれば、ワンタッチで操作できます。写真はお試し段階の様子だったのでボタン1つですが、キースイッチやキーキャップも使えます。

仕組みは比較的単純ですが、自分で作った回路がパソコンの操作につながるため、マイコンの役割を実感しやすい作品です。

マウスやホイールも実装できるので、デザインソフトやゲームで力を発揮しそうです。

温度や湿度表示することもできる

まだ実装していませんが、UIAPduinoには、センサーや時計用の部品も接続できます。

温湿度センサーのAHT20や、温度、湿度をOLEDに表示する仕組みも作れます。

センサーから数値を読み取り、画面に見やすく表示することで、マイコンが身の回りの情報を集めて伝える装置になります。

ゲームとは違った、実用的な作品も作れます。

UIAPduino専用のブロックプログラミング

現在は、UIAPduinoをブロックでプログラミングできる環境も制作しています。

Blocklyを使い、「スプライトを動かす」「壁で跳ね返す」「座標を調べる」「ボタンが押されたら処理する」といった命令を、ブロックを組み合わせて作れるようにしました。

組み立てたブロックから、UIAPduinoで動くC言語のプログラムを生成します。

最初からC言語をすべて入力するのは大変ですが、ブロックを使えば、処理の流れや条件分岐、座標の考え方から学ぶことができます。

単なる初心者向けの簡易ツールではなく、ブロックで作った処理と、生成されたプログラムを対応させながら学べる環境を目指しています。

小さいからこそ、仕組みが見える

UIAPduinoは、メモリもプログラム容量も限られています。

そのため、何でもライブラリに任せるのではなく、画面データをどのように送るのか、メモリをどう節約するのか、キャラクターの位置をどのように管理するのかを考える必要があります。

制限があるからこそ、コンピューターの中で何が起きているのかが見えやすくなります。

回路を組み、プログラムを書き込み、動かしてみる。思った通りに動かなければ、原因を調べて修正する。

UIAPduinoを使ったものづくりには、プログラミングだけでなく、電子工作、数学、ゲーム設計、問題解決など、さまざまな学びが含まれています。

これからも、小さなマイコンでどこまでできるのか、いろいろな作品づくりを試していきたいと思います。