Sim's blog

電子工作はじめてみました

ArduinoでI2C液晶

2009-07-21 01:31:17 | AVR
ストロベリーリナックスさんで販売しているI2C液晶にArduinoから出力してみる実験です。

注意!! I2C液晶は2.7-3.6Vでの動作が保証されています。Arduinoの5V出力での使用は仕様外です。

実験の様子です。


出力の様子です。


ArduinoにはWireというi2cライブラリが用意されているので、i2cの部分は簡単に実現できます。ストロベリーリナックスさんで公開しているソースの一部をArduinoに移植しました。移植していないのはアイコンの表示です。
 
#include <Wire.h>

// Arduino     i2c-lcd
// Dig 2 ----- 1pin rst (pull-up 10k ohm)
// Ana 5 ----- 2pin scl (pull-up 2.2k ohm)
// Ana 4 ----- 3pin sda (pull-up 2.2k ohm)
// GND ------- 4pin
// 5V -------- 5pin

int ledPin = 13;
int resetPin = 2;
int sdaPin = 18; // analog pin 4
int sclPin = 19; // analog pin 5
int i2cadr = 0x3e;
byte contrast = 7; // 0-63 5V系だとかなり少なくする

void lcd_cmd(byte x)
{
  Wire.beginTransmission(i2cadr);
  Wire.send(0x00);
  Wire.send(x);
  Wire.endTransmission();
}

void lcd_data(byte x)
{
  Wire.beginTransmission(i2cadr);
  Wire.send(0x40);
  Wire.send(x);
  Wire.endTransmission();
}

void lcd_puts(const char *s)
{
  while(*s) lcd_data(*s++);
}

void lcd_init()
{
  // reset
  delay(500);
  pinMode(resetPin, OUTPUT);
  digitalWrite(resetPin, LOW);
  delay(1);
  digitalWrite(resetPin, HIGH);
  delay(10);
  // LCD initialize
  delay(40);
  Wire.begin();
  lcd_cmd(0x38); // function set
  lcd_cmd(0x39); // function set
  lcd_cmd(0x14); // interval osc
  lcd_cmd(0x70 | (contrast & 15)); // contrast low
  lcd_cmd(0x5c | (contrast >> 4 & 3)); // contrast high / icon / power
  lcd_cmd(0x6c); // follower control
  delay(300);
  lcd_cmd(0x38); // function set
  lcd_cmd(0x0c); // display on
  lcd_cmd(0x01); // clear display
  delay(2);
}

void lcd_move(byte pos){
  lcd_cmd(0x80 | pos);
}

void setup()
{
  lcd_init();
  lcd_puts("Hello, Arduino!");
  lcd_move(0x40);
  lcd_puts("i2c LCD module");
  
  pinMode(ledPin, OUTPUT); // Lチカ
}

void loop()
{
  digitalWrite(ledPin, HIGH);
  delay(100);
  digitalWrite(ledPin, LOW);
  delay(500);
}

ArduinoのメニューTools→Copy as HTMLを使うと上のようなsketch風のソースを貼ることができます。
5Vなので、コントラストはむちゃくちゃ濃いです。コントラストは0から63まで指定できますが、7くらいでちょうどでした。
便利なライブラリがあるおかげで結構短く書けたと思います。
ライブラリにまとめることができれば、かっこいいんですが、ライブラリの作り方が分かっていません。

Arduinoモニタープログラム参加中
電子部品・半導体の通販サイト - チップワンストップ


ジャンル:
ウェブログ
コメント (5)   この記事についてブログを書く
« ATMega328P | トップ | AVRスティック »
最近の画像もっと見る

5 コメント

コメント日が  古い順  |   新しい順
初めまして (なんちゃ)
2009-10-14 23:38:11
昨日からArduinoを使い始め、I2C液晶を接続する為にWebを彷徨っていたところ、
こちらのBlogにたどり着きました。

始めたばかりですので、上のスケッチは非常に参考になりました。
これから「どこをどういじればどうなるか?」を試したいと思います。

ありがとうございました!
nancha.mine.nu
re:初めまして (Sim)
2009-10-15 01:18:12
こんにちは、なんちゃさん
お役に立てたようでよかったです。
他人の書いたものを試したりいじったりするのが一番勉強になりますね。
これからもよろしくお願いします。
参考になりました (やもり)
2012-09-08 17:52:07
はじめまして。

ストロベリーリナックスの小さい方のI2Cのモジュールを使ってみたのですが、同じST7032iなので参考にさせてもらいました。ありがとうございました。
moony@mindsnack.net (moony)
2013-09-11 23:31:23
Hi, thank you very much, works also with:
MIDAS - MCCOG21605D6W-SPTLYI
5V動作について (みかん)
2014-07-02 19:41:22
lcd_cmd(0x5c | (contrast >> 4 & 3));
とありますが、5V環境で使うのならば、倍圧回路を無効にすれば良いのでは?
要するに、0x5cの代わりに0x58を入れれば改善するのでは?

コメントを投稿

AVR」カテゴリの最新記事

関連するみんなの記事