Mira&Luna's nursery lab

旅乙女と発明娘の子供部屋

50円のコンピュータ "ATtiny13A" でちびゲーム機「Simon」を作る(後編)

Mira

ArduinoATtiny13Aを使ったミニゲームサイモンゲーム(Simon Game)」を作ろう(∂_∂🎀/

後編)「プログラムの書き込み実装
f:id:miraluna:20191219175451j:plain

これ ↑ が完成した「ATtiny13 Simon」のゲーム機です。

真ん中にある四葉のシールが貼られたICが「50円コンピュータ」の瞳子こと「ATtiny13」よ(2021.6月現在 85円になちゃた)。プログラム容量は1KByte。この子にLEDやブザーを制御させて、ゲーム機として動作させるというわけ。
前編で必要なパーツと配線図を紹介したので、今回はプログラムの書き込みと実装について紹介します。
◆ 前編へのリンク ↓
miraluna.hatenablog.com
◆ プレイ動画の記事 ↓
miraluna.hatenablog.com

プログラムの書き込み

このゲームのプログラムを作ったのはチェコのVojtakさん。私はプログラミング素人だから自分でゲームを作るのは壁が高すぎる。
Vojtakさんは「CC(クリエイティブコモンズ)」でこのプロジェクトを公開されています。利用条件は「表示」と「非営利」。プロジェクトの名前や作成者の情報を表示する必要があって、営利目的に利用してはいけないという条件。その条件を満たしている限りなら、自由に利用していいの。CCには様々な条件があるから、プロジェクトごとに確認が必要ね。
詳しくはCCのリンクを貼っておくので参考にしてください。
 CCジャパンへのリンク→「クリエイティブコモンズジャパン
 今回の条件→「Creative Commons — 表示 - 非営利 4.0 国際 — CC BY-NC 4.0

「表示」の条件を満たすために、Vojtakさんのプロジェクトのクレジットを以下に掲載し、リンクを置きます。
[Credit] Creator: Mr.Vojtak
    Community: Hackaday.io
    Project name: Simon Game with ATtiny13
    URL: https://hackaday.io/project/18952-simon-game-with-attiny13
リンク→「Vojtakさんのプロジェクトのページ」へ
  Thank you so much Mr.Vojtak :)

ATtiny13への書き込み

f:id:miraluna:20190421155321j:plain:w100 瞳子または瞳chen(ヒェン)ことATtiny13
1cm四方のこの小さなマイクロコンピュータATtiny13にプログラムを書き込むため、Arduinoを使います。
     Arduino f:id:miraluna:20191122170928j:plain:w200
でも買ってきてそのまますぐに書き込みができるかというと、そうじゃないの。Arduinoのスケッチ(プログラム)を書くArduino IDE(開発環境)にATtiny13を加えたり(ボードのインストール)、書き込み用の配線をしたりする必要がある。その方法は別の記事にまとめてあるので、初めての方はそちらをまずご覧ください。
 そちら ↓
miraluna.hatenablog.com

プログラムをダウンロード

ATtiny13にプログラムを書き込める環境が整ったら、Vojtakさんのページからプログラムをダウンロードします。
ページを下へスクロールすると「Files」という項目があって、いくつかのファイルが並んでいます。それぞれのファイルの右側にダウンロードボタンがあるから、それを押すだけ。
「Simon_attiny13.ino」がArduinoのファイル。
「Simon_attiny13.hex」がHEXファイル。(私にはよくわかりません)
「Simon_attiny_en.zip」には英語版(en)の回路図や配置図などのデータが入っていました。
INOファイルをArduinoで実行するには同名のフォルダに入っている必要があるので、ダウンロードすると「フォルダを作りますか?」と聞かれると思う。フォルダが作られなくてうまくいかない場合は、同名のフォルダを作成してその中にファイルを入れてみましょう。

エラー...p_q... プログラムが大きすぎて入らない

ダウンロードできたらあとはArduino IDEを開いてスケッチを瞳chenに書き込むだけ。書き込み方は「ATtiny13を使えるようにする」(←リンク)を参考にしてください。
でもここでエラーが出てしまったの。私の場合、ブートローダを焼くからかしら? なんとスケッチを書き込んだときの使用メモリが1040バイトになっちゃった。瞳子の容量は1024バイト。Vojtakさんはちゃんと収まるように作っているのに。
Vojtakさんのページのコメント欄を見てみると、他にも同じ状況の人が質問を寄せています。そのやりとりでは明確な解決方法は見つかっていないみたいで「Verのせいかも」「LFSR Ver.ならちょっと小さくなる」「HEXファイルを直接書き込んでみたら」というような答えが書かれていました。たぶん、最後のHEXファイルを直接書く、というのができたらうまくいくんじゃないかと思うんだけど、私にはその技術と知識がない。
そこで(∂. ∂🎀/
私にできる方法として、プログラムの一部をカットすることにしました。

プログラムの手直し

このサイモンゲームの遊び方は、リセットスイッチを押すと自動的にゲームがスタートして、失敗すると自動的に止まる。だから基本的には光った色を追って順番にボタンを押していくだけなの。
でもこのゲームにはオプション的な機能が備わっている。ATtiny13にはEEPROMといって電源を落としても消えないバックアップ機能があるんだけど、このゲームは自動的にハイスコアをこのEEPROMに記録してくれるの。その記録を使ってスタート時にハイスコアの続きからスタートすることもできるのよ。
スタートの方法
「リセットボタンのみ」通常のスタート。
オレンジ+リセット」ハイスコアをハイスコアのレベルからスタート。
+リセットボタン」ハイスコアを初めのレベルからスタート。
+リセットボタン」ハイスコアのデータを消去してスタート。
+リセットボタン」最高レベル(Lv255)のデモンストレーション(無限ループ)。
(ちょっと違うかもしれませんが......。)
このオプション的な機能は削ってしまってもゲームの動作に支障はないので、このうちの1つを削ることでプログラムを1024バイト以内に収めちゃおうっていうわけ。
今回私は黄色いボタンの機能を削りました。
削るのはスケッチのこの部分。

switch (PINB & 0b00011101) {
case 0b00010101: // red button is pressed during reset
eeprom_write_byte((uint8_t*) 0, 255); // reset best score
maxLvl = 0;
break;

case 0b00001101: // green button is pressed during reset
lvl = 255; // play random tones in an infinite loop
break;

case 0b00011001: // orange button is pressed during reset
lvl = maxLvl; // start from max level and load seed from eeprom (no break here)

case 0b00011100: // yellow button is pressed during reset
seed = (((uint16_t) eeprom_read_byte((uint8_t*) 1)) << 8) | eeprom_read_byte((uint8_t*) 2); // load seed from eeprom but start from first level
break;

}

赤、緑、オレンジ、黄に色分けした部分を削れば、その色の機能だけが失われる。そしてひとつでも機能を削れば、プログラムはAtiny13に収まる大きさまで小さくできます。
私はこのうちの黄色い部分、一番下の4行を削りました。
追記:)やっぱりそのあと緑の部分だけ削ったものを実装しました。

すると1040バイトだったプログラム容量が998バイトまで減りました 。(∂. <🎀y
これでATtiny13に書き込むことができます。

実装

プログラムを書き込んでブレッドボードで試運転(前編でやりました)をしたら、いよいよ実機として実装していきます。
はんだごての用意はいいかしら?
Let's solder(はんだ) time
配線図                オススメ<ポリウレタン銅線>
f:id:miraluna:20191220182435j:plain:w290 f:id:miraluna:20191220171852j:plain:w180

◆ 上から見たところ
f:id:miraluna:20191219175451j:plain
4つのボタンと4つのLED。それとリセット用にもう一つのボタン。
緑のタクトスイッチがなかったから青で代用。
赤のLEDがなかったから桃紫で代用。

◆ 横から見たところ
f:id:miraluna:20191219175426j:plain
ブザーとコンデンサと電池ボックスを下の基板に、その他は上の基板に設置しました。
ピンソケットを「接合パーツ」兼「スペーサ」兼「導線」としたところが、今回の私のグッドアイディアポイントだと思うの。どうかしら?

◆ 裏面
f:id:miraluna:20191219175442j:plain
シンプルイズベストね。
ピンソケット裏がチクチクするので、そのうちレジンか何かでカバーしたいと思っています。

◆ 中を開けると
f:id:miraluna:20191223183707j:plain
上下の基板をピンヘッダとピンソケットで合わせることで通電するようにしてあります。+電源用とグラウンド用とブザー用の接続箇所があって、他は固定するためのピン。
今回はいつも描いている私流の設計図「ます目地図」を描かずに、どんどんはんだ付けしてみたの。パーツがなければ代用を使ったりして。だから精巧な出来栄えとは言い難いわね。電池ボックスなんか+とーを間違えて付けちゃったんだもん。でも無事に動作しました。なんとかなっちゃうもんね。ケ・セラ・セラよ。


完成(∂。<🎀 y

f:id:miraluna:20191219175458j:plain

50円のコンピュータATtinyを使って作るサイモンゲーム。
作るのも面白いし、これで遊ぶのも面白いのよ。

はんだごてを手に、一緒に作ってみませんか?

作製・紹介はMiraでした。
f:id:miraluna:20191015184121j:plain:w200

🎀前編に戻る🎀  🎀部屋に戻る🎀  🎀動画を見る🎀