はじめに
現在、TFTディスプレイを使用したArduinoでのプロジェクトに取り組んでいます。 最近、一見シンプルな機能を追加したかった-明るさ調整機能。 TFTディスプレイを操作するためのライブラリ(UTFTライブラリ)のドキュメントで必要なメソッドを見つけました:
setBrightness(br);
すべてのコードを書き、必要なすべてを行いました。 チェックすることにしましたが、驚いたことに何も起こりませんでした。 私は理解し始めました。 2日後、私は
"This function is currently only supported on CPLD-based displays."
メソッドに関する小さなメモに気付きました:
"This function is currently only supported on CPLD-based displays."
つまり、このライブラリは私のディスプレイをサポートしていません。 しかし、ディスプレイ自体が輝度調整をサポートしていることがわかりました。 非常に長い間、設定方法をインターネットで検索しましたが、見つかりませんでした。そのため、私は目標を自分で達成することに決め、何とか成功しました。 そして、私はこれが役に立つと思うかもしれない人々と共有することに決めました。

何が必要ですか?
- 基礎として、ATmega2560プロセッサに基づいたFrearduino ADK v.2.2を使用しました
- TFT LCD Mega Shield v.2.2
- ディスプレイ自体は7インチのTFT LCD SSD1963です(ここでは、その説明と必要なドキュメントを確認できます )
- UTFTライブラリ-TFTディスプレイを操作するためのユニバーサルライブラリ(ライブラリ自体およびドキュメントはこちらで確認できます)
- はんだごて
鉄に対処します
表示回路を開くと、mp3032コンバーターに3つの入力(LED-A、PWM、5V)があることがわかります。 最初、PWMは非アクティブです。 この入力はまったく使用されません。 バックライトはLED-Aによって制御されます。

ディスプレイの背面を見ると、
"Backlight control"
たエリアがあります。 ここにこれらのまさに入力があります。 PWM方式でバックライトを制御するには、すべてがLED-Aが非アクティブで、PWMがアクティブであることを確認する必要があります。 これを行うには、ジャンパーを再はんだ付けする必要があります。 起こるべきことの写真は次のとおりです。

ソフトウェア部
ライブラリは必要なものを提供できないため、目的の関数を自分で記述します。 これを行うには、ディスプレイを制御するコントローラーのドキュメントを開きます(SSD1963)。 SSD1963は、ドキュメントに記載されている特別な出力を介してArduinoから送信される特別なコマンドを使用して制御されます。

制御は次のように実行されます:ArduinoはRSを介して出力します(表のD / C)コマンドを送信する場合は0、データを送信する場合は1。 コマンドを送信した後、RSは1に切り替わり、必要なパラメーターが送信されます。 すべてのコマンドとパラメーターは、出力D0〜D7を介して送信されます。 ATmega2560を使用している場合、これら8つの出力はすべてポートCで結合されます。
それでは、まず最初に、バスでデータを送信するための関数を作成しましょう。 使いやすくするために、UTFT.hに直接書き込みます。
void Lcd_Writ_Bus(uint8_t bla) { digitalWrite(WR,LOW); // SSD1963 digitalWrite(CS, LOW); PORTC = bla; // digitalWrite(CS,HIGH); digitalWrite(WR,HIGH); }
同じ名前の関数は既にライブラリにあるため、メソッドの名前にも注意を払う価値があります。
出力コマンドとデータに2つの関数を追加します。
void Lcd_Write_Com(uint8_t data) { digitalWrite(RS,LOW); // RS , 0 Lcd_Writ_Bus(data); } void Lcd_Write_Data(uint8_t data) { digitalWrite(RS,HIGH); // RS , 1 Lcd_Writ_Bus(data); }
これで、バックライト設定自体。 これをすべて行う方法を学ぶには、ドキュメントを開き、PWMを構成するコマンドを探してください。
注:
PWMは、動的輝度制御システムであるDBCを使用して制御できますが、簡単にするために使用しませんでした。 必要に応じて、同じドキュメントで必要な情報を見つけることができます。したがって、必要なものは次のとおりです。

つまり、最初に「0xBE」コマンドを送信し、次に3つのパラメーターとして、信号周波数、デューティサイクルの期間、およびDBCがオンかどうかを決定する3番目のパラメーター(0x01-オフ、0x09-オン)を渡す必要があります。
明るさ自体を調整するには、デューティサイクルの周波数を変更するだけです。 データを1バイトとして送信するため、サイクルの値は0から255になります。9レベルの輝度(0から8)を決定することにしました。 したがって、256個の値はすべて9つのステップに分割する必要があります。 しかし、ステップが等しい場合、明るさが私たちが望むほどスムーズに変化しないという事実にも注意を払う価値があります。 つまり、たとえば、すでに第4段階では明るさがほぼ最大になり、第4段階から第8段階まではほとんど感知できません。 これを考慮して、分母2の等比数列を使用することにしました。つまり、明るさは次の式で計算されます:
(2 ^ lvl) - 1
。ここで、lvlは0から8までの明るさレベルです。その後、1を引く必要があります。 もちろん、自分でステップとその値を選択することもできますが、ここではそのような非常に単純な例を示しました。 次に、コード自体:
void setBright(byte lvl) { byte brightness(1); for (byte i(1); i <= lvl; i++) // brightness *= 2; Lcd_Write_Com(0xBE); // Lcd_Write_Data(0x01); // 760 Lcd_Write_Data(brightness-1); // Lcd_Write_Data(0x01); // DBC }
これで、
UTFT.setBright(byte lvl);
使用できます
UTFT.setBright(byte lvl);