HOME > 技術談話 > PIC® microcontroller > 気圧センサとテキスト表示LCD
はじめに 開発内容 LCD(液晶パネル) 回路図例 ブレッドボード配置例 サンプルプログラム(第1段階)
電源の確保(第2段階)
小型基板作成(プロトタイプ1号) スイッチ機能実装 少し冒険
2010年2月に気圧センサ SCP1000(試食)を公開しました。これは試食用途であり、机上での実験を狙いました。 暫くしてインターネットで検索をかけると公開したライブラリを利用して実験されている人がいました。感謝です。 しかし…。試食用途のままではパソコン等の通信機器が必須であり、単独動作は不可。電源どうする? 気圧センサSCP1000-D01の入手先である秋月電子通商さんで参考応用例が掲載されています。気圧センサとテキスト表示LCDの組み合わせについて触れています。が、デバイスへの電圧供給方法が少々トリッキー。 試食版を公開する前、秋月電子通商さんの参考応用例で既にテキスト表示LCDを接続しているので、あえて追従せず、試食レベルまで。としたのですが、前回の公開から4カ月経過したこともあり、思い立って電源電圧3.3Vで統一し、気圧センサとテキスト表示LCDを組み合わせた単独動作可能なデモ機を作成したいと思います。 進捗は…。なにそれ、おいしいの? こっそり「つぶやき」してます → 途中経過やホームページの更新タイミングで何かしら独り言をつぶやいてます。 このLCDを利用して強引にグラフ表示をした冒険バージョンはこちら → 「少し冒険」 2010.07.12追記 注意事項 SCP1000-D01はVTIテクノロジー社の製品です。 今回はテキスト表示LCDを使用しますが…。グラフィック表示LCD版も予定しています(部品入手済み)。 以後、文章中の「テキスト表示LCD」は単に「LCD」と略します。 |
▲ |
デモ機を作成するに当たり以下の点に留意しました。 |
項目 | 補足 | |
・電池駆動 | … 電池1本、もしくは2本で1ヶ月連続運転を目標(通信無し状態)。 | |
・通信 | … 試食版と同レベルの通信機能を踏襲(通信速度は19200bpsにアップ)。 | |
・動作電圧 | … 気圧センサ、マイコン、LCDを DC3.3V で統一。 | |
・小型化 | … 煙草の箱より少し大きめ、胸ポケットに入る位を想定。 | |
・表示 | … 文字表示のできるLCDを装備。 | |
・単独操作 | … スイッチを1個実装(1つのスイッチ活用)。 |
以下の事項は保留です。意外と面倒です。 |
項目 | 備考 | |
・情報記憶 | … 今回は揮発性メモリ(RAM)を使用した簡易記録まで。 | |
・天気予報 | … 情報不足のため断念。なお気圧の海面補正は努力目標。 | |
・低電圧検出 | … 公開は見送り。実現するための予約定義まで行う(実験のみの予定)。 |
さて、一度に総てを作ってから公開しようとすると時間を要するので段階的に公開したいと思います。 |
ステップ | 備考 | |
・第1段階 | … 試食版にLCDを付与。供給電圧は DC3.3V。ブレッドボード版。 | |
・第2段階 | … DC/DCコンバータを搭載して供給電圧 DC0.8V 以上で動作。ブレッドボード版。 | |
・第3段階 | … 小型基板作成(手作り)。ケースを模索。 | |
・第4段階 | … スイッチ機能実装 |
先は長そうですが、コツコツ仕上げたいと思います。 |
▲ |
文字表示のできるLCDには多くの種類がありますが、そのほとんどが DC5.0V 仕様です。 前述の秋月電子通商さんの参考応用例では DC5.0V 用のLCDを使用しています。この例では電源に DC.3.3V を利用していますが、コントラストとバックライト用に通信ドライバからの信号を利用しています。 しかし…ここはネイティブな DC3.3V で動作するLCDを使用したいところです。 そこで見つけたのが以下の通信販売(国内です)。aitendo@shoppingさんへの直リンクになります。 LCDモジュール(8×2)SC802A-3.3V 240円(2010.06.07現在) データシートは同ページにあり。 … リンク切れの際は当該サイトのトップページから「表示素子」、「STN/DSTN/FSTN」の所にあります。 端子が横にある SC802B-3.3V という種類もあります。こちらも値段と文字数は同じです。 (注意:取り付け用ねじ穴の径が異なります) どちらも表示文字数が少ないですが DC3.3V 動作します。むしろ小型化と低消費電力化に貢献できそうです。 バックライトは DC5.0V 仕様なので今回は未使用です(今回のデモ機では消費電力を気にしてるので…)。 で、いきなり実物です。 撮影時期の関係で既に文字を表示していますが…表示イメージを把握する良い機会です(笑 |
バックライトオフですが、文字の見やすい液晶です。ってか、文字数が少ないだけで普通です(汗 LCDの裏面にはピンソケットを接続しました。このピンソケットはLCD購入時に添付されないので注意してください。 通常、両端オスのピンヘッダを利用することが多いかと思いますが、個人的にはピンソケットの方が便利です。 接続ピンの部分が「むき出し」になっていないこと、差し込む基板側を加工の容易なピンヘッダにできる事。等々。 さて、今回使用したのは「SC802A-3.3V」というタイプです。 このデバイス。ピン配置は異なるものの、制御手法については秋月電子通商さんで扱っているLCDと互換性があります。細かく言えばLCDのコントローラに互換性があるということでしょうか。なお、デバイスの個性(?)か、若干処理時間を要しますが、ディレイを適度に指定すれば問題ありません。 |
▲ |
試食版ではPIC12F683を使用しましたが、今回は制御ポート数が増えたので「PIC16F648A」を使用します。 このPICマイコンには汎用入出力ポートが16個あり、DC3.0V以上、内蔵クロック4MHzで動作します。 以下、回路図例です。信号線の交差が多いので、部品単位で記述しています。 開発ステップは徐々にアップしますが、基本回路は同一の予定です(追加はあります)。 ってか、回路図が見えないですよね。画像をクリックすると別ウィンドウで開きます。 |
プルアップ抵抗、プルダウン抵抗に47KΩを使用しています(気持ち的な消費電力対策)。 手元に47KΩが無い場合は10K~47KΩで代用できます。 今回のデモ機では電源電圧 DC3.3V 必須です。 実験の際は安定化電源を用意するか、三端子レギュレータ、もしくはDC/DCコンバータで DC3.3V を作ります。 一番敏感なのはLCDかな。DC3.3V より下回ると表示が薄くなり、DC3.0V 未満では見えません。 濃度はコントラスト調整という話もありますが、データシートではコントラスト調整端子(Vo)がGND接続になっていますので、これを踏襲しています。 PICマイコンとLCDは 4bit幅、書き込み方向だけの接続で都合6本の信号線を使用しています。 データバスの並びが変ですが…。これはソフトウェアではなく小型基板作成上の都合です。言い換えると、回路図、ソフトウェアが設計される以前に小型基板作成用の配置図ができていることになります。ちょっと順番が逆ですが、手作りでの配線の手間を減らしたかったので御容赦。 |
▲ |
いきなり小型基板を作成してもよいのですが、念のためブレッドボードで実験します。 少し大きめのブレッドボードを使用しました。画像をクリックすると別ウィンドウが開きます。 |
数字はLCDとの接続です。TXは送信ラインで使用します。RXは受信ラインですが今回未使用です。 マイコンとセンサの向きが逆になっているので注意してください。 J22の交点は未接続(未接触)です。J21-J25を接続、J22-GNDを接続になります。 配線量が多いのですが、なんとかPICマイコンと気圧センサは直線のジャンパ線だけで配線できました。 配線例を以下に載せます。 |
写真撮影のタイミングで、既にプログラムが動作してます(笑 小型汎用基板作成用の配置図は既にできているし、現時点で第3段階に突入しているとも(汗 右端の基板は自作のUART/RS232C通信変換基板です。今回はLCDがあるので通信系は無くても大丈夫です。 参考までに。 ブレッドボードでの実験では、通信変換基板の電源(横取りしてます)を排除した状態で約 1.2mA 消費しています。試食版プログラムの改造だけなのでスリープ操作、クロック操作は行っていません。LCDの消費電力が非常にわずかであることが幸いしているようです。これなら電池1本でも1ヶ月持つかな(期待)。 |
▲ |
第1段階でのサンプルプログラムを公開します → PresTx0201.zip 開発環境は MPLAB IDE V8.40 と HI-TECH C V9.70 を利用しています(開発環境の準備)。 2010.11.17 Ver02.01 TX端子を入力設定にする件。見た目のへかはバージョン番号だけです。 HI-TECH C v9.70 で作成されたプログラムを v9.81 以降のコンパイラで再コンパイルする際の注意点 → 開発環境による修正 2011/03/09 今回のサンプルプログラムではモジュール分割を行っています。 |
ファイル名 | 機能 | |
・main.c | … 全体を制御します。センサからデータを取得し文字列に成形して送信します。 | |
・press.c | … 圧力センサを制御します。無修正。 | |
・device.c | … 開発環境、デバイスに依存した部位を集約しています。 | |
・DrvLcd.c | … 弊社独自LCD表示ライブラリです。本体無修正。 | |
・DrvSw.c | … 弊社独自スイッチライブラリです。1つのスイッチで解説しています。本体無修正。 |
プログラムは試食版に機能を追加する形で実現し、LCDには気圧と温度を表示します。 表示タイミングは通信タイミングと同様、センサのデータ出力周期(高精度モード)の約1.8Hzに等しくなります。 シリアル通信に関しては大きく変更されました。 試食版では9600bps、出力ポートの操作で実現していましたが、今回使用したPIC16F648Aには専用のコントローラが内蔵しているので、これを利用し、更に通信速度を19200bpsに上げました。19200bpsに上げたのは今後の開発ステップに依るところが大きいです。なお、今回のデモ機では通信機能は「おまけ」になるので、過度の期待は禁物です。 スイッチライブラリに関しては、今回のサンプルプログラムではダミー扱いです。 このスイッチライブラリ。LCD表示ライブラリと同様、ユーザファイル(*.u)の修正だけで再利用できます。 実は色々悩んだのです。LCD表示ライブラリ。 当初はオブジェクト、もしくはライブラリ提供にしようと思ったのですが、世の中には公私問わず表示ライブラリが多数公開されている事もあり、今回はソースプログラムのみ公開することにしました。スイッチライブラリと同様、C言語で作成された少々癖のあるプログラムですが、PICマイコンだけでなく多くのマイコン開発環境で利用できます。 なお注意事項は再度確認していただけると幸いです。 |
▲ |
デモ機の電源には安定した DC3.3V が必要です。かつ、単体運用を行うためには電池運用が必須です。 電池の電圧を変換する場合、降圧方式(高い電圧を低い電圧へ)と昇圧方式(低い電圧を高い電圧へ)がありますが、デモ機では電池の数が少なくて済み、選択肢が豊富であることから、昇圧方式を採用します。 ただし…。 電池が早く消耗してしまうので外部のACアダプタから電源供給… orz なんて事があるかもしれませんが、そこはデモ機。駄目だったことも経験ですから(笑 |
今回利用した昇圧型のステップアップコンバーターです。 秋月電子通商さんから入手できます。 ・昇圧型DC-DCコンバーター 3.3V HT7733A使用 ・M-03072 @520- (2010.06.09現在) ・入力電圧:0.7~3.3V ・出力電圧:3.3V ・最大出力:200mA(入力電圧1.0V時は10mAまで) |
通販ページに参考資料があります。リップルが気になる場合は電解コンデンサーを接続とのことです。 いったいどれほどのリップルがあるのか…。試してみました。負荷はLEDで消費電流は1.58mA(3.3V時)です。 左側が電解コンデンサ無し、右側が電解コンデンサ有り(100uF6.3V以上…今回は100uF25V)。 上段が入力電圧 DC3.0V、下段が DC1.5V です。オシロスコープは10:1プローブなので電圧単位が1桁ずれます。 |
入力電圧が高いとリップルが元気です。これは電解コンデンサを入れた方がいいかな(汗 少し調べてみましたが、入力電圧が3.6Vを超えたあたりからリップルがなくなり、出力電圧が上昇します。一方、下の電圧は0.5V位まで耐えています。入力電圧が1,5V以下であればリップルが少なく電解コンデンサは不要と思われますが、この辺りは好みで。 今回は電源に単三電池、もしくは単四電池を1本、ないし2本。最大3.0V を考慮して電解コンデンサを接続します。 さて、回路図はというと、以下の部分が変更になります。 |
冒頭の回路図。最終的に DC3.3V が安定供給されれば問題ないので、上述の昇圧方式ではなく三端子レギュレータ等を使用した降圧方式で設計しても良いと思います。この辺りは各自のアレンジで。 なお、三端子レギュレータは電圧降下分を熱として放出するので気圧センサへの影響が懸念されます。それもあってデモ機では昇圧型(ステップアップコンバーター)を利用しています。大きさや重量だけが課題ではなかったのです。 こんな感じで回路が総て決まりました。実験状況は以下に。。ブレッドボードの左側の空き地にピッタリ(汗 |
安定化電源の出力電圧を3.2V~0.7Vで振ってみましたが動作は問題ありません。 そうそう、乾電池の電圧について注意点。 新品の電池電圧って DC1.5V ではないんですよね。 ・アルカリ単三電池 約1.6V ・エネループ充電池 約1.2V ・オキシライド電池 約1.7V 時として、オキシライド電池を使用すると壊れる電子機器もあるのでご注意を。 |
追記: ふと気になってステップアップコンバータの入力側の消費電流を見てみました。 出力側の消費電流が増えると入力側の消費電流が増えます。また、入力電圧が小さくなると消費電流が増えます。 たしか今回使用するステップアップコンバータの変換効率は 85% と記載されていたのを見た気がしますが、実運用では意外と早くに電池を使いきってしまう可能性があります。 |
▲ |
回路図例のところで配置図ができていることを前述しましたが、この配置図に基づいて小型基板を作ってみました。 |
ユニバーサル基板は秋月電子通商さま。 ・片面ガラスユニバーサル基板 Cタイプ めっき仕上げ(72mm×48mm) ・P-03229 @60- (2010.06.11現在) 大きさ的には煙草の箱位です。 サンプルプログラムを動作させていますが、PICマイコンは何処に? |
PICマイコンはLCDの下に置いてます。 隙間の高さが丁度良く、すっぽり入ります。 LCDコネクタの反対側は宙に浮いてしまうので2mmねじ、かつダブルナットで固定しています。 ねじは長めで25mmを使用しています(20mmなかった)。 |
部品同士が干渉しているように見えますが、高さが微妙に異なり干渉はありません(冷汗 この小型基板に作業用にスペーサーを取り付けてますが、この状態で自立します(笑 もしかしたら、ケースに入れずにこのままで良い気もします(笑 さて、問題はケースの選定。 いくつか用意していましたが、上手い具合に収納可能なケースって無いです。今回は高さに泣いています。 25mm長のねじで予想できますが、ケース内部の高さが25mm以上必要です。 内寸20mm高のケースは多いのですが、30mm高程度のケース。それもクリアタイプは見つかりません。 無い無い…とホームセンターを巡回していたら丁度良いのがありました。 写真は省略しますが無香空間。それもスリムタイプ。 上部の蓋は空気の通りが良く、ケースはクリア。厚みも十分あります。これで良いかもと購入。 けど、ポケットに入らない… 悩むこと数分。 そうだ。今回はプロトタイプ1号にしよう。 一番のネックはLCDの厚みとピンヘッダ。ピンヘッダ無しで基板に直接取り付ければ薄くできそうです。 とりあえず、プロトタイプ1号で作業を継続。ソフトウェアを開発したのち、プロトタイプ2号を検討したいと思います。 |
▲ |
(1)はじめに 2010/06/25 全面改訂 スイッチ機能を実装して表示内容を切り替える事の出来るサンプルプログラムを作成します。 搭載した機能は以下の通りです。共に表示(通信)周期は1秒になっており、表示分解能が微妙に異なります。 |
機能名称 | 気圧表示 | 温度表示 | 高度表示 | 通信機能 | |
BASIC(標準表示) | 1.00hPa | 0.10℃ | 無し | 有り | |
H-RESO(高分解能表示) | 0.25Pa | 0.05℃ | 無し | 無し | |
HEIGHT(高度表示) | 1.00hPa | 1.00℃ | 0.1m | 無し |
(2)スイッチ操作と状態遷移 サンプルプログラムを起動すると最初に「BASIC」が動作します。その後、スイッチ操作で「MENU」に遷移して機能を選択すると新たな機能が動作します。状態遷移図では以下の様なイメージです。 |
長押下の基準は2秒以上のスイッチ押下継続です。2秒未満でスイッチをオフした場合は短押下として扱います。 長押下、短押下の動作イメージは「1つのスイッチ」で御確認下さい。 |
(3)サンプルプログラム スイッチ機能を実装したサンプルプログラムを公開します → PresTx0212.zip Ver02.12 2010.11.17 開発環境は MPLAB IDE V8.40 と HI-TECH C V9.70 を利用しています(開発環境の準備)。 HI-TECH C v9.70 で作成されたプログラムを v9.81 以降のコンパイラで再コンパイルする際の注意点 → 開発環境による修正 2011/03/09 Ver02.10との相違点は以下の通りです。 ・「HEIGHT」が追加されました。また容量対策も行っています。 ・気圧センサ初期化でNGを検出してリトライする場合のシリアル通信モニタを削除。 ・プログラム使用量は3983word(97.2%、残113word)。RAM使用量は94byte。 ・記憶機能をメイン処理から排除(機能処理で対応する方針)。 Ver02.11との相違点は以下の通りです。 ・TX端子を入力設定にする件。見た目の変化はバージョン番号のみです。 プログラムが肥大したために、この状態から新たな機能を追加することは困難です。ですが、後述するカスタマイズ手法を適用すると現在の機能から新たな機能への切り替えを容易に行うことができます。 |
(4)-1 機能紹介 BASIC(標準表示) 既存のサンプルプログラムと互換性のある気圧と温度を表示し、シリアル通信(19200bps)で送信します。 |
上段:気圧(分解能1hPa) 下段:気温(分解能0.1℃、マイナス対応) これまでのサンプルプログラムと同様、表示と通信を行います。なお、これまでのサンプルプログラムではセンサのデータ発生周期(約1.8Hz)で表示を更新していましたが、今回は1秒周期(直近の測定結果)で表示されます。 |
(4)-2 機能紹介 H-RESO(高分解能表示) 気圧センサから得られる気圧データ、温度データを最小単位で表示します。 |
上段:気圧(分解能0.25Pa) 下段:温度(分解能0.05℃、マイナス対応) センサから得られたオリジナルの値を表示します。小数点を表示していないので各自で妄想(笑)して下さい。 表示の更新周期は1秒で、表示タイミング直近のデータが表示されています。 スイッチを押下すると表示が一時停止します。 |
(4)-3 機能紹介 HEIGHT(高度表示) 起動時の高度を0mとし、気圧データの変化から相対高度を表示します。 |
上段:気圧(分解能1hPa)、温度(分解能1℃) 下段:相対高度(分解能0.1m) 簡易計算で高度を求め(1hPa = 100Pa = 9.0m)1秒周期で表示します。±300m程度は把握できます。 スイッチを押下すると相対高度を0mにセットします。 |
(4)-4 メニュー 各機能が動作している状態でスイッチを長押下するとメニュー選択画面に遷移します。 |
上段:タイトル表示 下段:選択する機能名称 スイッチを押下する度に機能名称が切り替わります。 目的の機能が表示されている状態でスイッチを長押下すると機能が実行されます。 |
(5)プログラムの構成 サンプルプログラムの構成(機能積み上げ)イメージです。 |
制御対象毎にファイルを分割して再利用できる構成になっています。今回はPICマイコンを使用していますが、別種のPICマイコン、あるいは他社製のマイコンを使用する場合はデバイス制御を修正するだけで対応できると思います。 |
機能 | ファイル名 | 内容、備考 | |
デバイス制御 | device.c | ハードウェア依存部(マイコン設定含む)が記述されています。 | |
LCD | DrvLcd.c | LCD制御ライブラリです。DrvLcd.uの修正のみ。 | |
SW | DrvSw.c | スイッチ制御ライブラリです。DrvSw.uの修正のみ。 | |
センサ | press.c | 気圧センサ制御ライブラリです。基本は無修正(モニタ通信を除く)です。 | |
メイン処理 | main.c | プログラム全体を制御します。気圧データの取得、汎用関数も提供します。 | |
機能処理 | user.c | 本ファイルを修正するだけで任意の機能を実行します。 |
機能処理には現在3つの処理が登録されています。 プログラム容量の関係で機能を追加することは困難ですが、既存機能の実行を抑止(宣言の削除)することで新たな機能を追加することできます。その際、機能処理のモジュール(user.c)以外は修正不要です。 メイン処理の概略フローチャートを以下に載せます。 |
メイン処理は定期的に機能処理を呼び出しますが、一度の呼び出しで40ms、理想を言えば20ms程度で戻ってくることを想定しています。処理時間はシミュレータを利用して測定することもできるので試されることをお勧めします。 |
(6)特殊な手続き(文法) メイン処理から機能処理を呼び出す箇所で奇妙な文法を使用していることに気がつきましたか? この方式を利用することで、メイン処理の修正なしに機能処理の増減を実現することができます。 (*tUsr[UsrGetProc()].Proc)(Event); 機能処理(user.c)側に宣言された定数配列データに含まれる関数アドレスを参照して間接呼び出しを行います。 今回はパラメータを渡していますが、戻り値を得る事もできます。 この方式にたどり着くまでに検討された事項は以下の3点です。 ・メイン処理側にswitch文を取り入れた場合、機能処理の増減でプログラム変更を行う必要があります。 ・メイン処理側で機能処理の頭関数を呼び出し、そこでswitch文分岐。これはスタック消費量が1段増えます。 ・PICマイコンではこの方式を使用すると処理時間、プログラム容量が若干増えます。 今回はスタックの消費、保守性、そして見易さの点でswitch文を使用しない方法を採用しました。 ちなみに、今回の方法はコンパイラによってはswitch文に対して自動的に適用される場合があります。また、高性能なマイコンではswitch文による判定を繰り返すよりも高速、かつ値に関係なく同時間で分岐を行うことができます。 使い方によっては便利な手続き(文法)ですので、マスターしておくと役に立つかもしれません。 |
(7)カスタマイズ 機能処理の増減を行う場合は user.c ファイルに対して修正を行います。 新たな機能を作成した後、当該ファイルの冒頭にある「ユーザ制御」の3か所の修正を忘れないでください。 現在のサンプルプログラムは3つの機能処理でプログラムフル状態なので使用しない機能を削除する必要がありますが、その場合は「ユーザ制御」の記述をコメントアウトするだけで済みます。使用しない機能処理の関数本体は削除しなくてもよいのでバリエーションの切り替えが容易です。 この方法は…。「開発環境が未使用の関数をリンクしないだけ」とも言います。 |
(8)測定してみた 今回も高崎市役所に持って行きました。エレベータに乗り上下移動が高度に反映されることを確認しました。 しかし…。 気持ち測定結果がアンダーで変動が激しいです。晴天で空調がフル稼働していたのも要因かもしれません。 今回の測定では気圧センサはむき出し状態です。 前回の測定では装置を鞄の中に入れた状態で測定を行いましたが、鞄が風防代わりになっていたのでしょうか? 今はあまり見かけませんが、マイクに被せてあるスポンジ。風切り音を抑止するためだと思いますが、気圧センサの前面に同様の風防を設けた方が安定した値を得られそうです。この辺りは引き続き追試したいと思います。 |
▲ |
今回使用したテキスト表示LCDでグラフ描画ができないものだろうか…。 ということで、やってみました 「気圧センサとテキスト表示LCDでグラフ描画(冒険)」。 表示は簡素ですが、今回使用したハードウェアをプログラムを利用して、 ・気圧と温度を表示。 ・1時間単位で情報を保持し、グラフ描画。 ・グラフ描画はオートレンジで画面をはみ出さない。 というプログラムを作ってみます。 表現に無理はあるのですが、先日からの気圧の変化は?という感じでパッと見る事が出来ればと。 ちょっとだけ画面の内容をリーク(宣伝とも言う)。ってか、そろそろページも長いので移動します(汗 |
上段に気圧と温度を表示します。 下段に気圧の変動を示すグラフを簡易表示します。 左下に縦棒がありますが数字の「1」を表します。 グラフの右端が直近の情報です。 過去42件分の情報を表示しています。 |
▲ |