PICでI2C - 1 (温度計を作る)
タイトルには“I2C”とあるのですが、この記事にはI2Cの話は何もありません。
“I2C”の話題は次の記事
「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」
から始まります。詐欺だと思われるとイヤなので念のために補足しておきます (^^;;
参考
「I2Cのソース - PIC12F1822/16F1705/16F1938/18F26K22 - LCD(ACM1602)を例にして」
「PICでI2C - 温度センサーLP331APとAM2321の精度比較」
実際精度はどんなものか調べてみました、の一回目です。
「PICでI2C - 大気圧・温度センサー LPS331の使い方」
「I2C大気圧センサーLPS331の驚くべき分解能」
大気圧と温度を測っていますが、あくまでも大気圧センサーです。
温度計としては涙が出るくらいひどいです。
気圧計としては精度も分解能もいいです。おまけの温度計もちゃんと使えました。
「PICで平方根 - 白金薄膜抵抗で温度を測る」
この記事でもほんとうに温度計を使っています。
I2CのADコンバータも使っています。
「PICでI2C - ADコンバーター・MCP3425の使い方」
これはI2Cのところのコーリングシーケンスもちゃんと書いてあります (^^;;
---
最近“温度測定”に凝っています。
比較的精度が高いセンサーがないか「秋月電子通商 - 電子部品・半導体 【通販・販売】」で探していたら「温湿度センサ モジュール AM2321 」がありました。
精度は±0.3度とありますからまあまあです。これ以上を1000円以下で望むというのはムリというものでしょう。
仕様には“I2C”という言葉があります。これを見てやめようかと思ったのですが、よく考えると先日参号機用に買ってきたPIC16F1938の特徴の項目に“SPI”とか“I2C”という言葉が並んでいました。
そこで無謀にもAM2321での温度測定にチャレンジしてみることにしました。
同時進行ですから最後まで行きつけるかどうかわかりません (^^;;
センサー
AM2321 秋月電子通商 - AM2321 データシート (説明は中国語です)
PIC
PIC16F1938 Microchip - PIC16F193X/LF193Xデータシート (これは日本語です)
ライター
Microchip PICkit 3
開発環境
Microchip MPLAB X IDE V2.15
Microchip MPLAB IDE V2.15
(Windows8.1 Pro.で使用します)
ところでPICを使ってみようと思ったときいちばん困ったのはPICを使うために最低限何を準備すればいいかわからないということでした。PICに関連する記事はたくさんあるのですが意外とこれがはっきりと書いたものがないです。あまりにも基礎的な(常識的な?)で書くまでもないということなのかもしれませんがそれがわからないから初心者なわけで....
網羅的に、これでもいいがあれでもいい、とか、これも使えるしあれも使える、というような書き方をしてあると、で、けっきょくどれにすればいいの?、となるわけで(書いた方は親切にできるだけいろんな情報を、というつもりなんでしょうが)初心者は混乱に陥ります。
上に書いたように新たに用意するハードは(たとえば)PICkit 3と自分の好きな(必要とする)PICだけでいいです。PIC(を載せたボード)とライターを接続するケーブルも必要ですが自分で適当なものを作ります。ピンヘッダかブレッドボード用のジャンパを使えば簡単に作れます。まあジャンパでつなぐだけでもだいじょうぶですが。
あとはPCに開発環境(MPLAB X IDEまたはMPLAB IDE)をインストールするだけです。
こんな感じで“開発”しているという写真です。
これは“ICSP”をやっているということになるのでちょっと注意すべき点がありますがプログラムが書き込まれるとすぐに動き出してテストができますので便利です。ICSPのときの注意点は私は正確なことは書けそうにないのでご存じない方はググってください。注意すべき点はデータシートの「25.0 IN-CIRCUIT SERIAL PROGRAMMING™ (ICSP™)」のところを見てどういうことをすればまずいのか理解できれば問題ないと思います。図がちょっと間違ってるみたいですが。
ピンアサイン
PICkit 3 | PIC16F1938 |
1. VPP | 1. VPP/MCLR/RE3 |
2. VDD | 20. VDD |
3. VSS | 8. VSS 19. VSS |
4. ICSPDAT | 28. RB7/ICSPDAT/ICDDAT/SEG13 |
5. ICPSCLK | 27. RB6/ICSPCLK/ICDCLK/SEG14 |
-------
話が逆になりますが、OSインストールしなおしたばっかりなのでMPLAB X IDEをインストールしました。
さっそくトラブルが....
インストールの途中でエラーが出ます。
ググったら原因がすぐにわかりました。
「yuki-sato.com - PIC入門講座 - MPLAB IDE v8.3をインストール」
管理者権限でインストールすればいいようです。
インストーラの命じるままXC8コンパイラーもインストールしました。
-------
というわけでこれからぼちぼち作っていきます。
ひとまずMPLAB X IDEの操作の仕方やPIC16F1938のコンフィグレーションなどを覚えるため「きむ茶工房ガレージハウス - スイッチの入/切でLEDを点灯させます」を動かしてみます。
ソースはちょっと変更しました。
“BORV_25”はコンパイルエラーが起きたのではずしました。動作には関係なさそうです。
(「きむ茶工房ガレージハウス」の掲示板を見ていたらXC8コンパイラの場合は“BORV_HI”を使うようです。こう直したらコンパイルエラーはなくなりました)
入出力ピンは出力として使うRC3を除きすべて入力にしました。これは“流儀”だと思いますが入力ピンにしておけば間違って何かつないでもたいていだいじょうぶだと思うので私の場合はそうしています。ICSPだと現実にPICkit 3が接続されていますし、こういうとき出力に設定したらどうなるか考えるより入力にしてしまえば何も考えなくていいので気が楽です (^^;;
なおこのソースの“権利関係”(?)は「きむ茶工房ガレージハウス」の下の方に記されています。
#include <pic.h> // コンフィギュレーション1の設定 // CLKOUTピンをRA6ピンで使用する(CLKOUTEN_OFF):内部クロックを使用する(INTIO) // 外部クロック監視しない(FCMEN_OFF):外部・内部クロックの切替えでの起動はなし(IESO_OFF) // 電源電圧降下常時監視機能ON(BOREN_ON):電源ONから64ms後にプログラムを開始する(PWRTEN_ON) // ウオッチドッグタイマー無し(WDTE_OFF): // 外部リセット信号は使用せずにデジタル入力(RE3)ピンとする(MCLRE_OFF) // プログラムメモリーを保護しない(CP_OFF):データメモリーを保護しない(CPD_OFF) __CONFIG(CLKOUTEN_OFF & FOSC_INTOSC & FCMEN_OFF & IESO_OFF & BOREN_ON & PWRTE_ON & WDTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF) ; // コンフィギュレーション2の設定 // 動作クロックを32MHzでは動作させない(PLLEN_OFF) // スタックがオーバフローやアンダーフローしたらリセットをする(STVREN_ON) // 低電圧プログラミング機能使用しない(LVP_OFF) // Flashメモリーを保護しない(WRT_OFF):電源電圧降下常時監視電圧(2.5V)設定(BORV_25) // 低電圧レギュレータ用のキャパシタは使用しない(VCAPEN_OFF) // __CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & BORV_25 & LVP_OFF & VCAPEN_OFF) ; __CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & LVP_OFF & VCAPEN_OFF) ; // メインの処理 void main() { OSCCON = 0b01110010 ; // 内部クロックは8MHzとする OPTION_REG = 0b00000000 ; // デジタルI/Oに内部プルアップ抵抗を使用する ANSELA = 0b00000000 ; // AN0-AN4は使用しない全てデジタルI/Oとする ANSELB = 0b00000000 ; // AN8-AN13は使用しない全てデジタルI/Oとする // TRISA = 0b00000000 ; // ピン(RA)は全て出力に割当てる(0:出力 1:入力) // TRISB = 0b00000001 ; // ピン(RB)はRB0のみ入力、他は全て出力に割当てる // TRISC = 0b00000000 ; // ピン(RC)は全て出力に割当てる TRISA = 0b11111111 ; // ピン(RA)は全て入力に割当てる(0:出力 1:入力) TRISB = 0b11111111 ; // ピン(RB)は全て入力に割当てる TRISC = 0b11110111 ; // ピン(RC)はRC3をのぞき全て入力に割当てる WPUB = 0b00000001 ; // RB0は内部プルアップ抵抗を指定する PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする) PORTB = 0b00000000 ; // RB出力ピンの初期化(全てLOWにする) PORTC = 0b00000000 ; // RC出力ピンの初期化(全てLOWにする) while(1) { if (RB0 == 0) { // 21番ピン接続のスイッチが押されたか? RC3 = 1 ; // 14番ピンにHIGHを出力する(LED 点灯) } else { RC3 = 0 ; // 14番ピンにLOWを出力する(LED 消灯) } } }
------
関連
「PICでI2C - 大気圧・温度センサー LPS331の使い方」
「PICでI2C - ADコンバーター・MCP3425の使い方」
「PICで平方根 - 白金薄膜抵抗で温度を測る」
「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」
「PICでI2C - LCD(液晶)ディスプレイによる違い」
「PICでI2C - 1 (温度計を作る)」
「I2Cデバイス・アドレス一覧」
「I2C大気圧温度センサーLPS331の驚くべき分解能」
「海面更生気圧を気象庁とくらべてみた - I2C大気圧温度センサーLPS331」
「サーミスタによる温度測定の精度」
「サーミスタ温度計の精度を調べる - 1」
「ミニ恒温槽の作成に向けて - 1」
「炭素皮膜抵抗の温度係数を測定する話」
参考
「きむ茶工房ガレージハウス - PICの動かせ方入門はこちら - 16F1938覚書」
「きむ茶工房ガレージハウス - I2C通信の実験」
「きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」
予習として拝見していたのですが、とても参考になります。
私の記事を読んでI2Cのセンサーを使って温度計とか気圧計とかそういうものを作りたくなった方も実際に作られるときはこちらを読まれた方がいいと思います。
「電子工作の実験室 - PIC(8bit) - PIC16シリーズ - I2Cモジュールの使い方」
« サーミスタ温度計の精度を調べる - 1 | トップページ | PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する »
「趣味の電子工作」カテゴリの記事
- 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)
コメント
この記事へのコメントは終了しました。
« サーミスタ温度計の精度を調べる - 1 | トップページ | PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する »
温度計はまっていますね(≧∇≦)
PICも使いこなしていてさすがです。
ところでサダルテミスさんが、セッピーナさんに記事でコメントしていましたよ〜
投稿: 惑 | 2014年8月25日 (月) 21時19分
わざわざすみません m(._.)m
今日までちょっと旅行に行ってました。
涼しかったです。まわり数キロにはコンビニもありませんでしたが (^^;;
惑さんの記事に触発されて最近は温度測定にはまっています。
けっこう壮大(?)な計画があります。試験管とか用意し始めています (^^)
投稿: セッピーナ | 2014年8月25日 (月) 21時39分