無関係なコードの変更後にAdafruit FT6206コントローラが起動しない

ESP WROOM32モジュールに Adafruit HUZZAH32 Feather を使用し、 Adafruit 2,8 "キャップタッチディスプレイ私のコードを試してみた私は奇妙な問題に遭遇しました:コードの特定の1行は、すべてがうまくコンパイルされたにもかかわらず、コントローラがフリーズすることができます。

FT6206タッチスクリーンコントローラを起動できませんでした

so it stops there in the while(1);

#include    //Core graphics library
#include       //this is needed for display
#include 
#include      //this is needed for FT6206
#include 


// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 ctp = Adafruit_FT6206();

// The display also uses hardware SPI, plus #9 & #10
#define TFT_CS 21
#define TFT_DC 14
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

#define BOXSIDE 100
#define LBLUE     0x0479
#define BLACK     0x0000
#define RED       0xD802
#define LGREEN    0x7DE4
#define BACKGROUNDCOLOR BLACK

TS_Point lastPoint;
bool continuedTouch = false;

typedef struct box box;

/**
 * Struct to define boxes for the graphical interface
 */
struct box {
   int posx; /**< Start position on x-axis*/
   int posy; /**< Start position on y-axos*/
   int sidex; /**< Length of side in x direction*/
   int sidey; /**< Length of side in y direction*/
};

box leftBox ;
box middleBox ;
box rightBox ;

void setup() {
  while (!Serial);    //used for leonardo debugging

  Serial.begin(115200);

  tft.begin();
  tft.setRotation(1);
 //Initialization here because of rotation
  leftBox = {0, tft.height()/2 - BOXSIDE/2,  BOXSIDE, BOXSIDE};
  middleBox = {tft.width()/2 - BOXSIDE/2, tft.height()/2 - BOXSIDE/2, BOXSIDE, BOXSIDE};
  rightBox = {tft.width() - BOXSIDE, tft.height()/2 - BOXSIDE/2,  BOXSIDE, BOXSIDE};
  if (! ctp.begin(40)) { //pass in 'sensitivity' coefficient
    Serial.println("Couldn't start FT6206 touchscreen controller");
    while (1);
  }
  tft.fillScreen(BACKGROUNDCOLOR);
  showMainScreen();
}

void loop() {
   //Wait for a touch
  if (! ctp.touched()) {
    continuedTouch = false;
    return;
  }
  int buf = 0;

 //Retrieve a point  
  TS_Point p = ctp.getPoint();
  p.x = map(p.x, 0, 240, 320, 0);
  p.y = map(p.y, 0, 320, 240, 0);
  buf = p.y;
  p.y = p.x;
  p.x = buf;
  if (continuedTouch == false){
    lastPoint = p;
    continuedTouch = true;
    Serial.println("in if");
  }

  int overlap = 0;
  int diff = 0;

  if (lastPoint.x < p.x){
    diff = p.x-lastPoint.x;

    if (leftBox.posx > (tft.width() - leftBox.sidex )){
      overlap = leftBox.posx + leftBox.sidex  - tft.width() - 10; 
      tft.fillRect(0, leftBox.posy, overlap, leftBox.sidey, RED);
      if (leftBox.posx > tft.width()){
        //Serial.println("");//If this is commented out...
        leftBox.posx = leftBox.posx - tft.width() -10;//...this line causes problems
      }
    } 
    tft.fillRect(leftBox.posx, leftBox.posy, diff, leftBox.sidey, BLACK);
    tft.fillRect(leftBox.posx+leftBox.sidex, leftBox.posy, diff, leftBox.sidey, RED);
    leftBox.posx = leftBox.posx + diff;


    if (middleBox.posx > (tft.width() - middleBox.sidex )){
      overlap = middleBox.posx + middleBox.sidex  - tft.width() - 10;
      tft.fillRect(0, middleBox.posy, overlap, middleBox.sidey, LGREEN);
      if (middleBox.posx > tft.width()){
        middleBox.posx = middleBox.posx - tft.width() - 10;//Here the same line does not make problems
      }
    } 
    tft.fillRect(middleBox.posx, middleBox.posy, diff, middleBox.sidey, BLACK);
    tft.fillRect(middleBox.posx+middleBox.sidex, middleBox.posy, diff, middleBox.sidey, LGREEN);
    middleBox.posx = middleBox.posx + diff;


    if (rightBox.posx > (tft.width() - rightBox.sidex )){
      overlap = rightBox.posx + rightBox.sidex - tft.width() - 10;
      tft.fillRect(0, rightBox.posy, overlap, rightBox.sidey, LBLUE);
      if (rightBox.posx > tft.width()){
        rightBox.posx = rightBox.posx - tft.width()-10;//Here neither
      }
    } 
    tft.fillRect(rightBox.posx, rightBox.posy, diff, rightBox.sidey, BLACK);
    tft.fillRect(rightBox.posx+rightBox.sidex, rightBox.posy, diff, rightBox.sidey, LBLUE);
    rightBox.posx = rightBox.posx + diff;
  }  

  lastPoint = p;
}


void showMainScreen(){
  tft.fillRect(middleBox.posx, middleBox.posy, middleBox.sidex,middleBox.sidey, LGREEN); //middle
  tft.fillRect(leftBox.posx, leftBox.posy, leftBox.sidex,leftBox.sidey, RED);//left
  tft.fillRect(rightBox.posx, rightBox.posy, rightBox.sidex,rightBox.sidey, LBLUE);//right
}

プログラムは3つのボックスを描き、指がタッチスクリーン上の右側に移動するとスクロールします。彼らはディスプレイから移動したときにそれ自身を繰り返します。私の質問は、なぜ Serial.println( ""); をコメントアウトすると、タッチスクリーンコントローラが起動しないのですか?最初は leftBox.posx はゼロですので、この行では負の値になりますが、これは問題ですか?しかし、コードの一部は if の内部にあるため、開始時に実行されるとは思われません。 誰もこの行動を説明できますか?

The wiring looks like this (sorry for my crappy paint job)Wiring

P.S.これが正しいSEフォーラムであるかどうかはわかりませんが、私に知らせてください。 また、私は電気工学に関するこの質問をしたので、ここで質問するように勧められたので、そこで削除しました。


私はそれがある種の魔法と関係があるという解決策に遭遇しました...もっとたくさん試した後、私はいくつかの異なる機会にタッチスクリーンコントローラの故障に遭遇しました:一度、ボックスの色を変えたとき(すべてが< REDLGREENLBLUE ではない場合)、別の tft.fillRect は動作しませんでした。 Serial.prinln()をこれらの文のすぐ上に追加すると、コントローラが起動します。何故地上で何が起きてタッチスクリーンコントローラが起動しないのでしょうか?

追加情報:コメントに記載されているとおり、私は2枚のフェザーボードと2枚のディスプレイを持っています。これらのディスプレイの1つは、写真に示されているものであり、もう1つはブレークアウトボードバージョンです。どちらのディスプレイもAdafruitが提供する例でうまく動作します。 (タッチ入力が速いときには、画像が乱れてしまうかもしれませんが...アルゴリズムがうんざりであるか、または描画が高速ではありませんが、それは別の問題です)彼らは上記のようにはありません。私はディスプレイ上にI2Cパッドをはんだ付けし、Adafruitチュートリアルではディスプレイに実際にI2Cがタッチ・インターフェースとしてあると述べています。また、コードが原因で問題が発生していることは明らかです。

0
ru de
あなたの配線を見せてもらえますか? I2CピンをSDAとSCLに接続しましたか(A4とA5を使用した場合は、
追加された 著者 Tom Collins,
だから帽子のタッチは、羽ではなく、羽で働いていますか?さらに、フェザーには3.3VのI/Oがあることに気付きました。ですから、5Vではなく3.3Vでボードに電源を供給することをお勧めします。あなたはおそらくバックライトの一部を失うでしょうが、これはI2C通信がフェザーで動作しているかどうかを確認することです
追加された 著者 Tom Collins,
@ frarugi87私はジャンパーを半田付けし、Unoヘッダーバージョンとディスプレイのブレークアウトボードバージョンの両方で試しました。どちらもAdafruitが提供するサンプルとうまく機能します。私はオシロスコープにアクセスして答えを更新するかどうかを確認できます。
追加された 著者 awesomebob,
@ frarugi87いいえ、提供された例ではなく、私が書いたコードではなく、羽根に取り組んでいます。私のコードでは、 Serial.println( ""); がコメントアウトされていなければ動作します。羽根には3Vの出力しかないので、すでにこの方法でディスプレイに電力を供給しています。私はそれを明確にするために写真をアップロードする
追加された 著者 awesomebob,

答えはありません

0