Pages
▼
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 を使った遠隔計測。
温度センサーは特に指定した訳ではなく、たまたまあったやつ(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ではドライバにデジタル署名が必須なので、ちょっとテストモードで弄ってみて使えそうだったら
追記: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とかではできなさそうだったので超やっつけ。
img-s.foursquareからは100px四方、300px四方、500px四方の3タイプも取れるっぽいので
同様に300px、500pxも。
単に画像のURLが欲しければ
json形式、xml形式で返して欲しかったら適宜応用して。
最初はPHP Simple HTML DOM Parserを使って
もっとスマートな方法があったら教えてください。
というか、公式に出来るんだったら早急に教えてください(汗
元々画像ホスティング(?)サービス的なもの(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そのまま取り込めばいいじゃない。ということで。
もっとスマートな方法があったら教えてください。
というか、公式に出来るんだったら早急に教えてください(汗