Monday, December 5, 2011

OpenCVのSURFでARToolkit

ずいぶん昔に作った【パッケージから】巡音さんがやってきた【召喚】のソースが見たいと言われたのだけど、そんなものは残ってなかったのでとりあえずやっつけでARToolkitのマーカの代わりにSURFの画像マッチングを使うプログラムを作成。
ソースはこちら
OpenCV2.1, Ubuntu11.10, ARToolkit 2.72.1で動作確認しています。
ARToolkitのsimpleTest.cをベースに、OpenCVのfind_obj.cppの関数を利用しています。

すごく汚いコードな上、エラーチェックもせず、メモリ解放もろくにやってないので、ソースを見る人は覚悟してください。



Saturday, December 3, 2011

MTM07行ってきた

Make: Tokyo Meeting 07に行ってきました。
ついつい面白がってポケットガイガーとか、AquesTalk picoとか買ってみたり。
kumaduinoの基盤とか、他にもいろいろ。

ああいうの見に行くと、やっぱり自分でもなにか作りたくなるね。


Sunday, October 23, 2011

ようやく造形完成

のんびり進めていた球体関節人形が、一応造形完了。

Saturday, August 27, 2011

SICPよんでみる 3.3.3

計算機プログラムの構造と解釈。
3.3.3、テーブル構造のハナシ。









Saturday, July 30, 2011

SICPよんでみる 3.3.2

計算機プログラムの構造と解釈3.3.2。
キュー構造の紹介







Sunday, July 10, 2011

SICPよんでみる 3.3.1

計算機プログラムの構造と解釈3.3.1。
ペアの破壊的再代入について。









Saturday, June 25, 2011

EP121のACアダプタ修理

うっかりEP121を落としたらプラグが割れてしまったので、とりあえず何とか対処してみました。
まずは共立エレショップDCプラグの注文。内径1.1φ、外径3.0φ。
ただDC12V/0.5Aなのがかなり心配。19Vの3.0Aをフルに通すことは無くても、発熱とかしないといいけど…


ジャンクに19.5Vがなかったので、19Vでも多分大丈夫だろうと確保。ジャンクのくせに高い。

被覆を剥いて適当にはんだ付け。

今のところ動作に問題なし。

Friday, June 10, 2011

JPEGカメラ

スイッチ・サイエンスLinkSpriteシリアル接続JPEGカラーカメラを動作テスト。

とりあえず何も考えずにシリアルに出力して、それをそのまま保存してみる。


一応撮影はできるみたいだけど、やっぱり転送速度が遅い。
9600bpsだから仕方ないんだけどね。

撮影はArduinoで下のようなプログラムを使ってテスト。
リセットボタンを押すと吐き出されてくるバイナリを、そのままシリアルコンソールで保存しただけ。
ひとまず使えることは確認できた。

/*
JPEG Camera Example Sketch

Hardware Notes:
The camera Rx/Tx should be attached to pins 2 and 3.
IMPORTANT: The JPEG camera requires a TTL level shifter between the camera output
and the arduino. Bypassing this may damage the Arduino pins.
*/

#include <JPEGCamera.h>
#include <NewSoftSerial.h>

JPEGCamera camera;

char response[32];
unsigned int count=0;
int size=0;
int address=0;
int eof=0;

void setup()
{
//Setup the camera, serial port
camera.begin();
Serial.begin(9600);

//Reset the camera
count=camera.reset(response);
delay(3000);

//Take a picture
count=camera.takePicture(response);

//Get the size of the picture
count = camera.getSize(response, &size);

while(address < size)
{
//Read the data starting at the current address.
count=camera.readData(response, address);
//Store all of the data that we read to the SD card
for(int i=0; i //Check the response for the eof indicator (0xFF, 0xD9). If we find it, set the eof flag
if((response[i] == (char)0xD9) && (response[i-1]==(char)0xFF))eof=1;
Serial.print(response[i], BYTE);
//If we found the eof character, get out of this loop and stop reading data
if(eof==1)break;
}
//Increment the current address by the number of bytes we read
address+=count;
//Make sure we stop reading data if the eof flag is set.
if(eof==1)break;
}
}

void loop()
{

}

さて、次の目標はと…

Sunday, May 29, 2011

XBee通信実験

XBee ZBの通信実験。
この辺のページとかこのページとかを見ながら通信実験の準備。


子機は送受信端子を短絡させてループバック。


家の端から端まで離してもまあまあの通信強度。

細かい設定がよくわかってないので、少しずつ調べていかないと。

XBee組み立て

スイッチサイエンスのXBeeピッチ変換基板とソケットのセットを組み立ててみた。
ついでに動作確認のために適当にUSB変換モジュールと組み合わせ。
手持ちのじゃ5Vしか取れないけど、たまたま手元に3.3VのレギュレータがあったからそれをかましてXBeeに電力供給。

USBモジュールのRXをXBeeの左上から2番目(Vccの下)に、TXを3番目に接続してひとまず完成。


X-CTUをインストールして、接続テストをすると問題なく接続できて、
Modem Configurationタブで設定を読み込みも成功。

…というところまででいったん終了。設定や通信テストはまた今度。

Wednesday, May 25, 2011

秋月のATmegaキット

秋月のATmega168/328マイコンボードキット――というよりもArduinoキットと言った方が良いかも。
とりあえず組み立てて、Arduinoブートローダを書き込んでみた。
結構苦労して、最終的には楽な方に逃げてしまったのだけど、まあそれも含めて覚え書き。

結論から言うと、ATMega168Pへの書き込みがどうしてもうまくいきませんでした。
使ったのは純正のAVRライタ。

ブートローダの書き込みにはpermissionが~と言われるので、とりあえず管理者モードでArduinoIDEを起動
$ sudo arduino
あとは168で5Vのブートローダを選べば…
avrdude: Expected signature for ATMEGA168 is 1E 94 06
Double check chip, or use -F to override this check.
秋月のキット付属のマイコンはATmega168pで168じゃないから、チェックでハネられてしまうみたい。

この辺りのサイトを参考に/usr/share/arduino/hardware/tools/avrdude.confを差し替え。
http://d.hatena.ne.jp/LaclefYoshi/20110108/1294475337
http://www.geocities.jp/arduino_diecimila/bootloader/index.html
なんか妙なエラーが出たのでコメントアウト…はともかく、それでも結局うまく書き込めない。
(avrdude.confは元に戻しました)

WindowsのAVR Studioからブートローダを書き込んでみると、エラーも無くブートローダの書き込み自体は成功している様子。
そこでArduinoIDEからスケッチを書き込もうとすると
avrdude: stk500_recv(): programmer is not responding

結局よくわからないので、マイコンをATMega328Pに取り替えて、ターゲットボードをArduinoUNOとしてIDEからブートローダを書き込んでみると、拍子抜けするほどあっさり成功。
ライタを外してスケッチを書き込んでみるとちゃんと動く。

…よくわからないけど動いたから良いや。168Pも普通のマイコンとしてなら使えるだろうし。

Monday, May 16, 2011

1ステップ目でボードから白煙

12ステップで作る組込みOS自作入門の1ステップ目。
USBシリアル変換ケーブルではうまく書き込みできなかったので、デスクトップのWin機からFDTで書き出そうとして電源とケーブルをボードに繋いだまま設定をしていたら……表面実装のLEDが凄く光ったかと思うとボードが白煙を上げはじめた。

あわてて電源を抜いてLEDを見ると、すっかり白濁してあきらかにお亡くなりになっている様子。

……というか、ここまで焼けたLEDを作ったのは初めて。


えーと、プログラムの転送と実行は一応無事に出来ました。

どう考えても他の部品が無事だとは思えないんだけど、せめて本を読み終わるまでは耐えてほしいな。

Saturday, May 14, 2011

ASUS EP121の公式ペンドライバ公開

いつの間にか野良ドライバのリンクが切れている…と思ったら公式ドライバが公開されていたみたい。

野良ドライバを削除してから公式ドライバを入れてみる。
削除はデバイスマネージャから右クリックで削除するときに
「このデバイスのドライバーソフトウェアを削除する」
にチェックを入れるだけ。
一通り消したら再起動。
(わざわざ消さなくてもよかったかもしれないけど、念のため)

新ドライバはEee Slate EP121のダウンロードページで、OS:Windows7 64bitを選択して、タッチパッドのの一番上の「V7.0.2.21」ってのがそうみたい。

ダウンロードすると「ISD_DualTouch_702-21.rar」ってのが落ちてきたので解凍。
できたフォルダの中のsetup.exeを実行するだけ。

後は「コントロールパネル -> ハードウェアとサウンド->ペンタブレットのプロパティ」で調整。
好みによって「ペンとタッチ -> タッチ入力設定の変更 -> 入力デバイスとして指を使う」のチェックを付けたりはずしたり。

…野良ドライバよりいいところはコントロールパネルの「ペンタブレットのプロパティ」で表示される日本語フォントがきれいになったことくらい?
精度は変わらないか若干悪くなったような……どうだろ、悪くなったような気がするのはさすがに気のせいかもしれない。


新しく買った人には必須のドライバだと思うけど、野良ドライバ導入済みの人は敢えて入れる必要ないかも。

Wednesday, May 11, 2011

簡単カメラコントロール画面

prototype.jsを使って簡単な操作画面を設定。
prototype.jsには詳しくないけど、サンプル通りにカメラコントロール用cgiを呼び出して、cgiから返ってきたカメラの角度を更新するだけ。
カメラ画像はffserverで作ってるmjpg。そのままブラウザで扱えるから楽。fpsは1で画像も小さくしてるから、ただの確認用だけど。

とりあえずこれで必要最低限の機能は完成。
しばらく運用テストしてみて、不具合があったら修正。

cgiはこんな感じ。
#!/usr/bin/ruby

#移動指示を受け取って現在の角度を返すcgi
require 'rubygems'
require 'serialport'
require 'cgi'
cgi = CGI.new

#基本ステッピング角度0.75
#このシステムは一回に付き0.75*4*5 = 15
maxAngle = 8

print "Content-type: text/html\n\n"

port = "/dev/ttyUSB0"    #arduinoのポート番号
sp = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE)

f = open("angle")
count = f.gets.to_i
f.close

f = open("angle","w")

if cgi["move"] == "r" and  count < maxAngle
  sp.write cgi["move"]
  count += 1
elsif cgi["move"] == "l" and 0 < count + maxAngle
  sp.write cgi["move"]
  count -= 1
end

#15を掛けて角度に直したものを表示
puts count*15
f.puts count
f.close
sp.close

Monday, May 9, 2011

ありあわせでガワ作成

部屋に転がってた板切れやメモ帳の表紙やネジやらで適当に
オンラインカメラのガワを作成。



もう少し旋廻速度は遅くていいかな。
回転角度をもう少し細かく調整する必要もありそう。

video

ともかくこれでカメラ側の準備は一応終了。
次はWebインタフェースを作れば試作品は完成。

将来的には無線と太陽電池でOpportunityみたいなのを作りたいな。

Sunday, May 8, 2011

コマンドラインでステッピングモータ制御

ここしばらくモータをいじっていたのは、遠隔のライブカメラを動かしたいという理由だったので、
ひとまずコンソールからモータを動かせるようなプログラムを作ってみた。


int pin[4] = {8,9,10,11};
int incomingByte = 0;
int STEPWAIT = 50;

void setup(){
  Serial.begin(9600);
  for(int i=0;i < 4;i++){
    pinMode(pin[i], OUTPUT);
  }
}

void loop(){
  //入力があったら対応
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    switch(incomingByte){
      case 'r':
        turnRight(10);
        break;
      case 'l':
        turnLeft(10);
        break;
    }
  }
  delay(100);
}
/**
  右回転
*/
void turnRight(int count){
  for(int i=0; i< count;i++){
    for(int j=0;j<4;j++){
      int pre = j-1;
      int next = j+1;
      if(pre < 0){
        pre = 3;
      }
      if(next > 3){
        next = 0;
      }
      digitalWrite(pin[pre], LOW);
      digitalWrite(pin[j], HIGH);
      digitalWrite(pin[next], HIGH);
      delay(STEPWAIT);
    }   
  }
  pinOff();
}
/**
  左回転
*/
void turnLeft(int count){
  for(int i=0; i < count;i++){
    for(int j=3;j>=0;j--){
      int pre = j+1;
      int next = j-1;
      if(pre > 3){
        pre = 0;
      }
      if(next < 0){
        next = 3;
      }
      digitalWrite(pin[pre], LOW);
      digitalWrite(pin[j], HIGH);
      digitalWrite(pin[next], HIGH);
      delay(STEPWAIT);
    }   
  }
  pinOff();
}
/**
  オフ
*/
void pinOff(){
  for(int i=0;i<4;i++){
    digitalWrite(pin[i], LOW);
  }
}
あとはrubyのruby-serialportあたりを利用してコマンドを送ってもいいし、もっと単純にコマンドラインから $ echo llrl > /dev/ttyUSB1 こんな感じのコマンドを送るだけでも動作する。

あとは電子の付かない純粋な工作と、Webから操作できるように適当なページとCGIの作成で、
まあそれはどうとでもできるでしょ。

Saturday, May 7, 2011

SICPよんでみる 3.2.4

計算機プログラムの構造と解釈
内部定義の評価について。



Thursday, May 5, 2011

Arduinoでステッピングモータ回してみる

モータは同じくSPG20-332。
以前買って放置していたArduinoで、ものすごく適当な回路を組んでみた。


で、コードはこんな感じ。

/* 適当ステッピングモータ */
int pin[4] = {10,11,12,13};

void setup(){
  for(int i=0;i < 4;i++){
    pinMode(pin[i], OUTPUT);
  }
}

void loop(){
  for(int i=0;i<4;i++){
    digitalWrite(pin[i], HIGH);
    delay(20);
    digitalWrite(pin[i], LOW);
    delay(20);
  }
}

…自分で作っといてなんだけど、まさかこれで動くとは思わなかった。

video

さすがにパワーが足りない気もするけど、ちょっと何かを動かす程度ならこれでいいかも。
あー、パワーを増すなら2層励磁という手もあるのか。
というわけでコードを書き換え。
/* 適当ステッピングモータ 2相励磁 */
int pin[4] = {10,11,12,13};

void setup(){
  for(int i=0;i < 4;i++){
    pinMode(pin[i], OUTPUT);
  }
}

void loop(){
  for(int i=0;i<4;i++){
    int pre = i-1;
    int next = i+1;
    if(pre < 0){
      pre = 3;
    }
    if(next > 3){
      next = 0;
    }
    digitalWrite(pin[pre], LOW);
    digitalWrite(pin[i], HIGH);
    digitalWrite(pin[next], HIGH);
    delay(20);
  }
}
この程度のパワーがあれば大体の用は足りるような気がする。
楽だからありがたいけど、何の苦労もないからいまいち達成感が無い。

Tuesday, May 3, 2011

ステッピングモータを回してみる

ちょっと電子工作の練習にステッピングモータを回すことにした。
使うのはユニポーラステッピングモータSPG20-332。
これを単3電池4本で駆動してみた。
練習なので手作業のスイッチ駆動。
シートによると1ステップで0.75°動くらしいけど、そんなの見てもよくわからないので目立つように付箋をくっつけた。
実際の動きはこんな感じ。
video
…あんまり面白くないけど、まあ動作確認だから。
マイコンでいじるなら四本のピンから順番に信号送ればいいのかな?
まだまだ知らなきゃいけないことが多いなぁ。

参考にしたのはこの辺

Sunday, April 24, 2011

SICPよんでみる 3.2.3

計算機プログラムの構造と解釈。
状態変数を持つオブジェクトの話。