haraduka's diary

やる気が欲しい

arduinoとAQM1248Aをspi通信させてみた。

SPIを使ってarduinoとAQM1248Aを通信させて、U8glibを使って文字を出力させてみた。
せっかくSPIとか真面目に勉強したので色々メモを書いていきたいと思う

SPI通信について

  • SPIは1対nの同期式シリアル通信で、基本的には基板間などの短い距離で使う通信方式
  • Masterが1で、nがSlaveとなって通信を行う
  • 信号線は基本的には4種類あって、SCK(serial clock)、MOSI(Master out Slave in)、MISO(Master in Slave out)、SS(slave select)
  • Slaveがいくつかある場合は、MasterにSlave分だけSSを用意して、それぞれをSlaveのSSとつなぐ
  • MasterはSSから常時Highを出していて、通信したいSlaveにつながっているSSをLowにすることでそのSlaveと通信を始める。
  • MasterとSlaveはシフトレジスタによってリング状に接続される。Masterは上位1bitを送りshiftし、同時にSlaveはそれを下位1bitに入れ、上位1bitをMasterに送りshiftする。これを8bit繰り返して、MasterとSlaveのレジスタ値をswapする。

AQM1248Aについて

  • 超小型グラフィックLCDである。安い。変換基板を今回はそのまま買った。
  • 付属の説明書を読めば正直つなぎ方はわかるが一応。(LCD -> arduino)
  • VDD -> 3.3V | CS -> 10(SS) | RESET -> 8 | RS -> 9 | SCLK -> 13(SCLK) | SDI -> 11(MOSI) | GND -> GND
  • U8glibを使いたいのだが、残念ながらこのハードウェアには対応していない。ただ、同じコントローラICであるST7565を搭載したNHD-C12864のコンストラクタを流用できるそうなので使ってみる。NHD-C12864は128x64dotであり、AQM1248Aは128x48dotなので、U8glibにおいて16bitまでは使用できない。よって16~64のみを使用して描画してほしい。
  • https://code.google.com/p/u8glib/wiki/u8glib?tm=6 のProjectHomeからdownloadし、arduinoのライブラリを使用-> add libraryでそれを選択する。
  • 使い方についてはReference Manualにすべて書いてあるからそれを見ちくり

一応U8glibを使わずに表示するsampleと、U8glibを使ってMerry Christmasと表示させるsampleを貼っておきます。

#include <SPI.h>

#define RS_PIN    9
#define CS_PIN   10
#define RATE 10000000L

void LcdCommand(uint8_t cmd)
{
  digitalWrite(CS_PIN,LOW);
  digitalWrite(RS_PIN,LOW);
  SPI.transfer(cmd);
  digitalWrite(CS_PIN,HIGH);
} // LcdCommand

void LcdData(uint8_t dat)
{
  digitalWrite(CS_PIN,LOW);
  digitalWrite(RS_PIN,HIGH);
  SPI.transfer(dat);
  digitalWrite(CS_PIN,HIGH);
} // LcdCommand

void InitializeLcd()
{
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4); //default
  SPI.setDataMode(SPI_MODE3);
  LcdCommand(0xae);
  LcdCommand(0xa0);
  LcdCommand(0xc8);
  LcdCommand(0xa3);
  
  LcdCommand(0x2c);
  delay(2);
  LcdCommand(0x2e);
  delay(2);
  LcdCommand(0x2f);
  
  LcdCommand(0x23);
  LcdCommand(0x81);
  LcdCommand(0x1c);
  
  LcdCommand(0xa4);
  LcdCommand(0x40);
  LcdCommand(0xa6);
  LcdCommand(0xaf);
} // InitializeLCD

void setup() {
  pinMode(RS_PIN,  OUTPUT);
  pinMode(CS_PIN,  OUTPUT);
  digitalWrite(CS_PIN,HIGH);
  SPI.begin();
  InitializeLcd();
}

void loop() {
  for(int page=0; page<6; page++) {
    LcdCommand(0xb0+page);
    LcdCommand(0x10);
    LcdCommand(0x00);
    for(int x=0; x<128; x++) {
      LcdData(0);
    }
  }
  
  delay(1000);
  
  for(int page=0; page<6; page++) {
    LcdCommand(0xb0+page);
    LcdCommand(0x10);
    LcdCommand(0x00);
    for(int x=0; x<128; x++) {
      LcdData(x);
    }
  }
  
  delay(1000);
}
#include<U8glib.h>

#define ADAddr 0x48

int top = 16;
int buttom = 64;

U8GLIB_NHD_C12864 gd(13, 11, 10, 9);

void setup()
{
  gd.setContrast(0);
  gd.setRot180();
  gd.setColorIndex(1);
  gd.setFont(u8g_font_unifont);
  delay(1000);
}

void loop()
{
  gd.firstPage();
 do{
   drawPicture();
 } while(gd.nextPage());
  
}

void drawPicture()
{
  gd.drawStr(0, 48,  "Merry Christmas!");
}