浜松市にいる組み込みおやじ-電子工作、回路設計、ファーム TIPS

このブログはビーコンの代表である菅原が、電気電子、電子工作、組み込みソフトウェアなどで、自分が苦労したところや面白い発見などを記事にしていきます。電子工作やマイコンに親しむ人が少しでも増えたらという思いでつづります。
やっぱり、電子工作が好きなんですよ。
<< ポートのON/OFF時間 | main | outlookからのハイパーリンクが効かない >>
Arduinoで I2C LCD
0

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

    先日購入した 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);
    }




    | ビーコン菅原 | Arduino | 05:53 | comments(3) | trackbacks(0) |
    TITLE: いい感じのLCDですね SECRET: 0 PASS: ec6a6536ca304edf844d1d248a4f08dc そのポートって出力は0Vから5Vですよね? 3.3Vでひっぱってもいいのかな? 私は普段そういうことをしないのでよくわからない D/Aなら3.3Vで出力できるんだろうけど… ブレッドボードにのってるのは何かな? それとLCDの左にあるのも気になる シールドは8ピンのコネクタがハーフピッチ ずれてるだけなのでピンバイスで穴を8個 あけて接着すると気持ちよくささりますよ http://plaza.rakuten.co.jp/keytanosaka/diary/200906060000/
    | きぃたん | 2009/06/12 11:41 AM |
    TITLE: re: いい感じのLCDですね SECRET: 0 PASS: e0131ab33e1056ff267d17eecc5ce62a >>そのポートって出力は0Vから5Vですよね? >>3.3Vでひっぱってもいいのかな? I2cバスは プルアップしてあるのを LOにして引っ張るだけ、(要はオープンコレクタ的回路)なので、プルアップの電圧がデバイスの耐圧範囲内ならばOKです。 ブレッドボード上は抵抗とコネクタのみ。液晶基板が他の回路の流用なのでこのような形に。 LCDの左は ストロベリーリナックスで販売している I2Cの加速度センサ MMA7455Lです。 http://strawberry-linux.com/catalog/items?code=12102 私もお調子者なので、I2Cバスでどんどんつなげたくなっちゃうんです。 >シールドは8ピンのコネクタがハーフピッチ >ずれてるだけなのでピンバイスで穴を8個 >あけて接着すると気持ちよくささりますよ ブログ拝見。すごいですね。 @eleとかで、試作シールド基板を作ってくれる人がいればいいんですが・・
    | ビーコン菅原 | 2009/06/12 12:42 PM |
    TITLE: 教えてください SECRET: 0 PASS: 7c67b67f2b794ffc24a6cd0fafaae274 Arduinoで RC用 DCブラシモーター用制御PWM信号を RC用 ブラシレスモーターコントローラー用 PWM信号に変換するには 初心者です プログラムが理解できず困ってます.。ブラシレスコントローラーは RC用 サーボPWM信号と同じです。 一台のArduinoで 4機のモーターの制御 PWM信号をここに変換できると良いのですが 教えていただけませんか。
    | JA2YYN | 2010/03/29 8:22 PM |









    http://blog.suga41.com/trackback/152
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
    << April 2017 >>
    + RECOMMEND
    + RECOMMEND
    + SELECTED ENTRIES
    + RECENT COMMENTS
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + つぶやき
    + MOBILE
    qrcode
    + LINKS
    + PROFILE