2013年10月12日土曜日

MacのターミナルでGmailの未読メール数を表示する


curl -u USERNAME:PASSWORD \https://mail.google.com/mail/feed/atom  -k --silent |grep -m 1 "<fullcount>" | sed -e 's/<fullcount>//' | sed -e 's/<\/fullcount>//'

別にこれでもいいんだけど

curl -u USERNAME:PASSWORD \https://mail.google.com/mail/feed/atom  -k --silent |grep -m 1 "<fullcount>" |   grep -Eo "[0-9]+"
こっちのが短くてわかりやすい ※それぞれ二行目は無視してください
//追記2014/01/19 表示のおかしいところを治しました

2013年10月11日金曜日

ArduinoでMIDIケーブルを使わずにMIDI信号をやりとりする。

つまりUSB接続でMIDI通信をしよう!と言うこと。

Appleのコンピュータを買うと最初からGarage bandというDAWソフトがついてくる。
それをArduinoから制御しましょうという話。もちろんAbleton Liveとかも操れるはず。

材料
  1. Japanino…手持ちのArduino互換のマイコンボードがこれしかなかった
手順
  1. JapaninoにArduino1.0.5からも書き込みができるようにする。
  2. シリアルからMIDI通信するソフトをダウンロードする。
  3. IACドライバを設定する。
  4. MIDIライブラリをダウンロードする
  5. Japaninoのプログラムを書き、書き込む
  6. DAWを立ち上げる。
  7. シリアルMIDIソフトをオンにする。
  8. 糸冬
JapaninoをArduinoIDE 1.0.5から扱えるようにする方法
 ここにすべて書いてある→http://dexlab.net/pukiwiki/index.php?Memo%2FArduino#n12f195c
 簡潔にまとめると、学研で配布しているArduinoIDEのパッケージの中身のpins_arduino.cとpins_arduino.hをhardware\arduino\cores\arduinoにコピー、そしてboards.txtを書き換えればよい。Macでのパッケージを参照するためにはアイコンを右クリックして「パッケージの中身を表示する」を選べばよい。

シリアルーMIDIソフトのダウンロード
 またもや、ここに全て書いてある→http://projectgus.github.io/hairless-midiserial/
 他にも同じような機能を持つソフトはあるのだが、それらのソフトを試したなかで動いたのはこれだけだったのでこれを使えば問題は無いはず。(大きい声では言えないけどSerial−MIDI Converterっていうやつです。これまた大きな声で言えないけどMake:のオンラインマガジンに紹介記事が載ってたり、ブログがヒットしたりして惑わされました。今はJavaの仕様の関係で使えない、みたいです。)

IACドライバはMacに最初から付いている。
 アプリケーション→ユーティリティ→Audio MIDI 設定というソフトの中に入っている。
 一番左にあるIACドライバをダブルクリックするとプロパティが表示される。
 「装置はオンライン」にチェックマークを入れる。

Japaninoへのプログラム
MIDIライブラリをArduinoIDEに追加する必要がある。
以下はベロシティを段階的に変えて発音させるというプログラム
これを書き込む

#include<MIDI.h> 

void setup(){
  MIDI.begin();
  Serial.begin(115200);
}

void loop(){
  for(int velocity=0; velocity<=127; velocity++){
    MIDI.sendNoteOn(36,velocity,1);
    delay(250);
    MIDI.sendNoteOff(36,velocity,1);
  }
}
 
DAWを立ち上げる
GarageBandでもなんでもよい。

Hairless midi-serialを起動して設定する。
上記のように設定すればよい。
Serial portにはArduinoがつながっているUSBポートを選択する。
そして左上のボックスにチェックを入れると音が鳴り始める。

こんなつかいかたもある
圧電ブザーから取り出した圧電素子をつかって衝撃をトリガーとした。衝撃の強さを0-127の段階に置き換え、それをベロシティとする。


最後に
 ここまで非常にめんどくさい手順が必要だったわけだが、現行版のArdiuno UNO を購入することで解決することができる。ArduinoUNOはUSB接続の際にHIデバイスやMIDIデバイスへと自らを変化させることができる。
 このブログに書いてあることはそういった方法から考えるとえらく遠回りな方法を示していることにお詫び申し上げる。しかしながらこの方法ではシリアル通信さえできれば良いので他のマイコン、例えばPIC、でも同じことができるのではないかと思う。

2013年10月10日木曜日

趣味の話

 先日学校の行事で何枚もライントレースカーの回路をハンダ付けする機会があったのだが、そこでハンダ付けをしていると他の何もかも忘れて没頭できるなと気づいて、電子工作を趣味にしようと思った話。

 その時、回路作成のノルマが間に合っていなかったので家にユニバーサル基板と素子を持って帰って家にあるはんだごてで作ろうと思ったら、長いこと放置していたおかげでこて先が死んでた。

 これはいかんと言うことで工具を色々揃えたいなー。と思っていたら誕生日にほしいものが有ったら言いなさいとのことで、まあ良い物は長く使えるという言葉にしたがっていろんな物を買ってもらった。親としてはもっと別のものに遣って欲しかったかもしれないけど。

以下工具

  • 精密ドライバーセット \1000
  • 逆作用ピンセット*2 \600
  • 精密鷲口ピンセット \300
  • ニクロムはんだごて \800
  • はんだごて台 \1000
  • はんだ吸い取り器 \800
  • 精密ニッパー \1300
  • ラジオペンチ \1900
  • ワイヤストリッパ \1300
  • ミニバイス \500 
 
 それに合わせて素子も購入したのだが当面の目標はドラムセット型MIDIコントローラを作ることにした。電子ドラムは高い。それを安く・クオリティの高いもので代用してしまうことができるだろうと思う。音源はPCからそれぞれのPADに好きな音を当てることができるだろう。自作のDrumKitが自分のような人にとっては十分実用に耐えうるだろうということは下の動画を見てもらえればわかると思う。


 いろいろ電子ドラムについて調べてみた結果、9入力(bass,snare,hi-hat,hi-hatpedal,hi-tom,lo-tom,floar-tom,ride-cymbal,clash-cymbal)の電子ドラムは2万を切ることはない(廉価メーカーでさえ)のでそれ以下に価格を抑えることができたら大成功だと思う。設計次第ではオールメッシュパッドにだってできるはず。

 本格的に趣味としてやっていくことに決めたのだから何かしら生産性がなきゃダメだと思うので恐らくこの趣味のゴールは「人が欲しがるような物をつくる」事になるだろう。人が欲しがればそれは富となるので、すなわち生産性があると言っていいと思う。できたらキット化してネット上で販売したい。とりあえず今は自分が遊びたい気持ちが強いけど。

 それからこの趣味にはもうひとつ来年へ向けた理由がある。自分はこれまでプログラムばっかり(しかもC言語ばっかり)やってきたのだが、来年入る研究室はプログラムする機会はほとんどない。化学を独学で実践的に学ぶことは難しいので、テキストを使って勉強するとして、自分が持っているアドバンテージは電気・機械・情報の三分野をうすーくやってきたことだろうと思っている。電子制御工学科はそういうところだった。ならばということでこれまで深入りしてこなかった電気や機械の部分を残り高専生でいられる間に少しでも深めようという動機からのチャレンジとなる。

 そのチャレンジ一日目の課題はSolidWorks入門だった。
 
 これはPADを集中管理するTerminalBoxになる予定。SolidWorksには今日はじめて触ったと言っていいほどだけれど、ずっと隣で悪戦苦闘してた脇坂のお陰で専門用語的なものは頭に入っていたし、ソフトを立ち上げた時からできることはだいたい分かった。これが来年どこまで役に立つかわからないけど3DCADへの理解はきっと良い物になるはず。行き先には3Dプリンタが導入されているのは確認してあるし。

 こうやってやってみるともっと早くやっとけばあれもこれももっとキレイに、ちゃんと作れたんだろうなと後悔が…。

2013年9月30日月曜日

【NTV RRB】作業日記2

めっきり寒くなりました。
本番機(2mのロボットです)の材料がどんどん届いています。

持っているのは一枚のギアです。ロボットが等身大以上になるとギア一枚が顔よりでかい!


あとひとつ嬉しいニュース。人気投票が一位になってました。
応援してくださったみなさんありがとうございます!
研究室一同はしゃぎつつ、頑張らなきゃなあとおもったのでした。

2013年9月19日木曜日

【NTV RRB】作業日記

Blogger用に設定したIFTTTの確認も兼ねてRRBの作業日記っぽい記事。
学会原稿の締め切り伸びたよ。やったー。


本番の競技場(プロレスみたいなリング?)の床材が届きました。グレーっぽいコンクリートっぽいざらざらっぽい材質でした。


それから優勝予想の人気投票ですが現在二番人気。一番人気目指して宣伝頑張りたい。
投票は上記URLから。沼津高専青木研究室チームへどうぞ。

こんな感じで競技本番まで,出しても問題無さそうな情報出していけたらと思います~。
IFTTTのうまくいくかな…


2013年9月16日月曜日

高専最後の夏休み振り返り

順を追って

8/9 フーセンガムロボットリリース
 フーセンガム膨らますロボット作ってた。要素技術調べたりとか開発環境試したりとかのの裏方仕事やってました。


8/10 一日体験入学
 専攻科二年生ともなるとほっとんど仕事がありませんが、専攻科生として専攻科の説明を一時間くらいやってました。そのあとは恒例のアレ。赤からで。貼れる写真がない。
三島駅の近くでお祭りの練習してて夏だな〜って感じした。

8/14 Gifアニメーションのスクリーンセーバーを作ってた
 個人的な趣味で好きなGifアニメつかってスクリーンセーバー作ろうと思っていろいろやってみた。最終的にWindowsでもMacでもイケるのができた。このあとお盆中Vimにハマり,一週間費やした挙句結局SublimeText2というエディタに落ち着く。オススメ。

8/17 D22のアレ
 専攻科生である立場上アレと書くしか無いアレ。D科22期生のアレ。アレなので写真も無い。

8/21 三島子ども科学教室
 子どもを喜ばせ組。きっとここから未来の高専生が来るんじゃないか。子ども来場者は赤ちゃん〜小学生低学年でパワフリャーでした。LEGOのダーツとかkinectのアプリとかを展示

8/23 熱海でゼミ合宿
 大学院の合格発表がこの日だったけど受かってたのでよかった。熱海向かう車の中で確認してました。ボーリングをやり、最高級味噌汁・サザエの刺身・伊勢海老などの美味しい料理を食べ、卓球・カラオケ、バカゼミ、海、温泉とかいう贅沢コースでした。バカゼミは二年連続で優勝しました。研究室外に見せられないバカゼミ。

8/31 リアルロボットバトルの取材
 ゼミ合宿明けからこの日まで凄くハードであった。先生は海外出張で撮影当日まで居ない中ロボットをほぼ一週間で組み上げるという感じでした。前日、前々日は徹夜してみんなで力を合わせてという感じ。この合間に親の職場の退官記念DVDを作った。

9/3 大学院入学手続き
 してきました。東京暑かったので行って帰って来るまで約三時間ほど。東京は遠いようで近いのか,近いようで遠いのか。。。電車のなかで来年度からのことが少し不安になりました。

9/4〜/5 イノベーティブジャパン社会実装プロジェクト中間報告会
 所謂点滴台ロボットについて中間報告してきました。二日目のワークショップの会場は日本ロボット学会と同じ首都大学でした。千葉工大の先生の話し方がスゴイと思った。帰りに青木先生の案内で東小金井を満喫した。油そば食べてからカレーを食べる荒業。


9/10 専攻科二年で千本浜花火
 専攻科二年生で集まり花火しました。これがおそらくこの夏最後の花火でしょうね。


9/14 リアルロボットバトルの放送をみんなで鑑賞
 先生の弄られ具合が半端じゃない、CMマタギとかプロっぽい感じでした。そのおかげか沼津高専チームの時間がわりと長かったし、僕もちょっとは写ってた。応援よろしくおねがいします!


という感じの夏休みでした。バイトしてないのにかなり充実した夏休みだったと思います。とか言いつつほぼすべて研究室関連の行事ですが。ほんとこれ以外は研究室に居るか家でプログラム書くかVimいじるか、あにめかまんがかたんぶらー。日テレの紹介欄にも趣味ネットって書いてあるしね、ふふ。まあこれで高専生としての夏休みは終了。一年も残り半分です。

2013年8月28日水曜日

【雑記】オレオのクリームとクッキーどっちが好き?

オレオのクリームとクッキーのどっちが好き?
技術ノートとは関係しそうもないのですが面白かったのでご紹介させていただきます。

「OREO Separator Machine」
物理学者からおもちゃ科学者、コンセプトデザイナー、カーネギーメロン大学のロボット研究者がそれぞれ異なる方法でオレオのクッキーとクリームを分離する装置を開発しています。

2つに分離させたオレオに残ったクリームの部分をリーマーで削り取ったり、ロボットが画像処理でオレオをつまんで剥がしたり、剥がしたオレオに残ったクリームを布で拭きとるなどそこまでするか的な技術の無駄遣いが見ていて面白い。

個人的に一番すきなのが#2の装置。真剣におバカなことにチャレンジしている様子に思わず笑ってしまいます。





それから私事で申し訳ないのですが、研究室のプロジェクトでバ部(バブリシャス部)と共同でフーセンガムをふくらませることのできるロボットをつくりました!企業とのコラボものということでちらっとご紹介。(動画は限定公開になっていてブログには貼れませんでした…)
バ部×沼津高専 フーセンガムロボット

ちなみに私はクッキー派

2013年8月15日木曜日

【Mac,Windows】好きなGIFアニメをスクリーンセーバーにしよう!

Animated_Gif_Screensaver
お好みのGIFアニメをスクリーンセーバにするアプリを書きました.
スクリーンセーバを終了するためには何らかのキーを押してください.
Mac,Windowsの両方に対応しています.
それぞれ設定の方法が異なるので注意してください.
本ソフトウェアを使用する際は自己責任で宜しくお願い致します.

【Windows版】
まず,https://app.box.com/s/skte76ch7ftlu88mxdpiからgif_animation.zipというファイルをダウンロードして下さい.

そのファイルを解凍するとできるgif_animationを開くとapplication.windows32というフォルダがあります.その中にanimated_gif.exe , animated_gif.scr , data , lib , source が入っていることを確認してください.

全部揃っていたら,animated_gif.scr , data , lib をc:/windows/system32というフォルダに入れてください.その際,管理者のパスワードの入力が必要です.

ここまで終了しますとコントロールパネルのスクリーンセーバ設定項目にanimated_gifが現れているはずですので,それを選択すれば設定は完了です.

【WindowでのGIFアニメカスタマイズ方法】
先ほどc:/windows/system32フォルダに入れたdataディレクトリの中に再生するGIFアニメが入っています.この中のファイルをお好みのGIFアニメに置き換えることで自分だけのGIFアニメスクリーンセーバを作ることができます.中に入れることができる最大数は25ファイルです.それ以上入れるとメモリが足りなくなる可能性があるので注意してください.

【Mac版】
Mac版はWindows版に比べて設定方法が少々複雑になります.

まず,ScriptSaver:http://swannman.github.io/scriptsaver/のサイトにアクセスしてScriptSaverをダウンロードしてください.ダウンロードしたZipファイルを解凍するとScriptSaver.saverというファイルがありますのでそれをダブルクリックしてインストールしてください.

次に,https://app.box.com/s/vp3rxxukcj0nhvumb60sからGifAnimation_Screensaver_Mac.zipをダウンロードしてください.

そのファイルを解凍するとできるScreenSaver.appとScreensaver.scptをアプリケーションフォルダに入れてください.

次に,システム環境設定からスクリーンセーバの設定項目に移動します.スクリーンセーバーの選択メニューのその他というカテゴリにScriptSaverが表示されているのでそれをダブルクリックします.すると設定画面が表示されるので,ActivationScriptのLocationに/Applications/ScreenSaver.scptと入力しOKボタンを押して終了します.これで設定は終了です.テストボタンを押して動作を確認してみてください.

【Mac版表示するGIFアニメの設定方法】
アプリケーションフォルダの中にあるScreenSaver.appを右クリック(二本指タップ)してパッケージの内容を表示という項目をクリックします.すると中にContentsフォルダがあるのでそこからResources  ->  Java  ->  dataのように移動していきます.このフォルダの中に入っているGIFアニメをお好きなGIFアニメに置き換えることで自分だけのGIFアニメスクリーンセーバを作ることができます.中に入れることができる最大ファイル数は25ファイルです.それ以上入れるとメモリがたりなくなる可能性があるので注意してください.

2013年8月14日水曜日

ProcessingでGifアニメーションを利用したWindows向けスクリーンセーバーをつくる


動機など
 今日はGif_VJというアプリケーションに触発され,作成したGifアニメスクリーンセーバを作ったのでその記事を書きます.


この動画は本家GifVJのプロモーション動画です。かっこいいですよね。今回はこのアプリケーションに習ってProcessingを用いてWindows向けのスクリーンセーバを作成してみました.

 Gifといえば最近になって米オックスフォードが選ぶ「今年の新語/流行語」的なやつでGIFが選ばれて発表されたり,正確な読み方が「ジフ」であることが判明したり,と話題に事欠きません.そんなGifの流行に乗っかって一本書こうか!というのが今回の動機です.
  1. Windowsコンピュータ(Windows7 32bit)
  2. Processing(ver2.0.1)
  3. gifAnimation Processing Library
  4. Gifアニメ
実行ファイルの配布
次のURLで配布しています.
https://app.box.com/s/icabtlvpl83nc3wmvt08
https://app.box.com/s/hb3pu2u3jtmsbtya8tnj

使用方法
 Dataフォルダに格納されているGifアニメーションを読み込んで使用しています.Dataディレクトリ内のGifアニメーションファイルを置き換えることで好みのGifアニメーションをスクリーンセーバーにすることができます.ファイル名は好きなように設定していただいて大丈夫です.なお,最大数は40に設定してありますが,メモリ不足の可能性があるので25ファイルほどにしていただけたらと思います.このソフトウエアを使用際には自己責任でよろしくお願いたします.
 また,exeファイルはテスト用のファイルになっています.Gifファイルを置き換えた後,反映されているか確認するために使ってください.
 スクリーンセーバの設定方法は解凍ファイルのDataディレクトリ,libディレクトリ,animated_gif.scrをまとめてWindowsのsystem32ディレクトリに放り込み,コントロールパネルのスクリーンセーバーの設定から選択してください.詳しくは本記事下部の「Windows向けスクリーンセーバーの作り方」を参照してください.

※スクリーンセーバーの終了にはEscキーを押してください

ソースコード
 
import gifAnimation.*;
import java.io.*;

Gif[] loopingGif = new Gif[40];
int gifnum=1;
int filenum;
int currenttime=0;
int endflame;
boolean changeflag=false;
boolean t_start = true;

public void setup(){
  File directry = new File(dataPath(""));
  String[] fileArray=directry.list();
  filenum=fileArray.length;
  println(filenum);
  size(displayWidth,displayHeight);
  //size(640,480);
  imageMode(CENTER);
  for(int i=1;i<=filenum;i++){
    loopingGif[i] = new Gif(this,fileArray[i-1]);
    loopingGif[i].play();
    //loopingGif[i].ignoreRepeat();
  }
}
void loading(boolean flag){
  if(flag == true){
    changeflag=false;
    t_start=true;
    gifnum=(int)random(1,filenum+1);
  }else{
  }
}
void draw(){
   float w,h;
   background(25);
   loading(changeflag);
   if ( loopingGif[gifnum].width > loopingGif[gifnum].height ) {
      h = height;
      w = (float)loopingGif[gifnum].width * ((float)height/(float)loopingGif[gifnum].height);
    } 
    else {
      w = width;
      h = (float)loopingGif[gifnum].height * ((float)width/(float)loopingGif[gifnum].width);
    }
    timer();
    image(loopingGif[gifnum],width/2,height/2,w,h);
}

void timer(){
    if(t_start == true ){
      endflame=(int)random(1,30);
      t_start=false;
    }
    currenttime++;
    if(currenttime == endflame){
      changeflag=true;
      currenttime=0;
    }
    println(currenttime/60);
}


ソースコードの注意点
  • あらかじめDataディレクトリにGifアニメをいくつか入れておく必要が有ります.設定によって最大数を変えることができると思いますが,メモリとの兼ね合いになります.読み込み最大メモリはPreferenceで変更することができます.
  • その他は特に特別な処理はありません.わからないことが有れば聞いてください.

gifAnimationライブラリのインストール
 GifAnimationライブラリをhttp://www.extrapixel.ch/processing/gifAnimation/のDownloadアドレスから入手し,解凍してできるフォルダをローカルのDocuments/processing/libraryのディレクトリに全部放り込めば完了です.もしlibraryディレクトリがない場合は自分で作ってください.試しに,ProcessingのExamplesからgifAnimationのサンプルを実行して確認してみましょう.うまく動けばインストールは成功です.使用できるメソッドなどの詳しい説明は本家サイトを参照してください.

Windows向けのスクリーンセーバーの作り方
 ProcessingからWindows向けのスクリーンセーバーをつくるためにはProcessingのExport機能をしようします.左の図の赤枠の項目を選択します.すると右の図のような画面になるのでWindowsにチェック,Fullscreenにチェックをし,ShowStopbuttonのチェックを外します.


 すると下図のようなフォルダがProcessingのスケッチがあるディレクトリに作成されます.
 ここでapplication.windows32ディレクトリに入ると下図のようになっています.黄色のマーカが引いてあるanimated_gif.exeというファイルをコピーしてanimated_gif.scrとしましょう.これでスクリーンセーバの設定画面に登録するための下準備が終わりました.
 あとは,このディレクトリのdataディレクトリ,libディレクトリ,animated_gif.scrをsystem32ディレクトリにまとめて打ち込めばコントロールパネルのスクリーンセーバー設定画面からこのアプリケーションを選択することができます.やりましたね!
 この方法を使うとお好みのProcessingプログラムをスクリーンセーバにすることができると思います(まだ試してないのであくまで思うだけ…).つまり,スクリーンセーバに入ったら音声を再生させたり,Twitterにつぶやいたり,なんてことができるわけでいろいろ妄想が膨らみます…。

それではみなさんふぁっきんくーるなGifスクリーンセーバライフを。

※追記animated_gif.src → animated_gif.scrでした.配布している実行ファイルの方も間違えていたので直していただけるか,新しくアップロードした修正版をダウンロードして頂けたらと思います.

今回参考にさせて頂いたサイトさま




2013年8月1日木曜日

Happy Hacking Keybordでハッピーになれるか

友達にキーボードを買ってもらった.
正しくはバイトした給料のかわりに買ってもらえた.
http://www.pfu.fujitsu.com/direct/hhkb/detail_hhkb-pro2.html
直販価格は24990円ですが,Amazonで買うと二万円をちょっと下回るくらいですね.

俺が持っているのは英字配列の白です.
確か1月ぐらいに手元に来たので半年くらい使ったことになりますね.

動画のやつは無刻印・白


メリット
  1. パソコンに向かうモチベーションがあがる()
  2. 机の上で占領する場所が少ない
  3. キーボードについてるUSBポートにJapanino直挿し
  4. Rapsberry PiにつなぐときにはUSBポートにマウス便利
  5. 自慢できる。
  6. HHKB持ってるとできる情報系っぽい
デメリット
  1. 高い
  2. 英字配列に慣れると日本語配列使わなきゃならん時の違和感がすごい
  3. やっぱりちょっと音が大きめ
  4. カーソル移動がFnと同時押しなので辛い

HHKBの入手を気にVimやEmacsなんかに手を出してみたのでしたがVisualStudioのちからの前にはただひれ伏すのみだった.IntelliSenseないとスラスラ書けない.
あ、でもちょっと触った感じVimの方が好きかもしれない。でもWindowsの香り屋Vimで毎回毎回.txt~ってファイルができて「うわー。なんだこれはー。」みたいなこと言ってるレベル.でWin+R "notepad"を開いてる感じ.

Macbook Proが英字配列で買ったので,設定いじらずに挿してすぐ使えるのはすごくいい.さくらのVPSを契約しているのだけれども,VPSいじるのにはMacのターミナルから接続するので接続先でVimをちょっといじったりするようなときにすごく便利.

はい.あとは写真集です.








2013年6月9日日曜日

System::String^ から LPCTSTRへの変換

System::String^ から LPCTSTRへの変換
 Windowsフォームアプリケーションの作成時にTextBoxから得られるTextの型はSystemString^となっている.そいつをLPCTSTRに変換しなければいけない場合がある.(CreateFile関数を使用したい場合など)そんな時のためのメモ.


 #include <msclr\marshal.h>
 using namespace msclr::interop;
 ...
 System::String^ str = TextBox1->Text;
 marshal_context context;
 LPCTSTR lpcstr = context.marshal_as<const TCHAR*>(str);

参考

2013年6月8日土曜日

C言語でArduinoとシリアル通信してLEDを制御する

こんにちは。
C言語でArduinoとシリアル通信して制御する必要に駆られたのでサンプルプログラムを書いてみました。

まずはArduino側のプログラム

const int LED = 12;
int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
        pinMode(LED,OUTPUT);
        digitalWrite(LED,LOW);
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                incomingByte = Serial.read();
                if(incomingByte == 1){
                  digitalWrite(LED,HIGH);
                }
        }
     
        delay(10);
}

Arduino側のプログラムではC言語のプログラムから送信されてきた数字を受信し、それがもし1であったらLEDを発光、そうでなかったら何もしない。

それに対してC言語側のプログラム

#include <windows .h>
#include <stdio .h>
#include <stdlib .h>

HANDLE arduino;
bool Ret;

void main(void){
 BYTE data = 1;
 //1.ポートをオープン
 arduino = CreateFile("COM7",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 //2014/01/22追記 これでつながらない場合には"\\\\.\\COM7"とするとつながるかもしれません。

 if(arduino == INVALID_HANDLE_VALUE){
  printf("PORT COULD NOT OPEN\n");
  system("PAUSE");
  exit(0);
 }
 //2.送受信バッファ初期化
 Ret = SetupComm(arduino,1024,1024);
 if(!Ret){
  printf("SET UP FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 Ret = PurgeComm(arduino,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
 if(!Ret){
  printf("CLEAR FAILED\n");
  CloseHandle(arduino);
  exit(0);
 }
 //3.基本通信条件の設定
 DCB dcb;
 GetCommState(arduino,&dcb);
 dcb.DCBlength = sizeof(DCB);
 dcb.BaudRate = 9600;
 dcb.fBinary = TRUE;
 dcb.ByteSize = 8;
 dcb.fParity =NOPARITY;
 dcb.StopBits = ONESTOPBIT;

 Ret = SetCommState(arduino,&dcb);
 if(!Ret){
  printf("SetCommState FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 //4.送信
 DWORD dwSendSize;
 DWORD dwErrorMask;
 
 Ret = WriteFile(arduino,&data,sizeof(data),&dwSendSize,NULL);
 if(!Ret){
  printf("SEND FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 printf("FINISH\n");
 CloseHandle(arduino);
 system("PAUSE");
}

C言語側のプログラムでdataの値を1でなくするとプログラム実行時にLEDが発光しなくなることを確認することができました。
したがって、dataの値を指令値としてサーボモータの制御等に利用することができます。
ではまた!

参考にしたサイト

追記 2014/12/04 18:40
ArduinoからPCへデータを送信するC言語のプログラムはhttp://monitorgazer.blogspot.jp/2014/12/visualstudioarduinowin32cc.html
に書きました。


2013年5月28日火曜日

やっとわかったこと

今日ふと気づいたこと
 これがわかっただけでも「この研究室にいてよかったなあ」と思うようなことです。最近もうなにかなにもやる気がでない、ずっと布団で寝ていたい。そんな気分だったのですが、「さすがにヤバいだろ」と学校に行ってわかった2つのこと。
  • 僕にはずっと席に座ってマルチタスクこなすのは無理!
  • タスクがいっぱいでも、実際に手や口、頭を動かすその“運動”こそが僕を嬉しい、幸せな気持ちにしてくれる。
 この2つの事実はいくら休んでも「飯谷だから…」と受け入れてくれる研究室でなかったらわからなかったと思います。実際、普通の人からしたらありえないくらい休みました。学会2日前まで休んだりもしました。でもこれがなかったら僕はずっと気づかなかったと思います。自己啓発本なんかでは『やる気はやり始めることから始まる』みたいなことが書かれていますが、これを自分の体験として、自分の筋肉とすることができたような気がしました。

 学校からの帰り道、登校前とは全く違う気分で帰ることのできた自分を忘れないために、書き記しておきます。僕にはずっと椅子に座っている仕事は少し難しい!

2013年4月24日水曜日

二次方程式の解を求めるプログラム

二次方程式の解を求めるプログラムです。
strtod関数の使い方の例になればと思います。
数字以外の入力が発生した場合、誤入力として再入力を促します。
※66行目は不要です
#include 
#include 
#include 

bool inputCheck(char* e){
 if(*e == '\0'){
  return true;
 }else{
  printf("Discover an incorrect input -> %s\n", e);
  return false;
 }
}

void inputParametor(double *a,double *b, double *c){
 char input[255]={0};
 char *e;
 printf("Please Input Equation Parametor\n");
 do{
  printf("a=");
  scanf("%s",input);
  *a=strtod(input,&e);
 } while (!inputCheck(e));
 
 do{
  printf("b=");
  scanf("%s",input);
  *b=strtod(input,&e);
 } while (!inputCheck(e));
 
 do{
  printf("c=");
  scanf("%s",input);
  *c=strtod(input,&e);
 } while (!inputCheck(e));
 printf("Equation:\n%lfx^2+%lfx+%lf=0\n",*a,*b,*c);
}
 
void main(void){
 double a=0.0,b=0.0,c=0.0;
 double d=0.0;
 double x1=0.0,x2=0.0;

 inputParametor(&a,&b,&c);
 d = pow(b,2) - (4*a*c);
 printf("////////////////Answer///////////////////\n");
 printf("a =\t%lf\n",a);
 printf("b =\t%lf\n",b);
 printf("c =\t%lf\n",c);
 printf("d =\t%lf\n",d);
 if (d < 0)
 {
  printf("No solution\n");
 }else{
  if(d == 0){
   x1 = -b/(2*a);
   printf("x =\t%lf\n",x1);
  }else if(d > 0){
   x1 = (-b + sqrt(d))/(2*a);
   x2 = (-b - sqrt(d))/(2*a);
   printf("x1 =\t%lf\n",x1);
   printf("x2 =\t%lf\n",x2);
  }
 }
 system("PAUSE");
}

2013年4月1日月曜日

【感想】桐島、部活やめたってよ

研究室で『桐島、部活やめたってよ』を見ました。

この作品は朝井リョウ原作の映画です。2013年、『何者』で第148回直木賞受賞したのが記憶にあたらしいですね。僕も『何者』は読みました。それにしてもエグい。この人の作品はなんでこんなに残酷なんでしょう。

高校が舞台となっていて、他の人の感想を読むと“スクールカーストを克明に描き出した作品”とか“登場人物の実在感がすごい”とか“想像力が爆発する”とかいった感想が多いです。もちろんそこもこの作品をスバラシイものにしているポイントだと思うのですが僕が一番強く感じたのは“才能と諦め”でした。

ミカ
「お姉ちゃんは超えられない」

ヒロキ
「結局できるやつは何でもできるし、できないやつは何もできないっていうだけの話だろ」

野球部のキャプテン
「ドラフトが終わるまでは…」

映画部のマエダ
「映画監督は、無理」

キャプテンがドラフトが終わるまで云々ってところは滑稽で笑えるところだと思うんだけども、あれがすごく良かった。あの人を滑稽だなって思うことはつまり、現代の僕達は“普通”の感覚として「無理でしょwww」って思っちゃう、「無謀な夢見てんじゃねーよ。もっと現実見ろよ。部活なんかやってないで受験勉強しろよ。」ってなってるってことなんだよね。

だから、なに?

って感じなんだけどさ。自分の中でもね。

だからこそマエダの言葉は重い。自分の無力感をはっきり認めてもただ何もせず生きてるわけじゃない。無気力じゃない。

で、最後にゾンビ?の言葉に繋がる。
「戦おう、ここが俺たちの世界だ。俺たちはこの世界で生きていかなければならないのだから」
そうだ!(武器が無くても)戦おう!!


…『桐島』は学校の人気者。スターと言っても過言ではない人物。その『桐島』がある日突然バレー部を辞める。やっぱりそれはみんなにとってすごくショックだったと思う。誰にとっても『桐島』はスゲーやつ。でも、その桐島が諦めちゃう。ショックだよね。だって『桐島』が諦めちゃうんなら「僕には何もできない」じゃん。

2013年3月22日金曜日

WebAudioとgetUserMediaをつかって外部入力にエフェクトをかける【JS】

最近Javascriptにはまっています。 HTML5ではハードウエアの機能にアクセスする手段が整い始めていて、加速度センサやマイク入力を使用することが簡単にできるそうです。

WebAudio
 WebAudioを使用すると事前に用意したオーディオファイルを再生するだけでなく、その場で波形を生成して再生することも可能です。近年ではこれをつかったおもしろいWebサイトが登場しています。

WebAudio Drum Machine
 実際にあるドラムマシンをシミュレートしたもの






RealTime Analyser
音声を解析してビジュアル表示したもの







他にもたくさんあるのですが、サンプルとして2例ほど紹介しました。

 WebAudioでは用意された様々なノードをConnectすることで波形を生成したり、フィルターやディレイをかけたり、フーリエ変換をかけて音声を数値化することも簡単にできてしまいます。

getUserMedia
 getUserMediaはクライアントのWebカメラやマイク入力を扱うことができます。これはWebブラウザを通してP2Pでコミュニケーションをとるということを目指しているようで、ドキュメントを見るとP2Pに関する関数などもあることがわかります。今回はVideoの入力は用いず、Audioのみ用いました。

実装の説明とか
 実装に関する説明はググってみれば詳しく乗っているサイトがあるはずなので見てみてください。今回私が参考にさせていただいたサイトさまを以下に載せさせて頂きます。

  1. WebAudio API 解説
  2. SlideShare WebRTC + WebAudio API = スーパーサイヤ人 by girigiribauer
  3. WebAudio: live input / Stoyan's phpied.com
作ったもの
  1. 聴覚遅延フィードバックの簡単なデモ
  2. 2012年のイグ・ノーベル章のスピーチジャマーっぽいものを作ってみました。
  3. 低い周波数のSin波を流すデモ
  4. 0〜30Hzの音を聞いた時に脳はどういう反応するか調べてみたくて作りました。
ぶっちゃけ1は先程示した参考サイトの3を2は参考サイト1のコードを一部改変したものなのでアレですが、WebAudioとgetUserMediaの連携あたりのコードが日本語で検索してもあまり出ないので誰かの参考になったらいいなということでソースコードを載せときます。

聴覚遅延フィードバックの簡単なデモ

HTML

JavaScript
 function fire(e, data) {    
    log.innerHTML += "\n" + e + " " + (data || '');
  }

  var audio_context;
  var volume;

  function iCanHazUserMedia(stream) {
    
    fire('I haz live stream');
    
    var input = audio_context.createMediaStreamSource(stream);
    volume = audio_context.createGainNode();
    volume.gain.value = 0.8;
    var delay = audio_context.createDelay();
    delay.delayTime.value = 0.2;
    input.connect(volume);
    volume.connect(delay);
    delay.connect(audio_context.destination);
    
    fire('input connected to destination');
  }


  function changeDelayTime(value) {
    if (!delay) return;
    delay.delayTime.value = value;
    fire('DelayTime' + value);
  }

  function changeVolume(value) {
    if (!volume) return;
    volume.gain.value = value;
    fire('volume' + value);
  }

  (function init(g){
    try {
      audio_context = new (g.AudioContext || g.webkitAudioContext);
      fire('Audio context OK');
      // shim
      navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
      fire('navigator.getUserMedia ' + (navigator.getUserMedia ? 'OK' : 'fail'));
      // use
      navigator.getUserMedia(
        {audio:true},
        iCanHazUserMedia, 
        function(e){fire('No live audio input ' + e);}
      );
    } catch (e) {
      alert('No web audio support in this browser');
    }
  }(window));

低い周波数のSin波を流すデモ

HTML

JavaScript
  var audio = new webkitAudioContext();
  var osc = audio.createOscillator();
  var volume = audio.createGainNode();
  osc.connect(volume);
  volume.connect(audio.destination);
  osc.frequency.value = 12;
  osc.type = "sine";

  function show(data){
    log.innerHTML = "\n" + " "+(data || '');
  }

  function changeVolume(value){
    if(!volume)return;
    volume.gain.value = value;
  }
  
  function changeFreq(value){
    osc.frequency.value = value;
    show("Freq."+value+"Hz");
  }

  function play(){
    osc.start(0);
  }

マイク入力なんかは工夫すればギターのエフェクターの簡単なシミュレートなんかができるんじゃないかと思います。興味がある方挑戦してみてはいかがでしょうか。

2013年3月14日木曜日

SoundCloud APIでちょっと便利なプレーヤをつくる(2)

前回サービスの概要を説明したPlayLister for SoundCloudβですが、今回は実装過程について説明をしていきます。Playerについては解説が難しいので、はじめにプレイリストの読み込みについて説明します。

動作環境はChromeを想定しています。

コード
 以下に示すように記述することで実現することができます。

このようなHTMLに対してJavascriptは
function setPlaylist(){
  track_num_max = 0;
  var url_list=document.forms["form"].elements["playlist"];
  var tracks = url_list.value.toString();
  tracks.replace(/(^\s+)|(\s+$)/g, "");
  track_urls = tracks.split("\n");
  track_num_max = track_urls.length;
}
となります。

コード解説
 それでは一行づつ解説を行いたいと思います。

・一行目
 一行目は取り込んだ文字列を改行コードで配列化した際に配列の数を入れる変数です。他の関数でも使用するため、グローバル変数になっています。先頭にvarという接頭語をつけることによってローカル変数となります。

・二行目
 二行目ではTextareaのオブジェクトを取得しています。オブジェクトを取得することでJavaScriptから内部の値等にアクセスすることができるようになります。

・三行目
 三行目ではtracksという変数に先ほど代入したTextareaのオブジェクトutl_listの内容を.valueとすることで取得し、その値をtoString()関数を用いて文字列にキャストして代入しています。

・四行目
 四行目では取得した文字列の前後の空白を削除しています。

・五行目
 五行目では改行コード\nを区切りとして文字列を配列化しています。例えば
this
is
a 
pen

という入力があった場合
tracks[0]="this",tracks[1]="is",tracks[2]="a",tracks[3]="pen"
というように配列してくれます。

・六行目
 六行目は配列の数を取得して代入しています。

以上がTextareaからのプレイリスト取得についての解説です。次回は取得した文字列配列もとにJavaScriptでHTMLのTableを作成する部分の解説を行いたいと思います。

2013年3月11日月曜日

SoundCloud APIでちょっと便利なプレーヤをつくる(1)

今回は、SoundCloudという面白い音楽サイトで公開されているAPIを使って自作の機能を追加した音楽プレーヤを作ってみました。

SoundCloudとはなんだ?という人はこちらを読めば楽しさが伝わるかと思います。

どんな機能を追加するか
 今回は公式として用意されている”セット”をより使いやすいものにします。iTunes等で言えばプレイリストの機能になります。本家で提供されている”セット”はiPhoneアプリでは聞くことができません。せっかく作った最高のミックステープをiPhoneで聞けないなんて…!これも改善したいポイントです。

言語は
 SoundCloud APIはさまざまな言語で使用することが可能です。本家のDevelopersページを見ていただければわかると思いますが、Ruby、PHP、Python、JavaScriptを始めとしてiPhoneアプリに使用することもできます。今回は、単純なプレイリスト付きプレーヤの開発を目指しますのでどの言語でも対応できるのですが解説が豊富でiPhoneのブラウザからも利用できそうなJavaScriptを選択しました。

開発前の下準備
 今回はウィジェットの機能を拡張することでプレイリスト機能付きのプレーヤを実現します。公式で用意されているSoundCloud Widget API Playgroundというページを参考にしました。このページではウィジェットに関する関数が沢山使われています。これらの関数を使うために自分の作るページにapi.jsというファイルを追加します。
具体的には
<script type="text/javascript" src="api.js"></script>
と記述すれば良いです。
このファイルはhttps://w.soundcloud.com/player/api.jsから取得することができます。

β版公開!
 完成したプレーヤは現在http://monitorgazer.web.fc2.com/http://iitani.com/scp/scp.htmlで公開中です。今後は曲送り機能とプレイリストの保存と共有、ランキング機能を実装したいと思っています。iPhoneでは、Chromeブラウザで動作確認しました。

現状
 現状のシステムとしてはHTMLのテキストエリア要素に曲のURLを貼り付けると順に再生するようになっています。また、プレイリストのリピート機能、一曲リピート機能、プレイリスト無限シャッフル機能がついています。

現状での便利な使い方
 個人的に実装できてよかった一番便利な機能は一曲リピート機能だと思っています。ある曲にハマると永遠とリピートして聞くのですが、SoundCloudにはそのような機能がなかったので便利に使っています。
 プレイリストはページをリロードするたびに初期値に戻ってしまうので、Evernoteなどにプレイリストを書きだしておいて、簡単にコピペできるようにするのが良いと思います。そうすればiPhoneでも便利に使えるはずです。今はプレイリストを作成するのに曲のURLを調べる作業に一手間かかるため、改良の余地が有りそうです。

実装過程
 需要はあまりないかもしれませんが次回以降のエントリで書きたいと思います。

追記(2013/03/13)
 ブラウザはChromeを推奨しています。他にも要望があれば適宜対応する予定です。iPhone,nexus7にて動作確認を行ったところ音楽の再生にユーザアクションが必要という制約のため自動再生が動作しないことを確認しています。曲の切り替えはできますが自動再生に対応しておりません。改善を行なっていく予定です。

2013年2月14日木曜日

Hacking to the Omni Wheel Robot

 最近、これまでやってきた研究とは異なることに取り組んでいました。詳しくは言えないのですが、その研究のプロトタイプ作成のために車輪型ロボットを使っています。この車輪型ロボットがなかなか曲者で制御ボード等の仕様書が一切ないという状況です。これをなんとか使用するためにProcessingとArduino用いてプロトタイピングを行ないました。その過程が誰かの役にたったらいいなということでそのネタで一本書いていきます。

1. どうやって利用するか考えてみた
 制御対象とする車輪型ロボットはBluetooth通信によってAndroid端末から専用アプリを利用してリモート・コントロールを行うことができることがわかっていたので今回は専用アプリから出力されるBluetoothメッセージを解析することで車輪型ロボットを使えるようにする方法を考えていくことにしました。

2. どうやって解析するか考えてみた
 解析する方法にはいくつかあると思いますが、今回私は専用アプリをソースコードまでリバース・エンジニアリングすることでBluetoothメッセージの解析を行なっていくことにしました。
 ※ソフトウエアにおけるリバース・エンジニアリングは法律的に非常に微妙な立場にあるものであると考えられます。利用は自己責任でお願いします。また、本文章は知的財産権の侵害を推奨するものではありません。

3. ソース解析の手法
 Androidアプリは通常apkという拡張子で配布されています。これをAppSender等を用いてPC上に移動します。これでapkの拡張子をzipに変更することで展開できるようになるため、apkの中身を見ることができます。apkのなかにはいろいろなものが入っていますが、今回使用するのはdexファイルのみです。
 次に、http://code.google.com/p/dex2jar/ からdex2jarというソフトウエアを入手します。これを用いてdexファイルをjarファイルにまで戻します。dex2jar本体が入っているディレクトリにdexファイルを移動してコマンドプロンプト上でdex2jar ****.dexというコマンドを入力するだけです。
 jarファイルが得られたら、後はこれをJavaのデコンパイラに通すだけで完了です。私が使用したのはjd-guiというものでした。入手は http://java.decompiler.free.fr/?q=jdgui からできます。

4. ソース解析
 あとは好きなだけソースを眺めてBluetoothメッセージを解析するだけでした。幸い難読化が行われていなかったために短時間で走行制御メッセージを解析することができました。

5. 走行制御プログラム作成
 今回はおなじみのProcessingを用いて車輪型ロボットとのBluetooth通信を行いました。プログラムの作成には建築発明工作ゼミさまの記事を参考にさせて頂きました。そして完成したProcessingの走行制御プログラムとArduinoのJoystickコントローラを統合した際の動作デモがこちらになります。


このプログラムのソースコードは以下のようになっています。
import processing.serial.*;

int joy1,joy2;
String str1,str2,move_state;
int duty;
Serial Robot,Echo;

void setup(){
  size(640,480);
  background(0);
  duty = 30;
  Robot = new Serial(this,"/dev/tty.BTCOM-SPPB-DevB",9600);
  Echo = new Serial(this,"/dev/tty.FireFly-AD1C-SPP",115200);
  Robot.clear();
  Echo.clear();
  Echo.bufferUntil(10);
}

void draw(){
  background(0);
  determinSendValue();
  delay(70);
  controller();
  controlWithJoystick(joy1/16,joy2/16);
  move_state = "Stop";
  text("Duty = " + duty,30,30);
  text("str1 = " + str1,30,50);
  text("str2 = " + str2,30,70);
  text("move state =" + move_state,30,90); 
}

void determinSendValue(){
  str1 = str(duty/10);
  str2 = str(duty/17);
}

void controlWithJoystick(int resist1,int resist2){
  if(resist1 < 10){
    //forward
    Robot.write("0100"+str1+str1+str1+"0\r");
    move_state = "Forword";
  }else if(resist1 > 54){
    //back
    Robot.write("1000"+str1+str1+str1+"0\r");
    move_state = "Back";
  }else if(resist2 < 10){
    //left
    Robot.write("1100"+str2+str2+str1+"0\r");
    move_state = "Left";
  }else if(resist2 > 54){
    //right
    Robot.write("0010"+str2+str2+str1+"0\r");
    move_state = "Right";
  }
}

void serialEvent(Serial p){
  String stringData=Echo.readStringUntil(10);
  println(stringData);
  if(stringData != null){
    stringData = trim(stringData);
    int data[] = int(split(stringData,','));
    if(data.length == 2){
      joy1 = data[0];
      joy2 = data[1];
      Echo.write(65);
    }
  }
}

void controller(){
  Robot.clear();
  if (keyPressed){
    switch(key){
      case 'w'://Forward
        Robot.write("0100"+str1+str1+str1+"0\r");
        move_state = "Forward";
        break;
      case 'a'://Left
        Robot.write("1100"+str2+str2+str1+"0\r");
        move_state = "Left";
        break;
      case 'd'://Right
        Robot.write("0010"+str2+str2+str1+"0\r");
        move_state = "Right";
        break;
      case 's'://Back
        Robot.write("1000"+str1+str1+str1+"0\r");
        move_state = "Back";
        break;
      case 'q'://Forward-Left
        Robot.write("0102"+str1+str1+str1+"0\r");
        move_state = "Forward-Left";
        break;
      case 'e'://Forward-Right
        Robot.write("0012"+str1+str1+str1+"0\r");
        move_state = "Forward-Right";
        break;
      case 'z'://Back-Left
        Robot.write("1003"+str1+str1+str1+"0\r");
        move_state = "Back-Left";
        break;
      case 'c'://Back-Right
        Robot.write("0013"+str1+str1+str1+"0\r");
        move_state = "Back-Right";
        break;
      case '1'://Turn-Left
        Robot.write("1111"+str1+str1+str1+"0\r");
        move_state = "Turn-Left";
        break;
      case '3'://Turn-Right
        Robot.write("0000"+str1+str1+str1+"0\r");
        move_state = "Turn-Right";
        break;
      case 'h'://increase Duty
        duty++;
        if(duty >=99) duty =99;
        delay(70);
        break;
      case 'l'://decrease Duty
        duty--;
        if(duty <=0) duty = 0;
        delay(70);
        break;
      default://Stop
        move_state = "Stop";
        break;
    }
  } 
}

感想など
 簡単にAndroidアプリのコピーやら解析やらができてしまったのが恐ろしいと思います。しっかりした有料アプリ等は難読化がかけられているのだと思うのですが、個人でアプリ開発をしている人は念入りにやらないとコピー(そのままの意味でも、アルゴリズム等のアイディアという意味でも)されてしまうので気を付けなければならないと感じます。

2013年2月6日水曜日

Processing for Androidのとかなんとか

やったあああ!
Nexus7 32GB Wifi買ってもらいました~。






何に使うの?
 研究ではハードウエアのコントローラとして主に使っていくことになると思います。Android等のマイコンと通信してモーターを動かしたり、超音波で距離を測ったりGPSデータを取得したりします。これで現在青木研究室にはiPad,iPadmini,LightTab,Nexus7の4台のタブレットがあることになります。あれ、なんの研究室だっけ?以前からあったiPadではCamera Conection Kitを使ってArduinoをキーボードとして認識させてiPadに入力することができますが、その逆(iPadからモータを動かしたり)がとてもめんどくさそうだったのでAndroidタブレットを買いました。楽したかったのです。

開発に関する一番の強みは?
 書いたプログラムを実機でデバックできることはiOS系タブレットと比べた時の一番の違いではないでしょうか。iPad等ではDevelopers Program(年間8400円)に入らないと実機でテスト出来ません。(非公式には可能かも?)
 それから、Google公認でArduinoベースのハードウエア開発キットを公開しています。(ADK→http://developer.android.com/tools/adk/index.html)このおかげでAndroidとArduinoの相性はバッチリです。
 また、Processingというプログラムに不慣れなアーティストでもプログラムできるようにと開発された開発言語で実機で動作するアプリケーションを作成することができます。

個人的に買うのはアリなの?
 月曜日から使い始めて3日間経過したわけですが、Nexus7すっごくいいです。メインメールにGMailを使い、カレンダーにGoogle Calenderを使い、作業時間管理にGoogle Docsを使い、ブログにBloggerを使う僕にとってはこの純正アプリ感が心地いいです。ただ、パソコンとかデジタルガジェットをずっと触っているのが嫌いな人はiPadminiの方が幸せになれるかもしれません。例えば、マナーモード切り替えがハードウエアスイッチでできないとか、僕もマナーモードがどこにあるのかわかりませんでした。そういうことをいちいち調べるのが嫌いな人はiPadの方がいいかも。
(どっちをつかっても結局ググる作業は必要になると思いますが)

で結局どうやって使うのさ?
 まあまあ。設定や使い方の解説は、僕が書くまでもなく先人の知恵をお借りします。
参考サイトさま

  • yoppa.org 第11回: ProcessingによるAndroidプログラミング入門
↑読めば加速度センサと電子コンパス使ったプログラムまで実装できるようになる。

ただ、僕自身このページで解説の無いところに引っかかって時間をくっちゃったのでこれからやる人たちはこれに気をつけましょう(Windows7の場合)。


  • 実機デバックするときにただつなぐだけでは、デバックモードで繋がらない
まず、Nexus7に「私は開発用に使われる(やめて!私に乱暴する気でしょう?Windowsみたいに!)」ということを認識させなければなりません。その方法は、(Nexus7の)設定→タブレット情報→ビルド番号のところを7回連続でぱぱぱっとタップすること。これであなたを開発者であると認識してくれます。
 次にドライバを入れる必要があります。初めて繋ぐとドライバがインストールされますが、なんやかんや失敗しています。(Windowsの)コントロールパネル→システムとセキュリティ→システム→デバイスマネージャーを開いてください。
 こんな感じでNexusの部分に注意マークがついています。このようになっていたらNexusの部分を右クリック→ドライバーソフトウエアの更新→コンピュータを参照してドライバーソフトウエアを検索→インストールしたSDKフォルダ→sdk→extras→google→usb_driverを選択してインストールすれば、完了です。


  • Processingで利用する画像ファイル等の置き場所
Processingで画像データや音声ファイル等のメインソース外のファイルを使うときにはソースと同階層にdataというディレクトリを作成してぼんぼんそこに入れていってください。リソースの相対パスのスタートがデフォルトでそこになっているのだと思います。

 実際に以前作ったLED風時計のプログラムを実機で動かした時の画像。秒が12から13へ変わる瞬間。
 画面の大きさの関係上、座標等は変更が必要でしたが他の部分は変更なしでコンパイル、実行することができます。
非光沢フィルムが欲しい…




2013年1月31日木曜日

OpenCVで取り込んだ画像をARToolKitで用いる形式に変換

フォームアプリケーションを作ったりするときにbmpファイルでないとimageboxに表示できない。 そこで、ARUint8からOpenCVで扱える形式にして、更に変換してBoxに突っ込んだことがある。 その時に使った関数のメモ
上記説明は間違いです。正しくは、
OpenCVでWebカメラから画像を取り込み、Pictureboxに表示させ、OpenCVの画像をARToolKitで使用できるものに変換し、ARToolKit内部の関数で処理を行う。
でした。

//cv::MatからARUint8へ変換
void Cvt_AR_CV(const cv::Mat& cvImage, ARUint8* arImage)
{
 int width = cvImage.cols;
 int height = cvImage.rows;
 int channels = cvImage.channels();
 int cvStep = cvImage.step;
 int arStep = width * 4;

 for(int i = 0; i < height; i++){
  for(int j = 0; j < width; j++){  
   for(int c = 0; c < channels; c++){
    arImage[arStep * i + j * 4 + c] = cvImage.data[cvStep * i + j * channels + c];
   }
  }
 } 
}

//IplImageからARUint8へ変換
void Cvt_AR_CV(IplImage* cvImage, ARUint8* arImage)
{
 int width = cvImage->width;
 int height = cvImage->height;
 int channels = cvImage->nChannels;
 int cvStep = cvImage->widthStep;
 int arStep = width * 4;

 for(int i = 0; i < height; i++){
  for(int j = 0; j < width; j++){  
   for(int c = 0; c < channels; c++){
    arImage[arStep * i + j * 4 + c] = cvImage->imageData[cvStep * i + j * channels + c];
   }
  }
 } 
}

個人的備忘録

リアルタイムトラッカーの吐き出したCSV

俺のプログラムで読み込ませるときはyawとpitchを交換な。

2013年1月20日日曜日

あの人の研究所について

バーチャル・リアリティとかメディア・アートなんかに興味がある人は見てみたら面白いかも知れません。
あの人の研究所

あの人って誰よ?
 あの人です。僕も今日正体、知りました。自分で知ったほうが喜びが増すかと。

あの人の研究論文が面白い
 あの人との関係があるのか無いのかよくわかりませんが、あの人の研究論文と言うものが発行されているらしく、コミケでも売られています。Vol.1No.1、Vol.1No.2、Vol.2No.1については全編PDFで閲覧可能です。『技術を無駄遣いすることによって情報科学研究とコンテンツの分野の双方に新しい刺激を与えている, と判断された選り抜きの論文をまとめる』というコンセプトで募集された論文集です。一例で論文タイトルを挙げて行きます。
  • 衛生写真から地形のエロ度を判別するための基礎検討~体位四十八手を題材として~
  • 夢のなかでエロいVR体験をするためのヘッドマウントオナペッツ(HMO)の提案
  • 何気ない日常をドMが少しだけ幸せに過ごすための一手法 -願望顔プロジェクション-
 
「変態だー」
 一部を取り上げて全体を決めちゃいけない。と僕は思います。全部見てから判断してください。僕はこういうの大好きです。
 「うわー。気持ち悪い」「これだから理系は」「このむっつりさんめ」みたいな声が聞こえてきそうです。それは褒め言葉です。多分。

最後に
 論文の投稿者の半分くらいが東大(東京大学)っぽい。
 が、それで見直しちゃうのはおかしい。変態は変態。

2013年1月17日木曜日

専攻科研究期間が半分終わったので振り返り

先日、専攻科研究報告が終わりました。これで本科五年生から3年間の青木研での研究の半分以上が終わったことになります。ちょうどいい機会だと思うので、僕の研究とか学校生活について振り返ってみようと思います。

なぜ専攻科に入ったか
 僕が専攻科に入ったのは「まだ就職したくなかった」ということ、かといって「大学に編入する学力がなかった」こと、それから「先生から学び取りたいことが多かった」からだと思う。
 当時なんとなくプログラムが書けたのできっと就職するならソフトウェアハウスかIT系の企業しか無いと思っていた。世間一般的には高専生というとすごい技術を持っていたり、深い専門知識を持っているようなイメージがあると思うが、実情はそんなことはなくてある一人握りの人間が活躍するからそのようなイメージを持たれていると思う。高専生で情報系の学科に所属していたとしてもプログラムが嫌いだったり、書かないという人もいる。だからプログラムが少し得意だからといってそのまま会社に就職すれば欝になって死ぬか、地獄の研修で死ぬかのどちらかだと思っていた。それに学生にしかできないことがきっとあってそれができるチャンスを失ってしまうのが嫌だった。そんな訳で就職をすることは最初から頭になかった。
 青木先生との関わりが始まったのはハイテク鬼ごっこの計画の時からであった。そのころ僕はTwitterを初めて、天才プログラマーとして認定されている高専生や高専カンファレンスで活躍する高専生というものを初めて知った。そこで僕も「なにかやり遂げ、インターネットの世界に名を成したい。」と始めたのがTechKidsでありハイテク鬼ごっこであった。結局一回実施した後やっていないのだが。その時に僕の背中を蹴っ飛ばしてくれたのが先生だった。先生の人柄に惚れ込んでしまった僕はどうにかして先生の研究室で研究したいと考えた。その末に僕は「大学の編入試験を受験して合格する自信はない。しかし学生で居たい。専攻科単願すれば必ず青木研に入れるだろう。」ということで研究室配属会議の直前に専攻科単願を決めた。このことはクラスや学科に大きな迷惑をかけた。無理を押し通すようなことになることは解っていたのだけど、これが僕に取って最善の策だった。すごく自己中心的な考え方だった。申し訳ありませんでした。

研究室での生活
 そのようなごたごたの末に青木研究室に入った僕は、「研究では一番になろう」と決めた。それでしか周りの人を納得されられないと考えたからだった。アルバイトも終電で家に帰ったあとにできるものに決めた。5年生の時には学会にも二回行かせていただいて貴重な体験をすることができた。僕は研究発表がとても苦手であると知った。高専シンポジウムの発表などは青木先生にしてあんな発表は見たことがないと言わしめたほどであった。その後二回ほど学会発表を経験したが少しは成長したかなと思う。とにかく研究室にはやることが山ほどあって僕ができていることはその中のちょびっとでしか無いので残りの一年半で少しでも貢献出来たらと思う。

専攻科というところ
 専攻科というところはとにかく人との関わりの輪が小さくなる。研究室、同学年、アルバイトぐらいの出会いしかない。去年の4月頃、先生にカタリバの大人カフェに連れて行ってもらった。その時感じたのは人に自分のことを話すことはとても気持ちがいいということだった。会場はホテルの会議室のようなところだったのだが、窓が曇って外が見えなくなるほどの熱気だった。このように輪を自ら広げていくこともいいと思うが、専攻科が良くないとは思っていない。小さい輪であるからこそ強い輪になると僕は思う。

休みグセ
 専攻科に入って僕についてしまった悪いものは休みグセだと思う。深夜アルバイトをしていたことも理由の一つに入るのかもしれないが、講義に遅刻したり欠席してしまうようになった。直さねばならないと思う。

考え方
 対して僕が先生から盗みとったのは仕事などの依頼に対する考え方。たとえできないかもしれなくとも失礼であっても誘いにはできるだけ早く良い返事をすること。そういう時にはこの人ならできると依頼者は考えているということなので落胆させる可能性があっても「自分の実力じゃ…」とか考えず、少しでも自分にプラスになるなら受けたほうがいいと思うようになった。今日、行く?にすぐ返事できるように。それは心構えと準備を日頃からしっかりしておきゃなきゃいけないって事にもなると思うけど。断ることもあるので僕はまだまだ。

これから
 青木研での生活は後半戦に入ったがこれから更に忙しくなると思う。大学院へ行くことを考えているので勉強もしなくちゃいけない。やるべきことを見極めるということをしっかりできるようになろうと思う。

2013年1月10日木曜日

【GMail】これさえあればマウスいらずのショートカット4選

マウスを使うことが作業効率の低下につながっている…!
最近そう考えるようになったイイタニです。

Gmailのキーボードショートカットをよく使う順にまとめました。

① 読んでないけど未読メールをまとめて既読にしちゃう!

     * + u : 未読メール選択
     Shift + i :既読にする
     * + n : 全メール選択解除

② JKで移動!

     j : 以前のメール(スレッド)へ
     k : 直近のメール(スレッド)へ

③ スター☆でメールにしるしを。

     s : 選択中のメールにスターを付ける
      
④ ワンタッチで返信メール作成

     r : 返信の作成
     Shift + r :新しいウインドウで返信の作成

とりあえずこれだけ覚えればマウスに触らずにバリバリメールを送れるはず!

その他の便利なキーボードショートカットは
http://support.google.com/mail/bin/answer.py?hl=ja&ctx=mail&answer=6594
で見ることができます。

快適なGMailライフを!

2013年1月7日月曜日

新研究機材!


新年あけましておめでとうございます。

我々学生は2013年初めての講義を受けたところでした。
昼休み研究室で「3月のライオン」を読んでいるところにこんなものが…

 


なにかと思ったらエプソンのMOVERIO BT-1とソニーのHDZ-T1でした。
圧倒的じゃないか、我が軍は!


ところで
(友人Wの許諾済み)








こういうことですか?


MOVERIOはAndroid2.2を搭載していてスタンドアロン可能なシースルーヘッドマウントディスプレイとしては世界初のものだそうです。
外でこれを使えば、”確実”に変態の称号を与えられるでしょうね。

最近プログラムを書いてませんが、やらなきゃなあという感じです。
こうすればできそうということがわかってるとなかなか手がつかないですね。
キッカケが足りないかな…

以下二台のヘッドマウントディスプレイを使っての感想
・MOVERIOはシースルー型にしては画面外の視界が暗いような気がする
・でかい(故に屋内、一人でいるときにしか使えない。)
・2つとも画面はそれなりに大きい。音質にかなりこだわっているような感じ。