デジタルデトックスって何ぞ!?

こんばんは、Reveの技術担当です。
昨日は風邪で休んでいました(が、今日も治ってません汗)。

そういえば、普段パソコンを(仕事でも趣味でも)使っている身としては
とても気になる用語を見つけたので、なんとなく記事にします。

デジタルデトックスとは、スマートフォンやパソコン、インターネットなどのIT機器・技術への依存症を防ぐ目的で、それらデジタル機器から意図的に離れて過度な依存から脱する試み(出展:コトバンク 知恵蔵mini)だそうです。
アメリカが発祥のようですが、ネットで調べてもいろいろな記事が書かれているあたり、多くの人に注目されていると言えそうです。

効果についての医学的な見地などについてはまだ調べられていませんが、
SNSでの人間関係に対する精神的な疲れや、集中力の低下、眼精疲労、さらには腱鞘炎といった肉体的なダメージを防ぐ効果が期待できるとのことです。
確かに、PCやスマホが原因なら、PCなんぞ使わず休むのが一番ですもんねw

テンダーJさんのこちらの記事には難易度別に4つの手法が紹介されています。
やはり究極の方法は「電波の届かない」場所にいって自ら電波を絶つことだそうで。スマホが手放せない人は是非、電波の届かない秘境にレッツゴーですね。
最近ではデジタルデトックスのための旅行プランまであるそうです!

PCの作業で疲れているのもあり、なんか2泊3日ぐらいで山籠もりしたい気持ちになってきました。
というか、風邪ひいているならこんな記事書いてないで休めよ、と言われる気もしますがw

なんか、デジタルデトックスもいいかもしれないと思う今日この頃でした。

ハノイご飯(インスタント)

良い夢を見ていますか?私は最近、階段を駆け上る夢を見ます。しかし、数年に一度、階段(現実の)から落ちます…こんにちは。
先日、ハノイの日本料理店’きよみず’の階段から滑って落ちて脚が青アザだらけです(笑) 小さな頃は学校の階段から落ちて、山では崖から落ちそうになって、溝にも落ちて、制服のままプールにも落ちて、受験も落ちて落ちて落ちて、就活スーツで銀座駅の階段から落ちて、就活も落ちまくって、下宿先の階段から落ちて、ハノイでも階段から落ちて…色んな意味でとにかくよく落ちておりますが、夢は貫きたい夢担当です♪

ハノイに来て、食の安全をとても考えさせられ、野菜は買っていいのか悩んでいます。あー野菜を食べたい、お料理したい!でも買えない・・・というジレンマでインスタントに走りました・・・少ないように見えて、実はすごく量が増えるフォーシリーズです。種類によって異なりますが、1つ約50円くらいです。
20150614234527193.jpg
20150614234517763.jpg

こちらは、1袋2700VND(約10円)の袋麺です。安さのあまり大量に買ってしまいました…が、あっさりしていて結構、美味しいです。トッピングが何もなく、ちょっと寂しいいので要工夫。
20150614234543072.jpg

こちらは、おふざけでつい購入してしまいました。ドラえもんとドナルドと謎のキャラクターの夢の競演…何か違う(笑) 何かが違うドラえもんをよく見かけます。
20150615184635439.jpg
20150615184648308.jpg

ちなみに、上記のお買い物はハノイのVincom Center内にあるVin Martで購入しました。こちらのスーパーはお店に入る前にロッカーに貴重品以外の荷物を全て預けなければ入れません。もちろん、無料で鍵もかかります。帰る時は、レシートを警備員さんに見せてスタンプをもらいます。Vin Martの他にUni Martやロッテマートがお勧めだと聞いたので、行ってみたいと思います。

自作のコントローラーでゲームをプレイしてみよう (9)

皆さんこんにちは、Reveです。
今日も自作ゲームコントローラーの記事を書いていきます。
表を作ろうとしたら固まったので、また一から書き直しました汗

一連の自作ゲームコントローラー特集ですが、今回は少し趣向を変えてソフトウェアからコントローラーの設定を変更できるシステムを制作していきたいと思います。今までは簡単な回路とプログラムのみを作りましたが、今回は少し複雑なプログラムを使います。

(仕組みの解説)
今までずっと、Arduino Microを使用してきましたが、このArduinoシリアル通信が使用できます。さらに、USBエミュレータと同時並行で使用できるため、シリアル通信で設定を変更しながらUSBコントローラーとして使うことができるのです。
Controller_Setting_Schema.jpg
そのため今回は、Arduinoのプログラムとは別に、コントローラー設定アプリケーションを用意します。
当方の場合は、C#でシリアル通信によりArduinoへデータを送信するプログラムをこちらで作成しました(ダウンロードも可能ですが、いかなる損傷・誤動作が発生した場合も当方は責任を負いませんので、ご了承ください)。

(シリアル通信とは)
シリアル通信という用語は本来、情報を1ビットずつ送受信する通信方式を表し、その中に様々な規格があります。
Arduino-PC間で最もよく使用されるのはRS 232Cという規格で、これをシリアル通信と呼ぶことも多々あります。

RS 232Cは、1969年にコンピューターとモデム間の通信規格として策定された、歴史ある通信用インタ-フェース(レガシーインターフェース)です。モデムだけなく、コンピューター同士や他の周辺機器との接続にも広く使用されてきましたが、現在ではその役割をUSBに譲っています。

最近のPCでは搭載されていないことも多いのですが、Arduinoなどマイコンと接続する場合であれば、USBとシリアル通信を変換する機器(USB-シリアル変換ケーブルなど)を使用することがほとんどです。ですが、Arduinoの中にはUSB-シリアル変換機能が搭載されたものもあり、Arduino Microもその一つであるため、追加で購入する必要はありません

RS 232Cのコネクタには、D-Sub9ピンとD-Sub25ピンの2種類がありますが、Arduinoとの通信ではD-Sub9ピンの方を使います。端子9本の中には通信制御のものも含まれており、通信を行うだけなら以下の3本をつなげば実現できます。
ArduinoRS 232C
0(RX)3(TxD)
1(TX)2(RxD)
GND5(GND)
 
なお、(最新の)RS 232Cの正式な規定は仕様が少し異なり、名称も変わりますが、従来の規定を使用するものが多いです(名称もRS 232C準拠のまま)。

(回路の構成)
回路の構成は基本的にボタンとジョイスティックを使うものとなっています。
ボタン用のピンはArduinoの2~13とA3、A4の14ピン(アナログ入力ピンでデジタル入力も可能です)、ジョイスティック用のピンはA0、A1、A2(マウス左ボタン用)の3ピンを割り当てています。

これを今までの記事(ボタンジョイスティック)と同様につなげば回路ができます。
ボタンは最大14個までですが、必要な数だけ実装すればOKです。

(写真がなくてごめんなさい。後日用意します)

(プログラム)
Arduinoプログラム、およびコントローラー設定変更用のアプリケーション(.exe)はここから「Controller_config_App」と「Controller_sample6」の2種類をそれぞれフォルダごとダウンロードしてください。

なお、コントローラー設定用のアプリケーション実行には、「.NET Frameworks 4.5」のインストールが必要です(それ以上のバージョンでも可)。

コントローラー設定用のアプリケーションについては、ソースの解説は省きます。
もしご要望があれば、ソース公開や解説も載せていきたいと思います(無くてもやるかもw)。

一方、Arduinoプログラムについては一部の解説をしたいと思います。
解説が前の記事と重なる部分もあるため、ソース全体についてはダウンロードしたファイルと前の記事をご参照ください。

今回新しく登場するのはシリアル通信に関する実装です。
まず、シリアル通信を開始するにはSerial.beginメソッドをsetup関数内に記述します。カッコ内の数値は通信速度(bps)で、特定の数値だけ与えられます(Arduinoの仕様を参照)。今回は9600にしました。

Serial.begin(9600);

続いて、シリアル通信処理を行う関数を実装します。
今回作るシステムにおいては、独自の通信仕様(プロトコル)を定めており、以下のルールに従って情報がまとめて送られます(上から送信順に並んでいる)。ちなみに、このひとまとまりのデータをパケットと呼びます。
Header(0xE5)ヘッダー (16進数の0xE5固定)
IDパケット種類を表す (1バイト)
Lengthデータの長さ(バイト数)を表す (0 ~ 255)
Dataコントローラー設定の情報
Check Sumチェックサム(データ誤送信があるかの確認用)

そして、現状ではパケットの種類として、以下の2種類を用意しています。
ID番号内容
11キー割り当て設定
13ジョイスティック感度設定

つまり、このプロトコルを基にPC側ではパケットを作成して送信し、それをArduino側で受け取ってパケット内容を解析しています。
そのため、Arduinoではパケットを受信して解析する関数が必要です。当方では、パケット構造を解析する関数と、データ内容(Data)の情報を解析する関数を分けて実装しました。

まず、パケット構造を解析する関数から見てみます。
データを受信している場合、Serial.readメソッドで読み取って変数inBufferに入れ、その中身がパケットのどの部分に当たるかを見て読み取った内容を解析します。
図にすると、大体こんな感じです。
ConfigAnalysis.jpg

実装した関数は下のようになります。

const int HEADER = 0xE5; //header

byte ptPckt = 0; //the order of the packet the method assets currently
byte errCode = 0; //error code
byte pcktID = 0; //packet ID
byte datLen = 0; //data length
byte datBuf[255]; //buffer of the packet data

void serialReadPacket()
{
if(Serial.available() > 0){
int inBuffer = Serial.read();

//header
if(ptPckt == 0){
if(inBuffer != HEADER){
errCode = 2;
ptPckt = 0;
}
else{
errCode = 0;
ptPckt++;
}
}
//ID
else if(ptPckt == 1){
pcktID = (byte)inBuffer;
ptPckt++;
}
//data length
else if(ptPckt == 2){
datLen = (byte)inBuffer;
ptPckt++;
}
//check sum
else if(ptPckt == datLen + 3){
int sum = 0;

for(int i = 0; i < datLen; i++){sum += datBuf[i];}
sum = (sum + inBuffer) & 0xFF;

if(sum == 0xFF){
errCode = 0;
decodePacketData(datLen, pcktID, datBuf); //この下で実装されます
}
else{
errCode = 1;
}

ptPckt = 0;
}
//data overflow
else if(ptPckt > datLen + 3){
errCode = 3;
ptPckt = 0;
}
//data
else{
datBuf[ptPckt - 3] = (byte)inBuffer;
ptPckt++;
}
}
}

そして何のエラーもない場合は、受信データから得られたコントローラーの設定情報を基に内容の解析を行います。ID番号、データ長さ、そしてデータ内容の配列を引数に与えて、Arduino内部の設定を変更します。

void decodePacketData(byte len, byte id, byte* data){
switch(id){
case 11: //key config
for(int i = 0; i < len; i++){
keyConfig[i] = (char)datBuf[i];
}
break;
case 13: //controller setting
if(len >= 4){
bstShot = datBuf[0];
anStick = (datBuf[1] != 0) ? true : false;
range = datBuf[2];
threshold = datBuf[3];
}
break;
default:
break;
}
}

後は、serialReadPacket関数をloop関数内で使用すれば、シリアル通信でコントローラーの設定を変更できるようになります。
ちなみに、ボタンも複数使用できるよう、以前紹介した工夫をforループをかけて処理できるようにしましたが、詳細はソースをご覧ください。

(ゲームをやってみよう)
今回ご紹介するゲームは、TANAKA U様が運営されているNEXTFRAME(!)が制作された、Flashゲームで有名なアクションゲームのSeventh Sky(http://nextframe.jp/flash/seventhSky64M.html)です(リンクフリーとのこと)。

ロボットを操作して空中を浮遊し、全方位から攻めてくる敵をガンやブレードで倒していく2Dシューティングアクションですが、ロボットを操作して敵を倒す爽快感がたまりません。マウスとキーボードの両方を使用するため、慣れるのに少し時間がかかりますが、一度操作を覚えればこのゲームにやみつきになるでしょう。

ちなみに、個人的には水色の機体を使ってます。大火力のビームを撃ち、多くの敵を一度に薙ぎ払うように倒していくのが好きです。バスターライフル!!

(終わりに)
今回で書きたいことはほぼ全て書き終わったので、このテーマはお終いにします。
あまり上手な説明ではなかったかと思いますが、もし参考になった、あるいは楽しんでいただけたのであれば幸いです。
図や説明が足りない部分もあると思うので、また編集していきたいと思います。

では(・ω・)ノシ

テーマ : ソフトウェア開発
ジャンル : コンピュータ

ハノイカフェ(ラテ&スムージー)

昨日、会社の人に教えてもらった近所の日本の物を販売しているコンビニだというお店で、シャンプーセットや鮭フレークを調子に乗って購入したらえらーく高く付いたので、もう行かないと決めた夢担当です。こんにちは♪
輸入品だから仕方ないのかもしれませんが、値段表記もなく、シャンプーとコンディショナーのセット(いちかみ)が320000VND(約1600円)、鮭フレーク2個セットが160000VND(約800円)と、倍以上でした…さすが日本人街、いいカモにされています(笑)和食のお店もまぁまぁあるんですよ!匠とか焼肉桜とか紀伊とかきよみずとか、またご紹介しますね!

今回はカフェです!やーっと行けました。外国人通りにあるBig Ben Caffeです。夜に通ると2階がいい感じに見えたので行ってみたかったんです。店内の内装と2階からの眺めはこんな感じで綺麗です。私はテーブルではなく、靴を脱いで座る席でした。
内装

ラテ 45000VND(約225円)とスムージー 50000VND(約250円)を注文♪やっすいw
ラテ

日本と違って、お店の人はどこに行ってもどこで見かけても、暇な時は同僚と話しているかスマホをいじっているか寝ているか…やる気あるのかな?と思ってしまいますが、それがベトナムのまったりしている良い所なのかも。。。

ハノイご飯(ライスセット1)

平日のお昼休みに、人で溢れているお店を見つけたので行ってみました!ハノイの秋葉原(方向的にVincom center)とは反対方向の同じ側のフエ通り沿いにあります。床はコンクリートで建物の枠は茶色い木というイメージのちょっと古そうな外観です。中は人が多く、狭そうに見えましたが、2階に案内されたら意外と席も多かったです。

このお店はライスとメインとサラダとスープがセットのお店のようでした。
こちらは、相方が頼んだイカのフライセットです。私はお肉を頼んだ気でいたのですが、海老の炒め物セットが来ました…だってベトナム語、読めないんですもの(笑)
ご飯もフライも量が多く、相方が苦戦していました。ハノイに来て早26日になりますが、ご飯の量が多いという印象です。現地の方は残しておられました。私はいっぱい食べる女子なので問題ありませんがw
20150615184723712.jpg

こちらは、別のお店・近所のCafeですごーく気になったスイカスムージーを注文してみました!スイカって珍しいですよね。感想は・・・Watermelonというだけあって、ほぼ練乳と氷と微かなスイカの優しい甘さでした。Cafeだらけなので、Cafeめぐりもしてみたいですね♪
スイカと言えば、たまに食後のデザートが付いてくるお店があるのですが、スイカ9割、ライチ1割というほど、スイカの登場頻度が高いです。
20150614234947200.jpg

ハノイには軒先も1階も狭そうで、お客さんの姿が見えないor少ないなと思うお店が多いですが、案内されると、2階や2.5階があり、お客さんで賑わっていて、雰囲気もガラリと変わるお店も多いので、驚くことが多々あります。看板や入り口が怪しそうでも、思い切って入ってみても面白いと思います。もしかしたら、お気に入りのお店になるかもしれませんし♪最近、入ってみて「おっっ!!!」と、思うことが多いので、もっとお店を開拓してみようと思います!

自作のコントローラーでゲームをプレイしてみよう (8)

皆さんこんばんは、Reveです。技術担当です。
今日もお待ちかねの自作ゲームコントローラーだよw
昨日は風邪を引いて寝込んでました

今までは、ボタン(タクトスイッチ)、ジョイスティック、加速度センサーと従来のコントローラーでも使われているような部品を使用してきましたが、今回は赤外線測距センサー:GP2Y0A21YK と人感センサー:SB412A を使って、少し変わったコントローラーを作ります。

(赤外線測距センサーって?)
赤外線を使って、前にある物体の距離を測るセンサーです。簡単に言うと、トイレで使われているセンサー
今回使用するGP2Y0A21YKは、おおよそ10~80cmの距離を計測でき、それを電圧の大きさで出力します。

(人感センサーって?)
人や動物など、熱源を持つものが移動したことを検知するセンサーです。動いたことを検知するのであって、近接センサー(近いことを検知する)ではないのは注意点かもしれません。
今回使用するSB412Aは、動いているか否かを電圧の高低(HIGHかLOW)で出力します。

ちなみに、これらのセンサーも準備し忘れました。ごめんなさい。

(回路の構成)
というわけで回路に移りますが、今回はほとんど画像が用意できません(汗
ご容赦ください。

まず部品については、以下のものが必要になります。
Arduino Micro
・ブレッドボード
・赤外線測距センサー
・人感センサー
・ジャンプワイヤー

もうArduino Microとブレッドボードはおなじみなので、適当に挿しておいてくださいw
(もし分からない場合は、画像右上のArduinoのようにブレッドボードへ挿せば大丈夫です。ほかの部品は関係ありません。)
20150625063749578.jpg

Arduinoをブレッドボードに挿したら、次はセンサーを接続します。
・赤外線測距センサー
Arduino 赤外線測距センサー
5V Vcc
GND GND
A0 Vo

・人感センサー
Arduino 人感センサー
5V 3 - 12V
4 Vout
GND GND

赤外線測距センサーのケーブルは、そのままブレッドボードに挿せます。
ちなみに、ケーブルの配線はVccが黒、GNDが赤となっているので、電源とグランドを間違えて挿さないよう気を付けましょう。
また、人感センサーは一度ブレッドボードへ挿してから、それぞれのピンをジャンパーコードでつなげましょう。

これで回路は完成です。

(プログラム)
さて、プログラムのお時間です。
今回も早速、コードを見てみましょう。


#define SW 4

// 赤外線測距センサーの出力から距離を求める関数
float measureDist(int value)
{
float dist = 0.0;

if(value > 80 && value < 675)
{
dist = 6768 / (dist - 3.0) - 4; // 距離を求める計算式
}

return dist;
}

void setup()
{
pinMode(SW, INPUT); // (b)
}

void loop()
{
float msrDist = measureDist(analogRead(A0)); // 赤外線測距センサーから距離を求める
Mouse.move((msrDist - 45) / 2, 0, 0); // 求めた距離をマウスの平行移動に利用

if(digitalRead(SW) == HIGH){ // 人感センサーの出力がある場合(動いたのを検知)
Mouse.press(MOUSE_LEFT);
}
else{
Mouse.release(MOUSE_LEFT);
}

delay(10);
}


今回は、赤外線測距センサーでマウスポインタの平行移動を、人感センサーでマウス左ボタンの操作を行うプログラムになっています。赤外線測距センサーでの操作は、さながらテルミンか、最近でいうと1次元のみのLeap Motionといったところでしょうか。

マウスの操作に関しては、こちらの記事をご覧ください。手抜きとか言わない
画像なかったり既に荒だらけなんだから

今回あえて解説がいるとすれば、赤外線測距センサーの距離を求める計算です。
赤外線測距センサーの出力は最大でも3.3Vで、距離が離れるほど出力が小さくなっていきます。
今回は、比較的単純な、以下の式を利用しました。

(距離) = 6768 / ((センサー出力) - 3.0) - 4

ちなみに数式は、arudtech様のこちらの記事を参考にいたしました。

(ゲームをやってみよう)
今日ご紹介するゲームも、n_ryota様が運営されているゲーム開発ブランド ship of EYLN(http://dev.eyln.com/) から、「Processingによる横スクロールアクションゲーム」です(事前に承認を頂きました)。
リンク先に飛んで「Action」の画像をクリックすると、ゲームのページに行くことができます。

もうネタ切れなのであえて前回と同じゲームを選んだのは、ゲームが同じでもコントローラーが違えばプレイ感覚が異なるのを体験してもらいたかったためです。決して手抜きではない

というわけで、次回はもっとちゃんとした記事書きます。

続きを読む

テーマ : ソフトウェア開発
ジャンル : コンピュータ

ハノイご飯(かけ麺×リゾット)

お久しぶりです!22時45分@ハノイ、夢担当です♪
そろそろブログもご飯の時間ですね(笑)ということで、今日もハノイレストランをご紹介させていただきます^^紹介し忘れておりましたハノイの秋葉原の横にある青と白のお皿が壁や店内の天井に貼付けてあるお店です。

こちらは、以前も違うお店で食べた小さな海老が入ったお餅とやけにモチモチしたお煎餅。これ好き。50000VND(約250円)くらいだった気がします。
20150614235524164.jpg

こちらは、鮭の大きな切身がゴロッと入ったリゾットです。ちょっと量が多かったかな。リゾットにもシークワーサーがついてきましたw 約70000VND(約350円)
20150615000048426.jpg

こちらは、つけ麺かと一瞬思いましたが、海老とお肉がのった太麺のフォーに香草とスープをかけて食べるフォー。色も形もまるでパスタのようでした。パリパリしたお煎餅も美味しかったです。約70000VND(約350円)
20150614235510252.jpg

こちらがお店の内装です。店内は日本のファミレスのような雰囲気で、2階もあり広々としていて、清潔感がありました。英語も通じたので安心です。
20150615000112245.jpg

2階からのフエ通りの眺め。ハノイの秋葉原街に近いせいか、メンズのお店が並んでいます。
20150615000100595.jpg

値段もうろ覚えでごめんなさいですが、高いという印象はありませんでした。ファミレスのような綺麗な内装なので、街中のドアがないようであるようなお店よりは高めですが、それでも2人でジュースも頼んで240000VND(約1200円)以内一人約600円という感じです。テラスというか、ドアや壁のないCafeには人が溢れているのに、こういうお店は現地の方が少ないように思います。また秋葉原に来たら、ここでまった〜りするのも良いかもしれません♪

自作のコントローラーでゲームをプレイしてみよう (7)

こんばんは、Reveです。
さて、今回も自作ゲームコントローラーの話をしましょう。
え、飽きた?ちょっと待ってちょっと待っておにーさんw

今日はWiiコントローラー(っぽいの)を作りますんで、加速度センサーでコントローラー作るんで、もう少しお付き合いいただければorz

(加速度センサーとは)
Wiiコントローラーでご存知の方も多いと思いますが、物体にかかる加速度を計測するためのセンサーです。加速度は、センサーの平面方向2軸と垂直方向1軸の合わせて3軸それぞれの度合いが測定されます(デバイスによります)。
AccSensor.jpg
物体が動いている最中はもちろん、静止時も重力(加速度)がかかるため
物体の姿勢を計測するのにも使用されます。

(回路の構成)
それでは、今回使用する部品を紹介します。
Arduino Micro
・ブレッドボード
・加速度センサー(KXR-94 2050)
・ジャンパーピン
・ジャンプワイヤー

もうArduino Microとブレッドボードはおなじみですね。

加速度センサーはKXR-94 2050という、秋月電子で850円(税込)で購入できるデバイスを使います。
大変お求めやすい価格になっております。
これは、加速度をセンサーに対して3軸方向で測定するもので、その度合いは電圧の大きさで出力されます。
アナログ入力で加速度の大きさを計測できるため、使いやすいセンサーと言えます。

加速度センサーとArduino Microそれぞれのピンを、下の一覧の通りに接続します。
Arduino加速度センサー
5V1: 電源, 2: 有効化
GND3: GND, 5: セルフテスト
A06: X軸
A17: Y軸
A28: Z軸

加速度センサーのピンそれぞれの役割については、
・電源: 加速度センサーの電源 (2.5~5.25V)。
・有効化: 電源と接続で駆動、GNDと接続でスリープ状態に入る。
・GND: 加速度センサーのGND (0V)
・X,Y,Z軸: それぞれの軸方向の出力
となっています。なお、セルフテストは特殊なため、ここでは説明を省きます(GNDと接続で通常使用)。

接続した際のイメージは以下の通りです。
今回ジャンパーピンを使用したのは、加速度センサーのピン同士を接続するのにコードではごちゃごちゃしてしまうため、コードをやめてすっきりと配線するためです。
なお、それぞれの線の色がピン、およびワイヤーの色に対応しています。
AccSnsController_Circuit.jpg
制作した回路はこのようになります。
20150625063740263.jpg


(プログラム)
続いて、プログラムに行きましょう。

int readAxis(int thisAxis, int range, int threshold) {
int reading = map(analogRead(thisAxis), 0, 1023, 0, range);

reading -= range / 2;

if (abs(reading) < threshold) {
reading = 0;
}

return reading;
}

void setup()
{
// ここでは何も設定しない
}

void loop()
{
int valX = readAxis(A0, 24, 2); // X軸方向の加速度
int valY = readAxis(A1, 24, 2); // Y軸方向の加速度
int valZ = analogRead(A2); // Z軸方向の加速度

Mouse.move(valX, -valY, 0);

if(valZ < 500) // Z軸の加速度が一定値を下回る
{
Mouse.press(MOUSE_LEFT);
else if(valZ > 730){ // Z軸の加速度が一定値を上回る
Mouse.release(MOUSE_LEFT);
}

delay(10);
}

今回のプログラムは、今までのサンプルを基に作成されているため、解説が面倒だから詳細については前回の記事をご覧ください。

このプログラムは、加速度センサーの平面方向をマウスポインタの移動垂直方向をマウス左ボタンの操作に割り当てています。
左クリックについては、加速度センサーを上に振り上げることで可能です。振りが強いほどボタンを長く押すようになります。また、センサーを逆さに向けるとボタンが押しっぱなしの状態になります。

(ゲームをやってみよう)
今日ご紹介するゲームは、n_ryota様が運営されているゲーム開発ブランド ship of EYLN(http://dev.eyln.com/) から、「Processingによる横スクロールアクションゲーム」です(事前に承認を頂きました)。
リンク先に飛んで「Action」の画像をクリックすると、ゲームのページに行くことができます。

こちらは、Processingというプログラミング言語で開発されたアクションゲームで、マウスだけで操作できます。
そのため、今回のコントローラーも当然使えます。

コントローラーが変化したことで、マウスとは違うゲーム感覚を味わえたと思います。
なんだかWiiコントローラーを自作した気分になりませんか?
え、操作がマウスより難しくなった?聞こえんなぁー

そんなわけで、また次回もお楽しみに(・ω・)ノシ

続きを読む

テーマ : ソフトウェア開発
ジャンル : コンピュータ

自作のコントローラーでゲームをプレイしてみよう (6)

皆さんこんばんは、Reveです。技術担当です。
さて今回は、お待ちかね(?)の自作ゲームコントローラー第2弾、です。

今回は、ジョイスティックでマウスカーソルをぐりぐり動かすコントローラーを作りましょう。
ちなみに、当方はゲーム機のNINTENDO 64でジョイスティックをはじめて知り、子供心に感動した覚えがあります。
懐かしいですね。くぅー、しびれるー(笑)

…まあこの話は置いといて、早速コントローラーを作りましょう。

(ジョイスティックってどんな部品?)
PS3とかXBOX 360とか、最近のゲーム機のコントローラーについてるぐりぐり動くアレ、以上!
…で終わるのも乱暴なので、下に詳細を書きます。
ちなみに、NINTENDO 64では3Dスティックと呼ばれてました まる

(詳しい説明)
ジョイスティックの概要については先ほどの説明で片付いてしまうので、ここでは電気的な特性を書きたいと思います。
特徴としては、縦横の傾きをそれぞれ電圧の高低で出力するセンサーとなっており、その電圧をマイコン(Arduino)側で読み取ることで、スティックの傾きを計測することが可能です。
また、スイッチが内蔵されており、スティックを押し込むとスイッチ入力をすることも可能です。

(回路の構成)
まず、今回使用する部品は以下のとおりです。
Arduino Micro
・ブレッドボード
・ジョイスティック
・ジャンパーコード:5本

ただし当方では、前に紹介したものと別の製品を使用しますので、写真が一部、制作例と異なる部分があります。
ご了承くださいorz
ハノイに行く直前に、部品を買い忘れてました

それでは、回路の制作に入ります。
まず、Arduino Microをブレッドボードの片側中央に寄せる形で挿入します。
続いて、ジョイスティックに付属のケーブルをつなげます。

そして、ジョイスティックとArduinoをジャンパーコードで接続するわけですが、以下のように対応させます。
Arduinoピンジョイスティック端子
5V(電源)VCC
GNDGND
A0VRx
A1VRy
13SW

付属のケーブルはどちらもソケット型になっているので、用意したジャンパーコードを挿して、反対側をブレッドボードに挿してArduinoと接続します。Arduinoと接続するには、対応するピンが挿してある穴と同じ列のどこかにコードを挿せばOKです。

出来上がった回路はこのようになります。
20150625063749578.jpg

(プログラム)
それでは、回路も完成したところでプログラムを見てみましょう。

#define SW_ANSTICK 13

//ジョイスティックの傾きをマウスカーソルの移動量に変換する関数
int readAxis(int thisAxis, int range, int threshold) {
int reading = analogRead(thisAxis);

reading = map(reading, 0, 1023, 0, range); // ジョイスティックの出力を、0~rangeの間に変換

int distance = reading - (range / 2); // 値の中心を0にする

if (abs(distance) < threshold) { // 計算値が任意の値(threshold)を下回る場合
distance = 0; // 移動量を0にする
}

return distance;
}

void setup()
{
pinMode(SW_ANSTICK, INPUT_PULLUP); // ジョイスティックのスイッチ入力を有効化
}

void loop()
{
int valX = readAxis(A0, 12, 3); // 水平方向の移動量
int valY = readAxis(A1, 12, 3); // 垂直方向の移動量

Mouse.move(valX, valY, 0); // マウスカーソルを移動させる
if(digitalRead(SW_ANSTICK) == LOW){ // ジョイスティックのスイッチが押されたら
Mouse.press(MOUSE_LEFT); // マウスの左ボタンを押下
}
else{
Mouse.release(MOUSE_LEFT); // マウス左ボタンの押下を解除
}

delay(10);
}

ソース全体を見たところで、個別に処理内容を解説していきます。

まず、今回は独自の関数を設定しています。
この関数は、ジョイスティックの傾けた量をマウスカーソルの移動量に変換する役割を果たすものです。
アナログ入力で読み取った値をmap関数で任意の移動量に変換しています(-range/2 ~ range/2)。
また、あまり微細な変化で動かないよう、特定の値thresholdを下回る傾きでは動かないように制限します。

int readAxis(int thisAxis, int range, int threshold) {
int reading = analogRead(thisAxis); // (b)

reading = map(reading, 0, 1023, 0, range); // (c)

int distance = reading - (range / 2); // (d)

if (abs(distance) < threshold) { // (e)
distance = 0;
}

return distance;
}

続いて、setup関数は飛ばして、loop関数を見てみます。
マウスカーソルの移動に関しては、先ほど実装した関数を使用して水平、垂直の2方向の移動量を求め、
Mouse.moveメソッドに与えてマウスカーソルを移動させます。

int valX = readAxis(A0, 12, 3); // 水平方向の移動量
int valY = readAxis(A1, 12, 3); // 垂直方向の移動量

Mouse.move(valX, valY, 0); // マウスカーソルを移動させる(三番目の0は、マウスホイールの移動量)

そして、マウスクリックも以下のコードによって実現できます。
Mouse.pressメソッドで指定のボタンを押す操作を、Mouse.releaseメソッドで指定のボタンを離す操作を命令できます。
ここではジョイスティックの押し込みスイッチとマウスの左ボタンを対応させています。

if(digitalRead(SW_ANSTICK) == LOW){ // ジョイスティックのスイッチが押されたら
Mouse.press(MOUSE_LEFT); // マウスの左ボタンを押下(MOUSE_LEFTは定数)
}
else{
Mouse.release(MOUSE_LEFT); // マウス左ボタンの押下を解除
}

以上で解説は終わりです。
後は、プログラムをArduinoに書き込めばコントローラーの出来上がり。

(ゲームをやってみよう)
今回は、脱出ゲームというジャンルのゲームをプレイしましょう。
これは、どこかに閉じ込められたという設定の下、画面内のいろんな場所をクリックしながら脱出の手立てを探すというゲームです。最近では、実際の空間を舞台に、閉じ込められた場所から脱出を図るアトラクションも登場しています。

非常に多くのゲームが有志で制作されていますが、それらを集めたサイト(http://www.no1game.net/)から好みのものを探してみると良いでしょう。
制作したコントローラーを使ってプレイできますが、マウスとは一味違うゲーム体験になるかもしれません。

…まあ、操作性はよくなるわけではありませんが。むしろ悪くなったとか言わない

それでは、また会いましょう。さらば(・ω・)ノシ

続きを読む

テーマ : ソフトウェア開発
ジャンル : コンピュータ

Raspberry PiとArduinoのI2C通信

こんばんは、Reveの技術担当です。
今日はRaspberry PiArduinoを、I2C通信で連携する方法をご紹介します。
自作ゲームコントローラーはいったんお休みです。

(今回の目標)
今回作るものは、表題の通り ArduinoRaspberry Pi をI2Cで通信するためのプログラムですが、決まったデータを送るだけではつまらないので、Arduinoのアナログ入力(analogRead)で得られた値をRaspberry Piに送るプログラムを作ります。

これを使用すれば、Arduinoで測定したセンサーの出力をRaspberry Piで扱うことができ、これを応用すれば、webサーバー上で温度データの監視といったシステムなども可能になります。

(I2C通信って何?)
I2C(Inter Integrated Circuit)とはフィリップス社で開発されたシリアル通信方式で、
データのやり取りを行う「SDA(シリアルデータ)と、通信タイミングの動機を図る「SCL(シリアルクロック)の2線をつなげるだけでデバイス間の通信が可能になります。実際は電源とグランド線を合わせて4本の線でつなぐことがほとんどです。
各線を並列につなげば、複数のデバイス間で通信することも可能です。

通信用の線が2本で済むため、速度より製造コストを抑えることが重要な場合に適しており、
比較的低速な電子機器や組み込みデバイスなどで使用されます。

I2C通信を行うためのライブラリとして、Arduino には「Wire」ライブラリ、Raspberry Pi には「i2c-tools」および「python-smbus」パッケージが用意されています。
Raspberry Piのプログラム制作にはPythonを使用します。

(Raspberry Piの設定)
ここでは Raspberry Pi にOSのインストールが完了した前提で進めます(Raspberry Pi B+を使用)。

1. I2C通信に必要なパッケージをインストール
 ログイン画面で以下のコマンドを入力します。
 $ sudo apt-get install i2c-tools python-smbus

2. Raspberry Pi のソフトウェア設定画面に入ります。
 $ sudo raspi-config

3. 「8 Advanced Options」 -> 「A7 I2C」の順に選択します。

4. はい(YES)を選択すると、I2C通信が有効になります。

5. 再起動します。
 $ sudo reboot

6. 再起動したらI2Cの設定を確認します。
 以下のコマンドを入力し、特定のファイルを編集する画面に入ります。
 $ sudo nano /etc/modules

7. もしファイル内に i2c-dev が書かれてなければ、ファイルの一番下に追記して保存します。追記した後は、もう一度Raspberry Piを再起動します。

これで、Raspberry Pi側の設定は完了です
なお、Arduino側は何の設定も必要ありません。

続きを読む

テーマ : ソフトウェア開発
ジャンル : コンピュータ

プロフィール

Reveちゃん

Author:Reveちゃん
コンビでやってます。
夢担当と技術担当がいます。

大学院卒業 → ロボットベンチャー(漆黒)就職 → 1年で退職 → ベトナムで仕事中(今ここ) → メディアアーティスト(未来☆)

リンクフリーです。

最新記事
最新コメント
月別アーカイブ
カテゴリ
アクセス数
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR