Archive for category tips

ネットワークラジコンをコントロール

昨晩Macからネットワークを経由し、ラジコン(組み込みLinuxに繋がったArduino)を操作できました。

ネットワークからArduinoを操作するのに、「Serial Proxy」を使いました。

「Serial Proxy」を使うことで、ストリームからシリアルの制御が可能となります。

Linuxへのインストールは簡単

  1. Arduino公式サイトのダウンロードページの一番下にある「Serial Proxy」のソース版をダウンロードhttp://www.arduino.cc/en/Main/Software
  2. make
  3. serproxy.cfgを設定。comm_baud=9600、serial_device1=/dev/ttyUSB0に設定
  4. ./serproxy を実行

あとはProcessingのコードをストリーム用に修正。

以下は実際に利用したWiiハンドルからネットワーク越しにラジコンを操作するコードです。

# ハンドル周りに角度変更後の値から±5~10度の遊びを加えると操作しやすくなります(たぶん


import lll.wrj4P5.*;
import lll.Loc.*;
import processing.net.*;

float i = 0.0;
float angle = 0.0;
int kakudo = 0;
int old_kakudo = 0;

Wrj4P5 wii;
LinkedList p = new LinkedList();
Client client;

void setup() {

size(300,300,P3D);

wii=new Wrj4P5(this).connect();

client = new Client(this, “10.0.2.2”, 5331);

smooth();

rectMode(CENTER);

}

void draw() {

if (wii.isConnecting()) return;

stroke(32);

fill(255);

ellipse(width/2, height/2, width/1.6, width/1.6);

translate(width/2,height/2);

rotate( atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) );

fill(0);

rect(0,0,width/2,height/7);

angle = atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) * 180 / PI;

if (angle > 0) {

kakudo = int(angle) -90;

kakudo = 180 – kakudo;

}

if (angle < 0) {

kakudo = int(angle) * -1 -90;

}

kakudo = int(kakudo * 0.1) * 10;

if (kakudo >= 65 && kakudo <= 115) kakudo = 90;

if (kakudo >= 115 && kakudo <= 135) kakudo = 115;

if (kakudo >= 135) kakudo = 135;

if (kakudo >= 45 && kakudo <= 65) kakudo = 65;

if (kakudo <= 45) kakudo = 45;

if (old_kakudo != kakudo){

old_kakudo = kakudo;

client.write(str(kakudo) + “sn”);

println(client.read());

}

}

void buttonPressed(RimokonEvent evt,int rid){

if (evt.wasPressed(evt.TWO)) {

client.write(“255wn”);

}

if (evt.wasPressed(evt.ONE)) {

client.write(“150wn”);

}

}
void buttonReleased(RimokonEvent evt,int rid){

if (evt.wasReleased(evt.TWO)) {

client.write(“0wn”);

}

if (evt.wasReleased(evt.ONE)) {

client.write(“0wn”);

}

}

以上です。

「Serial Proxy」を使うとFlashなどからもArduinoの操作が可能となります。何が出来るか想像するだけでご飯が3杯は食べれます。もっと?

Arduinoを始めてからここまで2週間かかりました。Amazonの商品発送が9/1なので間違いないです。

平日は仕事しながら家で開発してましたので結構疲れました。

次回はラジコンを操作している動画のアップを予定してます。 # Serial Proxyとの通信に不具合があるので調整中です。

おまけ:Processing 1.0.7 を利用することでMacの64bitでもwiiリモコンを操作できました。

, , , , , , , , , , , , , , ,

2 Comments

wiiリモコンの制御

昨夜組み込みLinuxのインストールも終え、もうすぐラジコンが完成します。

今日は、Wiiリモコンの制御について書きます。

wiiリモコンの制御にはProcessing 1.0.6を使いました。

ProcessingでWiiリモコンを扱うにはライブラリの用意が必要です。

今回はwrj4P5.jar (alpha-011)を利用しますので以下を用意しました。

  • Loc.jar (beta 005)
  • avetanabt-20070719.tgz or bluecove-2.1.0.jar
  • WiiRemoteJ v1.6.zip.gz

avetanabtはLinuxで利用する以外は有料ですので、macやwindowsの方はbluecoveがおすすめです。

Linux用のbluecove-2.1.0は幾つかのライブラリが不足してますので、avetanabtがおすすめです。

私の環境では、Linux(ubuntu)とMacの両方にwrj4P5をインストールしました。

インストールに手間取った点を書きますと、

Macでは、wrj4P5を利用する際、Javaを64bit から 32bit に変更が必要でした。ここが解らず悩みました。

LinuxではaventaBTのインストールに若干手間取りました。

以下は参考までにインストールログです。

$ mkdir ~/src/aventaBT
$ cd ~/src/aventaBT
$ wget "http://downloads.sourceforge.net/project/avetanabt/avetanabt/20070719/avetanabt-20070719.tgz?use_mirror=jaist"
$ tar xvzf avetanabt-20070719.tgz
$ sudo aptitude install autoconf2.13
$ sudo aptitude install g++
$ export JDK_HOME=/usr/lib/jvm/java-6-sun
$ export BIN_DIR=/home/[user]/src/aventaBT/binaries
$ ./install
$ cp binaries/avetanaBT.jar ~/src/processing-1.0.6/libraries/wrj4P5/library

以上で、インストール出来たとしまして、ハンドルの制御コードは以下になります。


import lll.wrj4P5.*;
import lll.Loc.*;

float angle = 0.0;

Wrj4P5 wii;
LinkedList p = new LinkedList();

void setup() {

size(300,300,P3D);

wii=new Wrj4P5(this).connect();

smooth();

rectMode(CENTER);

}

void draw() {

if (wii.isConnecting()) return;

stroke(32);

fill(255);

ellipse(width/2, height/2, width/1.6, width/1.6);

translate(width/2,height/2);

rotate( atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) );

fill(0);

rect(0,0,width/2,height/7);

}

wii リモコンはラジアン値を返しますので、角度を求める場合は以下の公式になります。

angle = atan2( y , x ) * 180 / PI;

角度を求めれたことでハンドルの制御も計算しやすくなりましたね。

これにシリアル通信のコードを加えることで、Arudinoの制御が出来ます。

今回は以上です。

, , , , , , , , , , , , ,

No Comments

サーボのコントロール

昨夜は遅くまでラジコンに実装予定の組み込みLinuxを触ってました。

組み込みLinuxのファーストステップとして、シリアル接続が前提となるのですが、RS-232シリアルケーブルがそのまま繋がると思っていましたら、組み込みのRS-232 は10pin だったのです!

9pinのRS-232 ケーブルは用意してたのですが、これには困りました。

実際使われるpinはTX/RX、GNDと3本のケーブルのみでしたので、ピンを直刺しすることで対応できました。

また、この話は後日まとめてから書きます。

今日はサーボの制御について書きます。

サーボの制御はArduinoというイタリア生まれのマイコンで行っています。

普通の基盤だと決まったことしか出来ませんが、Arduinoは普通の基盤と違い配線の仕方と、プログラム制御で様々なことが出来ます。

サーボのコントロール方法は、パルス幅の信号長で角度を制御します。

実際はサーボ向けにライブラリがあり、角度を指定するだけで制御が行えます。

気をつける点としては、ラジコンのシャーシの稼動域よりもサーボの稼動域が広いことです。

サーボの稼動域がシャーシの稼動域を超えるとサーボが負荷で嫌な音を立てて潰れます。

実際に潰しましたので間違いないです!

なので先にサーボを取り外し、ラジコンに付属のプロポと同じ稼動域であるか、確認をオススメします。

以下はサーボと前後のモーターをシリアル通信で制御するコードです。

Arduinoでは短いコードで簡潔に書けます。

よろしければ参考ください。

#include
#define servoPin 9
#define Motor 3
Servo myservo;

void setup()
{

pinMode(Motor,OUTPUT);

myservo.attach(servoPin);

Serial.begin(9600);

Serial.println(“Ready”);

}

void loop() {

static int v = 0;

if ( Serial.available() > 0) {

char ch = Serial.read();

switch(ch) {

case ‘0’…’9′:

v = v * 10 + ch – ‘0’;

break;

case ‘s’:

if (v <= 45) v = 45;

if (v >= 135) v = 135;

myservo.write(v);

Serial.print(v);

Serial.println(‘s’);

v = 0;

break;

case ‘w’:

if (v <= 0) v = 0;

if (v >= 255) v = 255;

analogWrite(Motor,v);

Serial.print(v);

Serial.println(‘w’);

v = 0;

break;

}

}

}

以下は簡易な回路図のつもりです。
電源は外部電源を利用してます。外部電源はvinのpinから電源を引きます。
サーボ制御

回路図に1点間違いがありました。
モーターからのワイヤはモスの真ん中にさします。モスに繋がるマイナス電源は端にさします。

, , , , ,

19 Comments

パソコンからラジコンを操作

はじめまして。ラボに初参加のinfoaliveのo2です。

時々書かせていただきますのでお見知りおきください。

普段はAMP(Apache,MySQL,PHP) で開発してますが、趣味でマイコンの制御を始めましたので、マイコンの事を書かせていただきます。

マイコンは1週間前まで触ったことすらなかったのですが、唐突にパソコンからラジコンの制御がしたくなり始めました。

きっかけはJoker Racerを見て、これは面白い是非やってみようと思った次第です。

Joker Racerはインターネットを通じて実物のラジコンを操作するサービスです。説明終わり。

では早速、インターネットを通じてラジコンを操作するにはどうすればいいかを考えます。

ラジコンをパソコンから操作するにはマイコンをパソコンに繋げば出来そうです。

マイコンが制御するのは左右に動作するサーボモーターと、前後の動作をするモーターの2つを制御することになります。

ラジコンに直接パソコンのような大きなものは乗りませんので、組み込み系に使われるARMのLinuxを利用します。

LinuxにはWEBカメラと無線LANを積めば遠隔からも操作ができますね。

ラジコンのハンドリングはキーボードで操作するのは面白くないのでWiiリモコンを利用することにします。

現段階では、パソコンにマイコンを繋いだ状態でラジコンの制御が出来るところまで完成してます。

詳しくは追々書くとしまして、Youtubeにアップした動画をどうぞ!

, , , , , ,

No Comments

ムービークリップを特定フレームまで再生してから停止させる

Flashでゲームを作成した場合に、ヒットポイントを表示するゲージを扱うことがあるかと思います。

例えばダメージをうけた場合に特定の位置まで

gotoAndStop([フレーム番号]);

でも良いのですが、これだといきなり減ってしまい味気ない感じになってしまいます。

モーショントゥイーンしつつ指定の位置で停止出来ないものかと考えたのですが、_rootに停止位置フラグを置いて各フレームに、

if(_root.[停止位置の変数] == [フレーム番号]){

this.stop();

}

とするのも芸がありません。(100フレームあったとして全てに書くのもバカバカしいですしね)

こういった場合は次のようにするのが良いのではないでしょうか?(AS2.0です)

ステージ上に再生したいサンプルのムービークリップ (インスタンス名:test_mc )とテスト用の再生開始ボタン(インスタンス名:test_button)を配置します。test_mcの1フレーム目にはstop();を記述して再生はストップした状態です。

(ボタンをクリックした場合に25フレーム目まで再生して停止するサンプルスクリプト)

var test_mc_stop = 1;

test_button.onRelease = function(){

test_mc_stop = 25;

test_mc.play();

}

test_mc.onEnterFrame = function(){

if(this._currentframe == test_mc_stop){

this.stop();

}

}

onEnterFrameイベントで、毎フレーム呼び出されて currentframe で現在のフレーム位置をチェック。

予めボタンクリック時にセットされたtest_mc_stopと同じフレーム位置であれば再生を停止します。

AS3.0ではもう少しスマートな方法があるのかもしれませんが・・・・・

,

No Comments

文字コードUTF-8のページに設置したmailtoの文字化け

弊社のサービス「のみテレ」に幹事サポート機能を追加したので、社内のお花見告知に早速使用してみたのですが・・・

特定のメーラーで文字化けが発生するという報告がありました。

基本はモバイル向けですので、モバイル端末では問題ないのを確認していたのですが、PCではOutlook系のメーラーにてサブジェクト、本文ともに文字化けしていました。

調べてみるとどうやらUTF-8のページにUTF-8向けにURLエンコードしたmailtoリンクを設置すると文字化けする模様。

サンプル
shift_jis

utf-8

shift_jis向けにURLエンコードした場合では正常に表示されたのでこちらで問題ないと思いきや・・・

今度はThunberbirdで文字化け発生です。

  • shift_jisで正常に表示される
    • Outlook
    • OutlookExpress(Windows Mail)
    • Becky!2
  • shift_jisでは文字化けする
    • Thunderbird
  • utf-8で正常に表示される
    • Becky!2
    • Thunderbird
  • utf-8で文字化けする
    • Outlook
    • OutlookExpress(Windows Mail)

どうやら「文字化けする場合はこちら」という形でリンクを併記するしかなさそうです。

ちなみにMacの場合は逆にURLエンコードしない方が文字化けしないという情報もありましたので、JavaScriptからOSを判定する必要があるかもしれません。

静的なリンクにはなりませんが、mailtoはSEOも関係ないので問題ないでしょう。

No Comments

Flashへのフォント埋め込みとライセンス

先日「新聞一面ジェネレータ」を作成した際に、固定で作成している大見出しとは別に自由にテキストを入力できる見出し部分のフォントを予め取りこんでおいて新聞風に見せるようにしていました。

しかし、色々と調べてみたところほとんどのフォントベンダーはFlashへのフォンと埋込を認めておらず、ライセンス違反になるとのことで、急遽修正しました。

基本的には第3者へのフォントの再配布と見なされるそうです・・・

確かに空きに選択した文字がアウトラインを伴って表示されるのですが、そのままフォント情報を抜き取って利用できる形にはなっていないんですよね。

(PDFへのフォンと埋込と配布についても同様に扱われる場合もあるそうです)

AdobeにとってみるとPDFやFlashで持っている機能が一部制限されるわけで、そこをなんとかしようとフォントベンダーとの交渉を重ねているようですが、はやく自由度が上がると良いですね。

ちなみにAdobeによると

小塚明朝・ゴシックについては編集可能な状態での埋め込みを許可しているようです。

http://www.adobe.com/jp/type/browser/legal/embeddingeula.html

※新聞一面ジェネレータでも小塚ゴシックを使用しました。

別件でポストカードの裏面を編集できるサイトを構築しましたが、その際はフォントベンダーさんが仲介されていた案件ということもあり、ベンダーさんのご厚意でフォントを埋込可能でしたが、普段はなかなかそうはいかないでしょうし、ましてや今回のような実験的サイトではほとんど収益が発生しないため無理ですね。

どこか思い切ったメーカーさんで、Flashへの埋め込みOK!という形でリリースしていただけるとかえって売上が上がるように思うのは素人考えなんでしょうか?

No Comments

TextField へのスクロールバーの追加

通知表ジェネレータにて縮小表示時に文字が読みづらいためサイズ変更したところ1画面に収まらなくなってしまいました。

そこで、スクロールバーを表示させるためにUIScrollBarというコンポーネントを使用してみました。

コンポーネントを使用するためには、[ウィンドウ]→[コンポーネント]で、コンポーネントウィンドウを開き、UIScrollBarをドラッグして、TextFieldの端へ配置します。

(この際にオブジェクトへ吸着にチェックが入っていることを確認しておいてください)

右端側へ吸着させれば垂直の、下部に吸着させれば水平のスクロールバーとなります。

あとは、TextFieldに収まりきらないテキストがセットされると自動的にスクロールバーが表示されます。

ただ、方法によってはUIScrollBarがうまく表示されない場合があります。

  1. Varsからテキストをセットした場合
  2. TextFieldの変数名とインスタンス名が同じであった場合

1は、TextFieldに変数名を設定し、変数にテキストを代入することによって内容を切り替えていた場合にスクロールバーがうまく表示されません。

TextFieldにインスタンス名を設定し

[TextFieldのインスタンス名].text = “代入するテキスト”;

というようにtextプロパティからテキストをセットする必要があります。

2はインスタンス名と変数名が同じ場合に変数への代入が優先されてスクロールバーが出ないおそれがあるためです。

TextFieldにインスタンス名をつけ、 ‘TextField.text’プロパティを使ってテキストを設定してください。TextFieldにはインスタンス名に加えて変数名も使用できます が、スクリプトに混乱を生じるおそれがありますので、変数名は削除することをお勧めします。

ちなみに、縦横50%のサイズに縮小した場合にスクロールバーが細すぎるため、幅を増やせないかとあれこれ挑戦してみましたが、配置時にサイズ変更をしても、実行してみると元のサイズ(幅16pix)で表示されてしまいます。

Flash CS3 ドキュメンテーションを確認すると

UIScrollBar コンポーネントは、オーサリング時にも実行時にも縦横に変形させることができます。ただし、垂直方向の UIScrollBar の幅、水平方向の UIScrollBar の高さを変更することはできません。

とのことでした。好きな幅に設定できるといいんですけどね。

好みの形にするには自作するしかないようです。

,

No Comments

ダイナミックテキスト(デバイスフォント)へのマスク指定

通知表ジェネレータの表紙には、本人の名前がセットされるようにTextFieldが配置されています。

ページめくりのエフェクトの為、表紙にはマスクがかかっており、裏ページにあわせてマスクが移動することで表紙がだんだん隠れていくのですが・・・・

いざパブリッシュしてみると名前欄が表示されていません。

調べてみたところ、デバイスフォントへのマスク指定はスクリプト側から

MovieClip.setMask()メソッド

にて指定する必要があるようです。

ただ単に動かないマスクであれば良かったのですが、今回は動作の絡んだもののため、仕方なくめくり始めると字が消える形でごまかしてしまいました。

そういえばデバイスフォントの場合、文字の回転をした場合も文字が非表示になってしまうんですよね。

(フォントを埋め込むと正常に回転出来ます)

No Comments

ぐるなびWebサービスのテクニック

こんにちは、メガネダイスキー寺田です。

先日、のみテレ(http://nomikai.tv/)にお店検索を作成した際に、ぐるなびのWebサービスを使わせていただきました。

ホットペッパーや食べログのWebAPIも選択肢にありましたが、ぐるなびを選んだ理由は店舗登録数の多さですね。

http://api.gnavi.co.jp/api/service.htm

作成途中で気づいた点があるので書き綴ってみます。

設備・サービスの応用検索

お店を検索する際、設備・サービスを検索項目に指定することができます。

設備・サービスの項目の説明には、

設備・サービスの文字列をUTF-8で URLエンコードすること

とあのですが、実はこの項目は、複数指定することができます。

  • 半角スペースでAND検索
  • 半角バーティカルライン(|)でOR検索
  • 半角括弧でグループ化

例えば、

個室 (禁煙席|カラオケ)

とすることにより、

個室がありかつ、禁煙席があるかカラオケができる店舗

を、検索することができます。

設備・サービスはマスタを提供していないので、ある程度結果を分析して、どのような設備・サービスが登録されているのか調べないといけません。

今後は、ホットペッパーなどのWebAPIも使って、便利なサービスを作っていきたいと思います。

No Comments