XBee3の新機能を試す。(PyCharm-開発編)

〔マイコンのトップに戻る〕
[Xbeeの実験] [FileSystem] [MicroPython] [PyCharm導入 [PyCharmの操作]  


前回は"PyCharm-インストール編"と"操作編"を書きました。
今回は"開発編"と題して[PyCharm]のIDEを使ってXBee3のMicroPythonプログラムを作成します。

《コーディネータがメッセージを受信する》

前のページで、操作したこちらの記事はコーディネーター/ルーター共にXCTUのMicroPython環境
"REPL"を使用したものでした。
ここの記事は、ルーター側は同じ"REPL"で操作しますが、コーディネーター側を"PyCharm"IDEで
操作したいと思います。

[ コーディネーター側 ]

@ 先ずは、ここ(ZB_C_rcv.zip)からプロジェクトファイルをダウンロードし解凍します。

A "PyCharm"を起動させます

PyCharmようこそ画面4
PyCharmへようこそ」画面の
メニューから”開く”をクリックします。

B [ファイルまたはプログラムを開く]ウインドウ画面が開くので、この画面から上で解凍した
  プロジェクトファイルを開きます。

C 下図の様に開くでしょう。

ZB_C_rcvのプロジェクト画面

D 親機(コーディネータ)を”パソコンと繋いでみる”の様に配線します。
  親機の設定はXBeeパート3の"親機の設定を行う"を参照下さい。

E 後は、こちらの《ちょいとぉサンプルを動かす》のE〜Hまで操作しましょう。

F XBee3のフラッシュメモリに書き込まれ、プログラムが実行されます。

ZB_C_rcvの実行画面
ルーターのネットワーク参加待ちです。


[ エラーが出る場合 ]

初回起動、フラッシュメモリに書き込まれていてそのプログラムが自動起動している場合に、
実行させるとぉ次の様なエラーが出る場合があります。

実行時のエラー画面

その際はXBee3の自動実行しているプログラムを中断させます。

実行時のエラー画面
[XBee REPL Console]画面を選択します。
左上の[接続]アイコンをクリックしXBeeと繋ぎます。
ここで[CTRL]+[C]キーが聞かない場合は、XBeeの[REST]ボタンを押します。
再度プログラムが自動起動しますが今度は[CTRL]+[C]キーでプログラムが中断するでしょう
(XCTUの[MicroPython Terminal]でプログラムを中断させても良いでしょう)


[ ルーター側 ]

ルーター側は、こちらの"REPL"で同様な操作を行いましょう。

[ 実行結果 ]

ルーターの実行画面1
ルーター側の実行画面です。

コーディネータの実行画面1
コーディネータ側の実行画面です。


《XBee3のI2Cを操作する》

MicroPythonを使用するとI2Cが操作できる様なので使ってみます。
(ここまで読まれている読者様は、もうXBee操作に長けていますね、説明は端折ります。)
HDC1000 HDC1000ですが、”新規設計に用いることは推奨しません”らしく
代替えがHDC2010らしい、秋月通商でも取り扱いを止めたみたいで
SHT31使用のこちらを販売しているが操作方法は異なる。
SHT31の方は手に入れたら記事を書く事にして、ここではHDC1000を使います。
このHDC1000は、電源は2.7V〜5.5Vで、I2C接続のモジュールです。
このモジュールは、SDA/SCL/RDY端子に10KΩのプルアップ抵抗付きとなります。

RDY(DRDYn)ピン
データの変換が終了するとLOWを出力する信号ピンですが、ここでは使用していません。

I2Cアドレス
HDC1000自体は4種類のアドレスが選択できますが、
このモジュールは1種類固定(0b1000000x:0x40)となります。

配 線
HDC1000端子  XBee3端子
 VDD ------------ VCC(1) ------------- 3.3V
 SDA ------------ DIO11(7)
 SCL -------------DIO1(19)
 RDY
 GND ------------ GND(10) ------------ GND
          DIO5(15) --- LED --- GND ネットワーク参加状態表示(参加で点滅)

[ 実行 ]

@ 上記記載の"《コーディネータがメッセージを受信する》"で行った、
  コーディネータをそのまま使います。

A コーディネータをPCに接続して"XCTU"を起動させ、[MicroPython Terminal]画面を
  起動させて置きましょう。

B ルーター側は、ここ(ZB _R_hdc1000.zip)からプロジェクトファイルをダウンロードし解凍します。

C "PyCharm"を起動させ、"ZB _R_hdc1000"プロジェクトを開きましょう。

D ルーターをPCに接続して、"PyCharm"でプロジェクトをコンパイルし実行させましょう。

[ 実行結果 ]

ルーターの実行画面2
ルーター側の実行画面です。

コーディネータの実行画面2
コーディネータ側の実行画面です。


[ sk_hdc1000.py ]

HDC1000(I2C)で温度・湿度を得る為のユーティリティ関数です。

クラスHDC1000.__init__(i2c, slave_addr=64)
 クラスを生成する時に実行されるHDC1000用の初期化関数です。
 初期化は、温度と湿度の両方の測定値は独立した測定にして、14ビットの解像度で設定

 i2c    :I2Cセンサーと対話する為に使用されるi2cオブジェクト
 slave_addr: センサーのスレーブアドレス(デフォルトは64又は0x40)

 例)

 from machine import I2C
 from sk_hdc1000 import HDC1000

 sensor = HDC1000(I2C(1, freq=400000))  # HDC1000操作のオブジェクトを生成する
 以降の関数説明はこの宣言例で記述します。

sensor.read_temperature(celsius=False)
 現在の温度を読み取ります。

 celsius : Trueの場合、温度は摂氏で返され、それ以外の場合は華氏です(デフォルトはFalse)
 RETURN: 読み取った温度値を返します

sensor.read_humidity()
 現在の湿度を読み取ります。

 RETURN: 読み取った湿度値を返します

 例)
  temp_celsius = sensor.read_temperature(True)
  print("Temperature: %s C" % round(temp_celsius, 2))
  humidity_hr = sensor.read_humidity()
  print("Humidity: %s %%" % round(humidity_hr, 2))

[ クラスI2C:2線式シリアルプロトコル ]

(注)I2C機能をサポートするデバイスにのみ適用されます。

I2Cはデバイス間の通信用の2線式プロトコルです。
物理レベルでは、SCLとSDA、それぞれクロックとデータラインの2本のワイヤで構成されています。
XBeeデバイスは、MicroPythonによって制御されるI2Cマスターとして機能する事ができます。
これにより、マイクロコントローラを追加する事なく、MicroPythonを介してアクチュエーターや
センサー等のI2Cデバイスで基本的なセンシング及び作動を実行できます。

MicroPython APIは、MicroPythonライブラリリファレンスに記載されているものと同じですが、
XBeeデバイスは"deinit()"操作をサポートしていません。
sclおよびsdaパラメータを使用してピンを選択する事は、XBeeデバイスでは無効です。
I2Cの実装はハードウェアを介して提供される為、machineの I2C モジュールで行います。
以下は、"I2C"モジュールの関数一覧です。
------------------------------------------------------------------------------
>>> from machine import I2C
>>> help(I2C)
object <class 'I2C'> is of type type
  init -- <function>
  scan -- <function>
  start -- <function>
  stop -- <function>
  readinto -- <function>
  write -- <function>
  readfrom -- <function>
  readfrom_into -- <function>
  writeto -- <function>
  writevto -- <function>
  readfrom_mem -- <function>
  readfrom_mem_into -- <function>
  writeto_mem -- <function>
>>>
------------------------------------------------------------------------------

クラスmachine.I2C(id、*、freq = 400000)
 以下のパラメータを使用して、新しいI2Cオブジェクトを構築して返します。
 ・idは特定のI2Cペリフェラルを識別します。
  このバージョンのMicroPythonは、SCLにDIO1、SDAにDIO11を使用して、
  ID=1のみで周辺機器をサポートします。
 ・freqは、I2Cクロックの最大通信周波数(SCL)を設定する整数です。

 (注)I2Cオブジェクトを作成する前に、ATコマンドを使用してXBee I/Oを設定する必要はありません。
    適切なI O設定が自動的に実行されます。

I2C.scan()
 0x08と0x77の間の全てのI2Cアドレスをスキャンし、応答したスレーブデバイスのアドレスのリストを
 返します。
 デバイスは、アドレス(書き込みビットを含む)がバスに送信された後にSDAラインをローに引き下げると
 応答します。

I2C.readfrom(addr、nbytes、stop = True)
 addrで指定されたアドレスのスレーブからnバイトを読み取ります。
 stopが真(True)の場合、転送終了時にSTOP条件が生成されます。
 読み込んだデータを含むbytesオブジェクトを返します。

I2C.writeto(addr、buf、stop = True)
 bufからaddrで指定されたアドレスのスレーブにバイトを書き込みます。
 bufからのバイトの書き込みに続いてNACKを受信した場合、残りのバイトは送信されません。
 stopが真(True)の場合、例えNACKが受信されても、転送の終わりにSTOP条件が生成されます。
 この関数は受信したACKの数を返します。
 
 (注)bufはbytearray型のオブジェクトでなければなりません。
 (例)
        data = bytearray(3)
        data[0] = CONF_REG  # 構成レジスタのアドレス
        data[1] = 0         # 構成レジスタのHight側データ
        data[2] = 0         # 構成レジスタのLow側データ
        i2c.writeto(self.addr, data)

一部のI2Cデバイスは、読み書き可能なメモリデバイス(又はレジスタセット)として機能します。
この場合、I2Cトランザクションに関連付けられた2つのアドレスがあります。
スレーブアドレスとメモリアドレスです。
以下のメソッドは、そのようなデバイスと通信する為の便利な機能です。

I2C.readfrom_mem(addr、memaddr、nnbytes、*、addrsize = 8)
 memaddrで指定されたメモリアドレスから始めて、addrで指定されたアドレスのスレーブから
 nバイトを読み込みます。
 引数addrsizeはアドレスサイズをビットで指定します。
 読み込んだデータを含むbytesオブジェクトを返します。

I2C.writeto_mem(addr、memaddr、buf、*、addrsize = 8)
 memaddrで指定されたメモリアドレスから始めて、addrで指定されたアドレスのスレーブにbufを
 書き込む。
 引数addrsizeはアドレスサイズをビットで指定します。
 メソッドはNoneを返します。
 
 (注)bufはbytearray型のオブジェクトでなければなりません。

《XBee3にI2C LCDを接続する》

XBeeでスタンドアロン的な機器を作成する場合、端末に一々接続できないやはり何か表示する手段が
欲しい、そこでぇ、I2C接続LCDくらいは繋がる様にして置きたいと思う。
HDC1000  これは、こちらの商品です、
 詳しい説明は”I2C接続小型LCDモジュールに表示を行う”を見ましょう。
 LCD電源は3.3V/5.0Vで、使う電源に応じてコマンド設定が必要です。
 プルアップ抵抗は基板に半田盛するか、外付け10KΩが必要です。
 コントラストもコマンド設定となります。

又、コントローラーはST7032iなので他のST7032i系LCDも利用可能と思います。

RESETピン
LOWでリセットがかかるので通常はVDDに接続です。

I2Cアドレス
このLCDは1種類固定("0111110":0x3e)となります。
ST7032i搭載コントローラであれば、どのLCDもアドレスはすべて同じ様です。

配 線
LCD端子     XBee3端子
 VDD --------┬--- VCC(1) ---------------┬----- 3.3V
 RESET ------┘            │
 SCL -------------DIO1(19) ---[10KΩ]---┤
 SDA ------------ DIO11(7) ---[10KΩ]---┘
 GND ------------ GND(10) ---------------------- GND
          DIO5(15) --- LED ------------ GND ネットワーク参加状態表示(参加で点滅)

※ 今回の実験では、USBからの5.0V電源で、LCDには5.0Vが掛かっています、
  XBee3はモジュール基板で基板内蔵の電圧レギュレータで3.3Vに変換されています。(下記実験写真参照)

[ 実行 ]

@ ここ(i2c_lcd_library.zip)からプロジェクトファイルをダウンロードし解凍します。

A "PyCharm"を起動させ、"i2c_lcd_library"プロジェクトを開きましょう。

B XBee3をPCに接続して、"PyCharm"でプロジェクトをコンパイルし実行させましょう。

C LCDの1行目に[I2C Test]と表示し、2行目に[XBee3  ]と表示するでしょう。

[ sk_st7032i.py ]

i2C接続LCDに表示を行う為のユーティリティ関数です。

クラスST7032i.__init__(i2c、contrast、*、bon=False、slave_addr=0x3E)
 クラスを生成する時に実行されるLCD用の初期化関数です。
 初期化は、"表示は2行/昇圧回路OFF/アイコンは使わない/カーソル表示はOFF/画面消去"で設定

 i2c    :I2Cデバイスと対話する為に使用されるi2cオブジェクト
 contrast : LCDのコントラストを指定します(0-63)
 bon    : True=昇圧回路ON(Vcc3.3V使用時) False=昇圧回路OFF(Vcc5.0V使用時)(デフォルト)
 slave_addr: センサーのスレーブアドレス(デフォルトは62又は0x3E)

 例)
 from machine import I2C
 from sk_st7032i import ST7032i

 i2c = I2C(1, freq=100000)  # I2Cのオブジェクトを生成する
 lcd = ST7032i(i2c, 30)     # I2C接続LCD操作のオブジェクトを生成する
 以降の関数説明はこの宣言例で記述します。

lcd.clear()
 LCDの画面を消し(20hのスペースで埋める)ます、カーソル位置は0,0に戻ります。

lcd.cursor(col、row)
 カーソル位置を移動します。

 col: 横(列)方向のカーソル位置(0-39)
 row: 縦(行)方向のカーソル位置(0-1)

lcd.charout(s)
 指定の文字をLCDに表示させます。
 LCDの表示可能範囲をはみ出た文字は表示されません。

 s: 出力する文字データを指定
 例)
 lcd.charout("I2C Test")     # 文字を表示する
 lcd.cursor(0, 1)            # 文字の表示位置を2行目の1桁目に移動する
 lcd.charout('XBee'+'\x33')  # 文字を表示する

[ 実験風景 ]

実験風景
電源はUSBからの5.0Vを使っています。
XBee3は秋月電子通商のXBee用2.54mmピッチ変換基板に乗せて、
PCとの接続には、”USBシリアル変換モジュール”で行っています。
このモジュール説明や接続方法は”XBee(無線通信)の実験パート1”を参照してください。





【きむ茶工房ガレージハウス】
Copyright (C) 2006-2019 Shigehiro Kimura All Rights Reserved.