前回の秋月I2C RTCに続いて、秋月のI2C LCDモジュールを試してみました。結論から言うと、今のところ動かせてません(残念・・・)。
といっても、Arduinoでは何事も無くというか、あっさり動いてしまいました。
スケッチはこんなの。
#define RXDUINO
#ifdef RXDUINO
#include <rxduino.h>
#else
#include <Arduino.h>
#endif
#include <Wire.h>
#define LCD_CMD (0x00)
#define LCD_DATA (0x80)
#define LCD_ADDRESS (0x50)
#define LCD_CMD_CLEAR (0x01)
#define LCD_CMD_HOME (0x03)
// 関数プロトタイプ宣言。
void LCD_init();
void LCD_write(uint8_t rs, uint8_t data);
void LCD_clear();
void LCD_setCursor(byte col, byte row);
void LCD_putc(uint8_t c);
void LCD_puts(char *str);
void setup()
{
// シリアルポートを9600bpsで開始。
Serial.begin(9600);
// 受信バッファにデータが入るまで待機。
while (Serial.available() == 0);
Serial.println("Initializing...");
// 一旦、受信バッファにデータがあれば、
if (Serial.available() > 0) {
// 読み込んで、廃棄。
char c = Serial.read();
}
// Bus-MasterとしてI2Cを開始。
Wire.begin();
// LCDの初期化。
LCD_init();
// LCDクリア。
LCD_clear();
// メッセージ表示。
LCD_setCursor(0, 0);
LCD_puts("Hello!!");
LCD_setCursor(5, 1);
LCD_puts("I2C LCD!!");
}
void loop()
{
}
// LCD初期化。
void LCD_init()
{
delay(15);
LCD_write(LCD_CMD, 0x01);
delay(10);
LCD_write(LCD_CMD, 0x38);
delay(5);
LCD_write(LCD_CMD, 0x0f);
delay(5);
LCD_write(LCD_CMD, 0x06);
delay(5);
}
// LCDへデータ書き込み。
void LCD_write(uint8_t rs, uint8_t data)
{
int rtnValue;
if (rs == 0x00 || rs == 0x80)
{
// 0x00 ならコマンドモード。0x80 ならデータモード。
// LCDへの送信準備開始。
Wire.beginTransmission(LCD_ADDRESS);
// モード(RS)送信。
Wire.write(rs);
// データ送信。
Wire.write(data);
// キューの送信。通信終了。
rtnValue = Wire.endTransmission();
Serial.print(rtnValue);
}
else
{
// rsの指定が0x00,0x80以外ならなにもしない。
}
}
void LCD_clear()
{
LCD_write(LCD_CMD, LCD_CMD_CLEAR);
delay(2);
LCD_write(LCD_CMD, LCD_CMD_HOME);
delay(2);
}
void LCD_setCursor(byte col, byte row)
{
byte offset[] = {0x00, 0x40};
if (row > 1) row = 1;
if (col > 16) col = 16;
LCD_write(LCD_CMD, 0x80 | (col + offset[row]));
}
void LCD_putc(uint8_t c)
{
LCD_write(LCD_DATA, c);
}
void LCD_puts(char *str)
{
int i;
for (i = 0; i < 16; i++)
{
if (str[i] == 0x00)
{
break;
}
else
{
LCD_putc((unsigned int)str[i]);
}
}
}
ArduinoではWire.endTransmissino()関数はすべて正常終了して0を返してくるのに、GR-SAKURAでは一つ目は成功して0を返すものの、2つ目以降が2(アドレス送信でNACK)を返してきます。試しにロジアナで見てみると
2つ目以降はNACK(ACK応答なし)となっています。なんで?コマンドを変えたりして試すと、やっぱり、一つ目はうまくいくけど2つ目以降が失敗します。試しに強引に、一つ目送信後、LCD をブレッドボードから(通電状態のままだけど)引っこ抜いて挿しなおして(リセットして?)やると2つ目も受信します。まあ、その場合は3つ目が受信できないんですが。GR-SAKURA側なのかI2C LCD側なのか切り分けができていないのですが、Arduinoで出来てGR-SAKURAでできないとなるとGR-SAKURAを疑いたくなりますが、LCDをリセット(引っこ抜いて挿し直し)すると次を受信するということはLCD側に問題があるようにも見えます。電源電圧はSAKURAは3.3Vですが、元々このI2C LCDは3.3V(~5V)動作なので問題ないはず。
さて、困った。原因を調べるのに少し時間がかかりそうなので、一旦保留かな?何か他のものを先に試そうかな。


0 件のコメント:
コメントを投稿