電子工作

大気圧をキャラクタLCDに表示しました



無事、大気圧をキャラクタLCDに表示できるようになりました。

このために、AVRのハードTWI機能をつかったI2Cのコーディング、負電圧生成で5V用LCDを3.3Vで使う、cコードのファイル分割、ということをしました。c言語のオブジェクト指向風記述をしようとしましたが、抽象化が中途半端なところで諦めました。

レジスタから読んだデータをシフトしてuint32_tに代入するときに、予めキャストをしていなかったせいで、シフトでデータが消えているというバグをつぶすのに時間がかかりました。あとはsprintfで%ul,%d,%uの使い間違いとかのバグもあった。そしてI2Cのエラー処理を追加しました。

コードはこちら。長いです。

続きを読む

5V単電源用のHD44780互換LCDキャラクタ液晶モジュールDMC16117Aを3.3Vで使う

課題: AVRで3.3V I2C動作の大気圧モジュールの値を読んで、LCDキャラクタ液晶に値を表示させたいが、5V用の液晶しか手元にない。昔のI2C仕様書にのっていたようなI2Cの5V-3.3Vレベル変換回路をNチャネルFET2個で組むにしても、その回路をつくる手間に加え、5Vから3.3Vを作る手間は別に生じる。3.3Vレギュレータはあと一本なので使わずとっておきたいし、前みたいに青色LEDをかわりに使うのもすでにやったので、ホビーという意味では別の方法を使いたい。
解決策: LCDの仕様書を見ると、コントローラの電圧範囲は4.5-5.5 Vと書いてあるが、HD44780の仕様書をみると3.3Vでの制御は可能。LCD用のコントラストの電圧だけおおよそ 4.0 V以上かかればよいらしい。1-2Vの負電圧をつくってコントラストピンに入れれば良い。負電圧はめんどくさそうだけど、どうするか、と調べてみたら、こちらのページにてチャージポンプを使った回路が紹介されていた。
http://elm-chan.org/docs/lcd/lcd3v_j.html

というわけで、AVRのPWMで50%デューティのクロックを作って、チャージポンプ回路をつくって入れてやりました。 -2.7Vが簡単にでました。手元に転がっていたダイオードはショットキーかどうかわからないが、-2.7 = -3.3 + 0.6であるので2本で ~0.6 Vの電圧降下であった。キャパシタは100nF, 1uFをつかいました。可変抵抗を入れなくても周波数で制御できそうでしたので、それを液晶のコントラストピンに直結しました。電圧が降下して文字が薄くなったので、周波数を83 kHz程度に調整すると、負荷ありで-1.7 Vとなり、良い感じの濃さで表示できました。


見難いけれどチャージポンプ回路。右は3.3Vで表示できた液晶

AVRでPWMをするのは簡単で、デューティを50%に固定してクロックとしてつかうのであれば割り込みなど必要なく、レジスタにPWMの設定をするだけでピンにクロックがでてきます。

PWM設定部分の抜粋です。


void pwm_init(void){
  OCR2A = 0x60;//TOP value, 83 kHz at 8 MHz
  OCR2B = (OCR2A >> 1);//duty 50%
  TCCR2A = 0b00100011;//OC2B PWM, WGM = 111
  TCCR2B = 0b00001001;//timer counter cont. reg., prescaler 1
}

LPS331使用 高精度大気圧モジュールのI2CでのONE_SHOT測定テスト

I2C通信chkに引き続き、大気圧ONE_SHOT測定のテストをしました。装置をactiveにして、one_shotの命令をし、測定が終わったかをSTATUS_REGで確認し、終わっていたらば大気圧を読みに行く、という流れです。
こちらも無事読み取りができました。

= 0x3f32b6 / 4096 とグーグル先生に聞いたら、1011.17 mbarだそうです。

コードはこちら。エラー処理はしてません。

続きを読む

LPS331使用 高精度大気圧モジュールとのI2Cでの通信テスト

秋月で、「LPS331使用 高精度大気圧モジュール」を650円で入手しましたので、そのテストです。大気圧モジュールの温度補償用として精度は±2 degCほどのようですが、温度計もついています。通信プロトコルとして、I2CとSPIに対応しています。5番ピンをプルアップするかしないかで、I2C/SPIの切り替えができます。AVRを使って、I2Cの通信の練習をしようと思いましたので、I2Cモードで通信のテストをしてみます。AVRにはTWIにハードウェア対応しているatmega328Pを使います。

LPS331APは3.3V動作です。まず、この前作ったUSB-AVRライタは5V供給ですので、3.3 Vレギュレータを入れて、3.3 Vにもジャンパピンで対応できるようにさくりと工作しました。

そして、適当にコーディングをしてから、PC5(SCL), PC4(SDA)をLPS331APへ配線します。WHO_AM_Iを連打するコードをつくり、ロジック・アナライザで動作チェックをしました。

一発目から無事、通信できていました。

ロジック・アナライザのカラフルな感じが好きです。


チップLED付きです。

コードはこちら。SCL, SDAを外部でプルアップしない場合は、PC5, PC4についてPORTCレジスタに1を入れてやれば、AVR内部でプルアップしてもらえます。ただAVRのプルアップは弱いので(抵抗が大きいので)100kbps以上の早い通信をしようとすると失敗しました。エラー処理はしていません。

続きを読む