フォト
2025年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

« Arduino STM32のUSB HIDインタフェースの新しいブートローダー | トップページ | 次はSTM32ボードを積極的に使ていきたい(22) グラフィック液晶(3) »

2018年6月23日 (土)

次はSTM32ボードを積極的に使ていきたい(21) グラフィック液晶(2)

Arduino STM32 最新版 でのグラフィック液晶利用調査

以前、調査・検証した「次はSTM32ボードを積極的に使ていきたい(13) - グラフィック液晶」の再調査です。

マイコンボードとして、Blue Pillボード(STM32F103C8T6搭載)を使います。
グラフィック液晶モジュールは、コントローラーにILI9341(SPI接続版)をつかった製品を使います。
開発環境としては、Arduinoを利用します。

Dscn8316

ここ数ヶ月で利用しているArduino STM32モジュールにかなりの仕様変更がありまして、
コントローラーにILI9341を使った液晶モジュール利用環境にも影響がありました。
そのため、改めて動作確認を行いました。


影響する仕様変更点

Adafruit_GFX_ASライブラリの実装形態の変更

(概要)
  コントローラーILI9341用ライブラリAdafruit_ILI9341_STMは描画処理等に、
  Adafruit_GFX_ASライブラリを利用しています。

  Adafruit_GFX_ASは従来は、Adafruit_GFXライブラリをSTM32環境に修正したものが
  提供されていましたが、Adafruit_GFXからの派生クラスとして実装する形態に変更されました。

(影響)
  別途、Adafruit_GFXを各自でインストールする必要があります。

(メリット)
  従来は、Adafruit_GFXの古いバージョンがベースだったため、グラフィック液晶関連では
  Arduinoと同等の機能を利用することが出来ませんでしたが、この修正により利用出来る
  ようになりました。

それでは、最新版のArduino STM32モジュールを使った環境にて、
手持ちのグラフィック液晶モジュールの動作確認を行ってみることにします。

Adafruit_GFXライブラリのインストール
ライブラリマネージャにてAdafruit_GFXを検索し、最新版をインストールします。
Photo

この方法でインストールすると、ライブラリ\librariesに配置されるライブラリの
フォルダ名がarduino_981956となってしまいました。
これだと分かりにくいので、Arduino IDEを一旦終了し、Adafruit_GFXに変更して
Arduino IDEを再起動して利用しました。

サンプルスケッチ「stm32_graphicstest」を使った動作確認

Blue PillボードのSPIバスは2つありますが、ここではSPI1を使います。
SPI1は次のピンを利用します。
  PA4 : NSS
  PA5 : SCK
  PA6 : MISO
  PA7 : MOSI

液晶モジュールとの結線は次のような感じです。

・結線図

01

・結線表

02

スケッチの読み込みと修正

メニューのスケッチ例から
Adafruit_ILI9341_STMのサンプルスケッチ「stm32_graphicstest」を開きます。

#include "SPI.h"
#include "Adafruit_GFX_AS.h"
#include "Adafruit_ILI9341_STM.h"

#define TFT_CS  PA0                  
#define TFT_RST PA1
#define TFT_DC  PA2
            
//Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC);
Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  Serial.begin(115200);
  delay(3000);
  Serial.println("ILI9341 Test!"); 
 
  tft.begin();

RESETをBlue Pillのリセットと連動させる場合はBlue PillのRSTへの接続でもOkです。
その場合は、TFT_RSTを-1にするか、コメントアウトしているコンストラクタの方を
利用して初期化します。

スケッチを書き込むと、液晶モジュールにはトップ画像のデモ画面は表示されます。


・SPI2を利用したい場合


SPI2は次のピンを利用します。
  PB12 : NSS2
  PB13 : SCK2
  PB14 : MISO2
  PB15 : MOSI2

方法としては、
  ①SPI.setModule(2)にて、SPI2に切り替える
または、
  ②SPI2のインスタンスを生成し、Adafruit_ILI9341_STMクラスのメンバ関数
         void  begin(SPIClass & spi, uint32_t freq=48000000);
     を使う
でSPI2を利用することが出来ます。

①の方式は安定版(RR20170323)でのみ利用可能です。
最新版では①と②の方法が可能ですが、②の方法は何となくバグがあるようです。
SPI2を使っているのに、SPIオブジェクトの設定が変更されてしまうような気がします。
(SPIにSPI2の値がセットされてしまう。これについては調査中です)

結線図および結線表のピンは、
   A5 => B13
   A6 => B14
   A7 => B15
に変更となります。

ちなみに、SPI1とSPI2ではMAXの転送速度が異なります。
SPI1ではシステムクロックの1/2(36MHz)がまで出せますが、SPI2ではその半分となります。

SPI2を利用する際のスケッチの修正(SPI2のインスタンス生成による対応)
#include "SPI.h"
#include "Adafruit_GFX_AS.h"
#include "Adafruit_ILI9341_STM.h"

#define TFT_CS  PA0                  
#define TFT_RST PA1
#define TFT_DC  PA2
            
//Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC);
Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST);

SPIClass SPI_2(2);
void setup() {
  Serial.begin(115200);
  delay(3000);
  Serial.println("ILI9341 Test!"); 
 
  tft.begin(SPI_2);


次に、従来は古いAdafruit_GFXがベースだったために使えなかった、
フォントFreeFontを試してみます。

スケッチ(SPI2を使っています)
#include "SPI.h"
#include "Adafruit_GFX_AS.h"
#include "Adafruit_ILI9341_STM.h"
#include <Fonts/FreeMonoBoldOblique12pt7b.h>
#include <Fonts/FreeSerifBold12pt7b.h>
#include <Fonts/FreeSansBoldOblique12pt7b.h>

#define TFT_CS  PA0                  
#define TFT_RST PA1
#define TFT_DC  PA2

Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST);
SPIClass SPI_2(2);

void setup() {
  Serial.begin(115200);
  tft.begin(SPI_2);  
  tft.fillScreen(ILI9341_BLACK);
  
  tft.setCursor(0, 8);
  tft.setTextColor(ILI9341_WHITE);  
  tft.setFont(&FreeMonoBoldOblique12pt7b); 
  tft.println("Hello World!");

  tft.setCursor(0, 38);
  tft.setTextColor(ILI9341_YELLOW);  
  tft.setFont(&FreeSerifBold12pt7b); 
  tft.println("Hello World!");

  tft.setCursor(0, 60);
  tft.setTextColor(ILI9341_RED);  
  tft.setFont(&FreeSansBoldOblique12pt7b); 
  tft.println("Hello World!");
}

void loop() {

}

実行結果

Dscn8341

公式サイトにも説明がありますが、
FreeFontは表示位置がカーソル指定とずれるためちょっと使いにくいです。
等幅、プロポーショナルフォント、ボールド、イタリック等使い分けることが出来ますが、
それほど使用頻度は無いと思われます。


さて、利用しているこのグラフィック液晶モジュール、

Dscn8324

タッチパネルとSDカードスロットも搭載しています。
ピンもTFTとは独立してそれぞれ、SPIインタフェース対応の接続ピンがあります。
これらの機能も使い切ってみたいと思います。


« Arduino STM32のUSB HIDインタフェースの新しいブートローダー | トップページ | 次はSTM32ボードを積極的に使ていきたい(22) グラフィック液晶(3) »

arduino」カテゴリの記事

表示器制御関連」カテゴリの記事

ARM」カテゴリの記事

STM32」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« Arduino STM32のUSB HIDインタフェースの新しいブートローダー | トップページ | 次はSTM32ボードを積極的に使ていきたい(22) グラフィック液晶(3) »