2016年08月18日

Arduboyでブロック崩し

arduboy07.jpg
Arduboyのプログラムは基本的にはArduinoと同じです。
Arduboyのハードウェアにあわせたライブラリが提供されていますので、それを使います。
Arduboyに依存した処理はArduboyクラスで定義されています。

ライブラリの解説は正式なものはまだ内容ですが、Arduino用TFTライブラリなどを使ったことがあれば、それほど難しくはありません。
ヘッダファイルを見ればなんとなく使い方は分かります。

グラフィックス関連のヘッダファイルはこちら。

Arduboy/Arduboy.h at master ・ Arduboy/Arduboy

サウンド関連のヘッダファイルはこちらです。

Arduboy/audio.h at master ・ Arduboy/Arduboy

とりあえず何か作ってみようということで、まずは以前作ったブロック崩しを移植してみました。
ゲームの基本的な処理は変わっていませんが、ゲームとして完結するよう、ミス5回でゲームオーバーとし、スコア表示も追加しています。
また、隠しコマンドとしてゲーム開始時(AまたはBボタン)に左ボタンを押しているとデモモード、右ボタンを押していると高速モードになるようにしています。

Arduboyでの基本的なプログラムは以下のようになります。
#include "Arduboy.h"

Arduboy arduboy;

void setup() {
arduboy.begin();
arduboy.setFrameRate(30);
}

void loop() {
if (!(arduboy.nextFrame()))
return;

// いろいろな処理や描画命令など

arduboy.display();
}



Arduboyでは、描画命令は画面に対してではなく仮想スクリーンに対して行い、仮想スクリーンの内容を
 arduboy.display();
で一気にOLEDに転送しているようです。

それは結構重い処理なのではないかと思ったのですが、考えてみると白黒で128×64ピクセルしかないので、1024バイトの転送で済みます。毎秒60回処理しても60KBの転送量ですから、まあなんとかなりそうです。
カラーLCDだと1ピクセルで2バイトのデータですので、ピクセルあたり1/16のデータ量しかありません。

ただ、少ないArduinoのRAMの半分を仮想スクリーンに使ってしまいますので、メモリの使い方には注意が必要かもしれません。


移植するブロック崩しは、内部的には30×40ピクセルのマップ内で処理を行っており、使用するLCDの解像度に合わせて描画時に拡大することを想定しています。
今回は、Arduboyのスクリーンを90度回転し、マップを縦横2倍に拡大することにしました。
また、スクリーンの縦横比が1:2と大きいので、内部のマップを30×50ピクセルに引き伸ばしました。

128×64ドットのスクリーンの内側の100×60ドットをゲーム画面に使い、残りを枠やスコアなどの表示に使います。

Arduboy特有の命令で今回使ったのは、以下のものです。

・入力関係
arduboy.pressed(A_BUTTON) // ボタンが押されていればtrue
arduboy.notPressed(A_BUTTON) // ボタンが押されていなければtrue
// 他のボタンは、B_BUTTON、UP_BUTTON、DOWN_BUTTON、LEFT_BUTTON、RIGHT_BUTTON


・描画関係
arduboy.clear() // 全消去
arduboy.drawRect(x, y, w, h, color) // 矩形を描画
arduboy.fillRect(x, y, w, h, color) // 塗りつぶした矩形を描画
arduboy.fillCircle(x, y, r, color) // 塗りつぶした円を描画


・音関係
arduboy.tunes.tone(frequency, duration) // frequencyはHz、durationはmsec


このほか、テキスト表示を90度回転させるために、Arduboy.cppの中で定義されているdrawChar()を改変して使っています。

最後に、今回作ったスケッチと動作の様子のビデオを載せておきます。
posted by boochow at 13:08| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする

2016年08月17日

ゲーム機型Arduino「Arduboy」を動かしてみた

arduboy01.jpg

Maker Fair Tokyo 2016の会場で入手した「Arduboy」を動かしてみました。

これはArduino Leonardo相当のCPUと180mAhのバッテリ、SSD1306 OLEDディスプレイ、圧電ブザー、操作ボタンを組み合わせて携帯ゲーム機にしたものです。
会場での販売価格は5,000円ポッキリでした。
パーツを個別に買ってもそれほど安くはなりませんし、筐体の作りが割合良かったので購入してしまいました。

見かけはゲーム機風ですが、立派にArduino互換機です。
USBコネクタが内蔵されていますのでケーブルをつなぐだけでセットアップ完了です。
もちろん普通にArduino IDEでプログラムを書いて動作させることができます。

arduboy0.jpg


開発環境のセットアップなどは下記のページが詳しいです。

【Kickstarter】Arduboyレビュー、インストール手順、面白いゲーム紹介など - t-miyajima blog

ただ、一点注意が必要なのは、「Arduino 1.6.10では動きません」。
コンパイル中に
-fno-fat-lto-objects are supported only with linker plugin.

というエラーが出て止まってしまいます。
(8/19追記:Arduino 1.6.11がリリースされました。1.6.11では問題なく動作します。)

これはArduinoとArduboy用ライブラリの不整合が原因だそうで、Arduino 1.6.9なら問題ありません。

Cannot Compile or Upload an Example Game: cc1.exe: error [SOLVED] - Arduboy / Issues - Community

とりあえず、付属のサンプルなどゲームをいくつか動かしてみました。

■Hello, World!
OLEDに表示させるサンプルです。コードはこちら
arduboy02.jpg


■ブロック崩し
ボタン操作のブロック崩しです。コードはこちら
arduboy03.jpg


GLOVE
よくできていると評判のゲームです。「Gauntlet」みたいなゲーム、といえば伝わるでしょうか。
コンパイル時のメッセージが
最大28,672バイトのフラッシュメモリのうち、スケッチが28,612バイト(99%)を使っています。
最大2,560バイトのRAMのうち、グローバル変数が1,682バイト(65%)を使っていて、ローカル変数で878バイト使うことができます。

ということですので、詰め込めるだけ詰め込んでいるようですね。
arduboy04.jpg


伊for Arduboy
横スクロールシューティングです。結構たくさんのオブジェクトを画面で動かせるものですね。
arduboy05.jpg


コミュニティサイトを見ると、現在27本のゲームがWikiに登録されているようです。
他に、ゲームではないデモもいろいろあり、ドラクエ風のRPGのデモもありました。

Arduventure

[WIP] Arduventure (RPG) - Arduboy / Development - Community

arduboy06.jpg


いろいろな作品の紹介が下記の記事にあります。

11 Arduboy Games worth Playing - Retro Gaming Magazine | Retro Gaming Magazine

ラベル:Arduboy
posted by boochow at 15:50| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする

mbedの使いどころはIoT+TLS?

昨日ためしに動かしてみたmbedですが、ArduinoやESP8266と比べてどう使うのがいいのか、まだつかめていません。
mbedのハードウェアはクロックが100MHzクラス、RAMが数十KBと、Arduinoよりも1桁上のレンジですが、Raspberry Piよりも1桁下のレンジです。
mbedならできそうだけどArduinoだと難しい処理、というと、やはりネットワーク系でしょうか。

LPC1768CPU.jpg


Ethernetパケットは1.5KBありますから、Arduinoで扱うのはやや無理があります。
ESP8266は何とかTCP/IPが動作しますが、現時点ではSSL/TLSは古いTLS1.1までしかサポートされていません

AmazonのAWS IoTはTLS1.2を必須としています。
製品寿命がPCよりも長いと予想されるIoTですから、現時点で既に過去のものになっている規格は推奨できないのも頷けます。

Security and Identity for AWS IoT - AWS IoT

その点、mbedOSではARMが買収した「PolarSSL」がmbed用に提供されており、これはTLS1.2をサポートしています

SSL Library mbed TLS / PolarSSL: Download for free or buy a commercial license

つまりセキュリティをちゃんと考えた組み込みシステムのためのプラットホームを選定するなら、mbedは一応HTTPSが安全に使えるらしいので有力候補になりそう、ということです。
(他の候補の筆頭はLinuxになるでしょう。その場合は電力供給が課題になりますが・・・)


ただ、mbedOSのSSLのサンプルを見ると、サポートしているボードは現時点「FRDM-K64F」だけのようです。
mbedOSのページにある例題をLPC1768で試してみたところ、「authcrypt」は動いたものの「benchmark」は動きませんでした。
ですので、mbedならmbed-TLSが必ず使える、というわけではなさそうです。

mbed-os-example-tls/README.md at master ・ ARMmbed/mbed-os-example-tls ・ GitHub

結局、趣味でIoTというかネット接続機能があるデバイスを作ろうとすると、セキュリティを考慮するならTLSが必要なのでmbedかRaspberry Pi、そこまでセキュリティは重視しないというのであればお手軽にESP8266、となりそうです。
IntelもGalileoとかEdisonとか出していますが、Galileoは生産終了だしEdisonはちょっと価格がこなれてこないですね。

AppleやGoogleがHTTPSのデフォルト化を強力に推進していますので、世の中はなんとなくそちらへ向かいつつあります。しかし、安かろう悪かろうが勝つ場合もあるのがこの世界ですので、まだまだ予断を許しません。
posted by boochow at 00:33| Comment(0) | NXP | このブログの読者になる | 更新情報をチェックする

2016年08月15日

今さらながらmbedを動かしてみた

先日、Maker Faire Tokyo 2016を見に行ってきました。
とても楽しかったのですが、ふと昨年のMFTで購入したmbed用ボードをまだ動かしていなかったことを思い出しました。
当時はArduinoで遊んでいましたので、それが済んだらmbedも試してみようと思っていたのですが、実際にはESP8266のほうへ行ってしまいました。

そんなわけで1年ほったらかしにしていたボードですが、最近はmbedOSの話題も気になってはいますので、今さらながら動かしてみました。
lpc1768.jpg


mbedでの開発の特徴は、

・開発環境をPCにインストールしなくても良い(オンラインコンパイラ)
・ボードがUSBストレージになっており、プログラムの書き込みはオブジェクトをストレージにコピーするだけ
(コピーした後にリセットボタンを押せば、ストレージの最新のオブジェクトがマイコンに書き込まれる)

というあたりです。

まずは下記の記事を見ながら、mbedのサイトに登録してLチカを動作させました。
mbed-dev.png

ユーザ登録から始めても、せいぜい15分くらいでLチカ完了です。
これはお手軽でいいですね。

IoTをかじってみよう(1) 〜mbedの概要とオンラインIDEの使い方 (1/3):CodeZine(コードジン)

この連載は面白そうなのですが、とりあえずはもっと手軽な例題を、ということでオンラインコンパイラでいくつか試してみました。

まずは話題の?mbed OSを使用してのLチカを、下記の記事を参考に動作確認。

mbed OS 5でLEDを光らせてみる | スイッチサイエンス マガジン

そういえばこのLPC1768ボードは、MFT2015でスイッチサイエンスさんのブースで買ったのでした。

ボード単体ではLEDくらいしか入出力が付いていないので、大したことはできません。
Arduinoでおなじみのシリアルポートでの通信はどうなっているのだろう、と調べてみたところ、ちゃんとWindows用のドライバが用意されていることが分かりました。

こちらの記事を参考に、

mbed(4) USBポートでシリアル通信 | wsnakのブログ

こちらからドライバをダウンロードしてインストールします。

Windows serial configuration - Handbook | mbed

インストールすると、自動でLPC1768が認識され、USBシリアルポートがインストールされました。
ポートはCOM3になっています。

mbed-serial.png


通信ソフトは、今回は「PuTTY」を使ってみました。

Download PuTTY - a free SSH and telnet client for Windows

シリアルポートでの通信もサポートされています。シリアルポートで使うには、セッション開始画面で「Connection Type」に「Serial」を指定し、「Serial」の設定画面で使用するCOMポート(私の場合は先ほどの通りCOM3です)を指定します。

putty1.png
putty2.png


シリアルポートとの通信は、マニュアルがこちらにあります。

Serial - Handbook | mbed

次に、下記の記事にあった、アナログ入力の読み取りとファイルへの出力を試してみました。

おまけ (mbedを始めましょう!("Let's get started!" in Japnaese)) | mbed

pin20から値を100回取得し、CSVファイルに吐き出すというものです。
USBストレージがボードと一体化しているので、記録したファイルをそのままPCから読み取れるのは便利です。
ちなみにLPC1768のピン配列は下記のページなどに掲載されています。
pin20は、上の写真で言えば左上の角の位置になります。

mbed LPC1768 - スイッチサイエンス
mbed LPC1768 | mbed

pin20を触ったり離したりしてデータを取り、グラフ化してみました。

mbed_test.png



mbedですが、初日の感想としては、なかなかお手軽で教育用などに良さそうです。

オンラインコンパイラを使う場合は、個々人の環境依存性がほとんどないので、一度に多人数を教える場合のトラブルは少ないのではないでしょうか。
mbed対応のボードはたくさんありますが、使用しているボードにあわせた設定をオンラインコンパイラ側でやってくれるので、少なくとも最初の一歩のところでは敷居が低いと思います。
ネット上の既存のプロジェクトをそのままインポートして使える点も、教育用には良さそうです。

mbed OSはまだ今回はLチカを試してみただけですので、実際のところどの程度使えるものなのか、もうちょっと調べてみようと思います。
posted by boochow at 18:16| Comment(0) | NXP | このブログの読者になる | 更新情報をチェックする
人気記事