« STM32F107のTFT液晶のフォントを大きくする | トップページ | 気圧センサーMPL115出力補正とI2C EEPROMの動作まで »

2012年3月25日 (日)

STマイクロのライブラリでSTM32F107のI2Cを動かす

 STM32F107とTFT液晶でグラフィック気圧計を作るプロジェクトは、ベースになるファイラーの使用文字を作者のねむいさんの支援で元の8ドット文字(美咲フォント)から少し大きい10ドット文字(M+フォント)に換えることに成功した。文字を見やすくするためと、グラフィックの勉強を兼ねた修正である。

 プロジェクトの目的は気圧計なので、そろそろ気圧センサーの実装を始めないといけないのだが、はやる気持ちを少しおさえて、さらにTFT液晶の画像処理の勉強を続ける。画面仕様はおおよそ出来ているが、どれだけのことがこの液晶コントローラーで出来るか見極めておかないと先の工作の効率に響くからである(昔の仕事時代を含めて何度も痛い目にあっている)。

S_p3254809

ファイラーを繰り返し動かすことに成功(3/13/2012)
 前にも書いたが、ねむいさんから頂いたTFT液晶のファイラーのソースは、大元はChaNさんのFatFSをSTM32に移植したMartin Thomas氏のソースがオリジナルで、ねむいさんが開発されたファイラーは、このThomas氏のFatFSブロックに間借りする形で入っている。escキーでこれを一旦抜けると、FatFSの機能テスト部に入ったままになり、ファイラーには戻ってこない仕様になっている。

 気圧計は、このファイラーを使うのか、全く独自に作り直すのかまだ決めていないが、このあたりをもう少し動かしてプログラム全体の解析を進めることにした。ファイラーを度々動かしたいので、とりあえずFatFSからファイラーに戻るようにしたが、そのままではファイラーはエラーを吐いてreusableになってくれない。このトラブルシューティングが先だ。

 ファイラーのFatFSあたりの処理を詳しく解析する。各種のサイズの液晶にコンパクトにファイル名やファイルサイズを表示し、ディレクトリ項目でのエンターキーでサブディレクトリに表示を換える手法、ファイルの数が画面を越えたときのスクロールなど、今度の気圧計にはこんな複雑なことはしないで良いのだが、読んでいるだけでとてもためになる。

 ファイラーが、最初は動いて2回目にエラーになる原因は見当がついている。ソースコードをさらに追う。その結果、当初の予想通り、ルートディレクトリを指示するデータエリアが汚れたまま最初に戻るのが原因であることがわかる。ファイラーを動かす前にディレクトリパスを収容するエリアに文字列の終端文字\0を

Line[0] = '\0';

で、クリアすると、ファイラーは何度でも繰り返し実行が可能になった。こんな感じで中味がわかって来ると、ソースの解析は楽しくなる。それぞれの関数が何をやっているのか明確になってくる。ちょうど濃い霧が晴れて周りが見え始めると、急に全体が見通せるようになるのと同じである。

 BMPファイルを読んで描画するところなどが特に参考になる。だいぶ理解が進んだので、グラフを描くための実際の関数の開発計画をたてて、気圧グラフ描画に必要な機能の組み合わせを考える。今のところ直線(縦横)と領域の薄い塗りつぶし、任意の位置での文字出力、画像の重複の処理(重ねるか、描き直すか)などの機能があれば大体思ったようなグラフは作れそうだ。

 直線は、1ラインのレクタングルで描くことになるが、性能的には直接GRAMに書き込む方法もありそうなので、色々調べる。気圧のグラフは、およそ2日間のデータを画面の上部に表示し、その下をテキストエリアにする予定である。更新は今のところ10分に一回で、動画的な要素は全く考える必要はない。しかし、まあ、そこは、凝り性の所長の習い性である。あれこれ調べるのが楽しい。

気圧センサーMPL115A2とI2CフラッシュROMを実装する(3/16/2012)
 グラフの描画に目処がついたので、いよいよハードウエアの実装を始めることにした。既に買ってあった気圧センサーMPL115を基板に取り付ける工作である。取り付ける場所は、2層目のSDカード基板である。

 グラフを出すための気圧データの蓄積はSDカードでも良いが、気圧センサーのインターフェースがI2Cなので、I2CフラッシュROMも実装して、そこにデータを入れることにした。I2CフラッシュROMは以前、フォトフレームの時に買って使っていないのが余っている。丁度良い機会である。

S_p3254818

 手持ちのI2CフラッシュROMは、いくつか種類がある。最初、千石でROHMの16KビットのBR24S16(¥100)を買い、その後、秋月でもっと安くて大容量のチップを見つけて入手した。マイクロチップの24FC256と、24FC1025である(256Kbitで¥90と1Mbit!で¥250)。今度の気圧計では300ドットくらいのグラフにする予定なので、16Kbit(2KB)は小さすぎ、256kbitの24FC256が適当だろう。

 次は気圧センサーである。部品箱に大事にしまってあったMPL115A2を取り出す。この石は、去年の11月、O-familyさんが掲示板で、メーカーのサンプルソースに疑問を投げかけられたときに、ちょっとコメントしたのが縁で、自分も欲しくなり、秋月で衝動買い(キット¥700)したまま4ヶ月以上放置されていたものである。

 気圧センサーとしては、市場にはこれより数段精度の高いBMP085というICがある。これはMPL115より、精度が2桁近く高い(MPL115が±1.5hPaに対し、±0.03hPa)。高度計としての利用を考えているようで、この精度だと1mの高度差まで測れる。

 スイッチサイエンスで基板つきで¥1990で売っている(現在売り切れ。共立エレショップが同価格で売っている)。digikeyでは単品が¥677で買える。ただし、パッケージが面実装のLCC8ピンなので、電極が外面に出ていない。まともに基板にハンダ付けしようと思うとクリーム半田またはホットガンが要る(裏返して実装すれば配線可能だが)。

 精度の高い石にも食指は動くが、こちらは高度を測るのではなく、長期の気圧変化を調べて、天気の予報をしようというのが目的である。ここまでの精度は不要である。当初の予定通りMPL115で実装を進める。

気圧センサーの実装は、この基板以外への移設を考慮してソケットをつける。秋月でおまけに付いているヘッダーピンは、少し長すぎて丸ピンソケットからはみ出るので、ニッパーでピンを短くする。I2CフラッシュROMも、8ピンのソケットにする。

 配線は、2線のI2Cなので簡単である。データとクロックラインに、気圧センサーとフラッシュROMに共通のプルアップ抵抗を入れる。STM32F107のI2Cは2つあり、I2C1につなぐ(PB6とPB7)。アートワークを描くまでもなかったが、念のため作っておいたので、実際の作業は、あっけなく終了した。ちょっと物足らないくらいである。電源のLPFなどはあとで様子を見ながら入れることにする。

グラフィック気圧計の仕様を考える(3/19/2012)
 気圧センサーMPL115を使った気圧計としては、既にO-FamilyさんがAVRを使って実装され、サイトには、ケースに入った立派な時計つき天気予報計が既に作品としてラインナップされている。基板、回路図、ファームまで全て公開されており、至れり尽くせりの措置だ。すんさんもこのセンサーを使ってグラフィック気圧計を作られている。

 当研究所の気圧計は、この二番煎じ、三番煎じということで特に目新しいところは何もない。しいてあげればSTM32を使っていることが違うだけである。高度計として使うのなら電池式や、可搬性を考えるところだが、2日間のデータをもとに出す天気予報計が動き回ることは通常考えられないから、電源は最初から、ACアダプター仕様と割り切ることにする。

 画面仕様は、TFT液晶の解像度240X320で、当面は開発ベースのファイラーと同じ、縦型として使い、グラフは上から下へ時系列として一番下部を最新データとする。

 時間が経過すれば、グラフがそっくり上へ移動して行き、2日間程度の気圧推移を常に表示する。電源を切って測定していない間のデータは出さないで、あるだけのデータが表示される。つまりグラフを表示する時は、現在時刻よりさかのぼってあるだけのデータのドットをグラフに表示する(歯抜けになっても、存在するデータは範囲内であれば表示する)。

 移動平均くらいは表示したいところだ。グラフの縦のドットは下に30ドット(3行)のテキストエリアをつけるとすると280ドット、2日間として1日あたり140ドット24時間とすると、1時間が6ドット足らず。つまり10分に1ドットで48時間で288ドット。テキストは、現在日時に1行、現在気圧の表示に1行、現在の予報に1行で計3行というところか。全体的な画面仕様は決まった。

 制御するところは余りない。データログはUARTから出せばよいだろう。電源を入れれば、10分ごとにデータを記録し蓄積していく。年月日時分単位にデータを蓄積してROMに入れていき、最大まで蓄積すれば、古いものから消していく。

STマイクロのI2Cライブラリを使う(3/22/2012)
 大まかな仕様はかたまった。細かいところは先の話として、次にやるべきことは、MPL115A2を動かすことである。MPL115A2のインターフェースはI2Cで(SPIのA1というのもある)、最初はねむいさんが開発された例の超小型LCD用のGPIOで構成した簡便な手作りソースコードを流用させて貰おうと思っていた。

 しかし、フラッシュROMをつけることもあるし、せっかくだから、STマイクロの提供するライブラリを使って、少し本格的なI2Cインターフェースを構築することにした。

 意外なことに、STマイクロのI2Cライブラリの応用例がウェブ上では余り見かけない。ただ、こちらには、恰好の参考資料がある。例の弁護士さんの書いた「STM32マイコン徹底入門」である。ここには、STマイクロの提供するI2Cライブラリを使った制作例が詳しく18ページかけて載っている。

 ただし、ウェブには、このSTマイクロのライブラリを疑問視するこんなサイトもある。http://www.yza.jp/blog/2010/03/stm32_i2c/ どうもエラー処理がまずいようだ。「徹底入門」もこのとおりにしないとうまく動かないと注意書きがある。

 まあ、ここは忠実に、作例にならってプログラムを組むことにした。長たらしい変数と関数を地道に書いた。ただ、「徹底入門」の提供するソースには初心者にとって致命的な問題がある。機種依存のハードウエアの設定部分が、すべて未定義エラーになる。

 こちらは、既にSTマイクロのライブラリを何種類か利用しているので、何を使えば良いか、すぐわかったが、これをどうするかは、本文のどこにも載っていない(こちらが調べた限り)。初心者は恐らくこのソースコードを忠実に写しても、この未定義変数をどうすれば良いのかで途方に暮れるだろう。

 テストはロジアナを積極的に活用した。まずFatFSの各種の機能を動かすメニューに、UARTのコマンドを追加して、スタートコンディションだけを出すプログラムを組む。それをロジアナでSDA,SCLの2ラインを監視して動作することを確かめる。いつも愛用させてもらっているkuman流の逐次開発手法である。

 次に、マスターWriteリクエストのデータ送信のところまで入れて、スレーブ(MPL115)からのACKが帰ってくることをロジアナで確かめる。ロジアナはI2Cプロトコルが見えるような設定にしておく。

Mpl115i2c おお、ちゃんとACKが帰ってきた。続いてMPL115の測定開始のコマンド、データの受け取りと少しづつコマンドを増やして、無事、気圧と温度データが送られてくるのを確認した。

 ここまで来ると、あとは楽だと思ったのが落とし穴だった。最後の12ヶの補正用の係数データの受信がどうもうまく動かない。最初のデータは来るが、あとはみんな0xFFばかりで、正しいデータを送ってきていないようだ。

 スタートコンディションを再発行(restart)したり、ACKのdisableコマンド(最後のデータ受信のときにNACKを返す)を出す位置を替えたりしているうち、突然、データが正しく送られてくるようになった。何が悪かったのか良くわからないというのがつらいところだが、うまく動くシーケンスになったことは間違いない。まあ、あまり深く追求するのはやめよう。

ここに、MPL115A2を動かす、STM32F107用のI2Cライブラリをzipファイルにして置きます。
I2C_1.cとI2C_1.hが、I2Cの汎用部、MPL115.cと、MPL115.hが、MPL115固有の関数です。
MPL115_Init(); MPL115_Start();で計測が始まり、MPL115_getdataとMPL115_getcoefで、データが
MPL115.hで定義した構造体に収容されます。


「I2Clibrary.zip」をダウンロード

 とりあえずは順調にMPL115A2からすべてのデータが送られてくるようになった。あとはあの膨大な係数で観測値の補正をすることだが、それにしてもこれだけ簡単に動くようになったのは、O-FamilyさんのMPL115の日本語マニュアルが助けになったことは間違いない。これがあったお陰で開発は迷うことなく一本道だった。あらためて感謝を申し上げておきたい。

Mpl115 マニュアルには、12個もある係数値による測定値の補正ロジックが紹介され、O-Familyさんは、律義にBASCOMで全部の係数の計算式を入れておられるようだが、どうもここまでやる必要があるか迷うところである。だいいち係数の最後の4つはいつ出力しても0になっているし、サンプルソースも小数点以下はすべて切り捨てているようだ。

 そもそもセンサーの測定誤差が、1.5hPaと小数点以上であり、ADコンバーター(10ビット)の分解能そのものが、0.635hPaとかなり大きいので、細かい小数点以下の補正をする意味が余りないような感じもする。すんさんが掲示板で書いていたように、サンプルを多数測定して平均をとる方が精度が高くなるような気もする。

 これらの補正や、フラッシュROMへの蓄積など、気圧計の完成までにはまだ道のりは長いが、気圧センサーからの測定値が出たところで、とりあえずブログに報告することにする。

|

« STM32F107のTFT液晶のフォントを大きくする | トップページ | 気圧センサーMPL115出力補正とI2C EEPROMの動作まで »

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

ARM」カテゴリの記事

コメント

ご苦労様。
i2cの送受信のところは、いつでも本当に初心者泣かせですね。
解析できるロジアナがあれば、多少は違うような気もしますが、まだそういうものは持っていません。残念ながら。

投稿: きゅうる村 | 2012年3月26日 (月) 07時49分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: STマイクロのライブラリでSTM32F107のI2Cを動かす:

« STM32F107のTFT液晶のフォントを大きくする | トップページ | 気圧センサーMPL115出力補正とI2C EEPROMの動作まで »