工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

SDカードからのBMP画像をTFTLCDシールドに表示する

コンポーネントと消耗品

>
Arduino UNO
× 1

このプロジェクトについて

こんにちは、このチュートリアルは、ArduinoUNOを備えた2.4インチTFTLCDシールドに関する他の2つのチュートリアルのフォローアップです。最初のチュートリアルは、タッチ機能の問題の逆軸のインターフェースと修正に関するもので、2番目のチュートリアルは単純な機能の使用に関するものでした。さまざまな形を描く方法と、いくつかの機能をアクティブにするためのタッチボタンを作成する方法…

Arduino TFT2.4インチLCDシールドのインターフェースとタッチの問題の修正

TFT LCD2.4インチタッチスクリーンシールドチュートリアル

しかし、今日はSDカードから画像を読み取り、画面に表示することについてです。まず、SDカードをコンピューターに接続し、FAT32としてフォーマットすることを忘れないでください。次に、画像を転送することを忘れないでください。 「BMP」フォーマット、ビットマップ24 !!正しい画像を得るには、解像度を240 * 320にする必要がありますが、説明はほとんどありません。

<図>

これは、240 * 320の画像を表示できる画面の通常の向きです。これは、デフォルトの回転であるsetRotation(0);

<図>

これは、setRotation(1);を設定した場合の画面の向きです。これで、320 * 240の画像を表示できます。

そのため、PCの画面の回転または画像の回転を変更して、画像名を覚えたりコピーしたりして、SDカードをシールドに差し込むなど、自分に合ったものを選択できます。

<図>

これらは、SDカード上の私のbmp 24ビットイメージの名前です。「Img1」のように、コードでは「Img1.bmp」を使用して呼び出します。

ライブラリ:

これは私のために働いたライブラリです:このライブラリを使用する場合はここからダウンロードしてください。ただし、サンプルコードを試してみると白い画面が表示されるので、自分に合ったライブラリを探す必要があります。

コード:

これが私がビデオin.ino形式で使用したコードです。使用しているファイルの名前を変更することを忘れないでください。ヘルプが必要な場合に備えて、チュートリアルを確認することを忘れないでください。

  • コード1
  • コード2

コード

  • TFT_Shield_SD_1.ino
  • TFT_Shield_SD_2.ino
TFT_Shield_SD_1.ino Arduino
 / *このコードは2.4 "TFT LCDタッチスクリーンシールドで使用し、SDカードに保存されているbmp画像を読み取り*画面に表示します*詳細についてはSurtrTech.comを参照してください* /#include  //コアグラフィックスライブラリ#include  //ハードウェア固有のライブラリ#include  #include  #define LCD_CS A3 //チップ選択はアナログ3に移動#define LCD_CD A2 //コマンド/データはアナログ2に送られます#defineLCD_WR A1 // LCD書き込みはアナログ1に送られます#defineLCD_RD A0 // LCD読み取りはアナログ0に送られます#defineSD_CS 10 //シールドのSDカードピンAdafruit_TFTLCDtft(LCD_CS、LCD_CD 、LCD_WR、LCD_RD、A4); void setup(){Serial.begin(9600); tft.reset(); uint16_t識別子=tft.readID(); pinMode(10、OUTPUT); digitalWrite(10、HIGH); tft .begin(identifier); if(!SD.begin(SD_CS)){progmemPrintln(PSTR( "failed!")); return;}} void loop(){bmpDraw( "Logo.bmp"、0、0); // bmpDraw関数の呼び出し( "Name_of_your_image.bmp"、x、y)(x、y)が開始位置です描画遅延の(2000); bmpDraw( "Img2.bmp"、0、0); delay(2000); bmpDraw( "Img3.bmp"、0、0); delay(2000);} #define BUFFPIXEL 20 //描画速度、20が最高ですが、unoのRAMを大量に使用しますが、60を使用できます//描画機能、SDカードからファイルを読み取り、 //変換と描画、問題が発生した場合はシリアルモニターにメッセージを表示します//この関数には関係ありません:Dvoid bmpDraw(char * filename、int x、int y){File bmpFile; int bmpWidth、bmpHeight; // W + H(ピクセル単位)uint8_t bmpDepth; //ビット深度(現在は24でなければなりません)uint32_t bmpImageoffset; //ファイルuint32_tの画像データの開始rowSize; //常にではない=bmpWidth;パディングuint8_tsdbuffer [3 * BUFFPIXEL]がある可能性があります。 //バッファ内のピクセル(ピクセルあたりR + G + B)uint16_t lcdbuffer [BUFFPIXEL]; //ピクセル出力バッファ(ピクセルあたり16ビット)uint8_t buffidx =sizeof(sdbuffer); // sdbufferブール値の現在の位置goodBmp =false; //有効なヘッダーでtrueに設定されますparseboolean brief =true; // BMPは下から上に格納されますintw、h、row、col; uint8_t r、g、b; uint32_t pos =0、startTime =millis(); uint8_t lcdidx =0; boolean first =true; if((x> =tft.width())||(y> =tft.height()))return; Serial.println(); progmemPrint(PSTR( "画像の読み込み '")); Serial.print(ファイル名); Serial.println( '\' '); //要求されたファイルをSDカードで開きますif((bmpFile =SD.open(filename))==NULL){progmemPrintln(PSTR( "File not found"));戻る; } // BMPヘッダーを解析しますif(read16(bmpFile)==0x4D42){// BMP署名progmemPrint(PSTR( "ファイルサイズ:")); Serial.println(read32(bmpFile)); (void)read32(bmpFile); //作成者バイトを読み取って無視しますbmpImageoffset =read32(bmpFile); //画像データの開始progmemPrint(PSTR( "画像オフセット:")); Serial.println(bmpImageoffset、DEC); // DIBヘッダーを読み取りますprogmemPrint(PSTR( "Header size:")); Serial.println(read32(bmpFile)); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile)==1){//#プレーン-「1」である必要がありますbmpDepth =read16(bmpFile); //ピクセルあたりのビット数progmemPrint(PSTR( "Bit Depth:")); Serial.println(bmpDepth); if((bmpDepth ==24)&&(read32(bmpFile)==0)){// 0 =非圧縮goodBmp =true; //サポートされているBMP形式-続行します! progmemPrint(PSTR( "画像サイズ:")); Serial.print(bmpWidth); Serial.print( 'x'); Serial.println(bmpHeight); // BMP行は(必要に応じて)4バイト境界にパディングされますrowSize =(bmpWidth * 3 + 3)&〜3; // bmpHeightが負の場合、画像は上から下の順序になります。 //これは標準ではありませんが、実際に観察されています。 if(bmpHeight <0){bmpHeight =-bmpHeight;フリップ=false; } //ロードする領域を切り抜くw =bmpWidth; h =bmpHeight; if((x + w-1)> =tft.width())w =tft.width()-x; if((y + h-1)> =tft.height())h =tft.height()-y; // TFTアドレスウィンドウをクリップされた画像の境界に設定しますtft.setAddrWindow(x、y、x + w-1、y + h-1); for(row =0; row  =sizeof(sdbuffer)){//実際// LCDバッファを最初にディスプレイにプッシュif(lcdidx> 0){tft.pushColors(lcdbuffer、lcdidx、first); lcdidx =0;最初=false; } bmpFile.read(sdbuffer、sizeof(sdbuffer)); buffidx =0; //インデックスを先頭に設定} //ピクセルをBMPからTFT形式に変換b =sdbuffer [buffidx ++]; g =sdbuffer [buffidx ++]; r =sdbuffer [buffidx ++]; lcdbuffer [lcdidx ++] =tft.color565(r、g、b); } //ピクセルの終了} //スキャンラインの終了//残りのデータをLCDに書き込むif(lcdidx> 0){tft.pushColors(lcdbuffer、lcdidx、first); } progmemPrint(PSTR( "Loaded in")); Serial.print(millis()-startTime); Serial.println( "ms"); } // goodBmpを終了します}} bmpFile.close(); if(!goodBmp)progmemPrintln(PSTR( "BMP形式が認識されません。"));} //これらはSDカードファイルから16ビットおよび32ビットタイプを読み取ります。//BMPデータはリトルエンディアンで保存され、Arduinoはほとんどありません。 -エンディアンも。//他の場所に移植する場合は、添え字の順序を逆にする必要がある場合があります。uint16_tread16(File f){uint16_t result; ((uint8_t *)&result)[0] =f.read(); // LSB((uint8_t *)&result)[1] =f.read(); // MSBは結果を返します;} uint32_tread32(File f){uint32_t result; ((uint8_t *)&result)[0] =f.read(); // LSB((uint8_t *)&result)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSBは結果を返します;} //文字列をフラッシュからシリアルポートにコピーします//ソース文字列はPSTR()宣言内になければなりません!voidprogmemPrint(const char * str){char c; while(c =pgm_read_byte(str ++))Serial.print(c);} //上記と同じですが、末尾にnewlinevoid progmemPrintln(const char * str){progmemPrint(str); Serial.println();} 
TFT_Shield_SD_2.ino Arduino
 / *このコードは、UNOボードを備えた2.4 "TFTLCDタッチスクリーンシールド用です*画面を押した場所によって変化する画像の小さなスライドショーを作成します*画像はSDカードから読み取られます*参照詳細については、SurtrTech.comにアクセスしてください* /#include  //コアグラフィックライブラリ#include  //ハードウェア固有のライブラリ#include  #include  #include  //タッチスクリーン関数library#if defined(__ SAM3X8E __)#undef __FlashStringHelper ::F(string_literal)#define F(string_literal)string_literal#endif //以下のパラメーターはシールドに依存するため、ピンがcorrect#define YP A3 //アナログピンである必要があり、「An」表記を使用してください!#define XM A2 //アナログピンである必要があり、「An」表記を使用してください!#define YM 9 //デジタルピンである可能性があります#define XP 8 //デジタルピンにすることができます//タッチ機能が機能しない場合は、上記の値を確認してください(A1 A2 7 6)resp //最初にキャリブレーションコードを実行して、それらのポイントを設定する値をキャリブレーションします。#define TS_MINX 176#define TS_MINY 159#define TS_MAXX 921#define TS_MAXY 884#define MINPRESSURE 10#define MAXPRESSURE 1000TouchScreen ts =TouchScreen( XP、YP、XM、YM、300); #define LCD_CS A3 //チップ選択はアナログ3に移動#define LCD_CD A2 //コマンド/データはアナログ2に移動#define LCD_WR A1 // LCD書き込みはアナログ1に移動#define LCD_RD A0 // LCD読み取りはアナログ0#define SD_CS 10に進みます//チップ選択ラインを使用するものに設定しますAdafruit_TFTLCDtft(LCD_CS、LCD_CD、LCD_WR、LCD_RD、A4); char x [] ="x1.bmp"; / *このコードでは、名前を配列として宣言しました*スクロールしたい場合は、変更を加えることができます*画像に「1」のような番号を付けて、増減できるようにします*次の画像に移動します* / void setup(){Serial.begin(9600); tft.reset(); uint16_t識別子=tft.readID(); pinMode(10、OUTPUT); digitalWrite(10、HIGH); tft.begin(識別子); if(!SD.begin(SD_CS)){progmemPrintln(PSTR( "failed!"));戻る; } tft.setRotation(1); //画面を90回転させるにはbmpDraw(x、0、0); //宣言したとおりにx-> "x1.bmp"である最初の画像を描画します} void loop(){if(x [1] <49)//ここで追加する奇妙な値には移動しません値のリセットx [1] =49; //すでに最初の画像にいる場合は、そこにとどまります。lastif(x [1]> 52)についても同じです。//charの「1」は「49」で、「4」は「52」です。この形式なので、themx [1] =52を操作できます。 TSPoint p =ts.getPoint(); //ユーザーが画面に触れたかどうかを確認しますpinMode(XM、OUTPUT); pinMode(YP、OUTPUT); if(pz> MINPRESSURE &&pz  0 &&py <100){Serial.println( "Left"); //これは、左を押したことをシリアルモニターに表示するために行いましたx [1] =x [1] -1; //ここで、読み取りたいファイルの名前を変更しますx [] ="x1.bmp"、x [1]は名前の1、x [0]はxbmpDraw(x、0、0); //つまり、増やすと2にするか、減らすと0になります(最初の「if」を参照して、0が存在しないため、この場合の解決策を確認してください)delay(300); //次に、どちらの側を押したかによって名前が異なる画像を描画します} //タッチ検出がバウンスしないように、少し遅延を追加しますif(py> 200 &&py <320){Serial.println( "Right "); x [1] =x [1] +1; bmpDraw(x、0、0); delay(300); }}} #define BUFFPIXEL 20 //印刷速度20が最高です。60まで移動できますが、RAMの使用量が多すぎます//描画関数は簡単です:Dvoid bmpDraw(char * filename、int x、int y){ファイルbmpFile; int bmpWidth、bmpHeight; // W + H(ピクセル単位)uint8_t bmpDepth; //ビット深度(現在は24でなければなりません)uint32_t bmpImageoffset; //ファイルuint32_tの画像データの開始rowSize; //常にではない=bmpWidth;パディングuint8_tsdbuffer [3 * BUFFPIXEL]がある可能性があります。 //バッファ内のピクセル(ピクセルあたりR + G + B)uint16_t lcdbuffer [BUFFPIXEL]; //ピクセル出力バッファ(ピクセルあたり16ビット)uint8_t buffidx =sizeof(sdbuffer); // sdbufferブール値の現在の位置goodBmp =false; //有効なヘッダーでtrueに設定されますparseboolean brief =true; // BMPは下から上に格納されますintw、h、row、col; uint8_t r、g、b; uint32_t pos =0、startTime =millis(); uint8_t lcdidx =0; boolean first =true; if((x> =tft.width())||(y> =tft.height()))return; Serial.println(); progmemPrint(PSTR( "画像の読み込み '")); Serial.print(ファイル名); Serial.println( '\' '); //要求されたファイルをSDカードで開きますif((bmpFile =SD.open(filename))==NULL){progmemPrintln(PSTR( "File not found"));戻る; } // BMPヘッダーを解析しますif(read16(bmpFile)==0x4D42){// BMP署名progmemPrint(PSTR( "ファイルサイズ:")); Serial.println(read32(bmpFile)); (void)read32(bmpFile); //作成者バイトを読み取って無視しますbmpImageoffset =read32(bmpFile); //画像データの開始progmemPrint(PSTR( "画像オフセット:")); Serial.println(bmpImageoffset、DEC); // DIBヘッダーを読み取りますprogmemPrint(PSTR( "Header size:")); Serial.println(read32(bmpFile)); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile)==1){//#プレーン-「1」である必要がありますbmpDepth =read16(bmpFile); //ピクセルあたりのビット数progmemPrint(PSTR( "Bit Depth:")); Serial.println(bmpDepth); if((bmpDepth ==24)&&(read32(bmpFile)==0)){// 0 =非圧縮goodBmp =true; //サポートされているBMP形式-続行します! progmemPrint(PSTR( "画像サイズ:")); Serial.print(bmpWidth); Serial.print( 'x'); Serial.println(bmpHeight); // BMP行は(必要に応じて)4バイト境界にパディングされますrowSize =(bmpWidth * 3 + 3)&〜3; // bmpHeightが負の場合、画像は上から下の順序になります。 //これは標準ではありませんが、実際に観察されています。 if(bmpHeight <0){bmpHeight =-bmpHeight;フリップ=false; } //ロードする領域を切り抜くw =bmpWidth; h =bmpHeight; if((x + w-1)> =tft.width())w =tft.width()-x; if((y + h-1)> =tft.height())h =tft.height()-y; // TFTアドレスウィンドウをクリップされた画像の境界に設定しますtft.setAddrWindow(x、y、x + w-1、y + h-1); for(row =0; row  =sizeof(sdbuffer)){//実際// LCDバッファを最初にディスプレイにプッシュif(lcdidx> 0){tft.pushColors(lcdbuffer、lcdidx、first); lcdidx =0;最初=false; } bmpFile.read(sdbuffer、sizeof(sdbuffer)); buffidx =0; //インデックスを先頭に設定} //ピクセルをBMPからTFT形式に変換b =sdbuffer [buffidx ++]; g =sdbuffer [buffidx ++]; r =sdbuffer [buffidx ++]; lcdbuffer [lcdidx ++] =tft.color565(r、g、b); } //ピクセルの終了} //スキャンラインの終了//残りのデータをLCDに書き込むif(lcdidx> 0){tft.pushColors(lcdbuffer、lcdidx、first); } progmemPrint(PSTR( "Loaded in")); Serial.print(millis()-startTime); Serial.println( "ms"); } // goodBmpを終了します}} bmpFile.close(); if(!goodBmp)progmemPrintln(PSTR( "BMP形式が認識されません。"));} //これらはSDカードファイルから16ビットおよび32ビットタイプを読み取ります。//BMPデータはリトルエンディアンで保存され、Arduinoはほとんどありません。 -エンディアンも。//他の場所に移植する場合は、添え字の順序を逆にする必要がある場合があります。uint16_tread16(File f){uint16_t result; ((uint8_t *)&result)[0] =f.read(); // LSB((uint8_t *)&result)[1] =f.read(); // MSBは結果を返します;} uint32_tread32(File f){uint32_t result; ((uint8_t *)&result)[0] =f.read(); // LSB((uint8_t *)&result)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSBは結果を返します;} //文字列をフラッシュからシリアルポートにコピーします//ソース文字列はPSTR()宣言内になければなりません!voidprogmemPrint(const char * str){char c; while(c =pgm_read_byte(str ++))Serial.print(c);} //上記と同じですが、末尾にnewlinevoid progmemPrintln(const char * str){progmemPrint(str); Serial.println();} 

回路図

それは盾です:D

製造プロセス

  1. グリーティングカード
  2. クレジットカード
  3. 液晶ディスプレイ(LCD)
  4. データモジュール:スマートコントロールを備えた23.1インチの超伸縮TFTディスプレイ
  5. Distec:Ortustechの堅牢で太陽光で読み取り可能な7インチTFTディスプレイ
  6. Acceed:GPU-PCはグラフィックカードからパフォーマンスを得る
  7. 展示:プライマルディスプレイ
  8. Kuman TFT 3.5 RetroPie 2018
  9. AIは、シンプルなテキストベースのレシピから完成した食事の画像を生成します
  10. ILI9341TFTタッチスクリーンディスプレイシールドのビットマップアニメーション
  11. Dodge The Defs!