2011年11月30日

PS2コン用コネクタ

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

ELECOMのJC-PS101UをバラしてPS2コントローラー用のコネクタを取り外す。
ケーブルタイプだとコネクタだけ取り外すことが出来ないので、箱タイプをAmazonで購入。お値段764円。
ロボット用コントローラVS-C1の接続用基板側コネクタが秋月で売ってありますが、こちらはお値段840円。

ELECOMシールを爪でゴシゴシやってると穴が見つかるのでドライバを突っ込んでネジ外し。
分解すると箱のサイズよりも大分小さい基板が出てくるのでハンダを吸い取ってコネクタと分離。
ついでに変換基板とUSBケーブルの根元も分離。


コネクタ部分はPS2コントローラとの接続用に使用。
ArduinoでPS2コントローラを使った何かをつくろうかと画策中。


USBケーブルとプラスチックの箱は、何か作って収める時に使えそうです。

2011年11月26日

RFM12Bと電波法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ちょっと気になったので今更ながら電波法の微弱無線とRFM12B(433MHz版)について再確認。
総務省のホームページを読むと、322MHz〜10GHzは3mで35μV/m以下なら免許不要と書いてある。

マクスウェルの方程式から得られる自由空間における電界強度の公式

E=√(30GP)/d
d=送受信の距離(m)、E=電界強度(μV)、G=アンテナ利得(dB)、P=送信出力(W)

距離dは3m、電界強度Eは35μV、利得の基準を半波長ダイポールアンテナとすると0dBdなので利得Gは1とする。

求めたいのはPなので
P=(Ed)^2/30G
と変形して、これに各値を入れてあげると...

((35 * (10^(-6)) * 3)^2) / (30 * 1) = 3.67500 × 10^(-10)

= 0.3675nW

えっと... ナノワットですか...

今は手元にモジュールが無いので測定できないのですが、0.3675nWなんぞ普通に超えているはず。
これはちょっとマズい気がするので来週金曜日にちゃんと確認することにします。

315MHzタイプなら3mで500μV以下の範囲なので、まだ使えるかも。
それとも、多少高くても法的に問題ないZigBeeを使う方が安心・安全かな?

2011年11月19日

Chameleon USB FX2

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

オプティマイズのカメレオンUSB FX2 miniBタイプ。
CypressのEZ-USB FX2LPとAlteraのMAX2を1枚のボードに載せたものです。

先週の土曜日に届いて、その日中にチマチマと表面実装抵抗やコンデンサなどを取り付け。
完成したものをMacBook Airに接続して、別パーティションから起動したWin7で弄ろうとしたら、EZ-USBは認識されるにも関わらずMAX2へのプログラム書き込みがうまくいかない。
眠ってたWinXPマシンを引っ張り出して接続してみたり、ドライバを入れなおしてみたりしても症状が治らず。
オプティマイズの方にメールで事情を説明して先週の日曜夕方に定形外で送ったところ、本日帰って来ました。

不具合の原因は1箇所の半田不良。自分では見つけきれなかったけど、どこが悪かったんだろう...
それにしても土日にも関わらずメールでの素早い対応をしてくれたオプティマイズの方に感謝です。

というわけで無事動いてくれたカメレオンUSB FX2ですが、写真の通りピンソケットをつけました。
いろんな利用例では直に配線していることが多いですが、そこはせっかくのMAX2です。
プログラムを書き換えて色々と作ってみるのが目的なので。最近DE0でFPGA(Verilog)の勉強もやってますし。

とりあえず、友人から作ってくれと頼まれたNintendo DSのスクリーンキャプチャでもやってみようということで、ユニバーサル基板にピンヘッダとD-Sub25ピンメス端子を取り付けたものを作りました。
カメレオンUSB FX2を着脱式にすることで、飽きたら別のものに使いまわすことが可能です。

2011年11月18日

RFM12Bで双方向通信

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

とりあえず、RFM12B libraryのサンプルプログラムPingPongを参考にして双方向通信できました。
例のサンプルプログラムは "Hello" と送り受信成功で "OK" → "Hello" を送信というループ。
シリアルモニターで見ていても通信している感がなくて面白くないので少し弄りました。

nodeIDが1のArduinoにint num=0、IDが2のArduinoにint num=1をセット。
受信した数字を自分が持つ数値と足して送信するというもの。
0,1,1,2,3,5,8,13,21,34... という感じで通信を繰り返します。ただそれだけです。
#include <rf12.h>
#include <ports.h>

#define NODE_ID   1
#define GROUP   212
#define LED_PIN   6

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

MilliTimer sendTimer;
byte sendFlag;
int num = 0;
void setup () {
    Serial.begin(9600);
    rf12_initialize(NODE_ID, RF12_433MHZ, GROUP);
}

void loop () {
  
    if (rf12_recvDone() && rf12_crc == 0) {
        LED_ON();
        Serial.println(num);
        num += *(int*) rf12_data;
        delay(200);
        LED_OFF();
    }
    
    if (sendTimer.poll(3000))
        sendFlag = 1;

    if (needToSend && rf12_canSend()) {
        LED_ON();
        rf12_sendStart(0, &num, sizeof num);
        rf12_sendWait(2);
        delay(200);
        sendFlag = 0;
        LED_OFF(); 
    }
}
割りとシンプル。
送受信データはunsigned charの配列で扱っているので1要素の最大値は8bit(0〜255)。
1回のrf12_sendStartで送れるのはリファレンスでは65byteまで。
接続は前々回の通り。これを2つ用意する。


次回はノードが複数存在する場合のプログラミング。ここからネットワーク化していきます。
特定のノードに対してのデータ通信は受信側にてNODE_IDで条件分けするだけ。
受信側が正常にデータを受信できたら、送信側に受信完了の合図を送って通信終了。
来週は試験期間なので続きは再来週です。

2011年11月11日

RFM12B library

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

Jean-Philippe Lang氏のRFM12B libraryについて。
Google先生で調べる限りではリファレンスの日本語訳は見つからなかったので適当(自分用)に翻訳。
あと、本家のwikiは個人的に見づらいので、一覧にするという意味も。

RFM12Bについては前の記事にまとめました。

初期化関数
  • rf12_initialize()
  • 受信/送信用にモジュールを初期化する。
    #include <rf12.h>
    #include <ports.h>
    byte rf12_initialize(byte nodeId, byte freqBand, byte netGroup =212);
    
    パラメータ
    • nodeId
    • 無線モジュールのノードID。nodeIdは同じnetGroup内においてユニークにする必要がある。IDの範囲は0〜31だが通常は0〜30を使用する。nodeIdの1〜26に対応する大文字のA〜Zを利用することもできる(しかし今後は推奨しない)。数字の0はOOK(On-Off-Keying/オンオフ変調)のために予約されている。31は特別で同一netGroup内の任意のnodeIdのパケットをピックアップできる。
    • freqBand
    • 無線モジュールで利用する周波数。RF12_433MHZ、RF12_868MHZ、RF12_915MHZが用意されていて、利用するモジュールの周波数に合ったものを使用する。
    • netGroup
    • ノードを区切る為に利用する。同じnetGroupのノードが通信できる。このパラメータはオプションであり、省略した場合はデフォルトの212 (0xD4)が利用される。これ(212)はRFM12で唯一利用できるIDであり、RFM12Bでは他の任意のIDを利用できる。

  • rf12_config()
  • rf12_initialize()とEEPROMの0x20〜0x3Fに書きこまれた設定を呼び出す。0x20〜0x3Fに含まれるチェックサムが正しくない場合、rf12_initialize()は呼び出されない。実行結果としてnodeIdを返す。(なければ0を返す)
    #include <rf12.h>
    #include <ports.h>
    byte rf12_config();
    
    パラメータ
    なし。

  • rf12_easyInit()
  • 簡単な送信手法設定。
    この関数はドライバが初期化された後、rf12 initialize() または rf12 config()を利用して呼び出す必要がある。
    #include <rf12.h>
    #include <ports.h>
    void rf12_easyInit(byte seconds);
    
    パラメータ
    • seconds
    • 新しいデータパケットまでの最小値(1〜255秒)を設定する。0を使用すると最短で送信される。
      ・433および915 MHzの周波数帯では、100ミリ秒(10パケット/秒)に固定。
      ・866 MHz帯では、送信されるバイト数に依存。

以下、和訳途中...
基本関数
  • rf12_recvDone()
  • rf12_canSend()
  • rf12_sendStart()
  • rf12_sendWait()

簡易送信関数
  • rf12_easyPoll()
  • rf12_easySend()

その他
  • rf12_control()
  • rf12_encrypt()
  • rf12_lowbat()
  • rf12_onOff()
  • rf12_sleep()