I2C液晶のArduinoライブラリ – ST7032

ストロベリーリナックスや秋月電子のI2C液晶で使える、Arduinoのライブラリを作りました。

コントローラにST7032iが使用されているLCDなら使えると思います。

2014.10.13 追記:

  • コンストラクタ引数でI2Cスレーブアドレスを設定出来るようにしました。秋月電子、ストロベリーリナックスのモジュールを使う限りは変更不要です。
  • コントラスト値に64以上を設定するとBONビットに影響する不具合を修正しました。(注:BONは常に1なので実際の動作には影響しません)

2013.10.31 追記:

  • ダウンロード先のリンクが分かりにくいので追加しました。また、秋月のAQM0802A-RN-GBWを動作確認済みにしました。

2013.05.19 追記:

SB0802G

Arduino標準ライブラリのLiquidCrystalをベースにしているので、LiquidCrystalを使っているスケッチならクラスを差し替えて、初期化コードを少し変更するだけで使えます。

動作確認済みのLCDモジュール

動作すると思われるもの

スケッチはこちら:arduino_ST7032 (via tomozh/arduino_ST7032@GitHub)

zipファイル内の「arduino_ST7032-master」を「ST7032」にリネームし、arduinoの「libraries」フォルダにコピーして下さい。

ST7032 独自の機能があるので、以下のメンバ関数を追加しています。

コンストラクタ

ST7032 lcd(int i2c_addr);
i2c_addr: スレーブアドレス
コンストラクタ引数を省略した場合は 0x3E

コントラスト設定

void setContrast(uint8_t cont)
cont: コントラスト値 (0~63)

アイコン表示 (※アイコン表示機能の無いLCDではなにも起きません)

void setIcon(uint8_t addr, uint8_t bit)
addr : アイコンアドレス (0~15)
bit  : アイコン表示ビット (0x00~0x1F)

簡単な使い方

#include <Wire.h>
#include <ST7032.h>

ST7032 lcd;

lcd.setContrast(30);            // コントラスト設定
lcd.print("hello, world!");

接続図はこんな感じ。I2Cは配線が少ないのが良いですね。
SB0802GやAQM0802A-RN-GBWの場合は、コンデンサ(1uF×3)を別途付ける必要があるので注意です。

接続図

左:SB1602B、右:SB0802G

SB1602BとSB0802G

SB1602Bのアイコン表示テスト

SB1602B

おまけ。I2Cつながりで、INA226モジュールと接続してみる。

参考:INA226でお手軽電圧・電流測定(ついでにBit-BangでI2C) | オレ工房

スケッチはこちら:ina226_lib.zip

INA226に接続

INA226でお手軽電圧・電流測定(ついでにBit-BangでI2C)

INA226をArduinoで使ってみました。後半にはオマケで、FTDIのBitBangモードを使った疑似I2Cを使ったバージョンもあります。

INA226とはテキサスインスツルメンツのICで、手軽かつ超高精度に電流・電圧・電力を測定することができます。インタフェースはI2Cです。

シャント抵抗まで実装されたモジュールが、ストロベリーリナックスから販売されているので、今回はそれを使いました。シャント抵抗が2mΩと小さいので、電圧降下がほとんど無視できます。

INA226モジュール

Arduinoと接続してみる

Arduinoとつないでみます。と言っても10kΩの抵抗2本なので超簡単。

取得できるのは電圧(Bus Voltage)、シャント抵抗電圧(Shunt Voltage)、電流(Current)、電力(Power)の4種類。電力、シャント電圧→電流の変換、平均化処理はIC内部勝手にやってくれます。電流と電力を計算するために、初期化時にCalibrationレジスタにシャント抵抗の定数を書き込んでおく必要があります。(2mΩの場合は0A00h)

詳しくは、ソースを見てください。

ソースはこちら:ina226_test2

2013/09/04追記:電力が1/10で表示される不具合を修正しました。

レジスタダンプ

回路図(Arduinoで接続)

実際に測ってみる

Nintendo 3DSLLの充電電流を測ってみました。813mAだそうです。(途中で電流が変動したので、写真の電源は0.65Aになってます)

配線がテキトウだったせいで、電源からUSBの付け根までハイサイド・ローサイド合計で約50mVの電位差がありました。きちんと測定するには、配線の抵抗も考慮しないとダメですね…。

3DSLLを充電中

3DSLL充電中

精度はどのくらい?

自宅のデジタルテスターで測った値とはほぼ一致してたので、まあ大丈夫な感じと思うんですが、秋月で4.096Vの高精度シャントレギュレータ(LM4040AIM3-4.1/NOPB)を買ったので、試しにつないでみました。4096mVぴったり!素敵!!

が…この値は、INA226の電源電圧に3.3Vを使ったとき。5.0Vにすると、4098Vになっちゃいました。orz

シャントレギュレータの電圧を測定

シャントレギュレータの電圧

FTDIのBitBangモードで疑似I2Cしてみる

元々は一昨年のKick4勉強会のネタですが、FTDIのFT232/245シリーズにはBitBangモードというICの信号線をパラレルIOのように使える機能があって、それを使って簡易的なI2C通信をやってしまおうという実験です。

できる!Bit-Bangモード

外付け部品がダイオード2本と抵抗3本だけなので、わざわざマイコンまで使いたくない場合にいいかも。

ソースはこちら(Visual C++2010):bitbang_ina226

2013/09/04追記:電力が1/10で表示される不具合があります。そのうち修正します…

BitBangで通信

回路図(BitBangでI2C)

Bitbangでi2c

そんなわけで

調整が要らないし、精度は高い(と思う)ので、なかなか面白いモジュールだと思います。

ゆくゆくはケースに組み込んで、スタンドアロンの計測器にしたいなぁと思ってます。