今回はANEを試してみました。
ANEとは、AIRからデバイスのネイティブコードと連携できる仕組みのことで、今回のテストではAIRから複雑な計算処理だけをネイティブコードに任せて、AIRを爆速で動かしてみます。
今回のテスト内容は↓この記事をかなり参考にさせていただきました。ありがとうございます。
・Air Native Extension(ANE) 実行速度実験2 + 画像処理 » Every day is Carnival
テスト内容は、
(1) 動画を毎フレームごとに
(2) 1200×800px のBitmapDataにdrawして
(3) 緑色以外の部分だけグレースケールに変換する
というものです。
(3) の部分だけをネイティブコードにお任せします。
元の動画はこちらを使いました。
ネイティブコード(C++)で計算してみた動画です。環境はWindows7です。
FPSは 30 出ています。
これ以上BitmapDataのサイズが大きくなると、フレームレートが落ちてくるのですが、2010年に買ったノートPC(Core i7)なので、最新のデスクトップPCだともう少し大きなBitmapDataも処理できるはずです。
C++での画像変換処理のコードはこんな感じです。(参考blog記事に少し手を加えただけです。)
FREObject grayScale(
FREContext ctx,
void* funcData,
uint32_t argc,
FREObject argv[]
) {
FREByteArray ba;
int32_t w, h;
FREAcquireByteArray(argv[0], &ba);
FREGetObjectAsInt32(argv[1], &w);
FREGetObjectAsInt32(argv[2], &h);
uint32_t *p, *data = (uint32_t*)(ba.bytes);
int r, g, b;
p = data;
for(int y = 0; y < h; ++y) {
for(int x = 0; x < w; ++x) {
r = *p >> 8 & 0xff;
g = *p >> 16 & 0xff;
b = *p >> 24 & 0xff;
if(r>g || b>g){
r = g = b = (r+g+b)/3;
}
*p = b << 24 | g << 16 | r << 8 | 0xff;
p++;
}
}
FREReleaseByteArray(argv[0]);
return FREObject();
}
そして、比較用にAS3だけで同じ画像変換処理を行ったものはこちらです。
FPSは 2 しか出ていません。
AS3には暴力的な計算処理みたいです。
AS3での画像変換処理のコードはこんな感じです。
private function grayScale(bmpData:BitmapData):void{
bmpData.lock();
var color:uint;
var r:uint;
var b:uint;
var g:uint;
for(var i:int = 0; i < bmpData.height; i++){
for(var j:int = 0; j < bmpData.width; j++){
color = bmpData.getPixel(j, i);
r = color & 0xFF;
g = (color>>8) & 0xFF;
b = (color >> 16) & 0xFF;
if(r>g || b>g){
r = g = b = (r+g+b)/3;
}
bmpData.setPixel(j,i, (b<<16)|(g<<8)|r);
}
}
bmpData.unlock();
}
ネイティブコードの方がかなり早いことが実感できました!
次は、openFreamworksのライブラリ等とも連携してみたいなー!
2012 年 11 月 30 日|制作|No Comments
3Dプリンタのキットを購入しました。
Lunavast Prusa 3Dプリンターキットっていう商品です。
届いた部品
部品をよく見ると、3Dプリンタで出力されたようなプラスチックのパーツ(左側の黒い物体)も入っています。
後は、ボルトやナットやステッピングモーター等、市販で買えるようなパーツが結構入っています。
ということは、ボルトやナットをうまく組み合わせて、足りないパーツだけ3Dプリンタで出力すれば、また別のオリジナル機械が作れてしまうんじゃないかと夢が広がっていきます。
こりゃ~テンションマックスやー!
これを組み立てていきます。
なんとか完成!
緑色のホースみたいなのがプリントされる樹脂で、これを熱で溶かしながら目的の形を作っていきます。
ではさっそくテストプリント、スイッチオン!
モーターの音「キュイーンキュイーン」
僕「すげー!」
モーターの音「デロデロデロデロ」
僕「たまらーん!」
結果
途中で底面がズレて移動してしまいこんな感じになっちゃいましたが、ズレ対策をとったり、ハードもソフト側の設定も微調整してもう少し精度を上げていきたいと思います。
それにしても自分で組み立てた機械が動くというのは実に気持ちがいいですな!
2012 年 10 月 20 日|制作|No Comments
最近読んで面白かったマンガです。
鉄工所で働くナッちゃんが、毎回やってくるちょっとややこしい内容の仕事(機械の修理や製作等)を工夫しながら解決していくといった内容の工作マンガです。
機械作りの工程が、大雑把にですが分かってきて面白いです。
このマンガを読むまでは、鉄製品のパーツの大部分は、鉄の塊を削ったり、溶かした鉄を型に流し込んだりして作るのかなーと漠然と思ってたんですが、このマンガを読んでいると板や棒状の鉄を曲げたり削ったり溶接したりネジで固定したりするだけで、かなりの色んな形が出来てしまうんだなーと分かりました。
言われてみれば3Dグラフィックソフトでも、プリミティブな形の組み合わせでいろんな形が作れますしね。
後、主人公のナッちゃんがものすごい楽しそうにものづくりをするので、こっちも仕事等が楽しくなってくるという点でもオススメのマンガです。
2012 年 10 月 16 日|日常|No Comments
階段の照明スイッチって、下の階と上の階の両方についていることが一般的だと思いますが、このスイッチの回路が臨機応変な感じで僕は大好きです。
夜中に思い出してドキドキしたりします。
階段の下の階のスイッチが上の図のA、上の階のスイッチがBだとして、照明が点いているときにどちらのスイッチを切り替えても照明は消えて、次にどちらのスイッチを切り替えても照明は点きます。
臨機応変な仕組みですね。
この回路はスイッチが2か所あるとき用のものですが、スイッチが3か所あるときはどうなるんだろうと、ふと思ったので考えてみました。
20分ぐらい考えてみたんですが、3か所すべてのスイッチのどれを押してもオンオフ切り替えれるというところまでなかなか行き着きません。。
ついにギブアップしてインターネットで調べてみると、下の4路スイッチなるものを使えば可能ということが分かりました。
このスイッチだけ見てもまだピンとこなかったのですが、回路を見ると納得!
スイッチBが4路スイッチですね。こいつはすごい!
考えていた時はもっと複雑な回路になるのかなと思っていたのですが、実にシンプルです。ドキドキします。
そしてこの4路スイッチのような、パッと見ただけでは何の役に立つのか分からなさそうな部品も、存在を知っているかどうかでいざというときに出てくるアイデアの差になるんでしょうな~。
と、部品は普段からいろいろチェックしておこうと思ったのでした。
2012 年 9 月 8 日|制作|No Comments
Arduinoで複数のRGBフルカラーLEDを制御してみようと思ったのですが、まずArduinoでPWM出力できるピンは6つしかなく、フルカラーLEDを1つ制御するには3つのPWM出力ピンを使う為、ArduinoだけだとフルカラーLED2つまでしか制御できないということになります。
そこで、もっと多量のPWM出力を制御できないか調べたところ、TLC5940というICから16ピン分のPWM出力を制御できるということが分かりました。さらにTLC5940どうしでデイジーチェーン接続していけば、32、48、、というようにPWM出力のピン数を増やしていけるみたいです。
さっそく購入したTLC5940
そしてLEDのカソード側とTLC5940のPWM出力を繋ぐので、RGB LEDはアノードコモンのものが必要になります。
角型フルカラーLED OSTA71A1D-A アノードコモン
このLEDの足をブレッドボードに4つの導線に分けて刺そうとすると、あと1穴分幅が足りなくてブレッドボードに刺さりません。むむむ、もどかしいです。
他に良さそうなアノードコモンのRGB LEDを見つけれなかったので、このLEDの足に銅線をはんだ付けしてブレッドボードに刺せるようにします。(もっと簡単な方法があったのでしょうかね?)
LEDの足をヒートクリップで挟んで熱からLEDを守る!あ、この写真は違う足を挟んでたw
足が長くなり、横たわるしかなくなったLED
お次は回路を組みます。
「Arduino 日本語リファレンス」のTLC5940のページにあった回路を参考に組みました。
2つのTLC5940をデイジーチェーン接続で繋いでいます。RGB LEDは10個
ランダムな色で順番に光るようにした動画です。
Arduinoのコードはこちら
// "tlc_config.h"の値を下記に変更
// #define NUM_TLCS 2
#include "Tlc5940.h"
#define MAX_BRIGHTNESS 4095
void setup() {
Tlc.init();
}
void loop() {
int myR = random(4)*(MAX_BRIGHTNESS/3);
int myG = random(4)*(MAX_BRIGHTNESS/3);
int myB = random(4)*(MAX_BRIGHTNESS/3);
//channelの 0 と 31 は未接続
for (TLC_CHANNEL_TYPE channel = 1; channel < (NUM_TLCS * 16)-2; channel += 3) {
Tlc.clear();
Tlc.set(channel + 0, myR);
Tlc.set(channel + 1, myG);
Tlc.set(channel + 2, myB);
Tlc.update();
delay(70);
}
}
今後はLEDの数をもっと増やしてテストを続けて行きたいと思います。
お金がかかります。ブルジョアの道楽です。
2012 年 8 月 16 日|制作|2 Comments