2013/08/30

ホイッスラー(現象)を観測してみたい

ちょっと息抜きに、VLF受信機を組み立ててみた。

 今年は雷がすごかったが、雷も電磁波的には広帯域で観測できる。 ラジオがバリバリ言うのがわかりやすい。 雷が鳴るとテンションが上がるダメ人間だが、アンテナを設置するようになると、いつ屋外設備に被雷しないかとヒヤヒヤしてしまう。(危ないときは撤収とケーブル分離をしよう)

 さて、周波数数Hz~数十kHzの電波をVLF(超長波)と言う。 雷の周波数成分のうち、このVLFで観測できる現象は面白いらしい。

・Whistler(ホイッスラー) 雷の超長波成分が電離層を超え、地球を取り巻く磁気圏の磁力線にそって伝わり、また地上に戻ってきたもの。低い周波数ほど遅れて届くため、電波を音に変換した時に、音程変化が笛の音のように聞こえる。
 北海道くらいの緯度だと聞こえやすいらしい。

・tweeks 鳥のさえずりに似た短い音色。 これは、宇宙に行かずに、電離層に反射されて届くため、比較的観測しやすいらしい。

 いろんなサイトやYoutubeを巡ると、録音やスペクトル画像がたくさん見つかる。百聞は一見にしかず。

たとえば… Natural VLF Radio Emissions http://home.pon.net/785/natural.htm


VLF帯といえば、人間は電波時計のタイムコードを送信するJJYや、潜水艦の通信に使っている。


JJYについては、無線機が無くても、録音機材(ICレコーダー)や、PCのサウンドカードに適当なアンテナと、必要に応じて増幅/フィルタ回路を繋ぐだけでも条件が良ければ観測できる。 

ホイッスラーの受信も原理は同じだが、今回作ったBBB-4というVLF受信機では、増幅段とVLF局の混信対策のためのフィルタ回路が組まれている。

条件が良ければ

 残念ながら、東京だと都市雑音や電柱の無いところを探すのは難しい。 特に数kHzのあたりはかなり雑音が大きく、信号があっても埋もれて分からないだろう。 ホイッスラーの観測は、ロケーションが肝心と思われる。 

 田舎の実家に受信局を置いて、長期観測やってみたいなあ…。 

実際に作ったもの

Stephen P. McGreevy's BBB-4 (Bare Bones Basic) Natural VLF Radio Receiver Schematic http://www.auroralchorus.com/bbb4rx3.htm



FETは秋月で入手できる。 残りは手持ちの部品を使った。
これをPCのマイク入力に繋ぎ、Spectrum Labというソフトを使って観測した。

アンテナは数m程度で試したが、家では、雑音になりそうなもの(空調、LED照明)などを全部消しても、ノイズフロアが大きかった。 

2013/08/24

TWE-001 Lite


東京コスモス電機のZigBeeモジュール。TWE-001 Liteを試しているところ。
 
DIP版と最近発売された表面実装版がある。 どちらもアンテナをハンダ付けする。
(U.FLコネクタ版は無いのかなあ)

そのままI/OやA/D変換値を親機・子機間で転送するファームウェアが焼かれているのが面白い。GPIOや電圧値入力、PWM波形などを渡せるので、ラジコンが作れそうだ。(サイトでは連続送信に対応した公式ファームが公開されている) 

中のRFマイコンはNXPのJN5164の模様。(32kB_RAM/160kB_ROM)
 
 公開されているSDKのライブラリを眺めると、気になっていたToF(Time of Flight / RFレンジング)や、I2Cのライブラリがあった。 I2Cのセンサを繋ぎ、データ取得ができそう。 すべて親機から操作するよりも、ある程度ローカル処理でI/O操作やデータ処理をさせて、ワイヤレスセンサとして使えるようにしたい。 このマイコンにGPSやセンサ、アクチュエータを繋ぐだけで、カンサットが作れそう。

 出力や通信距離が気になったら、高出力のTWE-Strongを選択できる。 技適通過済みの指向性アンテナオプションもある。


表面実装版の試作はコイン充電池を挟んで最小限の構成にしてみた。 ファームウェアは最新版に更新済み。

2013/08/18

I2Cカラーセンサ

秋月で販売している浜松フォトニクスのカラーセンサ S11059-02DTを試してみた。

・RGBに加えIRが計測できて、解像度が16bit/chになった。
・I2Cバス接続が可能。
・ダイナミックレンジが向上し、明るい太陽光下でも値が飽和しにくくなったので使いやすい。

接続のポイント
・3.3V系なので、5V系ボードではレベル変換が必要
・数kΩでプルアップ (3kΩ程度かな)

実物は米粒くらいの大きさ


ユニバーサル基板にハンダ付けするときは、四隅の足だけ残して、真ん中寄りの足をピンセットなどで上に折り曲げてから、4本の足をパッドにハンダ付けすると簡単にできる。

手前がカラーセンサ。奥はTMP006(非接触IR温度センサ)

1画素ドットカメラの時みたいに、またレンズでも付けてみようかと思っている。
得られた数値で、照度の換算なども出来そう。 

動作確認用スケッチ
最初はEnergia IDE(MSP430)で作っていたけど、Arduinoでも動く。Wireの仕様の関係で、1.0以降のAPIに対応したバージョンなら大丈夫だと思う。

MSP430 LaunchPadの場合、デフォルトのボードはI2CのSCLにLED2が接続されているため、通信ができない。 あらかじめLED2の黒いジャンパを外しておくこと。

スケッチでは固定露出モード動作となる。 マニュアル露出についてはまだテストしていないけど、任意の露出時間を選べそう。



/******************************************************************************** 
 * S11059_02dt I2C color sensor test sketch  v20151220   by KentN 
 *
 * 
 *  tested boards  
 *  MSP430 LaunchPad(G2553) (Energia IDE 0101E016)
 *   Arduino 1.0 or later (3.3V board or I2C level converter) 
 * 
 *  MSP430LaunchPad (Energia) 
 *  before enabling I2C bus, remove led2 JUMPER PIN 
 ********************************************************************************/

#include "Wire.h"

#define led 13 // Arduino LED PIN
//#define led RED_LED  //(MSP430 LaunchPad)

#define device_address 0x2A
#define control_reg 0x00
#define timing_reg_H  0x01
#define timing_reg_L 0x02

uint16_t red = 0;
uint16_t green = 0;
uint16_t blue = 0;
uint16_t IR = 0;

void getRGB();

void setup()
{
  Wire.begin();
  Serial.begin(9600); 
  pinMode(led,OUTPUT);
  digitalWrite(led,LOW);
  led_blink();
}

void loop()
{

  getRGB();

  Serial.print(red);
  Serial.print(", ");
  Serial.print(green);
  Serial.print(", ");
  Serial.print(blue);
  Serial.print(", ");
  Serial.println(IR);

  delay(500);
}

void getRGB()
{
  uint16_t colordata= 0;
  
  /* //manual exposure mode  
   setManualtGain(100);
   Wire.beginTransmission(device_address);
   Wire.write(control_reg);
   Wire.write(0x84); // ADC reset LowGain wakeup
   Wire.endTransmission();
   Wire.beginTransmission(device_address);
   Wire.write(control_reg);
   Wire.write(0x04); //start 
   Wire.endTransmission();
   */
   
  //Fixsed exposure mode settings
  //  LowGain mode
  //  0x00 = 87.5us
  //  0x01 = 1.4ms
  //  0x02 = 22.4ms
  //  0x03 = 179.2ms 
  //  HighGain Mode
  //  0x08 = 87.5us
  //  0x09 = 1.4ms
  //  0x0a = 22.4ms
  //  0x0b = 179.2ms 

    
  Wire.beginTransmission(device_address);
  Wire.write(control_reg);
  Wire.write(0x83); // ADC reset wakeup
  Wire.endTransmission(false);
  Wire.beginTransmission(device_address);
  Wire.write(control_reg);
  Wire.write(0x03);  // set gain & exposure time 
  Wire.endTransmission();

  delay(180*4); //wait exposure time x4ch

  led_blink();
  Wire.beginTransmission(device_address);
  Wire.write(0x03);
  Wire.endTransmission(false);
  Wire.requestFrom(device_address,8);
  //read data
  if (Wire.available() > 0){
  colordata = Wire.read();
  colordata <<= 8;
  colordata |= Wire.read();
  red = colordata;
  colordata =0;
  colordata = Wire.read();
  colordata <<= 8;
  colordata |= Wire.read();
  green = colordata;
  colordata =0;
  colordata = Wire.read();
  colordata <<= 8;
  colordata |= Wire.read();
  blue = colordata;
  colordata =0;
  colordata = Wire.read();
  colordata <<= 8;
  colordata |= Wire.read();
  IR = colordata;
  }   return;
}

void setManualtGain(uint16_t ex_time){
  uint8_t reg =0;
  Wire.beginTransmission(device_address);
  reg =(ex_time >>= 8);
  Wire.write(reg);
  Wire.endTransmission();
  Wire.beginTransmission(device_address);
  reg |= ex_time;
  Wire.write(reg);
  Wire.endTransmission();
}

void led_blink()
{
  digitalWrite(led,HIGH);
  delay(10);
  digitalWrite(led,LOW);
}

2013/08/03

energy harvesting testboard

太陽電池とキャパシタを電源にするために、MSP430LaunchPadで開発ボードを組んでみた。
ここ数ヶ月の発電実験で、規模的に余計だった要素を省いていった結果となる。

このシステムは屋外みたいな日照の安定しない、昼夜が存在する環境を想定している。 となると工場のように24時間光源が存在する特殊環境ではないので、発電した余剰エネルギーを貯めて、曇りと夜を乗り切らなくてはならない。

・太陽電池(9直の単結晶シリコン) 4.5V 10mA出力
・MSP430G2553
・EDLC


MSP430は下限電圧が1.8V、今回つけたEDLCは2.7Vが耐圧の規格上限なので、
おおよそ0.9Vの範囲内で動作するだろう。 それ以下の電圧のエネルギーはもったいないけど利用しない。 (実質3.3Fくらい) LiCが入手出来ればその点は改善されるだろう。

過充電防止はディスクリートでは設けず、電圧をモニタして、日照時の余剰電力を負荷に回すことでソフトウェア的に実現する。(ハイサイドスイッチでも良いがお手軽にしてみた)
 具体的には数mA~数十mAのLED、無線系(XBee?)などなど。 

電気二重層コンデンサは過放電については心配しなくて良いから、電源管理は稼働率の配分だけになる。 枯渇時はほとんどスリープ状態。

センサはI2Cバスにぶら下げて拡張しようと思う。
今ついてるのは
・S11059(I2Cカラーセンサ) http://akizukidenshi.com/catalog/g/gI-06793/
・BMP180(MEMS気圧センサ)
・TMP006(放射温度計)

 LaunchPadはEneriga IDEで使っているけれど、最新の配布バージョンだとI2C周りのバグがとれていない。(2013/08/03現在)
なので、以下の点に注意が必要。

・MSP430のCoreライブラリをgithubの最新版に差し替える。
・ピン定義と、サイトのPinMapで示されるSDAとSCLはなぜかMSP430G2553の実際のHWピンと逆なので注意。 
 
正しくは、
 P1.6: SCL
P1.7: SDA
・ボード上でI2Cを有効化するときは、LED2(緑色)がSCLと干渉しているため、LED2のジャンパピンを外す。 (これを忘れていて1時間くらい悩んだ)

これで、Arduino 1.0以降と互換のあるAPIが使える。 

BMP180とTMP006はArduino向けのライブラリをそのまま使って、カラーセンサはデータシートを元に固定露出モードの読み出しを実装した。 日照下でも問題なく使える。



課題

・MSP430のスリープからの復帰は、低速オシレータを使った割り込みでやりたいけど、まずCoreライブラリがどうタイマーを初期化してるのか調べないと…
・システムクロックを8~1MHzに下げるとI2Cバスが通信できない。一応TWI.cとかにはクロック毎に記述があるが…?
・EDLCの自己放電が結構多く、一日で0.5V下がっていた。