« 計算した流星の経路を表示するための星図の作り方 | トップページ | カノープスが2回南中する日 »

2014年12月22日 (月)

PIC/I2C大気圧センサーLPS331APの測定値をSDカード(SPI)に記録する - はじめに

その後他のSPIデバイスといっしょに使うとSDカードが読み書きできないというトラブルに見舞われました。なんとか読み書きできるようにはなったのですが....

  「SPI接続でSDカードとMCP3208がいっしょに使えない話

--------

やっとLPS331APで測定した気圧と温度を測定時刻とともにSDカードに書き込めるようになりました。
今回は“はじめに”ということで概要を書きます。具体的なソースとか回路というか実装については別に記事にする予定です。

大気圧・温度センサーは「PICでI2C - 大気圧・温度センサーLPS331APの使い方」で記事にしたLPS331APを使います。気圧の測定精度はなかなかのものがあります。温度はちょっとあやしいですが実用的にはそう気にするほどではありません。温度も精度がほしいという方はAM2321なんかいいかもしれません。これもI2CなのでLPS331APといっしょに使えます。「温度センサー3種の精度比較(摂氏0度~40度編)」などを参考にしてください。

LCDは「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」にあるACM1602を使っています。これもI2Cです。測定値をSDカードに記録するだけならLCDは不要ですがあった方が何かと便利です。

SDカードは4GbyteのSDHCを“デバイスの既定値”でフォーマットして使っています。ソケットは秋月電子通商で売っていたDIP化基板です。

RTCは「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの実装」です。なかなか正確です。そこまで正確でなくてもいいならI2CのRTCもあります(参考「PICでI2C - リアルタイムクロック(RTC) DS1307+の使い方」)

ソースはメインとLPS331APのところだけ次の記事に書きます。あとは以下を参照していただければと思います。各記事にあるソース(ライブラリ)をそのまま使っています。

I2CライブラリとLCDのライブラリ
I2Cのソース - PIC12F1822/16F1705/16F1938/18F26K22 - LCD(ACM1602)を例にして

SPIのライブラリとRTC/DS3234Sのライブラリ
PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの使い方

SDカードのライブラリ
PICでSPI SDカードを読み書きする

いずれもはきむしげさん(きむ茶工房ガレージハウス)の記事にあるソースがベースです。特にSDカードのは「MMC/SDカードを接続し読書きを行って見ます」をそのまま使っています(ほんのちょっと手を加えてあるのでいちおう私の記事も読んでください)

======

PIC: PIC18F26K22
機能豊富、メモリーもいっぱいついています。ピン数が多いのが難だと思ってましたがそのうちピンも使い切るかも (^^;;

コンパイラ: Microchip MPLAB XC8 C Compiler (Free Mode) V1.32
浮動小数点の計算(math.lib)が必要です。(あんまり意味がないと思いますが)LPS331APのデータをすべて使うのだったら“--float=32”でのコンパイルが必要です(私は“--float=24”でやってます)

回路図を書くのが面倒なのでどういう具合に接続されているかだけ書いておきます。
カッコつきの数字はPICkit3のピン番号です。

// 01 RE3/VPP/MCLR .....(1) 10kでプルアップ
// 02 RA0/AN0
// 03 RA1/AN1  ====>  10kでプルアップしLowに落としたら測定終了
// 09 RA7/CLKI/OSC1  ====>  RTCの/CS
// 13 RC2/CTPLS/P1A/CCP1/T5CKI/AN14
       =====> I2Cバスの接続先選択用アナログスイッチのON/OFF用(注2)
// 14 RC3/SCL1 =====> I2Cバス
// 15 RC4/SDA1 =====> I2Cバス
// 19 VSS .....(3)
// 20 VDD .....(2)
// 21 RB0/INT0/CCP4/FLT0/SRI/SS2/AN12 =====> RTCの1PPS(毎秒割込み)(注3)
// 22 RB1/INT1/P1C/SCK2/SCL2/C12IN3-/AN10 =====> SDカード(ソケット)の CLK(注1)
// 23 RB2/INT2/CTED1/P1B/SDI2/SDA2/AN8 =====>  SDカード(ソケット)の SDO
// 24 RB3/CTED2/P2A/CCP2/SDO2/C12IN2-/AN9 =====> SDカード(ソケット)の SDI
// 25 RB4/IOC0/P1D/T5G/AN11  ====>  SDカード(ソケット)の /CS
// 27 RB6/TX2/PGC .....(5)
// 28 RB7/RX2/PGD .....(4)

注1

SCK2なんですが、今回SDカードにはそのまま接続してあるのですがRTC/DS3234Sにはインバータ(実際にはNORで片側をLowに落としたもの)を通して接続しています。このためmode 0で動くRTCが見かけ上mode 2で動作しています。これだとSPIのモード切り替えは不要になります。

これはそういう効果を狙ってしているわけではなくどうしてもまともに動かせなかったとき苦し紛れにいろいろやったときの名残です(「勘違い! - PICでSPI - RTC・DS3234SとSDカードがいっしょに使えない」)

mode 0からmode 2にするときは

  SSP2CON1 |= 0b00010000;

mode  2からmode 0にするときは

  SSP2CON1 &= 0b11101111;

とすればいいと思います。そのうち回路を元にもどして(=インバーターを使わないようにして)確かめてみるつもりです。 <== 「PIC/I2C大気圧センサーLPS331APの測定値をSDカード(SPI)に記録する - ソース編」では回路をもとに戻してつまりふつうの状態にしてSPIのmodeを切り替える形にしてあります。

注2

I2Cの接続先を変える話は「同じアドレスのI2Cデバイスを使う」にあります。

注3

RTCの1PPSは出力するように設定する必要があります(「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの使い方」のソースの時刻設定の部分にやり方があります)

実験風景(まだI2Cデバイスが接続されていませんが)
Imgp1259800

A. PIC18F26K22
B. 74HC4066(同じアドレスのI2Cデバイスを使うため)
C. ACM1602(I2C接続LCD) <== ここから別のI2Cデバイスに接続します。
D. SDカード(とそのソケット)
E. DS3234S(RTC)
F. RTCバックアップ用リチウム電池

PIC/I2C大気圧センサーLPS331APの測定値をSDカード(SPI)に記録する - ソース編」に続く

----

関連

  趣味の電子工作
    PIC

  「PICでSPI SDカードを読み書きする
  「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの使い方」(ソース付き)
  「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの実装

  「PICでI2C - リアルタイムクロック(RTC) DS1307+の使い方

  「PICでI2C - 大気圧・温度センサーLPS331APの使い方
  「温度センサー3種の精度比較(摂氏0度~40度編)

« 計算した流星の経路を表示するための星図の作り方 | トップページ | カノープスが2回南中する日 »

趣味の電子工作」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック

« 計算した流星の経路を表示するための星図の作り方 | トップページ | カノープスが2回南中する日 »

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ