SSブログ
前の10件 | -

あれれ?Xivelyに開発者登録できない? XBee Wifiでお手軽クラウド(Xively)セミナー [XBee Wifi]

xively_activation.png


あれ?先ほどXivelyのページを確認すると、Get Started with Xivelyのページには従来あった開発者アカウントの登録のボタンが存在していません。
もしかしてXivelyは新規には有料アカウントしか受け付けなくなってしまったのでしょうか?

既存の開発者アカウントについてはまだ問題無く使用できています。

いつかはそう言う事が起きるかもしれないとは思っていましたが、想像以上に早かったですね。
セミナーで開発者アカウントを取得した方は、大事に使ってください。

と、思ったら、xivelyのページのPLATHOME→What is Xively?で開くページの一番下に移動すると、
Continue to using Xively.のリンクがあり、
その先のBuild Compelling Connected Experiencesのページの一番下に移動すると、
Take the Test Driveのリンクがあり、それを開くと、
Welcome to the Xively Test Driveのページが開く、、、おぃ!
ようするにurlは
https://xively.com/testdrive/
ですが、
ここにSign Upのリンクが有りますね。このリンク先を開くと、
Free Developer Sign-Upのページが開きました。
ようするにurlは
https://xively.com/signup
ですが、深いよ深い、こんなんほとんどの人がも辿り着けないって(笑)。

だがこの後、さっぱり連絡が来ないんだよな。


XBee Wifiでお手軽クラウド(Xively)セミナー 事前準備編3 [XBee Wifi]

※ご迷惑をお掛けしています。
このページを元にxivelyへの登録を試してみた方も居られるとは思いますが、こちらでもドキュメントを作成
する為に新たに登録を行った所、いつまで経ってもアクティベーションのメールが送られて来ず、xively
を利用できない状況となっています。

現時点でようやくTwitter経由で@XivleyIoTとフォロー関係になった段階で、具体的に何故Developerアカウント
のアクティベーションが行われないのか?のやり取りはこの先になります。

この為セミナー時点で皆さんが自分のアカウントで作業をできる保障ができない事からセミナーは一時延期
とします。

ご理解のほど、よろしくお願いいたします。




PCにインストールするアプリケーション、ドライバーを解説します。

1.X-CTU
Digi-InternationalからX-CTUの最新版をダウンロードし、インストールを完了させます。

http://www.digi.com/support/productdetail?pid=3352&type=utilities

Next Generation XCTUと書かれている物はX-CTUのver.6シリーズです。こちらをインストールします。

XCTU ver. 5.2.8.6 installerはセミナーでは使用しませんが、自分でXBeeの省電力機能を確かめる時に
有ると便利です。


2.FTDI ドライバー
USB/シリアル変換ICはFTDI社のFT232RLを使用しています。

http://www.ftdichip.com/Drivers/VCP.htm

VCP Driversの項目からご自分のPCのOSに合わせたドライバーをインストールします。


3.Arduino IDE
セミナーで使用するIDEはver.1.0.以降となります。最新はArduino 1.0.6です。
※ver.1.5での動作は未確認となっています。

http://arduino.cc/en/Main/Software


4.Arduino
セミナーでお配りするArduinoはArduino PRO MINI(3.3V 8Mhz)です。
資料は以下となります。

http://www.sparkfun.com/products/11114


5.XBee wifiマニュアル
XBee wifiを深く知る為にはマニュアルは必須です。以下から入手できます。

http://ftp1.digi.com/support/documentation/90002180_H.pdf



XBee Wifiでお手軽クラウド(Xively)セミナー 事前準備編2 [XBee Wifi]

※ご迷惑をお掛けしています。
このページを元にxivelyへの登録を試してみた方も居られるとは思いますが、こちらでもドキュメントを作成
する為に新たに登録を行った所、いつまで経ってもアクティベーションのメールが送られて来ず、xively
を利用できない状況となっています。

現時点でようやくTwitter経由で@XivleyIoTとフォロー関係になった段階で、具体的に何故Developerアカウント
のアクティベーションが行われないのか?のやり取りはこの先になります。

この為セミナー時点で皆さんが自分のアカウントで作業をできる保障ができない事からセミナーは一時延期
とします。

ご理解のほど、よろしくお願いいたします。





PCについてお話します。

当日用意していただきたいPCは、基本的にはWindowsの7または8シリーズを搭載したノートPCと言う事
になります。


1.鬼門 ※以下は主観です。
まずWindows8.1を搭載したASUSの場合、FTDIのドライバーが入りませんでした。
確証がある訳ではありませんが、ASUSのノートPCの場合、FTDIのドライバーと相性が悪い事が多いです。
私も仕事で使っているASUSのPCでFTDIのチップに接続すると、必ずハングアップします。

またMac bookをお持ちの方も残念ならが上手く行きませんでした。

これらPCを持ち込まれる方は、次でインストールするアプリケーションを解説しますので、事前に動作確認を
済ませて置いて下さい。

※MSが推奨しないだけで当方は一切関知しませんが、Windows XP PCは、8.1よりも問題を起こさず安定
して動いている様です。


2.ネットワーク機能
お持ちのPCでインターネットに接続をしますので、有線または無線LAN機能は必須となります。
無線LANは混んでしまいますので、有線LANを推奨します。


3.USB
USBを必ず1ポート使用します。


※不明点は以下のコメント欄に記入お願いします。

XBee Wifiでお手軽クラウド(Xively)セミナー 事前準備編1 [XBee Wifi]

※ご迷惑をお掛けしています。
このページを元にxivelyへの登録を試してみた方も居られるとは思いますが、こちらでもドキュメントを作成
する為に新たに登録を行った所、いつまで経ってもアクティベーションのメールが送られて来ず、xively
を利用できない状況となっています。

現時点でようやくTwitter経由で@XivleyIoTとフォロー関係になった段階で、具体的に何故Developerアカウント
のアクティベーションが行われないのか?のやり取りはこの先になります。

この為セミナー時点で皆さんが自分のアカウントで作業をできる保障ができない事からセミナーは一時延期
とします。

ご理解のほど、よろしくお願いいたします。




以下ではXivelyへの登録手順を述べます。
以下の手順を参考に、Xivelyへの登録を完了させて置いて下さい。なお、Xively側のページ構成等が変更される場合もありますが、基本的には以下の要領で登録が完了できる筈です。

※登録完了する為には有効なメールアドレスが必要です。

1.Xivelyのページにアクセスと登録開始
https://xively.com
にアクセスします。
以下の画面が開きますので、「GET STARTED」をクリックして下さい。
xively_activate_01.png


2.無償版への登録
ページの下の方に移動し、「Sign Up for a free Developer Account」をクリックします。
xively_activate_02.png


3.ユーザー情報の登録
必要事項を記入し、右下の「Request Access」をクリックします。
「アクティベーションのメールが発送されました」と言う画面が開きますので、メールを受信してアクティベーションを完了させてください。
xively_activate_03.png

xively_activate_04.png



※不明点は以下のコメント欄に記入お願いします。

XBee Wifiでお手軽クラウド(Xively)体験 サポートページ [XBee Wifi]

Img_3028_s.jpg

XBee Wifiでお手軽クラウド体験セミナー参加者様向けサポートページです。

ご質問がある方はコメント欄に記入してください。よろしくお願いいたします。

セミナーのサンプルコードは以下のアドレスで公開しています。
実際に使うにあたってFEED IDやAPI KEYはご自分のものに変更する必要があります。
sample1:
https://dl.dropboxusercontent.com/u/60463387/marutsu/iot_seminor01/sketch/sample01/sample01.ino

sample2:
https://dl.dropboxusercontent.com/u/60463387/marutsu/iot_seminor01/sketch/sample02/sample02.ino

チャネルの操作
それぞれのサンプルコードの17行目辺りからチャネルの登録になっています。
struct DATA_RECORD
{
  const char *name;
  float val;
  int integer;  //
  int small;  //
} ch[] =
{
  {"Temperature",0.0f,2,1},
  {"AVCC",0.0f,1,3},
  {"MONITOR",0.0f,3,0},
};

見て解る?様に、最初のメンバーがチャネル名、次がfloat型のデータ、次がデータの表現方法で整数の桁数、最後が小数部の桁数を代入します。
なお30チャネル登録したからこの構造体の配列も30用意する!と言う必要は無く、必要なチャネルのみ配列を用意してアップロードが可能です。

この事は、一つの登録デバイス名に必ず一つのリアルなデバイスが紐付けされると言う訳ではなく、一つの登録デバイス名に複数のリアルなデバイスが存在していても全然構わないって事です。
面白い使い方ですね。

Xivelyの操作メモ
1.public device←→private deviceの切り替え
xivel_tips_001.png

開発者画面左上辺り、Device名(ここではxbee test)の右側の鉛筆をクリックすると、Deviceの編集を行うことができます。
ここでpublicまたはprivateの変更が可能です。

2.値を直接入力
xivel_tips_002.png

開発者画面でそれぞれのチャネルの値をクリックすると直接入力が可能です。
ダウンストリームのデバックに使用できます。

3.Request Logを活用する
xivel_tips_003.png

開発者画面でRequest Logを見てみましょう。アップロード、ダウンロードが成功していれば、ここに

200 PUT チャネルの情報 時間

が表示されます。
200はHTTPリクエストに対するリザルトコードで、確か400番台も表示されると思います。
また、200のところをクリックすれば、詳細な情報を見ることができます。
REQUEST BODYのところはJSON、XML、CSVなどのフォーマットを自分で作成する時の参考にもなりますね。

4.自分でゴリゴリ書くのに疲れたときは、、、
xivel_tips_004.png

迷わずDeveloper centerをクリックしましょう。
ここではTUTORIALや各プラットホーム(Arduinoとかmbedとか)向けライブラリやサンプルコードなどが結構揃っています。
自分でゴリゴリが好きな方や、別のプラットホーム(PICとかルネサスのマイコンとか)向け開発を行いたい方は、セミナー資料を参考にやってみてください。

5.文字列もアップロードできます。
xivel_tips_005.png

数値型では表現し難い情報、例えばドアの開閉状態も、文字列として”OPEN”であるとか”CLOSED”でアップロード、ダウンロードが可能です。
遠隔からの状態監視に便利ですね。




Maruduino 拡張部品 7セグメントLEDと24KEYの実装について [組み立て]

サンプルのスケッチを掲載します。
ただ、実行したArduinoのバージョンが古い(0018)ので、Arduinoの現在のバージョンとの違いが影響を及ぼすかもしれません。

仕組みとしては追加した3個のICはIO Expanderと呼ばれるもので、I2Cバスに接続されてパラレルの入出力機能を拡張するものです。

設定によって入力にしたり、出力とする事が出来ますが、7SEG LEDをドライブする場合は3つ共に出力とします。

回路図の7SEG LEDのシートの上側にトランジスタが8個並んでいる訳ですが、この8個のトランジスタがそれぞれの桁の7SEG LEDに対して電源を供給する事となります。
シート名EXTENTION IOのIO ExpanderのIC5に接続され、IO ExpanderからLOWを出力したトランジスタがONとなり、7SEG LEDに電気を供給します。
※この時注意が必要なのが、8個のトランジスタのうち、一度にONするのは必ず一つに限ります。他のトランジスタにはHIGHを出力する様にIO Expanderの出力を決めます。
トランジスタを駆動するIO ExpanderのI2Cバス上のアドレスは0x40となります。

残り2つのIO Expanderがそれぞれの行の7SEG LEDのセグメント(光る部分)をコントロールします。
7SEG LEDのそれぞれのセグメントにはアルファベットが割り付けられており、一番上をaとして時計回りにb、c、d、e、fと回り、真中のセグメントがgになります。
つまり数字で7を表示したい時はa、b、cを光らせれば7になります。
IO Expanderの出力をLOWとすれば、そのbitに接続されたセグメントが光ります。
上の行のコントロールをするIO ExpanderのI2Cバス上のアドレスは0x42、下が0x44です。

さて充分に早い時間間隔でONするトランジスタを切り替えていきます。トランジスタの位置がそのまま桁となっている点に注意してください。
通常人間は30Hz以上のフリッカーには反応できず点灯しっ放しに見えます。つまり最初の桁から最後の桁までの切り替えを30Hz以上で回さないといけないので、切り替えの周期はその8倍で240Hz以上は必要でしょう。

※IO Expanderを入力として使う時は、Writeモードで入力したいbitに1を書き込んで、Readモードで読み込んでください。

以下のスケッチはMsTimer2を使って1msでカウントアップを行っています。
---------------------------------------------
#include <MsTimer2.h>
#include <Wire.h>

//const int I2C_SEL_ADR = 0x70 >> 1;  //_ONSEMI_
//const int I2C_SEG1_ADR = 0x72 >> 1; //_ONSEMI_
//const int I2C_SEG2_ADR = 0x74 >> 1; //_ONSEMI_
const int I2C_SEL_ADR = 0x40 >> 1;    //_NXP
const int I2C_SEG1_ADR = 0x42 >> 1;   //_NXP
const int I2C_SEG2_ADR = 0x44 >> 1;   //_NXP

unsigned long systim;
unsigned long nxttim = 50UL;

#define  SEG_A  0b10000000
#define  SEG_B  0b00100000
#define  SEG_C  0b00001000
#define  SEG_D  0b00000010
#define  SEG_E  0b00000100
#define  SEG_F  0b00010000
#define  SEG_G  0b01000000
#define  SEG_DP 0b00000001

const unsigned char seg[] =
{
  ~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F),  //0:abcdef
  ~(SEG_B | SEG_C),  //1:bc
  ~(SEG_A | SEG_B | SEG_D | SEG_E | SEG_G),  //2:abdeg
  ~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_G),  //3:abcdg
  ~(SEG_B | SEG_C | SEG_F | SEG_G),  //4:bcfg
  ~(SEG_A | SEG_C | SEG_D | SEG_F | SEG_G),  //5:acdfg
  ~(SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G),  //6:acdefg
  ~(SEG_A | SEG_B | SEG_C),  //7:abc
  ~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G),  //8:abcdefg
  ~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G),  //9:abcdfg
  0b11111111,  //blank
  0b11111111,  //blank
  0b11111111,  //blank
  0b11111111,  //blank
  0b11111111,  //blank
  0b11111111,  //blank
};

void I2C_Write( unsigned char adr, unsigned char data )
{
  Wire.beginTransmission( adr );
  Wire.send( data );
  Wire.endTransmission();
}

static void drive_seg( void )
{
  static int keta;
  unsigned char sel,seg1,seg2;

  switch( keta )
  {
    case 0 :  /*LSB*/
      sel = 0x7f;
      seg1 = seg[systim % 10];
//      seg2 = seg[systim % 10];
      break;
    case 1 :
      sel = 0xbf;
      seg1 = seg[(systim / 10) % 10];
//      seg2 = seg[(sec / 10) % 10];
      break;
    case 2 :
      sel = 0xdf;
      seg1 = seg[(systim / 100UL) % 10];
//      seg2 = seg[(sec / 100UL) % 10];
      break;
    case 3 :
      sel = 0xef;
      seg1 = seg[(systim / 1000UL) % 10];
//      seg2 = seg[(sec / 1000UL) % 10];
      break;
    case 4 :
      sel = 0xf7;
      seg1 = seg[(systim / 10000UL) % 10];
//      seg2 = seg[(sec / 10000UL) % 10];
      break;
    case 5 :
      sel = 0xfb;
      seg1 = seg[(systim / 100000UL) % 10];
//      seg2 = seg[(sec / 100000UL) % 10];
      break;
    case 6 :
      sel = 0xfd;
      seg1 = seg[(systim / 1000000UL) % 10];
//      seg2 = seg[(sec / 1000000UL) % 10];
      break;
    case 7 :  /*MSB*/
      sel = 0xfe;
      seg1 = seg[(systim / 10000000UL) % 10];
//      seg2 = seg[(sec / 10000000UL) % 10];
      break;
  }
  I2C_Write( I2C_SEL_ADR, 0xff );
  I2C_Write( I2C_SEG1_ADR, seg1 );
  I2C_Write( I2C_SEG2_ADR, seg1 );
  I2C_Write( I2C_SEL_ADR, sel );

  if( ++keta > 7 ) keta = 0;
}

static void systim_hdr( void )
{
  systim++;
}

void setup()
{
  Wire.begin();
  I2C_Write( I2C_SEL_ADR, 0xff );
  I2C_Write( I2C_SEG1_ADR, 0xff );
  I2C_Write( I2C_SEG2_ADR, 0xff );

  MsTimer2::set( 1, systim_hdr );
  MsTimer2::start();
}

void loop()
{
    drive_seg();
}




以下、昔の書き込み
---------------------------------------------
まだマルツさんからは部品セットとして販売していませんが、7セグメントLEDと24KEYは同時に実装する事ができません。

機能的にはI2C エキスパンドIOが入力モードか出力モードの何れかしか選択できないので、7セグメントLEDでは出力、24KEYでは入力と同時設定はできないものです。

ただ物理的に実装は可能なので、7セグメントLEDと24KEYの両方を実装してしまうこともあり得るのですが、いまの回路ではこれに対応できません。最悪ではLEDかトランジスタの故障と言う事になります。
実装はかならずどちらかを選んでください。

どうしても一つの基板で7セグメントLEDと24KEYを実装したい場合は、トランジスタを3pinのソケットヘッダーを使って実装(差し込む)事をお勧めします。24KEYを使う場合はトランジスタを外してしまいます。
私も手持ちのMaruduinoではそうしています。

MaruduinoでXBeeを使ってみる。マイコン、パソコン無しで制御 #xbee [アプリケーション]

※今回もXBeeシリーズ1でやっとります。
※動画を作成していただきました。貼り付けておきます。



Img_2368.jpg
Img_2369.jpg
xctu_control_01.png
xctu_remote_01.png
前回のIO出力では制御側にはArduino(Maruduino)を使っていました。実はXBeeはこの様な外部の制御なんたらを必要とせずに遠方のモジュールの出力を制御する事ができます。

写真を見ると判りますが、下はUSBシリアル変換基板に接続されたXBeeのモジュールで、USBシリアルはコンフィギュレーション完了後は単にXBeeアダプターへ電源を供給しているにすぎません。
また、上のMaruduinoにはArduinoもAVRも搭載されていない事が判ります。

指の先にタクトスイッチがありますが、離すとMaruduino上のブレッドボードの赤色LEDが点灯し、押すと消灯します。

タクトスイッチは制御側XBeeのD1に接続されています。またLEDは遠方のD1に接続されています。
この制御のやり方の肝は、D1なら相手のD1に、D2なら相手のD2に状態が反映される事で、例えばD1の状態を相手のD2に反映すると言った事はできません。また、制御側のD1の状態が"High"なら相手も”High”、制御側が"Low"であれば相手も"Low"であり、ロジックの反転はできませんので、必要ならば外部にインバーターを用意します。

先の例で言えば制御側のD1は入力設定されていますが、ポートのプルアップが有効となっていますので、タクトスイッチから指を離すと状態は"High"ですし、スイッチを押せば"Low"となります。

X-CTUのコンフィギュレーションを見てみましょう。上のX-CTUのキャプチャは制御側、下は遠方側です。

制御側:
まずDH=0、DL=相手の16bitアドレスとして制御の送り先を指定しておきます。チャネルやPAN ID等は適宜に設定しておいてください。
D1=3として入力にします。IU=1、IT=1、IR=0x7Dとしています。つまり125ms置きにサンプリングデータのパケットを送信する訳です。なお時間は遠方側で説明します。

遠方側:
チャネルやPAN ID、16bitアドレスなどは適宜設定しておきます。
APIモードに設定します。
D1=4とし、標準は"Low"出力設定です。
I/O Line Passingを展開してI/O Input Addressを設定します。16bitのユニキャストアドレスを指定した場合は該当するアドレス、0xFFFFとした場合は全ての受信したパケットを受け入れます。64bit全て1であれば制御パケットは拒否されます。
T1=5として非標準状態がアサートされる継続時間を設定します。16進表記であり、入力した値×100msとなっているので500ms間は非標準状態が継続します。先ほどパケットの送信間隔を125msとしたのは時間切れとなる500msに十分余裕を持たせたからです。
このタイマーは受け入れ可能なパケットを受信する度にクリアされ、カウントが再開します。なお、タイマーをOFFする設定はありませんでした。

ZigBeeのプロファイルにはホーム照明プロファイルがありますが、XBeeのこの設定を使って、手元のスイッチで天井の電灯の制御をすると言ったホーム照明プロファイルっぽいものができますね。










ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

  • 作者: 濱原 和明
  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/25
  • メディア: 単行本



トランジスタ技術 SPECIAL (スペシャル) 2011年 01月号 [雑誌]

トランジスタ技術 SPECIAL (スペシャル) 2011年 01月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2010/12/28
  • メディア: 雑誌



MaruduinoでXBeeを使ってみる。主にRemote ATコマンドでIO出力。 [アプリケーション]

※スケッチを書き込む時はXBeeを外すか、接続を全て外してから行ってください。
※写真の様に2個のXBeeの内、一つはADC0を温度センサーであるLM61CIZに接続しています。この時温度センサー側のMaruduino自体は単にXBeeに電源を供給しているのみで、特にプログラムが走ってはいません。あくまでも温度センサー側のXBeeはスタンドアローンで動かしています。
Img_2367.jpg
前回同様、いままでのページを参照の上、ご覧ください。
http://maruduino.blog.so-net.ne.jp/2011-01-05-1
http://maruduino.blog.so-net.ne.jp/2011-01-05
http://maruduino.blog.so-net.ne.jp/2011-01-04

前回はIO Samplingで温度データの取り込みを行いましたが、今度は逆にポート出力を行います。
使うのはRemote ATコマンドです。事前にターゲット(Remote側)のXBeeのDIO1、DIO2、DIO3を出力に設定しておきます。いや、今回の場合はしなくても大丈夫です。Remote ATコマンドで出力の状態を変化させるのは、実質的に毎回XBeeのコンフィギュレーションを行っている様なものですから。

事前の準備として、Remote側のMaruduinoのCN20端子のAD1~AD3にLEDを接続しておきます。
コントロール側のMaruduinoはSW2~SW4の状態を取り込みます。つまりこのSW2~SW4が押されていればRemote側のLEDが点灯、離されていれば消灯を行う実に簡単なアプリケーションとなっています。

/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital DI2
 * LCD Enable pin to digital Di3
 * LCD D4 pin to digital DI4
 * LCD D5 pin to digital DI5
 * LCD D6 pin to digital DI6
 * LCD D7 pin to digital DI7
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 
 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

/**
 * Copyright (c) 2009 Andrew Rapp. All rights reserved.
 *
 * This file is part of XBee-Arduino.
 *
 * XBee-Arduino is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * XBee-Arduino is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with XBee-Arduino.  If not, see <http://www.gnu.org/licenses/>.
 */


// include the library code:
#include <LiquidCrystal.h>
#include <XBee.h>
#include <stdlib.h>
#include <string.h>
/*************************************************************************/
/* defines                                                               */
/*************************************************************************/
#if 0
#define  DI13     2
#define  DI12     3
#define  DI11     4
#define  DI10     5
#define  DI9      6
#define  DI8      7
#define  DI7      8
#define  DI6      9
#define  DI5      10
#define  DI4      11
#define  DI3      12
#define  DI2      13
#define  DI1      
#define  DI0      
#else
#define  DI13     13
#define  DI12     12
#define  DI11     11
#define  DI10     10
#define  DI9      9
#define  DI8      8
#define  DI7      7
#define  DI6      6
#define  DI5      5
#define  DI4      4
#define  DI3      3
#define  DI2      2
#define  DI1      1
#define  DI0      0
#endif

#define  AN0      14
#define  AN1      15
#define  AN2      16
#define  AN3      17
#define  AN4      18
#define  AN5      19

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(DI2, DI3, DI4, DI5, DI6, DI7);
XBee xbee = XBee();

uint8_t d1Cmd[] = { 'D', '1' };
uint8_t d1Value[1];  /*0x04 is low, 0x05 is high*/
uint8_t d2Cmd[] = { 'D', '2' };
uint8_t d2Value[1];  /*0x04 is low, 0x05 is high*/
uint8_t d3Cmd[] = { 'D', '3' };
uint8_t d3Value[1];  /*0x04 is low, 0x05 is high*/

// DH + DL of your remote radio
XBeeAddress64 remoteAddress = XBeeAddress64(0x0013a200, 0x4008de66);
// Create a remote AT request command
RemoteAtCommandRequest remoteAtRequest
  = RemoteAtCommandRequest(remoteAddress, d1Cmd, d1Value, sizeof(d1Value));
// Create a Remote AT response object
RemoteAtCommandResponse remoteAtResponse = RemoteAtCommandResponse();

boolean an[3][3] =
{
  {false,false,false,},
  {false,false,false,},
  {false,false,false,},
};

void setup()
{
  lcd.begin(16, 2);
  lcd.print("Xbee Test!");
  xbee.begin(9600);
  pinMode( AN5, INPUT );
  pinMode( AN4, INPUT );
  pinMode( AN3, INPUT );

 // When powered on, XBee radios require a few seconds to start up
 // and join the network.
 // During this time, any packets sent to the radio are ignored.
 // Series 2 radios send a modem status packet on startup.
 
 // it took about 4 seconds for mine to return modem status.
 // In my experience, series 1 radios take a bit longer to associate.
 // Of course if the radio has been powered on for some time before the sketch runs,
 // you can safely remove this delay.
 // Or if you both commands are not successful, try increasing the delay.
 
 delay(5000);
}

void loop()
{
  an[0][0] = an[0][1];an[0][1] = an[0][2];
  an[0][2] = ( digitalRead( AN5 ) == HIGH ) ? true : false;

  an[1][0] = an[1][1];an[1][1] = an[1][2];
  an[1][2] = ( digitalRead( AN4 ) == HIGH ) ? true : false;

  an[2][0] = an[2][1];an[2][1] = an[2][2];
  an[2][2] = ( digitalRead( AN3 ) == HIGH ) ? true : false;

  remoteAtRequest.setCommand(d1Cmd);
  remoteAtRequest.setCommandValue(d1Value);
  remoteAtRequest.setCommandValueLength(sizeof(d1Value));
  if( an[0][0] == false && an[0][1] == false && an[0][2] == true )
  {
    d1Value[0] = 0x5;  /*0x04 is low, 0x05 is high*/
    sendRemoteAtCommand();
  }
  else if( an[0][0] == true && an[0][1] == true && an[0][2] == false )
  {
    d1Value[0] = 0x4;  /*0x04 is low, 0x05 is high*/
    sendRemoteAtCommand();
  }
  else {}

  remoteAtRequest.setCommand(d2Cmd);
  remoteAtRequest.setCommandValue(d2Value);
  remoteAtRequest.setCommandValueLength(sizeof(d2Value));
  if( an[1][0] == false && an[1][1] == false && an[1][2] == true )
  {
    d2Value[0] = 0x5;  /*0x04 is low, 0x05 is high*/
    sendRemoteAtCommand();
  }
  else if( an[1][0] == true && an[1][1] == true && an[1][2] == false )
  {
    d2Value[0] = 0x4;  /*0x04 is low, 0x05 is high*/
    sendRemoteAtCommand();
  }
  else {}

  remoteAtRequest.setCommand(d3Cmd);
  remoteAtRequest.setCommandValue(d3Value);
  remoteAtRequest.setCommandValueLength(sizeof(d3Value));
  if( an[2][0] == false && an[2][1] == false && an[2][2] == true )
  {
    d3Value[0] = 0x5;  /*0x04 is low, 0x05 is high*/
    sendRemoteAtCommand();
  }
  else if( an[2][0] == true && an[2][1] == true && an[2][2] == false )
  {
    d3Value[0] = 0x4;  /*0x04 is low, 0x05 is high*/
    sendRemoteAtCommand();
  }
  else {}

  delay(50);
}

void sendRemoteAtCommand()
{
  // send the command
  xbee.send(remoteAtRequest);

  // wait up to 5 seconds for the status response
  if (xbee.readPacket(5000))
  {
    // got a response!

    // should be an AT command response
    if (xbee.getResponse().getApiId() == REMOTE_AT_COMMAND_RESPONSE)
    {
      xbee.getResponse().getRemoteAtCommandResponse(remoteAtResponse);

      if (remoteAtResponse.isOk())
      {
        lcd.clear();
        lcd.print("Command ");
        lcd.print(remoteAtResponse.getCommand()[0]);
        lcd.print(remoteAtResponse.getCommand()[1]);
        lcd.print(" OK.");

        if(remoteAtResponse.getValueLength() > 0)
        {
          lcd.setCursor(0, 1);
          lcd.print("len:");
          lcd.print(remoteAtResponse.getValueLength(), DEC);
          lcd.print(" val:");
          
          for (int i = 0; i < remoteAtResponse.getValueLength(); i++)
          {
            lcd.print(remoteAtResponse.getValue()[i], HEX);
            lcd.print(" ");
          }
        }
      }
      else
      {
        lcd.clear();
        lcd.print("Command returned");
        lcd.setCursor(0, 1);
        lcd.print("ERROR CODE:");
        lcd.print(remoteAtResponse.getStatus(), HEX);
      }
    }
    else
    {
      lcd.clear();
      lcd.print("Error response");
      lcd.setCursor(0, 1);
      lcd.print("ID:");
      lcd.print(xbee.getResponse().getApiId(), HEX);
    }    
  }
  else
  {
    // remote at command failed
    if (xbee.getResponse().isError())
    {
      lcd.clear();
      lcd.print("Remote AT Error");  
      lcd.setCursor(0, 1);
      lcd.print("CODE:");  
      lcd.print(xbee.getResponse().getErrorCode());
    }
    else
    {
      lcd.clear();
      lcd.print("No response");  
      lcd.setCursor(0, 1);
      lcd.print(" from radio");  
    }
  }
}



Zigbee開発ハンドブック (実践入門ネットワーク)

Zigbee開発ハンドブック (実践入門ネットワーク)

  • 作者: 鄭 立
  • 出版社/メーカー: リックテレコム
  • 発売日: 2006/02
  • メディア: 単行本



MaruduinoでXBeeを使ってみる。主にIO Sampling。 [アプリケーション]

※スケッチを書き込む時はXBeeを外すか、接続を全て外してから行ってください。
※写真の様に2個のXBeeの内、一つはADC0を温度センサーであるLM61CIZに接続しています。この時温度センサー側のMaruduino自体は単にXBeeに電源を供給しているのみで、特にプログラムが走ってはいません。あくまでも温度センサー側のXBeeはスタンドアローンで動かしています。
Img_2366.jpg
MaruduinoのXBeeの横にあるCN20からはXBeeの幾つかの端子と、3.3V電源出力、GND、VREFが引き出せますので、ブレッドボードなどに回路を組んで実験を行うことができます。
XBeeと温度センサーとの接続および設定に関してはこのページを参考としてください。
http://hamayan.blog.so-net.ne.jp/2010-10-17-1

例によってxbee-arduinoライブラリのサンプルを元にアプリケーションを作成していますので、以下のページもご参照ください。
http://maruduino.blog.so-net.ne.jp/2011-01-05
http://maruduino.blog.so-net.ne.jp/2011-01-04

/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital DI2
 * LCD Enable pin to digital Di3
 * LCD D4 pin to digital DI4
 * LCD D5 pin to digital DI5
 * LCD D6 pin to digital DI6
 * LCD D7 pin to digital DI7
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 
 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

/**
 * Copyright (c) 2009 Andrew Rapp. All rights reserved.
 *
 * This file is part of XBee-Arduino.
 *
 * XBee-Arduino is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * XBee-Arduino is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with XBee-Arduino.  If not, see <http://www.gnu.org/licenses/>.
 */


// include the library code:
#include <LiquidCrystal.h>
#include <XBee.h>
#include <stdlib.h>
#include <string.h>
/*************************************************************************/
/* defines                                                               */
/*************************************************************************/
#if 0
#define  DI13     2
#define  DI12     3
#define  DI11     4
#define  DI10     5
#define  DI9      6
#define  DI8      7
#define  DI7      8
#define  DI6      9
#define  DI5      10
#define  DI4      11
#define  DI3      12
#define  DI2      13
#define  DI1      
#define  DI0      
#else
#define  DI13     13
#define  DI12     12
#define  DI11     11
#define  DI10     10
#define  DI9      9
#define  DI8      8
#define  DI7      7
#define  DI6      6
#define  DI5      5
#define  DI4      4
#define  DI3      3
#define  DI2      2
#define  DI1      1
#define  DI0      0
#endif

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(DI2, DI3, DI4, DI5, DI6, DI7);
XBee xbee = XBee();
Rx16IoSampleResponse ioSample = Rx16IoSampleResponse();

void setup()
{
  lcd.begin(16, 2);
  lcd.print("Xbee Test!");
  xbee.begin(9600);
}

void loop()
{
  xbee.readPacket();

  if (xbee.getResponse().isAvailable())
  {
    // got something
    if(xbee.getResponse().getApiId() == RX_16_IO_RESPONSE)
    {
      xbee.getResponse().getRx16IoSampleResponse(ioSample);
      lcd.clear();
      lcd.print("src=");
      lcd.print(ioSample.getRemoteAddress16(), HEX);
      lcd.print(" size=");
      lcd.print(ioSample.getSampleSize(), DEC);

      unsigned long adc = 0;
      for(int i = 0; i < ioSample.getSampleSize(); i++)
      {
        adc += ioSample.getAnalog(0,i);  
      }
      adc /= ioSample.getSampleSize();
      lcd.setCursor(0, 1);
      float temper = ((adc * 3.3 / 1024) - 0.6) / 0.01;
      lcd.print("TEMP=");
      lcd.print(temper);
    } 
    else
    {
      lcd.clear();
      lcd.print("Expected I/O Sample,");
      lcd.setCursor(0, 1);
      lcd.print("but got ");
      lcd.print(xbee.getResponse().getApiId(), HEX);
    }    
  } 
  else if(xbee.getResponse().isError())
  {
    lcd.clear();
    lcd.print("Error reading packet.");
    lcd.setCursor(0, 1);
    lcd.print("Error code:");
    lcd.print(xbee.getResponse().getErrorCode(),HEX);
  }
}


トランジスタ技術 (Transistor Gijutsu) 2010年 11月号 [雑誌]

トランジスタ技術 (Transistor Gijutsu) 2010年 11月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2010/10/09
  • メディア: 雑誌



MaruduinoでXBeeを使ってみる。主に受信。 [アプリケーション]

※スケッチを書き込む時はXBeeを外すか、接続を全て外してから行ってください。
※2個のXBeeが必要です。また、Maruduinoと対向する側はPCに接続し、X-CTUでモニターします。
Img_2365.jpg
前回は送信でしたので、今回はさらっと受信してみます。
Xbeeの設定は前回と同様ですが、PC側のXBeeの送り先16bitアドレスにはMaruduinoに搭載されているXbeeの16bitアドレスを設定しておきます。
前回へのリンク
http://maruduino.blog.so-net.ne.jp/2011-01-04
X-CTUのターミナル画面でASSEMBLE PACKETボタンを押して文字単位での送信ではなく、文字列単位の送信を行える様にしています。
MaruduinoのLCD画面には送信元アドレスとRSSI値、それに受信した文字列を表示します。
/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital DI2
 * LCD Enable pin to digital Di3
 * LCD D4 pin to digital DI4
 * LCD D5 pin to digital DI5
 * LCD D6 pin to digital DI6
 * LCD D7 pin to digital DI7
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 
 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

/**
 * Copyright (c) 2009 Andrew Rapp. All rights reserved.
 *
 * This file is part of XBee-Arduino.
 *
 * XBee-Arduino is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * XBee-Arduino is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with XBee-Arduino.  If not, see <http://www.gnu.org/licenses/>.
 */


// include the library code:
#include <LiquidCrystal.h>
#include <XBee.h>
#include <stdlib.h>
#include <string.h>
/*************************************************************************/
/* defines                                                               */
/*************************************************************************/
#if 0
#define  DI13     2
#define  DI12     3
#define  DI11     4
#define  DI10     5
#define  DI9      6
#define  DI8      7
#define  DI7      8
#define  DI6      9
#define  DI5      10
#define  DI4      11
#define  DI3      12
#define  DI2      13
#define  DI1      
#define  DI0      
#else
#define  DI13     13
#define  DI12     12
#define  DI11     11
#define  DI10     10
#define  DI9      9
#define  DI8      8
#define  DI7      7
#define  DI6      6
#define  DI5      5
#define  DI4      4
#define  DI3      3
#define  DI2      2
#define  DI1      1
#define  DI0      0
#endif

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(DI2, DI3, DI4, DI5, DI6, DI7);
XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
// create reusable response objects for responses we expect to handle 
Rx16Response rx16 = Rx16Response();
Rx64Response rx64 = Rx64Response();

uint8_t option = 0;
uint8_t data = 0;

void setup()
{
  lcd.begin(16, 2);
  lcd.print("Xbee Test!");
  xbee.begin(9600);
}

void loop()
{
  xbee.readPacket();

  if(xbee.getResponse().isAvailable())
  {
    // got something
    if(xbee.getResponse().getApiId() == RX_16_RESPONSE
     || xbee.getResponse().getApiId() == RX_64_RESPONSE )
    {
      // got a rx packet
      if(xbee.getResponse().getApiId() == RX_16_RESPONSE)
      {
        xbee.getResponse().getRx16Response(rx16);
        option = rx16.getOption();
//        data = rx16.getData(0);
      }
      else
      {
        xbee.getResponse().getRx64Response(rx64);
        option = rx64.getOption();
//        data = rx64.getData(0);
      }

      uint8_t len = xbee.getResponse().getFrameDataLength();
      char *buf = (char *)malloc( (size_t)len );
      memcpy( buf, xbee.getResponse().getFrameData(), len );

      lcd.clear();
      lcd.print("src=");
      int src = (buf[0] << 8) | buf[1];
      lcd.print(src,HEX);
      lcd.print(":rssi=");
      int rssi = (int)buf[2];
      lcd.print(rssi,DEC);

      lcd.setCursor(0, 1);
      for( char *ptr = buf + 4; len > 4; len-- )
      {
        lcd.write( *ptr++ );
      }
      free( buf );
    }
    else
    {
      // not something we were expecting
    }
  }
}


ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

  • 作者: 濱原 和明
  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/25
  • メディア: 単行本



前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。