!Gamebuino概要
>> css
/*
div.wiki-body div{
line-height:150%;
}
*/
<<
!イントロ
ArduinoベースのGamebuinoというゲーム機がとてもすばらしかったので紹介します。
Gamebuinoは一言で言うと「自分で作れるレトロゲーム機」です。
SDカードにゲームデータを用意しておくことで、ゲームを次々に入れ替えながら遊ぶことが出来る素敵なおもちゃです。
本体は販売もされていますが、仕様が公開されているため、その気があれば自分で作ることも出来ます。
もちろんGamebuinoで動くゲームもArduinoIDEで簡単に作ることが出来ます。
!Arduinoざっくり紹介
Arduinoと比較してGamebuinoのすごいところ と思ったのですが、まずはArduinoの紹介です。
{{amz B0044X2E5S http://ecx.images-amazon.com/images/I/5127o7CglFL._SL160_.jpg http://www.amazon.co.jp/%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9-%E3%80%90%E6%B0%B8%E4%B9%85%E4%BF%9D%E8%A8%BC%E4%BB%98%E3%81%8D%E3%80%91Arduino-Uno/dp/B0044X2E5S%3FSubscriptionId%3D0XWJJHYBK2E3MDJAQ9G2%26tag%3Dinajob-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB0044X2E5S 【永久保証付き】Arduino Uno}}
ArduinoはAtmega328とFT232RLというICを接続して作られています。
また周辺回路としてACアダプタから5Vを作成する回路、そして共通したピンヘッダの(物理的な)インターフェースを持ちます。
そして、Arduinoブートローダーとライブラリが用意されています
もう少し噛み砕くと
- Atmega328
-- CPU本体です。このCPUは内部にフラッシュメモリを持っており、プログラムを書き込むことで、好きな動作をさせることが出来ます。
-- 他にもEEPROMという不揮発のメモリを搭載しています。
-- ROMとRAMの領域が別れており、ROMは32KB、RAMは2KBです
-- AVRという種類の命令セットを理解し、gcc-avrでC/C++をアセンブラにコンパイルできます。(Arduinoも内部でgcc-avrを利用している)
- FT232RL
-- USBをシリアルに変換するICです
-- Arduinoの種類によってこの役割のICが違うことがあります
- 5Vを作成(レギュレータ)
-- ACアダプタは5Vより大きなものであればなんでも接続できます。またUSBからの電源をさらに安定させて供給することもできます。
- 共通したピンヘッダ
-- Arduinoはシリーズを通して同じピン配置になっています。ここにどんどん拡張ボードをスタックしていくことで、機能を追加することが出来ます。拡張ボードのことをシールド(SHIELD)と言います
- Arduinoブートローダー
-- 通常Atmega328にプログラムを焼きこむためには、専用の書き込み器が必要です。しかしこのArduinoブートローダーを書き込んでおくことで、専用の書き込み器ではなくシリアル入力で書き込みを行うことが出来るようになります。
-- このブートローダーは起動時に少し待ち時間を設け、その間にシリアル接続に反応がある場合は書き込みモードに突入します。何もなければ普通にプログラムを実行します。
- Arduinoライブラリ
-- ライブラリ無しでのAVRの開発はすこし煩雑で、一般のC/C++プログラミング的に利用するにはラッパがあるのが望ましいです。そのためのライブラリがArduinoライブラリです。
-- このライブラリを利用することで、他のArduinoと名のつくボードでもほぼプログラムの変更無しでプログラムを移植することが出来ます。
{{amz B007MYZF9S http://ecx.images-amazon.com/images/I/516WpoGFZGL._SL160_.jpg http://www.amazon.co.jp/%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%EF%BC%88SainSmart%EF%BC%89-%E3%82%B7%E3%83%BC%E3%83%AB%E3%83%89-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-Arduino-MEGA2560-MEGA1280/dp/B007MYZF9S%3Fpsc%3D1%26SubscriptionId%3D0XWJJHYBK2E3MDJAQ9G2%26tag%3Dinajob-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB007MYZF9S サインスマート(SainSmart) 1602 LCD シールド モジュール ディスプレイ for Arduino UNO R3 MEGA2560 MEGA1280}}
{{amz B00IZ4BUCU http://ecx.images-amazon.com/images/I/51Z%2BhzDEWAL._SL160_.jpg http://www.amazon.co.jp/GAOHOU-A1010-Arduino-UNO-%E5%AD%A6%E7%BF%92%E5%90%91%E3%81%91%E5%A4%9A%E6%A9%9F%E8%83%BD%E6%8B%A1%E5%BC%B5%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%BC%E3%83%AB%E3%83%89%E3%82%AD%E3%83%83%E3%83%88/dp/B00IZ4BUCU%3FSubscriptionId%3D0XWJJHYBK2E3MDJAQ9G2%26tag%3Dinajob-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00IZ4BUCU Arduino UNO R3 学習向け多機能拡張ボード シールドキット}}
!!arduinoライブラリの機能
- シリアル通信(printfデバッグなどでよく使う)
- sin,conなど
- ピンの制御(書き込み、読み込み)
- EEPROMへの書き込み
- タイマー
!!! LEDをチカチカさせる例
>> code cpp
int led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
<<
!!! ボタン入力を受け取る例
>> code cpp
const int buttonPin = 2;
const int ledPin = 13;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
<<
!Gamebuinoざっくり紹介
Gamebuinoは上記Arduinoを利用して作られたゲーム機とその環境です。
Arduinoに加えて下記の機能が搭載されています
- ハードウェア
-- 48px*84pxのLCD(バックライト付き)
-- 十字ボタンとA,B,Cボタン
-- SDカードソケット
-- スピーカ
-- バッテリー
-- 通信対戦用のI2C端子
- ソフトウェア
-- ブートローダー
-- ゲーム開発用ライブラリ
-- 既に作られた楽しそうなゲーム
--- http://gamebuino.com/wiki/index.php?title=Games
ハードウェアはまぁ書いてあるとおりの機能です。ソフトウェアがすばらしくてですね、、
!!ブートローダー
Arduinoのブートローダーとほぼ同じなのですが
- シリアル経由の書き込み(これはArduinoと同じ)
- SDカード経由の書き込み
- Cボタンが押された状態で起動した場合にLOADER.HEXを書き込む
という機能があります。
これにより、PCが無くても違うプログラムに書き換えることが出来ます。
まるでゲーム機みたい!
!!ゲーム開発用ライブラリ
ゲームづくりにおいて大切なのは良いライブラリです。
ゲームが作りたいのに、円を書くアルゴリズムや直線をひくアルゴリズムの作成に時間を割かれたくありません。
GamebuinoにはよくできたSDKが提供されており、様々な機能が簡単に呼び出せる関数にまとめられています。
一例を以下に列挙
- 名前入力などに使える文字入力(keyboard)
- ちょっとした情報をユーザに伝えるpopup(アニメーション付きで表示されます)
- ちょっとした当たり判定(physics)
- ボタン周りの処理(キーリピートなど)
- 8bitサウンドのソフトウェア音源とトラックの管理
- 各種図形の描画ルーチン
- 数種類の大きさのアルファベットのフォント
とてもすばらしい
!Gamebuinoつくってみた
>> mermaid
graph LR
Atmega328 --- LCD
Atmega328 --- SDCard
Atmega328 --- Speaker
Atmega328 --- Button0,1,2,3,A,B,C
Atmega328 --- レギュレーター
レギュレーター --- 乾電池
FT232RL -.- Atmega328
PC-- USB -->FT232RL
<<
さてさて こういう構成で作れば良いのか
お値段はざっとこんな感じ
|LCD|500円 有機ELなら倍くらい
|FT232RL|秋月のモジュールが1000円くらい(これは使いまわせるので1つあればOK)
|Atmega328|250円
|Speaker|100円(なにかしらのおもちゃから取り出してもOK)
|ボタン|10個で100円くらい(良いボタンは1個100円くらいする)
|レギュレーター|1個30円くらい、周辺にコンデンサが必要、これは1個10円もしない
|基板|150円
|SDカードスロット|250円
|その他|もろもろ
2500円くらいかな
もし2個めを作るならFT232RLは共用できるので1500円くらいです
!!FT232RL
FT232RLからはシリアルの通信線でAtmega328と接続します。
TX,RXという送りの線と受信の線です。それと書き込み時にリセットを書けるための線を接続します。
シリアル接続は予め転送レートを決めておいて、そのクロックでデータを送り合う方式です。
!!Button
ボタンは全部で7つあります。
それぞれをAtmega328と接続します。
プルアップはAtmega328の内部で行うので不要です。
!!LCD
LCDとAtmega328はSPIというインターフェースで接続します。
- CS(chip select)
- MOSI(master out, serial in)
- MISO(moster in, serial out)
- SCK(serial clock)
!!!SPI
SPIはMasterとSlaveという役割を割り振ります。MasterはAtmega328などのCPUで、Slaveは液晶などの周辺機器であることが多いです。
MasterがSCKからクロック信号(HIGH,LOWを切り替え続ける)を送り、そのクロックに合わせてMOSIを通してMasterからSlaveに、MISOを通してSlaveからMasterにデータを送ります。
また複数のSlaveを接続する際にピンを消費しないように、MOSI,MISO,SCKのピンは他のSlaveと共有することが出来ます。CSがHIGHのものだけがその信号をやり取り出来るようになっています。
>> mermaid
graph LR
subgraph master
CS1[CS]
MOSI1[MOSI]
MISO1[MISO]
SCK1[SCK]
end
subgraph slave
CS2[CS]
MOSI2[MOSI]
MISO2[MISO]
SCK2[SCK]
end
CS1 --> CS2
MOSI1 --> MOSI2
MISO1 ---|<--| MISO2
SCK1 --> SCK2
<<
!!Speaker
スピーカーはトランジスタを介して接続します。
たぶん今回の場合は小さいスピーカなので無くても大丈夫だと思います。
!!SDCard
SDカードとはSPIで接続します。
これはLCDと線を共有します。
ただしCSだけは違う配線で接続します。SPIはCSを使ってどの接続が有効かどうかを切り替えるのです。
- CS(chip select)
- MOSI(master out, serial in)
- MISO(moster in, serial out)
- SCK(serial clock)
!!レギュレーター
今回使うLCDやSDカードは3.3Vで動作します。
そのためには乾電池3本から得られる4.5Vを3.3Vにレギュレーターで降圧する必要があります。
普通のArduinoは5Vで動作しますが、Gamebuinoは3.3Vで動作します。
!!組み上げる
Gamebuinoのサイトを参考に結線します。
本当はブレッドボードにまず組んで、動作を確認してからユニバーサル基板を使うのが良いです。
{{amz B00DSKCS68 http://ecx.images-amazon.com/images/I/51QGfTVwbBL._SL160_.jpg http://www.amazon.co.jp/%E3%82%B5%E3%83%B3%E3%83%8F%E3%83%A4%E3%83%88-SAD-101-%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%89%E3%83%9C%E3%83%BC%E3%83%89/dp/B00DSKCS68%3FSubscriptionId%3D0XWJJHYBK2E3MDJAQ9G2%26tag%3Dinajob-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00DSKCS68 サンハヤト SAD-101 ニューブレッドボード}}
{{amz B00J7LDJ38 http://ecx.images-amazon.com/images/I/51HgTEVRKLL._SL160_.jpg http://www.amazon.co.jp/%E3%82%B5%E3%83%B3%E3%83%8F%E3%83%A4%E3%83%88-ICB-288-%E5%B0%8F%E5%9E%8B%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E5%9F%BA%E6%9D%BF/dp/B00J7LDJ38%3FSubscriptionId%3D0XWJJHYBK2E3MDJAQ9G2%26tag%3Dinajob-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00J7LDJ38 サンハヤト 小型ユニバーサル基板 ICB-288}}
!!ブートローダーの書き込み
ブートローダーの書き込みは少し面倒くさいです。
専用の書き込み器を使うか、既に作られてあるArduinoを利用するか、FT232RLを使う方法がありますが、どれも煩雑です。
ココに良い資料があるのでこの方法を使いました。
http://make.kosakalab.com/arduino/bootloader/
!!エンクロージャー
とりあえず配線の裏側を守るために木の板を用意してネジとナットで基板に固定します。
!!遊ぼう!
SDカードにHEXファイルを入れておくことで、複数のゲームを切り替えて遊ぶことが出来ます。ただしSDカードはSDHCではなく「SD」カードである必要があります。
これは2G以下のSDカードのことです。
今やあまり売っていないですが、なんとか調達しましょう。
http://gamebuino.com/wiki/index.php?title=Games
ゲームはここにたくさんあるので、ダウンロードしましょう。
液晶がGamebuinoとは別の場合は、液晶の命令セットが異なるためゲームを再度ビルドする必要があります。
!まとめ
Gamebuinoは良いので、自分で作るか買ってみてください!
5643382
wiki
1458222251