06

12

コメント

Arduinoで I2C LCD

おはようございます。ビーコン菅原です。

先日購入した Arduinoでストロベリーリナックスの
I2C・低電圧キャラクタ液晶モジュール(16x2行)型番 SB1602Bを動かしてみました。
AruinoでI2CのLCDを動かす

Arduinoでは 3.3Vを MAX50mA引き出せます。
SB1602Bの液晶はの消費電力は 250uA。 I2Cバスで消費する分を合わせても全く問題ありません。
普通のキャラクタLCDだと信号線として7本端子を消費しますが、このLCDだと信号線はSCLとSDAの2本だけですむのがナイスですね。

●I2C通信について
ATmega168は PC5に SCL,PC4にSDA が割り付けられています。
この端子をプルアップつきで接続し、公式ライブラリの Wire を用いると簡単にアクセスできます。
オシロでSCL,SDAを観測したところ 100Kbpsで通信しています。


Arduino_i2c接続クリックで拡大




以下にソースコードを示します。

(Tabが反映されていなくて見苦しいです。 )
公式ライブラリの LiquidCrystalに似せて作ってあります。
#include
#include

// I2C TestD
// ST7032i LCD controler
// by sugawara / be-con.jp Jun 11 2009

#define LED 13

//I2C LCD モジュールのアドレス
#define LCD_ADD 0x3e

//RSBIT=1 次ありデータ
#define LCD_CMD_RS1_C0 (byte)0xc0

//RSBIT=1 次なしデータ
#define LCD_CMD_RS1 (byte)0x40

//RSBIT=0 次ありデータ
#define LCD_CMD_RS0_C0 (byte)0x80

//RSBIT=0 次なしデータ
#define LCD_CMD_RS0 (byte)0x00

// function prototype
void Wire_lcd_cmd( char c );
void Wire_lcd_data(char c );
void Wire_lcd_nputs(char *data,short n);

void I2CLCD_init(void);
void I2CLCD_clear( void );
void I2CLCD_home( void );
void I2CLCD_setCursor(short col,short row);
void I2CLCD_write( char c );
void I2CLCD_print( char *data );


//
void setup()
{
pinMode(LED,OUTPUT);
Wire.begin( 0 ); // I2C master mode
I2CLCD_init();

}

void loop()
{

I2CLCD_clear();
I2CLCD_setCursor(0,0);
I2CLCD_print("TEST");
I2CLCD_setCursor(0,1);
I2CLCD_print("be-con.jp");
delay(1000);
I2CLCD_home();
for(int i=0;i<16;i++) I2CLCD_write('@');
delay(1000);
}


// I2C LCD basic function
//
// I2C_LCDに対してコマンド発行
void Wire_lcd_cmd( char c )
{
Wire.beginTransmission(LCD_ADD);
Wire.send(LCD_CMD_RS0);
Wire.send(c);
Wire.endTransmission();
}


// I2C_LCDに対してデータ発行(1バイト)
void Wire_lcd_data(char c)
{
Wire.beginTransmission(LCD_ADD);
Wire.send(LCD_CMD_RS1);
Wire.send(c);
Wire.endTransmission();

}

// I2C_LCDに対してn個連続でデータ発行
void Wire_lcd_nputs(char *data,short n)
{
Wire.beginTransmission(LCD_ADD);
while(n--){
if(n){
Wire.send((byte)LCD_CMD_RS1_C0);
}else{
Wire.send((byte)LCD_CMD_RS1);
}
Wire.send(*data++);
}
Wire.endTransmission();
}


// I2C LCD function
//
// I2CLCD の初期化
// 必ずコール前に Wire.begin()を実行すること
void I2CLCD_init(void)
{
int i;
Wire_lcd_cmd(0b00111000); // function set

Wire_lcd_cmd(0b00111001); // function set
Wire_lcd_cmd(0b00010100); // internal osc
Wire_lcd_cmd(0b01111111); // contrast1
Wire_lcd_cmd(0b01011111); // contrast2
Wire_lcd_cmd(0b01101010); // follower control
delay(300);
Wire_lcd_cmd(0b00111000); // function set
Wire_lcd_cmd(0b00001100); // Display ON

Wire_lcd_cmd(0b00000001); // Clear display
delay(200);
}

// I2CLCD 画面クリア
void I2CLCD_clear( void )
{
Wire_lcd_cmd(0b00000001);
delay(200);

}

// I2CLCD ホームポジションに戻る
void I2CLCD_home( void )
{
Wire_lcd_cmd(0b00000010);

}


// I2CLCD ホームポジションに戻る
void I2CLCD_setCursor(short col,short row)
{
byte dat;
if(row == 0 ){
dat = 0x80 + col;
}else{
dat = 0xc0 + col;
}
Wire_lcd_cmd(dat);
}


// I2CLCD 一文字表示
void I2CLCD_write( char c )
{
Wire_lcd_data(c);
}

// I2CLCD 文字列表示
void I2CLCD_print( char *data )
{
byte n;
n = strlen(data);
Wire_lcd_nputs(data,n);
}



きぃたん

そのポートって出力は0Vから5Vですよね?
3.3Vでひっぱってもいいのかな?
私は普段そういうことをしないのでよくわからない
D/Aなら3.3Vで出力できるんだろうけど…

ブレッドボードにのってるのは何かな?
それとLCDの左にあるのも気になる

シールドは8ピンのコネクタがハーフピッチ
ずれてるだけなのでピンバイスで穴を8個
あけて接着すると気持ちよくささりますよ
http://plaza.rakuten.co.jp/keytanosaka/diary/200906060000/

06

12

11:41

ビーコン菅原

>>そのポートって出力は0Vから5Vですよね?
>>3.3Vでひっぱってもいいのかな?
I2cバスは プルアップしてあるのを LOにして引っ張るだけ、(要はオープンコレクタ的回路)なので、プルアップの電圧がデバイスの耐圧範囲内ならばOKです。

ブレッドボード上は抵抗とコネクタのみ。液晶基板が他の回路の流用なのでこのような形に。

LCDの左は ストロベリーリナックスで販売している I2Cの加速度センサ MMA7455Lです。
http://strawberry-linux.com/catalog/items?code=12102

私もお調子者なので、I2Cバスでどんどんつなげたくなっちゃうんです。

>シールドは8ピンのコネクタがハーフピッチ
>ずれてるだけなのでピンバイスで穴を8個
>あけて接着すると気持ちよくささりますよ
ブログ拝見。すごいですね。
@eleとかで、試作シールド基板を作ってくれる人がいればいいんですが・・

06

12

12:42

JA2YYN

Arduinoで RC用 DCブラシモーター用制御PWM信号を RC用 ブラシレスモーターコントローラー用 PWM信号に変換するには
初心者です プログラムが理解できず困ってます.。ブラシレスコントローラーは RC用
サーボPWM信号と同じです。
一台のArduinoで 4機のモーターの制御
PWM信号をここに変換できると良いのですが 教えていただけませんか。

03

29

20:22

管理者にだけ表示を許可する

この記事のトラックバックURL

http://kkbecon.blog8.fc2.com/tb.php/34-bcf30a07

プロフィール

ビーコン菅原

Author:ビーコン菅原
組み込み始めてそろそろ25年。マイコンとか電子回路が大好きなんですよー

メールフォーム

名前:
メール:
件名:
本文:

Twitter

カウンター(UV)

月別アーカイブ

06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  03  02  01  12  11  10  09  07  05  02  12  10  09  08  07  05  04  03  11  09  08  07  06  03  02  01  12  11  10  09  08  07  06  05  04  02  12  11  10  08  02  12 

QRコード

QRコード

Designed by

Ad