UNO R3はSDカードから画像を読み取り、2.2インチLCD画面(220x176)に表示します



週末のトスの後、ようやく完成しました。私は以前プレイしましたが、画像が十分に大きい後、メモリ不足または配列オーバーランの問題を解決できませんでした。

だから、もう一度SDカードを試すことにしました。220x176は情報が少ないので、祭壇の内外で中国語と外国語のウェブサイトをチェックしたところ、ようやくいくつかのアイデアが見つかりました。

大きなアイデアは、指定された画像ファイルの各ピクセルのRGBをSDカードから読み取り、対応する位置に表示することです。

私が使用したLCDモジュールの解像度は220x176で、SDカードスロットがあり、UNO挿入をサポートしていますが、SDカードのピンははんだ付けする必要があります。また、320インチx 240インチ(2.2インチ)もあり、レベル変換後に使用する必要があるという情報を読んだ。とりあえずこれに入れましょう。

配線は非常にシンプルで、関連するプラグがUNO R3に直接接続されていることを示しています。純正品はソケットが詰まっているので、対応する液晶モジュールのピンを壊してください。互換性のあるUNOはほとんどこの位置のギャップなので、無視できます。

SDカードの配線も非常にシンプルで、ハードウェアSPIのPIN11〜PIN13の定義に対応しています(公式例にも詳しい説明があります)。別のSD_CSピンがあり、これを10に接続しました。コード内のSD.beginのパラメーターはSD_CSであるため、これは原則の問題ではありません。

とにかく、SDの部分はそれほど複雑ではありません。基本的に、以下の例でSDのDumpFileを見てください。さらに言えば、インターネットではSDは2G以下が一番いいと言われていますが、私が使っているSDカードは4Gです。また、例ではpinModeがコメントアウトされています。ここでは実行しません。明示的にOUTPUTとして指定する必要があります。そうしないと、SDカードが認識されません。

また、画像ファイルを迂回しましたが、これは完全な解決策ではなく、より面倒な回避策にすぎません。理想的な状況は、ビットマップファイルを使用することです(JPEG、PNGなどはすべてコード化されますが、デコードするマイクロコントローラーの16Mクロック周波数が低いことを考慮して...データを直接供給する必要があります。ロードするのに約1分かかります。 )。シーク(0x12)は幅を取得し、シーク(0x16)は高さを取得し、シーク(0x36)はデータを取得します。これは可能ですが、ここでのテストで遭遇した最大の問題は色の不足です。このように言えば、すべての顔はアバターです。ビットマップファイルの構造は慎重に検討されていません。ビットマップまたはBMPファイルのパレットを作成するときの保存オプションと関係があると推定されています。後で試してみましょう。

現在のアプローチは、C#でプログラムを記述し、ファイルヘッダーなしで直接ピクセルRGBファイルに変換することです。たとえば、幅3ピクセル、高さ2ピクセルの画像がある場合、最初のラインはすべて赤で、2番目のラインはすべて緑なので、ファイルバイナリI出力は次のようになります
。0xFF 0x00 0x00 0xFF 0x00 0x00 0xFF 0x00 0x00
0x00 0xFF 0x00 0x00 0xFF 0x00 0x00 0xFF 0x00
(人間の読書習慣を処理するために、スペースと改行が追加されますが、実際にはありません。欠点は明白です。幅と高さを知っている必要があります。)
合計3 * 2 * 3 = 18バイト。

既成のフォーマットがあると思いますが、探すキーワードがわかりません。私はRAWおよびMemoryBmp形式を推測しましたが、私の手で成功したものはありません。

Arduinoで各バイトを順番に読み取ると、現在の座標に表示できる3つの読み取りごとに1ピクセルのRGB情報を取得できます。図に実際の効果を示します。

メインコードは以下の通りですが、多くの例外判定が省略されています。完全なアルゴリズムについては、公式の例を参照してください。

#include <UTFT.h>
#include <SPI.h>
#include <SD.h>

const int chipSelect = 10;

UTFT lcd(QD220A, A2, A1, A5, A4, A3); 

void setup()
{
  int r, g, b;
  //Serial.begin(9600);

  pinMode(chipSelect, OUTPUT);

  lcd.InitLCD();
  lcd.clrScr();

  int width;
  int height;

  if (SD.begin(chipSelect)) {
    File bmpImage = SD.open("TEST.RAW", FILE_READ);
    
    /*

    bmpImage.seek(0x12);  // 宽度
    width = bmpImage.read();
    bmpImage.seek(0x16);  // 高度
    height = bmpImage.read();

    //Serial.println(width);
    //Serial.println(height);

    bmpImage.seek(0x36); //跳过Bitmap文件头
	
    */

    width = 220;
    height = 176;

    for (int y = 0; y < height; y ++) {
      for (int x = 0; x < width; x++) {

        r = bmpImage.read();
        g = bmpImage.read();
        b = bmpImage.read();

        lcd.setColor(r, g, b);
        lcd.drawPixel(x, y);
      }
    }

    bmpImage.close();
  }
}

void loop()
{
    // 啥都不用做
}


122件の元の記事を公開 61のよう 訪問数530,000以上

おすすめ

転載: blog.csdn.net/ki1381/article/details/66974924