ラベル Wireless の投稿を表示しています。 すべての投稿を表示
ラベル Wireless の投稿を表示しています。 すべての投稿を表示

2015年8月28日

ESP8266のSSL clientについて

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ESP-WROOM-02でhttpsなAPIを叩こうとしたらハマったので、まとめておきます。

SDKは1.3.0 (Release date: Aug 08, 2015)を使用しています。
ドキュメントも、これ(esp_iot_sdk_v1.3.0_15_08_08.zip)に含まれている2C-ESP8266__SDK__Programming Guide__EN_v1.3.0.pdfを参照しました。

現状

8/28現在、Arduino core for ESP8266はSSL(TLS)でのclientに対応していない。
対応して欲しいという要望&対応したいねという話は出ている。

ESP8266のSDKとしては、SSLに対応している。
※ただし、制約あり(この下に書きます)

処理の流れ

公式によるサンプルコードがEspressifのフォーラムにあるので、それを見るとだいたい分かります。

以下も非常に参考になります。
DSAS開発者の部屋:ESP8266 モジュールの AT コマンドに SSL クライアント機能を追加する
ESP-WROOM-02で、IFTTTをhttps(SSL/TLS)で呼び出す例 - Qiita

大雑把な流れとしては...

//証明書ストアを用意
unsigned char *default_certificate;
unsigned int default_certificate_len = 0;
unsigned char *default_private_key;
unsigned int default_private_key_len = 0;

//espconn, _esp_tcpを定義

LOCAL struct espconn user_tcp_conn;
LOCAL struct _esp_tcp user_tcp;

//接続先のIPアドレスとポートを設定
user_tcp.remote_ip[0] = 192;
user_tcp.remote_ip[1] = 168;
user_tcp.remote_ip[2] = 1;
user_tcp.remote_ip[3] = 128;
user_tcp.remote_port = 443;

//自分のポートを設定
user_tcp.local_port = espconn_port();

//type, state等を設定
user_tcp_conn.proto.tcp = &user_tcp;
user_tcp_conn.type = ESPCONN_TCP;
user_tcp_conn.state = ESPCONN_NONE;

//接続時、再接続時、接続断時のコールバックを設定
espconn_regist_connectcb(&user_tcp_conn, user_tcp_connect_cb);
espconn_regist_reconcb(&user_tcp_conn, user_tcp_recon_cb);
espconn_regist_disconcb(&user_tcp_conn, user_tcp_discon_cb);

//SSLバッファサイズを設定
espconn_secure_set_size(ESPCONN_CLIENT,5120);

//接続する
espconn_secure_connect(&user_tcp_conn);

みたいな感じ?

user_tcp_connect_cb()関数の中でデータ送受信時のコールバックを設定してあげれば良いみたい。

void user_tcp_connect_cb() {
    espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
    espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
}

サーバからの応答は
void user_tcp_recv_cb(void *arg, char *pusrdata, unsigned short length)
のpusrdataに入ってくるので、これを出力するなり判定するなりすると良い。

SSLバッファサイズはデフォルト(espconn_secure_set_sizeを呼ばない場合)で2048バイトになっているので、SSLパケットが2048バイトを超えそうな時は適宜増やしてね、ということらしい。
最大8192バイトらしいけど、8192を設定したらメモリに乗り切れないっぽくて(確保できない?)、espconn_secure_connectの段階でこけました。
公式サンプルコードにあるように5120くらいが限界かな...?

使用できるプロトコル(バージョン)と暗号

たぶん、ここが一番重要で、メモリ周りとかは全然大丈夫だけどespconn_secure_connectした直後にuser_tcp_discon_cbが呼ばれる(接続断される)ような、とあるサービスのAPIサーバがあって、Wiresharkでパケットキャプチャしたら原因が分かりました。

こちらがESP8266からサーバに送信されたClient Hello。


バージョンはTLS 1.1で、Cipher Suitesは以下の4種。

  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_RC4_128_MD5


TLS 1.1を拒否ってたり、上記暗号種での接続を拒否ってると


「お前の指定したバージョン、暗号種ではうちに繋げねーぞ」とHandshake Failureが返ってきてServer Helloしてくれない訳です。

HeartbleedとかPOODLEとか色々あった関係で、厳しめなところは繋がらないという感じかなぁ。

このマイコンの性能上、強度の高い暗号アルゴリズムは載せられないのでしょうが、IoT向けを前面に押し出してるからには、もうちょっと頑張ってほしい...

追記その後、Arduino core for ESP8266でWiFiClientSecureが追加され、httpsが叩けるようになりました。

2015年8月26日

ESP-WROOM-02でIoTデバイスっぽいものを作る(1)

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

前回(ESP-WROOM-02を使ってみる)の続き。

サンプルを漁ってたらCaptive Portalを使ったものがあったので、早速この機能を使って何か作ることに。
Captive Portal = APに接続したら強制的にWebページ(普通は認証ページなど)を開かせる、公衆無線LANに良くあるアレです。
そして、
1. ESP-WROOM-02をアクセスポイントにできる
2. Captive Portalが使える
3. ESP-WROOM-02がクライアントになれる
ということは...
スマホだけで家のアクセスポイントへの接続設定が出来るIoTデバイスを作れる訳です。

想定
1. 利用者がIoTデバイスの電源を入れる
2. 取説に書いてある特定のSSIDのAPが出現するので、それにスマホで接続する
3. 設定ページが自動的に立ち上がる
4. 家に既設のAPを選択し、パスワードを入力して設定
5. 自動的に再起動して、今度はクライアントとして家のLANにぶら下がってくれる

こういう物が出来れば素敵... というわけで、まずは雛形として使えそうなものを作ってみました。

9SQ/esp8266-wifi-setup (GitHub)

Arduino core for ESP8266を使っているので、前回の記事でも書いたようにArduino IDEへのボード情報の設定が必要です。

実際のスマホでの設定画面はこんな感じ。


その時のシリアルモニタはこんな感じ。


動作としては、
1. EEPROMを読みに行って、設定が存在しない場合はSetup Modeになる
2. 一旦、STA modeで周辺のアクセスポイントを検索して保存
3. AP modeに切り替えて、設定されたSSIDでアクセスポイントを立てる
4. WebサーバとDNSサーバも立てる
5. 接続してきたクライアントはCaptive Portalで設定ページに飛ばす
6. 設定ページから入力されたSSIDとパスワードをURLデコード
7. EEPROMに書き込み
8. 再起動
9. EEPROMを読みに行って、設定されたSSIDのAPに接続する
10. 接続を確立したらWebサーバを立てる
という流れです。

・設定したSSIDのAPに接続できなかったら、再びSetup Modeになります。
・設定後にシリアルモニタに出力されるIPアドレスに接続するとWebサーバが立ち上がってますが、ここにアクセスすると接続設定のリセットが可能です。

あとは、これにセンサーなどを接続してあげれば、同一LAN内からブラウザで値を覗いたり、外部のサーバにデータを定期的に送るようなデバイスが作れると思います。

実はまだ手を入れるところ(接続確立後に何らかの問題で接続断したときの再接続処理など)が結構残っているので、ぼちぼち修正する予定...と並行して次回は実際に何か作ってみたものを載せようと思います。

2015年8月25日

ESP-WROOM-02を使ってみる

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

たいへん出遅れました!
今更ながらESP-WROOM-02をゲットできたので、先人の日本語による資料の恩恵を受けながら、サクッと使ってみます。

ちなみに、aitendoで買いました。2個パックが1100円(税別)。
秋月電子だとbreakout boardが売って無くてつらいのですが、aitendoだと1個120円で売ってます。
スイッチサイエンスだとモジュールが1個あたり864円、ピッチ変換が162円なので、たぶんネットで買える店の中ではaitendoが最安っぽいです。10個以上買うと秋月の方が安くなりますが。(2015年8月25日現在)
#スイッチサイエンスさんは学校とかで買いやすいので、研究などで買うときは使ってます。

aitendo
Wi-Fiモジュール(技適マック付き/2PCS) [ESP-WROOM-02P] 1100円(税別)
WiFiモジュール変換基板(A) [IFB1518-A] 120円(税別)
WiFiモジュール変換基板(B) [IFB1518-B] 120円(税別)

秋月電子通商
Wi-Fiモジュール ESP-WROOM-02 [ESP-WROOM-02] 550円(税込)

スイッチサイエンス
ESP-WROOM-02 Wi-Fiモジュール 864円(税込)
ESP-WROOM-02ピッチ変換済みモジュール《フル版》 ボードのみ 162円(税込)
ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 ボードのみ 162円(税込)

さて、注文して届いたモジュールをbreakout board(ピッチ変換基板)にハンダ付けします。
今回はaitendoの変換基板(A)と(B)を1個ずつ買ったので、どっちも付けて比較。
温調ハンダごてだと引きハンダで綺麗に付けやすい。


ブレッドボードに刺すときは2枚を跨がせるか、基板の下をジャンパワイヤーで配線すれば良し。


上の写真では、LED(GPIO4)と気圧センサーLPS25H(SDA=GPIO12, SCL=GPIO14)を接続しています。
ボタンの青がRST、黄色がGPIO0に繋がっているので、黄色を押しながら青を押すとUART Download Modeに入ります。

あとは、先人たちの資料を読みながら、今回はArduino IDEでプログラムを書いていきます。

ググれば色々出てきますが、この辺りが参考になりました。
「ESP-WROOM-02」をArduinoで開発 - おかゆ日和
ESP8266 - ESP-WROOM-02 の Arduino 環境で I2C 制御 - Qiita
ねむいさんのぶろぐ | 技適マーク付きESP8266モジュール ESP-WROOM-02 を使ってみる

LEDのON/OFFをブラウザから操作するのは、サンプルのESP8266WiFi → WiFiWebServerで実現できました。
気圧計は、通常のArduino向けに書かれたコードと、WiFiWebServerを組み合わせて簡単に作れます。

気圧計LPS25HをArduinoで読み取るコードは以下が使えると思います。
Arduinoで遊ぶページ | 大気圧・温度センサモジュールの実験

Raspberry Piで読み取るコードを以前Pythonで書いていたので、これも処理の流れの参考にできるかな。
9SQ/raspi_lps25h.py | Raspberry PiとLPS25Hで気圧取得

ちなみに、I2CはSCLをGPIO14にすればSDAはどのピンでも良いみたいです。
上記Qiita投稿ではSDAをGPIO4に繋げてるみたいですが、私はGPIO12でも動きました。
データシートではGPIO2がSDAになってるんですが、ここは起動時にプルアップしないといけないので、使わなくていいなら使わない方が楽。

GPIOについては、4, 5, 12, 13, 14, 16が使えるよーっという投稿をどこかで見かけた気がしますが、実際には0, 2, 15, 1(U0TXD), 3(U0RXD)も使えます。
ただし、これらのピンは起動時、プログラミング時に使用するピンなので使う際は工夫が必要です。

というわけで、そういうのを踏まえてESP-WROOM-02用のPINOUT DIAGRAMを作ってみました。

PDF版ダウンロード (893KB)

修正ポイントがあったら、記事へのコメントなどで教えてください。
ライセンスはCC0です。(いろんな所で使いやすいように)
著者表記・バックリンク不要ですが、してくれたらそれはそれで嬉しいのでお好みでどうぞ。
※PDFへの直リンクはダメです。

続き→ ESP-WROOM-02でIoTデバイスっぽいものを作る(1)
続き2→ ESP8266のSSL clientについて
続き3→ ESP-WROOM-02でYoを送るボタンを作ってみた

2014年2月26日

MP268 FR4 ワイヤレス給電モジュール

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

久々の電子工作系のネタ(といっても工作じゃありませんが...)
dealextremeでワイヤレス給電のモジュールが売ってあったので、2種類買ってみました。
1つめは特に規格などが定められてないMP268 FR4 DIY Wireless Power Supplyというもので、もう1つはqi規格に対応したモジュール... なのですが別々に発送されて先にMP268が届いたので、こちらから先に調べてみました。

中身は上の写真の通り。
給電モジュールと受電モジュールのセットで、受電側は何かに貼り付けられるように両面テープみたいになってます。
ちなみに、受電モジュールの正極側のリード線が付いてなかったので、この後自分で付けました...

説明書によれば入力はDC12Vとのことですが、商品ページには10〜12Vとか9〜12Vとか色々書いてあるので、とりあえず試してみました。
直流安定化電源は菊水のPMC18-3Aです。

左上12V、右上9V、左下7V、右下5V。



7Vくらいまでは大丈夫そう。(余裕を見れば9V〜12Vといったところでしょうか)
いずれもコイル間の隙間がほぼゼロの状態なので、実際に何かに組み込む際はもう少し下がるでしょう。

以下は実際にLEDを繋いでみた&スマートフォンを繋いでみた動画。(入力は12V)



実用的で夢拡がる感じなのは良いとして、何に組み込もうか...

追記:説明書の裏に使用用途例が書いてありました。(なぜ気づかなかった?)


2013年1月24日

Arduino DUEが届いた

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

供給が追いつかず、どこも品切れ状態が続いているArduino DUE、やっと購入でき、本日届きました。
右の写真は、奥から順にArduino UNO、Arduino MEGA 2560、Arduino DUEの3兄弟(?)

DUEを購入するついでにWireless Proto Shieldも購入。


新しいShieldは、パターンを追ってみるとICSP、VCC&GNDピンの両方から電源を引いてる様なので変な3段重ねをしなくてもよさそう。

2013年1月22日

ウォシュレット実況botの無線化

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

ウォシュレット実況botトイレットペーパー使用量bot を合体して無線化しました。
今まではトイレから直接送信(有線LAN)していましたが、隣の部屋からLANケーブルを引くのも滑稽なのでXBeeで無線化することに。
上の写真はトイレに設置する送信側で、Pro mini 3.3V、スイッチサイエンスのXBeeピッチ変換基板XBee(S2/ZB)、赤外線受信モジュール、ロータリエンコーダ、Li-poで構成。
下の写真は別室に設置する受信側で、Arduino UNOEthernet Shield、XBee Shieldで構成。


古いXBee Shieldは電源がICSPから取ってあるらしく、Ethernet Shieldと3段重ねにするとXBee Shieldに電源供給されません。(Ethernet ShieldにICSPピンヘッダが無い)


この様な細工で電源供給して、ピンのカサ増しの為にピンヘッダを間に入れています。

プログラムは、ウォシュレットbotとトイレットペーパーbotを合体した後、赤外線受信&エンコーダのカウント&シリアル送信部をトイレ設置機に、シリアル受信&Twitterへの投稿部を別室設置機にという具合です。

ちなみに、XBee(S2/ZB)ピッチ変換基板XBee USBアダプタは、電子工作コンテスト2012の はんだづけカフェ賞 でスイッチサイエンスさんから頂いた物です。
#初めてのXBeeがこういう形で使うことになるとは...

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個で少しだけ発展したものを作るつもり。
具体的なことは進捗状況と一緒に書いていく予定です。

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月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()

2011年10月27日

RFM12B + Arduino

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

Hope Microelectronics社製の微弱無線モジュール
日本では日昇テクノロジー通販(http://www.csun.co.jp/SHOP/200712022.html)で買える。
お値段は1200円 880円(2012/4現在)ですが、SparkfunでSMDタイプが6.95ドルから売ってる模様。

周波数帯は315/434/868/915MHzの4種。(国によって使用できない周波数帯が有り)
定格電圧は2.2V〜3.8Vらしいけど、Arduino UNOからの5Vでも特に問題なく動作するっぽい。
(というより、5VのArduinoでRFM12Bを使う場合はVCCを3Vから取ると動作不安定になりました。)

参考資料
微弱無線モジュールのテスト (CPUを作ろう)
RFM12B wireless FSK transceiver module (Hope Microelectronics)
RF12B programming guide - RF12B_code.pdf (上記製造元のWebより)
RFM12B library for Arduino (JeeLabs)
→2013.2.14追記:ライブラリが新しくなっている模様です。https://github.com/jcw/jeelib

とりあえず、Hope Microelectronics社のプログラミングガイドの通りに接続してみる。

接続
GND-----------GND
5V--------------VCC
pin D2---------IRQ (interrupt request out)
pin D10-------SEL (chip select in)
pin D11-------SDI (SPI data in)
pin D12-------SDO (SPI data out)
pin D13-------SCK (SPI clock in)

左の写真はpin D2が抜けてます(;・∀・)
送信と受信のサンプルプログラムをそれぞれ1台ずつ書き込んでテスト。
送信側のLEDは等間隔で点滅。
受信側のLEDは送信側からのデータを受信できたら受信の度に点滅。
(受信が継続して問題なければ送信側と同じ等間隔で点滅)

というわけで、しばらくはこの無線モジュールで遊んでみます。
XBeeと比較して安価なので、無線通信デバイスの量産とか色々出来るということです。
先人の知恵と産物を使いながら、まずは使いこなせるように色々やってみます。