2012年1月28日

RFM12Bのアンテナを考える

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前記事でさらりと流していましたが、RFM12Bにアンテナを付けてテストしてみました。

今回は1/4波長モノポールを考える。
このモジュールは434MHzなので、(300/434)/4 = 0.17281106 m、およそ172mmになる。
これをセンサー側とデータ収集側の双方に172mmのアンテナ(ビニール線)を付けてテスト。

先生のご協力の下、学校のグラウンドで歩数を元に大雑把に調べてみると... 50m〜100mくらい飛ぶので前の記事で触れたとおり、電波法的にマズイ。
逆に、アンテナを付けない状態だと1m〜2mくらいが限界なので、アンテナの有無でこれだけの差が出る事にビックリ。

というわけで、アンテナの長さを調節 or アンテナを付けないという処置で調整する必要があるようです。

2012年1月27日

RFM12B + MCP9701

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

久々のRFM12Bネタ。

微弱無線モジュール RFM12B と 温度センサー MCP9701 を使った遠隔計測。
温度センサーは特に指定した訳ではなく、たまたまあったやつ(MCP9701)を使うことに。

センサー側はこんな感じ。MCP9701を5V、GND、アナログ5ピンに接続し、RFM12Bも前の記事の通りに接続。


受信側はRFM12Bのみ、同様に接続。


MCP9701は0℃の時400mVなので0.4Vのオフセット、1℃あたりの電圧の変化は19.53mVである。
アナログ入力は0〜5Vを0〜1023の1024段階で表現するので、以上を踏まえて下記のような感じで温度を得られる。
double sensorVal;
double temp = 0;
double offset = 0.4; //オフセット(V)
double tc = 19.53; //温度係数(mV)

temp = (( 5.0 / 1024 * sensorVal ) - offset ) / ( tc / 1000 );
これを前のプログラムに適当に突っ込むと完成。とっても簡単。

センサー側のプログラムはこんな感じ。
#include <rf12.h>
#include <ports.h>

#define NODE_ID   1
#define LED_PIN   7
#define TEMP_SENSOR  5

#define LED_OUTPUT() pinMode(LED_PIN,OUTPUT) 
#define LED_ON()  digitalWrite(LED_PIN, HIGH) 
#define LED_OFF() digitalWrite(LED_PIN, LOW) 

MilliTimer sendTimer;
byte needToSend;
double sensorVal;
double temp = 0;
double offset = 0.4; //オフセット(V)
double tc = 19.53; //温度係数(mV)

void setup () {
    Serial.begin(9600);
    rf12_initialize(NODE_ID, RF12_433MHZ, 33);
}

void loop () {
  
    sensorVal = analogRead( TEMP_SENSOR ); //温度取得
    temp = (( 5.0 / 1024 * sensorVal ) - offset ) / ( tc / 1000 );
  
    if (rf12_recvDone() && rf12_crc == 0 && *(int*) rf12_data) {
        LED_ON();
        Serial.println("Send check OK!");
        Serial.println();
        delay(200);
        LED_OFF();
    }
    
    if (sendTimer.poll(3000)) // ポーリングタイマー3000ミリ秒
        needToSend = 1;

    if (needToSend && rf12_canSend()) {
        LED_ON();
        Serial.print("send temp:");
        Serial.println(temp);
        rf12_sendStart(0, &temp, sizeof temp);
        delay(200);
        needToSend = 0;
        LED_OFF(); 
    }
    
}
受信側のプログラム(一部省略)はこんな感じ。
温度を受信したら1を送信。
int num = 1;

void loop () {
  
    if (rf12_recvDone() && rf12_crc == 0) {
        LED_ON();
        Serial.print("receive temp:");
        Serial.println(*(double*) rf12_data);
        delay(200);
        LED_OFF();
    }
    
    if (sendTimer.poll(3000)) // ポーリングタイマー3000ミリ秒
        needToSend = 1;

    if (needToSend && rf12_canSend() && *(double*) rf12_data) {
        LED_ON();
        rf12_sendStart(0, &num, sizeof num);
        Serial.println("receive check send.");
        Serial.println();
        delay(200);
        needToSend = 0;
        LED_OFF(); 
    }
}
コンパイルして転送。
とりあえず両方ともMacBook Airの2つのUSBポートに接続。
CoolTermで9600を見る。



↑receiveの綴りが間違っている事に今更気づく(;゜ロ゜)

やりとりの内容は至って簡単。
送信側が気温を送信(send temp)→受信側が気温を受信(receive temp)→受信側が1を返信(receive check send.)→送信側が受信側の受信を確認(Send check OK!)

Arduino UNO(ATmega328)だとアナログ入力が0〜5ピンの6個あるので、単純なセンサー(温度、照度、気圧 etc...)を6個接続できる。

ここまでで創造実験は一旦終了。
ADKでAndroidから値の読み出しなど、続きは卒業研究。

のつもりだったんだけど、学生研究奨励金で3万取れたのでUNOとMegaとEthernet Shield*2個で少しだけ発展したものを作るつもり。
具体的なことは進捗状況と一緒に書いていく予定です。

2012年1月9日

STIKA STX-7を10年ぶりに動かしてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

1997年に発売されたRoland DG製の小型カッティングマシーン「STIKA STX-7」が親父の会社で放置されていたので使えるようにしてみました。

1997年発売ということで「一応の」対応OSは98/NT/2000辺りらしい。
Roland DGのウェブサイトを見るとXP対応のドライバはあるので、こちらをダウンロードしてParallels Desktop 7上のWindows XPにインストール。

STIKA STX-7自体はパラレル(セントロニクス)接続でUSBポートは無し。
接続には実績のあったELECOM製UC-PGTを使ってMacBook Airと接続、Parallels上のXPにブリッジ。
ドライバインストール時はLPT1でインストールし、インストール完了後はプリンタのプロパティよりUSB001に変更。

CutStudioとCutStudio Plugin for Adobe Illustratorを使って、イラレでネット上から拾ったepsとかaiを開いてプラグイン経由でCutStudioに転送。
あとは普通のプリンタで印刷するようにしてあげるとカッティングがスタート、しばらくすると良い感じに切ってくれます。


Parallelsを使うと仮想環境のウィンドウにファイルをドラッグ&ドロップで送れるのでMacで作ったデータをXPに送ってカッティングなんてことが容易に可能。

余談

Roland DGのサイトにはWindows 7ではドライバ使えない的なことが書いてありましたが、bootcampで別パーティションにインストールしたWindows 7 UltimateにXP対応のドライバをインストールしてみたら普通に動きました。(CutStudioも同様)
ただし32bit版Windows 7での話で、おそらくというか普通に64bit版では動かないと思います。
Windows 7 64bitではドライバにデジタル署名が必須なので、ちょっとテストモードで弄ってみて使えそうだったら64bit向けにドライバをゴリゴリ改変していく予定
追記:Windows 8 64bit向けのSV-8用ドライバでSTX-7も駆動できました!
追記2:Windows 8 64bit向けSV-8用ドライバでWindows 10でも動きました!

ちなみにMacOS Xではいくら頑張っても無理でした。これよりも新しいモデルだと使えそうですが、USBパラレル変換での接続がそもそも駄目だとか何とか書いてあったような気が。

家にカッティングマシーンが眠っているなんて人はそうそういないと思いますが、万が一古くてよくわからないマシーンが眠っているなら試してみる価値があるかも。

2012年1月5日

foursquareの添付画像を取得する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
http://4sq.com/〜 という短縮URLから添付された画像を取得する方法など。
元々画像ホスティング(?)サービス的なもの(twitpicとか)には画像だけ取り出せるURLがあったりするんだけど、 foursquare for Developersをザッと読んだ感じでは公式APIとかではできなさそうだったので超やっつけ。
<?php
    $geturl = $_GET['url'];
    $html = file_get_contents($geturl);
    $pattern = '/https:\/\/img-s[.]foursquare[.]com\/pix\/(\w+)[.]jpg/';
    if(preg_match($pattern, $html, $matches)){
        $url = $matches[0];
        header('Content-type: image/jpeg');
        readfile($url);
    }
?>
pic4sq.phpとか適当に名前つけたら
pic4sq.php?url=http://4sq.com/xxxxxx
っという感じで添付された画像が取れる。
img-s.foursquareからは100px四方、300px四方、500px四方の3タイプも取れるっぽいので
<?php
    $geturl = $_GET['url'];
    $html = file_get_contents($geturl);
    
    $pattern = '/https:\/\/img-s[.]foursquare[.]com\/pix\/(\w+)[.]jpg/';
    $replace = 'http://img-s.foursquare.com/derived_pix/$1_100x100.jpg';
    
    if(preg_match($pattern, $html, $matches)){
        $url = $matches[0];
        $pic = preg_replace($pattern, $replace, $url);
        header('Content-type: image/jpeg');
        readfile($pic);
    }
?>
っていう感じにしてあげると100px四方の画像が取れる。
同様に300px、500pxも。
$replace = 'http://img-s.foursquare.com/derived_pix/$1_300x300.jpg';
$replace = 'http://img-s.foursquare.com/derived_pix/$1_500x500.jpg';
にすればいい。

単に画像のURLが欲しければ
    if(preg_match($pattern, $html, $matches)){
        echo $matches[0];
    }
とか
    if(preg_match($pattern, $html, $matches)){
        $url = $matches[0];
        echo $pic = preg_replace($pattern, $replace, $url);
    }
みたいな感じで。
json形式、xml形式で返して欲しかったら適宜応用して。

最初はPHP Simple HTML DOM Parserを使って
    $html = file_get_html($geturl);

    foreach($html->find('img') as $element) {
        if(preg_match($pattern, $element->src, $matches)){
    }
とかやってたけど、preg_match使うならhtmlそのまま取り込めばいいじゃない。ということで。
もっとスマートな方法があったら教えてください。
というか、公式に出来るんだったら早急に教えてください(汗

2012年1月1日

平成24年 元旦

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
happy2012

明けましておめでとうございます。
ドタバタしている間に2011年が終わってしまった...

色々と忙しくて手の回らない年になりそうですが、今年もよろしくお願いします。