フォト
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      
無料ブログはココログ

« 豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中(2) | トップページ | ジャンク品のMSXの修理 その1 »

2018年11月20日 (火)

RobotDyn STM32 Miniボード(Blue Pill互換)でJPEG画像表示

RobotDyn STM32 Miniボード(Blue Pill互換)でJPEG画像の表示をやってみました。
(BluePillより面積が狭いので、ブレッドボードで多線が出来ます)

グラフィック液晶モジュール は、
ILI9341搭載(SPI接続)+ SDカードスロット付きのものを利用しました。

Dscn9014

グラフィック液晶モジュールのスロットに刺したSDカードに
320x240ドット JPEG形式のフルカラー画像を配置し、それを表示しています。
開発環境はArduino STM32を利用しています。

JPEG表示は、Arduino UNOではSRAMの容量的に無理(バッファに2kバイト必要)ですが、

Blue Pillでは比較的簡単に表示出来ました。

動いている様子

これくらいの、速度で表示出来ればOKでしょう。

構成

03
※クリックすると拡大表示します

結線表
04
利用したテスト画像(test1.jpg)

Test1


スケッチは下記のサイトのESP8266用のJPEG画像表示スケッチを
参考にしました。

参考にしたサイト
・楽しくやろう。 ESP8266でJPEG画像をTFT LCDに表示する
   https://blog.boochow.com/article/427690966.html


利用ライブラリ

・JPEGデコーダーライブラリ
   MakotoKurauchi/JPEGDecoder
 https://github.com/MakotoKurauchi/JPEGDecoder
 
   ※fdfat対応にJPEGDecoder.cppの一部を修正しています。

   修正
    ・
#include <SD.h> を #include <SdFat.h> に変更
   
・ その下に
       extern SdFat SD;
      を追加

スケッチ
(こちらからも参照出来ます Tamakichi/stm32_jpeg_tft.ino)

//
// Arduino STM32 TFT(ILI9341) SPI接続 jpeg画像表示サンプル
//
// 参考にしたサイト
//  元にしたスケッチ
//  ・楽しくやろう。 ESP8266でJPEG画像をTFT LCDに表示する
//    https://blog.boochow.com/article/427690966.html
//  ライブラリ
//  ・MakotoKurauchi/JPEGDecoder
//    https://github.com/MakotoKurauchi/JPEGDecoder
//  Jpegに関する情報
//  ・JPEG/MCU
//    https://monobook.org/wiki/JPEG/MCU
//

#include <SPI.h>
#include <Adafruit_GFX_AS.h>
#include <Adafruit_ILI9341_STM.h>
#include <SdFat.h>
#include <JPEGDecoder.h>

// SDカード(SPI2利用)
#if ENABLE_EXTENDED_TRANSFER_CLASS == 1
  SdFatEX  SD(2);
#else
  SdFat  SD(2);  
#endif

#define SPI_SPEED SD_SCK_MHZ(36) // バスクロック
#define SD_CS PB0                // SDカード選択

// TFT制御用ピン (SPI1利用)
#define TFT_CS  PA0
#define TFT_RST PA1
#define TFT_DC  PA2

// TFT制御用オブジェクト
Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  Serial.begin(115200);
  delay(200);
  
  if (!SD.begin(SD_CS,SPI_SPEED)) {
    Serial.println("failed!");
  }
 
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(ILI9341_BLUE);
  Serial.println("OK!");

  jpegDraw("/test1.jpg"); // 320x240ドットフルカラー画像の表示
}

void jpegDraw(char* filename) {
 char str[100];
 uint8_t *pImg;
 int x,y,bx,by;
 
 // Decoding start
 JpegDec.decode(filename,0);
 uint16_t buf[JpegDec.MCUWidth*JpegDec.MCUHeight];
 uint16_t pos = 0;

 // Image Information
 Serial.print("Width     :");
 Serial.println(JpegDec.width);
 Serial.print("Height    :");
 Serial.println(JpegDec.height);
 Serial.print("Components:");
 Serial.println(JpegDec.comps);
 Serial.print("MCU / row :");
 Serial.println(JpegDec.MCUSPerRow);
 Serial.print("MCU / col :");
 Serial.println(JpegDec.MCUSPerCol);
 Serial.print("Scan type :");
 Serial.println(JpegDec.scanType);
 Serial.print("MCU width :");
 Serial.println(JpegDec.MCUWidth);
 Serial.print("MCU height:");
 Serial.println(JpegDec.MCUHeight);
 Serial.println("");
 
 sprintf(str,"#SIZE,%d,%d",JpegDec.width,JpegDec.height);
 Serial.println(str);

  // Raw Image Data
  while( JpegDec.read() ){    // MCU毎の描画処理
    pImg = JpegDec.pImage ;   // MCUブロックの先頭アドレス
    pos = 0;                   // バッファ位置初期化
    
    // MCUブロック描画ウィンドウの設定
    tft.setAddrWindow(JpegDec.MCUx * JpegDec.MCUWidth,
                      JpegDec.MCUy * JpegDec.MCUHeight,
                      JpegDec.MCUx * JpegDec.MCUWidth+JpegDec.MCUWidth-1,
                      JpegDec.MCUy * JpegDec.MCUHeight+JpegDec.MCUHeight-1);
 
    // ウィンドウ領域へのデータ転送
    for( by = 0; by < JpegDec.MCUHeight; by++)
      for( bx = 0; bx < JpegDec.MCUWidth; bx++, pImg += JpegDec.comps, pos++)
        buf[pos] = (JpegDec.comps == 1) ? 
         tft.color565(pImg[0], pImg[0], pImg[0]) : tft.color565(pImg[0], pImg[1], pImg[2]);
    tft.pushColors(buf, JpegDec.MCUWidth*JpegDec.MCUHeight, 0); 
  }
}
   
void loop() {
}

スケッチは高速化優先で、MCU内の端数画像には考慮していません。

SDカード利用のためのライブラリは、SdFatを利用しています。
SDカードアクセスのパフォーマンス改善のために、SdFatConfig.hの設定を修正しています。

変更
#define ENABLE_EXTENDED_TRANSFER_CLASS 1

« 豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中(2) | トップページ | ジャンク品のMSXの修理 その1 »

arduino」カテゴリの記事

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

STM32」カテゴリの記事

コメント

コメントを書く

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

トラックバック


この記事へのトラックバック一覧です: RobotDyn STM32 Miniボード(Blue Pill互換)でJPEG画像表示:

« 豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中(2) | トップページ | ジャンク品のMSXの修理 その1 »