「I2C LCD Breakout」を86Duinoでも使ってみた!

投稿者:

ArduinoRaspberry pimbedの動作実績がある「I2C LCD Breakout」を86Duinoでも使ってみました。「I2C接続の小型LCDボード」でできる事についてはこちらの記事をどうぞ。

86DuinoはIOの出力が3.3Vなので、同じ仕様であるRasberry Pi用の製品を使用しました。
86Duino_I2C_LCD

これはI2C用のプルアップ抵抗が入っていないため、10kΩの抵抗をプルアップ抵抗として使用しました。Arduino用基板にチップ抵抗用のパッド(1608サイズ)が出ているので、そこに抵抗を半田付けすることも出来ます。各端子は以下のように接続します。左側がLCD液晶、右側は86Duinoの端子名です。XRSはリセット端子なので、今回はオープンのままにしました。

 LCD液晶    --  86Duino

    VDD   --   3.3V

    SDA   --   SDA

    SCL   --   SCL

    XRS   --  オープン

    GND   --   GND

スケッチは過去の記事のものを拝借します。この記事の最初にでてくるものを電源ピンの記述だけ変更して使います。

まずピン定義を行っている3-4行目を削除した後、5-6行目を以下に変更。

#define sdaPin SDA //86Duino SDA
#define sclPin SCL   //86Duino SCL

次に、void setup()内の次の4行を削除。

pinMode(gndPin, OUTPUT);
digitalWrite(gndPin, LOW);
pinMode(vddPin, OUTPUT);
digitalWrite(vddPin, HIGH);

これでスケッチの変更は終了です。このプログラムを動作させると冒頭の写真のように動作します。これでデバッグをする時に液晶を使えるようになりました。最後に今回使ったスケッチを貼っておきます。

#include <wire.h> 

#define sdaPin SDA // 86Duino SDA
#define sclPin SCL // 86Duino SCL
#define I2Cadr 0x3e // 固定
byte contrast = 35; // コントラスト(0~63)

void setup() {
delay(500);
Wire.begin();
lcd_cmd(0b00111000); // function set
lcd_cmd(0b00111001); // function set
lcd_cmd(0b00000100); // EntryModeSet
lcd_cmd(0b00010100); // interval osc
lcd_cmd(0b01110000 | (contrast & 0xF)); // contrast Low
lcd_cmd(0b01011100 | ((contrast >> 4) & 0x3)); // contast High/icon/power
lcd_cmd(0b01101100); // follower control
delay(200);
lcd_cmd(0b00111000); // function set
lcd_cmd(0b00001100); // Display On
lcd_cmd(0b00000001); // Clear Display
delay(2);
}

void loop() {
lcd_setCursor(0, 0);
lcd_printStr("SWITCH");
lcd_setCursor(1, 1);
lcd_printStr("SCIENCE");
delay(100);
}

void lcd_cmd(byte x) {
Wire.beginTransmission(I2Cadr);
Wire.write(0b00000000); // CO = 0,RS = 0
Wire.write(x);
Wire.endTransmission();
}
void lcd_contdata(byte x) {
Wire.write(0b11000000); // CO = 1, RS = 1
Wire.write(x);
}

void lcd_lastdata(byte x) {
Wire.write(0b01000000); // CO = 0, RS = 1
Wire.write(x);
}

// 文字の表示
void lcd_printStr(const char *s) {
Wire.beginTransmission(I2Cadr);
while (*s) {
if (*(s + 1)) {
lcd_contdata(*s);
} else {
lcd_lastdata(*s);
}
s++;
}
Wire.endTransmission();
}

// 表示位置の指定
void lcd_setCursor(byte x, byte y) {
lcd_cmd(0x80 | (y * 0x40 + x));
}