PICキット 周辺モジュールの製作

周辺モジュールと言っても、簡単なものばかりで、製作にてこずる事はありません。
と言うより、笑っちゃう様な物ばかりです・・・
ここからNO表示が20番台になります。





HDC1000 XC8制御関数群

 HDC1Kv1.h

 HDC1Kv1.c

 MSSP02b.h

 MSSP02b.c
NO-20  温度・湿度センサモジュール AE-HDC-1000

秋月電子で購入した、I2C接続温湿度センサモジュールです

主な仕様
温度(摂氏)-20℃~+85℃ 計測精度±0.2℃
湿度0%~100% 計測精度±3%
インターフェイスは、I2Cでクロック最大400KHZ
I2Cアドレスは、80H固定です。

ピン配置(②③④プルアップ抵抗内蔵)
① +V 3~5V(絶対最大定格6V)
② SDA
③ SCL
④ RDY 出力のみで、1=計測中、0=スタンバイあるいは計測終了
⑤ GND

製作
画像の様に、電源ラインとSCL/SDAラインの2本をハンダ付けしただけ
数分で完成となります・・・ (^^ゞ


レジスタアドレス マップ
00H Temperature 温度提示レジスタ
01H Humidity 湿度提示レジスタ
02H Configuration
     bit15 RST 1書込みでリセット、その後ノーマル動作に移行で、0となる
     bit14~13 Reserved 必ず0に設定
     bit12 MODE 
          0=個別測定モードでデータを16ビットで送信、指定レジスタはそれぞれ
          1=同時測定モードでデータを32ビットで送信、指定レジスタは00H
     bit11 BTST 電源電圧状態表示ビット、1で2.8V以下、0で2.8V以上
     bit10 TRES 温度の分解能設定ビット
          0=14ビット分解能
          1=11ビット分解能
     bit9~8 HRES 湿度の分解能設定ビット
          00=14ビット分解能
          01=11ビット分解能
          10=8ビット分解能
     bit7~0 Reserved 必ず0に設定
FBH Serial ID
FCH Seial ID
FDH Seroal ID
FEH Manufacturer ID 5449H
FFH Device ID 1000H


基本制御プログラムの流れ

①START→I2Cアドレス送信80H(WRITE=+0)
②CONFIGアドレス 02H送信
③CONFIGコマンド上位8bit 10H送信(温度湿度32bit連続送信設定)
④CONFIGコマンド下位8bit 00H送信(ここは常に00H送信)
⑤STOP
⑥START→I2Cアドレス送信80H(WRITE=0)
⑦ポインタアドレス温度提示00H送信、計測開始(事実上の計測開始コマンド)
⑧STOP 及び計測ウエイト
⑨START→I2Cアドレス送信81H(READ=+1)
⑩データ受信 温度15-8bit分
⑪データ受信 温度7-0bit分
⑫データ受信 湿度15-8bit分
⑬データ受信 湿度7-0bit分
⑭STOP


取得生データの演算処理方法

センサからのデータは解像度に関わらず、16bit左詰めで送信されます。
温度(℃)=(DATA×165÷65536)-40
湿度(%)=DATA×100÷65536
上記を計算して、LCD等に表示すればOK、と言った案配で、一見シンプルですが・・・

AE-HDC1000用XC8制御関数

PIC内臓モジュールMSSPを使用しますので、MSSP制御関数群も必要です。
詳細はサンプルソースを参照してください。

(1)HDC1000制御関数群

 1) HDC1K_WRT_CONFIG(unsigned int)
    HDC1000のCONFIGレジスタに指定データの書き込みを行います
    引数:16bitの符号無整数
    戻値:無

 2) HDC1K_RCV_TMP(void)
    温度を計測し、その温度データの受信を行います
    計測時間のためのウエイトが入っています
    引数:無
    戻値:16bitの符号無整数

 3) HDC1K_RCV_HUM(void)
    湿度を計測し、その湿度データの受信を行います
    計測時間のためのウエイトが入っています
    引数:無
    戻値:16bitの符号無整数

 4) HDC1K_RCV_REG(unsigned char)
    指定のレジスタから16bitレジスタデータを読込ます
    ウエイトが入っていないため、計測値の受信には使えません
    引数:レジスタアドレス
    戻値:16bitの符号無整数

↑ NO-21 大気圧センサモジュール




↑ 秋月 AE-LPS25H




↑ 本モジュール基板の回路図




LPS25H用 XC8制御関数群

 LPS25Hv1.h
 LPS25Hv1.c

 MSSP02b.h
 MSSP02b.c

注意)
LPS25H関数はMSSP関数群を呼び出します
NO-21 大気圧 センサモジュール AE-LPS25H

秋月電子で購入した、大気圧センサモジュールです。
購入したままでは使い難いので、基板上に配置して簡単に使えるようにしています。
CPU基板との接続は、I2Cシリアルバスとなります。
本基板の入力ピンは、
①VDD 5V
②GND
③SCL
④SDA
以上の4種類となります。

製作した基板上には、センサ基板、レベルコンバータ基板、電源ICが乗っています。
左記回路図を参照して下さい。
さて、この小さなモジュールを購入すると、取扱説明書が同梱されています・・・
しかし、いきなりこれを見ても、プログラムミングなどは、まずできません。
HDC1000を事前に手を出していたので、何となく予想が付きますが・・・
基本的にデータシートを入手して、良く読まないと無理です・・・ (ーー;)

LPS25H8ピンDIPモジュールのピン配置
① VDD 1.7~3.6V(絶対最大定格4.8V)
② SCL
③ SDA
④ SDO スレーブアドレスの下位ビット決定
⑤ CS  VDDに接続するとI2Cとなる、SPIの場合はチップセレクト
⑥ NC  無接続
⑦ INT1 インタラプト1
⑧ GND

I2Cバス用双方向電圧レベル変換モジュールのピン配置(PCA9306使用)
① VREF1 電圧の低い方(1.0V~3.3V)のVDDに接続、ここでは3.3V
② SCL1  電圧の低い方に使用(1KΩでプルアップ済)
③ SDA1  電圧の高い方に使用(1KΩでプルアップ済)
④ VPU   
⑤ GND
⑥ SDA2  電圧の高い方に使用(1KΩでプルアップ済)
⑦ SCL2  電圧の高い方に使用(1KΩでプルアップ済)
⑧ VREF2 電圧の高い方のVDD(1.8V~5V)に接続、ここでは5V
   *詳細は付属の取扱説明書を参照して下さい

LPS25H気圧センサー内部レジスタ表
  色々な機能があり、センサ内部各レジスタに設定処理するのですが、
  面倒なので、最低限使用するレジスタを下記に記します。

センサ内部レジスタ(抜粋)
 REG_ADRS  NAME       TYPE  DATA
 0FH      WHO_AM_I     R    デバイスナンバーBDH(READ)
 20H      CTRL_REG1    R/W  基本動作設定
 21H      CTRL_REG2    R/W  詳細動作設定
 22H-26H   省略             詳細動作設定(マニュアル参照)
 27H      STATUS_REG    R   ステータス読み込み
 28H      PRESS_POUT_XL  R   圧力データ最下位8bit
 29H      PRESS_OUT_L    R   圧力データ中位8bit
 2AH      PRESS_OUT_H    R   圧力データ上位8bit
 2BH      TEMP_OUT_L     R   温度データ下位8bit
 2CH      TEMP_OUT_H     R   温度データ上位8bit

CTRL_REG1 20H
  bit7   PD パワーダウン制御
          1=デバイスは通常(動作中)モード
          0=パワーダウンモード(初期値)
  bit6-4 ODRx 出力データ速度の設定
       bit  圧力のデータ速度  温度のデータ速度
       000  ワンショット(初期値)    ←
       001  1HZ 1HZ
       010  7HZ(143ms)         ←
       011  12.5HZ(80ms)        ←
       100  25HZ(40ms)         ←
       101  予約
       110  予約
       111  予約
  bit3   DEF_EN 圧力差割込み許可
       1=有効
       0=無効(初期値)
  bit2   BDU ブロックデータ更新
       1=読み込まれるまで更新しない
       0=連続で更新する(初期値)
  bit1   RESET_AZ オートゼロ機能のリセット
       1=リセット
       0=無効(初期値)
  bit0   SIM SPIモードの選択
       1=3線式SPI
       0=4線式SPI

CTRL_REG2 21H
  bit7 BOOT 再起動のメモリ内容、完了時に自動でクリア
       1=再起動のメモリ内容
       0=通常モード(初期値)
  bit6 FIFO_EN FIFOを有効にする
       1=有効
       0=無効(初期値)
  bit5 WTM_EN FIFOの基準値レベルの使用を有効にする
       1=有効
       0=無効(初期値)
  bit4 FIFO_MEAN_DEC
       1=有効
       0=無効(初期値)
  bit3 予約済み
  bit2 SWRESET ソフトウエア・リセット
       1=ソフトウエアリセット
       0=通常モード(初期値)
  bit1 AUTO_ZERO オートゼロ機能の許可
       1=オートゼロを許可
       0=通常モード(初期値)
  bit0 ONE_SHOT ワンショットの許可
       1=新たな変換の開始
       0=測定終了・変換指示待ち
       *このbitを1にして測定・変換を終了すると、自動的にbitは0となる
        STATUS_REGにも結果が反映されます

STATUS_REG 27H
  bit7-6 予約済み
  bit5 P_OR 圧力データの上書き
       1=上書きされた
       0=上書きされていない(初期値)
       *PRESS_OUT_Hが読み出しされると、このbitは常に0となる
  bit4 T_OR 温度データの上書き
       1=上書きされた
       0=上書きされていない(初期値)
       *TMEP_OUT_Hが読み出しされると、このbitは常に0となる
  bit3-2 予約済み
  bit1 P_DA 圧力データの準備状況
       1=新しい圧力データが準備された
       0=新データは準備されていない
       *PRESS_OUT_Hが読み出しされると、このbitは常に0となる
  bit0 T_DA 温度データの準備状況
       1=新しい温度データが準備された
       0=新データは準備されていない
       *TMEP_OUT_Hが読み出しされると、このbitは常に0となる


基本制御プログラムの流れ
(1)初期設定
 ①START→I2Cアドレス送信B8H(WRITE=+0)
 ②CTRL_REG1アドレス 20H送信
 ③CTRL_REG1設定データ80Hor90H他送信
  センサパワーオン設定、ワンショット測定或いは自動インタバル測定
 ④STOP
(2)測定命令
 ①START→I2Cアドレス送信B8H(WRITE=+0)
 ②CTRL_REG2アドレス 21H送信
 ③CTRL_REG2設定データ01H送信
  ワンショット測定開始
 ④STOP
(3)測定完了時間待ち、或いはSTATUS_REGチェック
(4)測定値(気圧)読み込み
 ①START→I2Cアドレス送信B8H(WRITE=0)
 ②PRESS_POUT_XLアドレスA0H送信(連続READコマンド)
 ③RESTART→I2Cアドレス送信B9H(READ=+1)
 ④データ受信 気圧データ7-0bit分
 ⑤データ受信 気圧データ15-8bit分
 ⑥データ受信 気圧データ23-16bit分
 ⑦STOP
(5)測定値(気温)読み込み
 ①START→I2Cアドレス送信B8H(WRITE=0)
 ②TEMP_OUT_LアドレスABH送信(連続READコマンド)
 ③RESTART→I2Cアドレス送信B9H(READ=+1)
 ④データ受信 気圧データ7-0bit分
 ⑤データ受信 気圧データ15-8bit分
 ⑥STOP
注意
 *MSSP低レベルルーチンVer0.2a以降でないと動作しません

取得生データの演算処理方法

センサからのデータは大気圧24bit、温度16bitで送信されます。
また、2の補数で表現されています。
しかし、大気圧はこのままの設定では事実上絶対値なので、そのまま演算できます。

気圧(hPa)=DATA÷4096
温度(℃)=40-(DATA÷480)

上記を計算して、LCD等に表示すればOK、と言った案配で、
大気圧計算はシンプルなのですが・・・
温度は2の補数表現なので、そのままでは除算が出来ず、ひと工夫が必要です
詳細は製作編のソースファイルを参照して下さい。


追記 2017年03月25日

XC8用制御関数

XC8による制御関数群
PIC内臓モジュールMSSPを使用しますので、MSSP制御関数群も必要です。
最低限、2),3),5),6)の関数呼び出しで気圧と気温が取得できます。
詳細はサンプルソースを参照してください。

(1)LPS25H制御関数群

 1) LPS_INIT(void)
    LPS25Hの通信確認を行います
    通信が確立した場合、読み込んだデバイスナンバを返します
    引数:無
    戻値:8bitのデバイス番号(BDH)、符号無char

 2) LPS_WRTRG1_(unsigned char)
    LPS25HのCTRL_REG1の設定(書き込み)を行います
    引数:8bitのCTRL_REG1の設定データ
    戻値:無

 3) LPS_WRTRG2(unsigned char)
    LPS_25HのCTRL_REG2の設定(書き込み)を行います
    引数:8bitのCTRL_REG2設定データ
    戻値:無

 4) LPS_WRTRG(unsigned char1,unsigned char2)
    指定のレジスタに設定(書き込み)します
    書き込んではいけないレジスタもありますので、注意
    この関数はマニュアルを熟読してからご使用ください
    引数1:レジスタアドレス
    引数2:設定データ、1バイト
    戻値:無

 5) LPS_RCVP(void)
    測定した圧力値を受信(24bit補数)します
    マイナスは無いので、事実上符号は関係ありません。
    引数:無
    戻値:24bit大気圧測定データ(24bit整数)

 6) LPS_RCVT(void)
    測定した温度値を受信(16bit補数)します
    引数:無
    戻値:16bit気温測定データ(16bit符号付整数)

 7) LPS_STATUS(void)
    現在のステータスレジスタの値を受信します
    引数:無
    戻値:8bitステータスデータ(符号無char)

 8) LPS_RCVRG(unsigned char)
    指定のレジスタからデータを受信します
    引数:レジスタアドレス
    戻値:8bitのレジスタデータ(符号無char)










NO-22 LEDモジュール

何の事は無い、ただのLEDを2本付けただけの代物・・・
とは言っても意外と使用頻度が高く、デバッグや実験に必需品です。
全くの初めてのPICプログラミング、のモチーフにも最適です。
実際はデバッグ用として、CPU基板初号器製作の頃から存在していたのですが、表に出す程の物でも無いと思い、今に至ります。
簡単に製作できるし使い勝手も良いので、現在までに複数個作っています。

使用方法はRA4とRA5ピンに、水晶発振器と同じ様に差し込むだけです。
もちろん、水晶モジュールと排他的での使用となります。
任意のプログラム中に、RA5あるいはRA4を1にすると、各々のLEDが点灯します。
RAピンから電流が流れ出る形となります。
戻る  実験・製作の記録TOPへ戻る