. ArduinoでグラフィックLCDを動かす(AQM1248A編)(9) - しなぷすのハード製作記
ArduinoでグラフィックLCDを動かす(AQM1248A編)(9) - しなぷすのハード製作記
ArduinoでグラフィックLCDを動かす(AQM1248A編)(9) - しなぷすのハード製作記

ArduinoでグラフィックLCDを動かす(AQM1248A編)(9)

図44と図46とを比較すると、SCK信号の立ち上がりでSDI信号の 10101110 BのデータをAQM1248Aが取り込んでいる点では一致しますが、送信していない時(/CS信号が H の時)のSCKのレベルが図44では H なのに対して、図46では L となっている点が異なります。図44の様な波形でSPIバスを使う場合の動作モードをモード3と呼び、図46の様な波形の場合の動作モードをモード0と呼びます。(SPIバスの動作モードについては、Electronic Lives Mfg. のSPIについて という記事に詳しく載っているので、ぜひ参照してください)

4-1-6-2. ハードウェアSPIによるコマンドやデータの送信 リスト7 、ハードウェアSPI用のLcdCommand関数とLcdData関数COPY void LcdCommand(uint8_t cmd) < digitalWrite(CS_PIN,LOW); digitalWrite(DI_PIN,LOW); SPI.transfer(cmd); digitalWrite(CS_PIN,HIGH); > // LcdCommand void LcdData(uint8_t dat) < digitalWrite(CS_PIN,LOW); digitalWrite(DI_PIN,HIGH); SPI.transfer(dat); digitalWrite(CS_PIN,HIGH); > // LcdCommand

リスト7に出てくる"SPI"というのは、Arduinoのマイコンに内蔵しているSPIインターフェースモジュールを使うためのライブラリです。このSPIライブラリを利用するには、スケッチの先頭に #include と宣言する必要があります。

receivedVal = SPI.transfer(val)

SPI.transfer関数には返り値(receivedVal)があります。valを MOSI 信号に送出するのと同じタイミングで、 MISO 信号から情報を読み取り、それが返り値となります。

まず、SPIライブラリを使用する際には、ライブラリの使用をSPI.begin関数 で宣言する必要があります。これには、 SPI.begin(); と、引数なしでSPI.begin関数を呼び出せばOKです。

SPI.setClockDivider(divider) 表15 、SPIバスのクロック分周比指定用の定数 定数 意味 SPI_CLOCK_DIV2 マイコンのクロックを2分周してSPIバスのクロックに使用 SPI_CLOCK_DIV4 マイコンのクロックを4分周してSPIバスのクロックに使用 SPI_CLOCK_DIV8 マイコンのクロックを8分周してSPIバスのクロックに使用 SPI_CLOCK_DIV16 マイコンのクロックを16分周してSPIバスのクロックに使用 SPI_CLOCK_DIV32 マイコンのクロックを32分周してSPIバスのクロックに使用 SPI_CLOCK_DIV64 マイコンのクロックを64分周してSPIバスのクロックに使用 SPI_CLOCK_DIV128 マイコンのクロックを128分周してSPIバスのクロックに使用

例えば SPI.setClockDivider(SPI_CLOCK_DIV32); を実行すると、それ以降はマイコンのクロックを32分周してSPIバスのクロックとします。Arduino Unoの場合、マイコン(ATmega328P)のクロックが16MHzですから、SPIバスのクロック周波数は、その1/32の0.5MHz(500kHz)となります。

なお、Arduino DueやArduino M0などのARM系(Cortex系)のArduinoでは、SPI.setClockDivider関数に整数の引数を渡すと、それがそのまま分周比として解釈されます。

例えばマイコンのクロックを32分周してSPIバスのクロックに使う場合は SPI.setClockDivider(32); とします。

注:Arduino DueでSPI.setClockDivider(SPI_CLOCK_DIV32);を実行すると、マイコンのクロックを32分周ではなく168分周したものがSPIバスのクロックになります。Arduino Dueのマイコンのクロック周波数は84MHzですから、SPIバスのクロック周波数は84÷168=0.5MHzとなり、Arduino UnoでSPI.setClockDivider(SPI_CLOCK_DIV32);を実行する場合と、同じ周波数に設定されます。

Arduino M0の場合には、どういうわけかSPIライブラリに表15の定数が宣言されていません。どうしても使いたい場合は自分で宣言する必要があります。( 3ページ のコラム、「Arduino M0を使っていて遭遇した不具合」を参照)

SPI.setDataMode(mode) 表16 、SPIバスの動作モードを指定するための定数 定数 意味 SPI_MODE0 SPIバスをモード0で使用 SPI_MODE1 SPIバスをモード1で使用 SPI_MODE2 SPIバスをモード2で使用 SPI_MODE3 SPIバスをモード3で使用 SPI.setBitOrder(order) 表17 、ビットの送出順序を指定する定数 定数 意味 LSBFIRST 最下位ビットから最上位ビットへ順に送出 MSBFIRST 最上位ビットから最下位ビットへ順に送出 リスト8 、リスト1のsetup関数を抜き出した物COPY void setup() < pinMode(DI_PIN,OUTPUT); pinMode(CS_PIN,OUTPUT); digitalWrite(CS_PIN,HIGH); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV32); SPI.setDataMode(SPI_MODE3); SPI.setBitOrder(MSBFIRST); InitializeLcd(); > 図47、リスト1を実行した際に観測された、AEHのコマンドを送出している部分のSPIバスの波形 図48、リスト1のSPI.setClockDivider関数の引数を変え、SPIバスのクロック周波数を8MHzに変更した際の波形

このページでは、SPIバスの各種設定を、SPI.setClockDivider関数、SPI.setDataMode関数、およびSPI.setBitOrder関数により設定しましたが、実はこの方法は、新しいバージョンのArduino IDEでは推奨されていません。今回は古いバージョンのArduino IDEでも動作するように、これらの関数を用いましたが、現在ではSPISettingsオブジェクト を使って設定を行うことが推奨されています。

このページで使われている用語の解説

関連ページ

  • MGLCDライブラリArduino用グラフィックLCDライブラリ。AQM1248Aも対応している。
  • AQM1248Aを使ったArduino用シールド2種(1)AQM1248Aを使ったArduino用シールドの製作。サンプルゲームもある。
  • ArduinoでグラフィックLCDを動かす(SG12232C編)(1)秋月電子で手に入る、バックライト付きで122X32ピクセルのグラフィックLCDモジュールをArduinoで動かす方法。
  • ArduinoでグラフィックLCDを動かす(S12232ZA編)(1)バックライトはないものの、非常に安価な122X32ピクセルのグラフィックLCDモジュールをArduinoで動かす方法。
  • ArudinoでグラフィックLCDを動かす(SG12864ASLB-GB編)(1)秋月電子で手に入る、バックライト付きで128X64ピクセルのグラフィックLCDモジュールをArduinoで動かす方法。
  • Arduino用ヘッダシールドの製作(3)AQM1248Aの信号をロジックアナライザで解析した例が載っている。
  • Arduino IDE 1.7.10で解決した不具合、発生した不具合この連載の3ページのコラムに載せたArduino M0の不具合の一部が、Arduino IDE 1.7.10で解消した話。

関連製品

商品名 122X32モノクログラフィックLCDシールド 税抜き小売価格 3333円 販売店 スイッチサイエンス サポートページ 122X32モノクログラフィックLCDシールドサポートページ 商品名 GLCD学習シールドキット 税抜き小売価格 1410円 販売店 スイッチサイエンス サポートページ GLCD学習シールドキットサポートページ
📎📎📎📎📎📎📎📎📎📎