ArduinoやRaspberry pi、mbedの動作実績がある「I2C LCD Breakout」を86Duinoでも使ってみました。「I2C接続の小型LCDボード」でできる事についてはこちらの記事をどうぞ。
86DuinoはIOの出力が3.3Vなので、同じ仕様であるRasberry Pi用の製品を使用しました。
これは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)); }