実現したいこと
Arduino UNOでTFT液晶を使用したい、
現時点で正常に動作しないからプログラム?か配線のデバッグをしたい
前提
エラーはないが、画面が明るくならない。
4.7kΩの抵抗を使う部分は10kΩ2本を並列で代替。
2.2kΩの抵抗を使う場合は1kΩ2本を直列で代替。
サイトなどを参考にチャレンジ中
http://okiraku-camera.tokyo/blog/wp-content/uploads/2017/10/A_PRO_MINI_IL9341_TFT1.png
該当のソースコード
#include <avr/sleep.h> #include <Adafruit_GFX.h> #include <Adafruit_ILI9341.h> #define TFT_RST 6 #define TFT_DC 7 #define TFT_CS 5 #define LED_PIN 4 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); #define TFT_ROTATION 3 // J2端子側を左に見たとき左上が、1: (319, 239) or 3 : (0, 0)。 #include "tsc2046_spi.h" tsc2046_spi TS(8, ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, TFT_ROTATION); void getTextMetrics(char* cpText, uint16_t& tw, uint16_t& th) { int16_t tx, ty; tft.getTextBounds(cpText, 0, 0, &tx, &ty, &tw, &th); } bool onTouch(int x, int y) { char tmp[32]; static uint16_t text_h = 0; static uint16_t text_w = 0; enum {POS_X = 10, POS_Y = 20 }; tft.setTextSize(1); tft.setTextColor(ILI9341_BLACK); if (text_h == 0) { memset(tmp, 'W', sizeof(tmp)); tmp[sizeof(tmp) - 1] = 0; getTextMetrics((char*)tmp, text_w, text_h); sprintf(tmp, "%d,%d,%d,%d", POS_X, POS_Y, text_w, text_h); Serial.println(tmp); } int rx, ry, rz; TS.read_pos_raw(rx, ry, rz); tft.fillRect(POS_X, POS_Y, text_w, text_h, ILI9341_WHITE); sprintf(tmp, "x=%d, y=%d, rx=%d, ry=%d", x, y, rx, ry); tft.setCursor(POS_X, POS_Y); tft.println(tmp); return true; // 連続検出させる。 } void setup() { ADCSRA &= 0x7f; // ADC禁止。MSB を 0に。 ACSR |= 0x80; // アナログコンパレータ禁止 delay(50); Serial.begin(115200); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, 0); pinMode(2, INPUT_PULLUP); digitalWrite(TFT_RST, 0); delay(10); digitalWrite(TFT_RST, 1); delay(10); tft.begin(); tft.setRotation(TFT_ROTATION); tft.fillScreen(ILI9341_WHITE); tft.setTextColor(ILI9341_BLUE); tft.setTextSize(2); tft.println("A_PROMINI_XPT2046"); TS.setHandler(onTouch); } void isr() {} void loop() { Serial.println("start sleep"); delay(100); digitalWrite(LED_PIN, 0); //tft.tft_sleep(); attachInterrupt(0, isr, FALLING); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); MCUCR |= 0x60; MCUCR = (MCUCR & 0xdf) | 0x40; sleep_cpu(); detachInterrupt(0); // タッチ検出 digitalWrite(LED_PIN, 1); //tft.tft_wakeup(); TS.touch_loop(); }
試したこと
配線のチェック等
もっと試したいが、液晶のピン部分の温度が高くなるため、
なにかデバッグするいい方法がないか検討中
補足情報(FW/ツールのバージョンなど)
OS : Windows10、
IDE : Arduino1.8.9
ボード: ArduinoUno
そのプログラム、Sleepに入ってそれっきり...になりそうな気がするのですが、Sleepから抜けるトリガはなんですか?
> 液晶のピン部分の温度が高くなる
これ、詳しく。特定のピン? 全部のピン? どういう条件で(常時? なにかしたら?)、どのくらいの温度(ほんのり温かい? 触ってられないくらい?)になるということでしょう?
>これ、詳しく。特定のピン? 全部のピン?
まあまあ高熱です。
触ってられないので、全部のピンかどれか1つかはわかりませんでした。
Setup()の時点でSleepに入ってしまうということでしょうか??
http://okiraku-camera.tokyo/blog/?p=6487 の写真でみる限り、ピン付近には部品もないし、基板のパターンとコネクタピンだけでそんな発熱するって一体どれだけの電流が流れてるんだか。あれで触っていられないくらい熱い、というのは、明らかに異常です。壊れているかも知れませんね。
そのブログを読んでいて、5V入力ダメみたいな話が出てて、そこ大丈夫かな、などと思ってましたけどそんなレベルじゃないですね。
Sleepは...あなたの意図はどうなんですか? それに合わせてあるんじゃないんですか?
Sleepはタッチパネルを操作していない場合にディスプレイをOFFにして、
タッチパネルの操作があったと時にWakeUpするようにするためとのことです。
ただ、まずはディスプレイが正しく動くことを確認するために省エネ機能はOFF仕様と思い、コメントアウトにしています。
いや、そっちじゃなくて
sleep_cpu();
の方。
やっていることの意味がわからないなら、理解していないプログラムでハードを評価しようというのは間違った方針だと思いますが。
AdafruitのILI9341ライブラリを入れてるのなら、そこのExamplesに入っているどれかとかで試してみたら。LEDの制御は追加するか常時点灯にしないといけないかも知れませんけれど。
というか。
配線のチェックをして間違いがないというのなら、そんなに熱くなるのは液晶モジュールが壊れています。
現物を見ていないで言うのもナンですけど、そのモジュールでなにかを確認しようというのは無駄、じゃないですか?
以下の流れで進めてみます。
1.LEDだけで点灯
2.サンプルをつかってILI9341のみ制御
(タッチパネルを使わず、液晶だけつかう)
3.サンプルを使ってタッチパネルのみ使用
(液晶を無視して、タッチパネルの情報を取得)
4.全てを統合