「ゲーム機」も作って遊ぼう!MakeCode Arcade (3)ファームウェア作成編
ビジュアルプログラミング可能なレトロゲームコンソールが 自作 できるッ! …勝手に連載記事(笑)。
前回はパーツ調達編 でした。中華通販も最初はドキドキしながらポチったりするのですが、次第に慣れてくるものです。いつの間にか怪しげな黄色や白の空き封筒が増え…、郵便配達員からマークの目で見られるようになり…、Aliのshipmentリストが空になるロスを味わうと、また何かポチりたい欲求に襲われることになる。
…そんなわけで、無事に荷物が届いたらホッとしてやる気がなくなってしまうという現象(名前は適当に考えて下さい(^_^;) と戦いながら、マイコンボードに ファームウェア を突っ込んであげることにしましょう。
とは言っても、既にgithubで公開されているファームウェアを カスタマイズするだけ です。そうすることによってオリジナルゲームコンソールを組み立てられるようになっているわけですね。
マイコンのピン割当を決める
いきなりですが、あくまでも(筆者の)一例です。必ずこのように割り当てなくてはいけない。という訳ではありませんし、ボードそのものも違うことがあるでしょう。
※ボタンとブザーそれぞれの片側は G(グランド) に接続されます
なお、ハードウェア仕様にも書かれてますが、いくらか 最低限のルール のようなものがあります。
・Display(LCD) のSPI通信はマイコンの SPI1ユニット を使用する。(つまり クロック→A5、データ→A7。A6は入力データ用信号なのですが、LCDモジュール側から出力されるデータ信号が無いので空きになります)
・LCDの BL(バックライト)と、ブザー は PWM出力 が可能なピンとする。
・あとは適当にマイコンのピンを割り当てて大丈夫
自由度高いですねヽ(´ー`)ノ …でも、このマイコンボードの特性も含めて以下のような思惑も考慮しています。
・将来、I2C通信モジュール をくっつけるかもしれないので、B10(クロック)とB3(データ)は空けておく。
・A0 はマイコンボードの KEYボタン と連動しているので空ける。
・C13 もマイコンボードの LED と連動してるので(以下略)
・C14,15 は オシレーター(クロック水晶)と繋がってるので(以下略)
・A11,12 ピンは(中略)USB信号線 で、A09,10 は シリアル通信線 なので(以下略)
そしてDisplay用の信号と、キーボタン用の信号が、それぞれ ご近所 になるように並べたというわけです。その方が配線が楽そうなので。
■ 一応まとめ
ファームウェアをカスタマイズしよう
あんたの説明なんかいらないから、zip・デ・クレ(°Д゚)
…という方はこの項は読み飛ばして下さい。。。(T-T)
まずは、元となるファームウェアの紹介です。
uf2-stm32f
https://github.com/mmoskal/uf2-stm32f
↑のプログラムソースを git なり zip なりで自分のパソコンにダウンロードしておきましょう。
■ ファームウェアの役割
MakeCode Arcade でゲームを完成させたあと、画面の左下に「Download」というボタンがあると思います。こいつをポチると拡張子が .uf2 のファイルがダウンロードできるでしょう。その .uf2 ファイルをマイコンボードに書き込むためのプログラムということになります。
micro:bit にプログラムを書き込んだことのある方はイメージしやすいと思いますが、マイコンボードとパソコンをUSBケーブルでつなぐとパソコンにUSBメモリドライブ として現れるのです。そのドライブにあらかじめダウンロードした .uf2 ファイルを ドラッグ&ドロップ してやれば、無事にプログラムが書き込まれるという具合ですね。
■ ARM のビルド環境を用意する
まだ無い方はインストールしておきましょう。こういう時、debian linux系のOSだとたいへん楽で
gcc-arm-none-eabi
libnewlib-arm-none-eabi
libstdc++-arm-none-eabi-newlib
make
このあたりのパッケージを一気に sudo apt-get install してあげましょう。Winの場合は…😅 たぶん cygwin か msys のインストールくらいから始めないとダメだった気がするので、面倒くさくて筆者はやった事が無いです(ぉぃ……まあ、ぐぐればザクザクと出てくると思います;;;
■ board.h の修正
ファームウェアのカスタマイズは「board.h」ファイルの修正によって行われます。これがどこにあるかと言うと…
先にダウンロードしたファームウェアのソース一式から、boards フォルダ をたどってゆくと、さまざまなボード名が書かれたフォルダがあるでしょう(既に筆者が pull request した「miniF4」用のフォルダーもあります)それらのボード名フォルダの下に board.h があります。
そして、ハードウェア仕様によると「f401c」フォルダ以下の board.h が標準 だから、そいつをコピーして自分用にカスタマイズしていってね!的な事が書いてある。
…どのあたりを変更すればいいのかについて、(いくらか)わかりやすいように筆者が書いた miniF4 フォルダの board.h から説明しますね。
#define OSC_FREQ 25
まずはこれ。オシレーターに挟んである発振器周波数ですね。
回路図を見てもわかるとおり、25MHzです。これが設定できていないとUSBはまるで動きません(笑)
4, 0x19, // PIN_BTN_A = PB09
5, 0x18, // PIN_BTN_B = PB08
13, 0x2d, // PIN_LED = PC13
47, 0x14, // PIN_BTN_LEFT = PB04
48, 0x16, // PIN_BTN_RIGHT = PB06
49, 0x15, // PIN_BTN_UP = PB05
50, 0x17, // PIN_BTN_DOWN = PB07
51, 0x0, // PIN_BTN_MENU = PA00
このあたりはコメントを見ればわかりますね…。そうです!ボタン割当 (とLEDの定義)です。なお、それぞれで定義している数値については、以下のリンクを見ればだいたいわかると思います!
32, 0x5, // PIN_DISPLAY_SCK = PA05
33, 0x6, // PIN_DISPLAY_MISO = PA06
34, 0x7, // PIN_DISPLAY_MOSI = PA07
35, 0x4, // PIN_DISPLAY_CS = PA04
36, 0x3, // PIN_DISPLAY_DC = PA03
//////////////// For ST7735(160x128)
37, 0xa0, // DISPLAY_WIDTH = 160
38, 0x80, // DISPLAY_HEIGHT = 128
39, 0x020180, // DISPLAY_CFG0 = 0x80 ST7735(160x128 GreenTAB)
40, 0x603, // DISPLAY_CFG1 = 0x603
41, 0x16, // DISPLAY_CFG2 = 0x16
/////////////// For ILI9341(320x240)
// 37, 320, // DISPLAY_WIDTH = 320
// 38, 240, // DISPLAY_HEIGHT = 240
// 39, 0x08, // DISPLAY_CFG0 = 0x08
// 40, 0x0010ff, // DISPLAY_CFG1 = 0x10ff
// 41, 50, // DISPLAY_CFG2 = 0x50
// 78, 9341, // DISPLAY_TYPE = ILI9341
///////////////////////////////////
43, 0x1, // PIN_DISPLAY_RST = PA01
44, 0x2, // PIN_DISPLAY_BL = PA02
そして、↑はディスプレイ周りの定義です。信号線割当やら、サイズなどなどですね。ILI9341(320x240) 用の定義もあるので、必要に応じてコメントを外したり付けたりで調整してくださいヽ(´ー`)ノ
60, 0x1d, // PIN_JACK_TX = PB13
64, 0x1c, // PIN_JACK_PWREN = PB12
65, 0x8, // PIN_JACK_SND = PA08
ハード仕様には 「JACDAC が無いなら、_JACK_ 関係の定義はしなくてもいいよ!」的なことが書いてあるのですが、PIN_JACK_SND(ブザーと接続するピン)を定義しないと音を出すタイミングで死にます…(筆者はこの仕組みがわからず、意味不明のフリーズに見舞われる…という事態に2〜3日間ほどハマりました ^_^;)
【追記】
ボタンではなくて、ジョイスティックをくっつけたいな…と思ったら、下記の記事を参照してください。
■ ビルド
board.h の修正が終わったら適当なコマンド端末を開き、ソースの「Makefile」があるところのディレクトリまで行って、makeしましょう。
make BOARD=ボードフォルダの名前(miniF4など)
ワシャワシャとコンソール上にWarningだの出ると思いますが、いつものことで大丈夫(なはず)。ビルド終了後にはbuild フォルダが作られて、その中に
・bootloader.bin
・flasher.uf2
が出来上がっているでしょう。めでたし(゚∀゚)!
ビルドするのめんどっちいし…という方に
上記のような筆者の「俺得」的なマイコンボードとピンレイアウトでもいいよ。という方のためにビルド済バイナリも用意しておきました…。需要があるかどうかは…知らない(^^;
ファームウェアの書込み
最近のSTM32は CubeProg という、ものすごく ユーザー甘やかしツール があって、ファームの書込みはとっても楽です。
上記リンクから適当にインストールしておきましょう。(Linuxではインストールに成功しても起動しないことがあります。その対策は後日別記事で紹介したいと思います。)
書込みの手順は以下のとおり。GUIなので、適当にやってもなんとかなります(無責任)
(1)マイコンボードとPCをUSBケーブル(できれば短いので)でつなぐ。
※Windows10だと標準ドライバがあたると思います。
※筆者の場合、USBドライバを認識してくれないことがありました…(Winだと不明なデバイスという表示が出る)。いろいろ試行錯誤してみたところ、USBケーブルを短いのにしたら、あっさり認識してくれたり。
(2)マイコンボードの BOOT0ボタンを押しながら、RESETボタンをクリック(オン→オフ)する。見た目ではよくわかりませんが、ファーム書込モード(DFUモードと言います)になってくれるでしょう。
(3)Cubeprog を起動して、右側のタブから「USB」を選んでConnect ボタンをクリック
(4)書込み画面に入って、Browse から「bootloader.bin」を選択して書き込もう。
次の記事は…
このように書いてあると大変そうですけど、実際に手を動かしてやってみると意外にあっさりとうまく行くものです。
無事にファームウェアの書込みが終わると、パソコン上にUSBメモリドライブが現れます!!やったね!
いよいよ次回は 組み立て 編です!
アイキャッチの画像
インストールいらずの MakeCode Arcade は android タブレット + Chrome といった組み合わせでも、プログラミングできたりします!
…自分はまだゲーム作っていない(ぉぃ
この記事が気に入ったらサポートをしてみませんか?