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デバイスが接続されていませんが)
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回南中する日 »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
この記事へのコメントは終了しました。
コメント