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!"); }