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

ありあわせでガワ作成

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



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


ともかくこれでカメラ側の準備は一応終了。
次は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);
  }
}

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


さすがにパワーが足りない気もするけど、ちょっと何かを動かす程度ならこれでいいかも。
あー、パワーを増すなら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°動くらしいけど、そんなの見てもよくわからないので目立つように付箋をくっつけた。
実際の動きはこんな感じ。
…あんまり面白くないけど、まあ動作確認だから。
マイコンでいじるなら四本のピンから順番に信号送ればいいのかな?
まだまだ知らなきゃいけないことが多いなぁ。

参考にしたのはこの辺。

Sunday, April 24, 2011

SICPよんでみる 3.2.3

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