Adafruit 1.8" TFTシールドがハングしてしまう問題、解決した。microSDカードのせいだった。

 いよいよ波形観測しないといかんかな〜と思ってて気付いた。μSDカードが繋がってる。
μSDカードを外してテストしたらハングアップしない。試しにSanDiskのμSDカードを挿したら問題なく動いている一時間程度でハング。ノーブランドのμSDカードが悪さしていたようだ。ちょっと気づくの遅かったですね。(その後、SDカードなしで12HランOK)
となると、SDカードからイメージを転送して表示するものはこのトラブルが発生する可能性がある。注意。

 あと、調査中色々検索してわかったことだが、3.3V-5VレベルシフタのCD4050、動作上限が10MHzなのであまり高いSPIクロックだと動かないということだった(Arduino UNOでは問題ない)。3.3V系でよければバイパスしてしまうという方法がある。

2014tft1





 以下は記録として残しておく。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 Arduino IDE 1.0.5から提供されたTFTライブラリだが、ランダムに線を引くのを繰り返していると画面がおかしくなり、真っ白になる。

2014softTFThang


 

Arduino IDE 1.5.6-r2 + Arduino Due /  Arduino Leonardo (TFT.h/TFT.cppにソフトSPIのパッチ)→発生
Arduino IDE 1.0.5 + Arduino UNO (ハードSPI)→発生

 これから、IDEやマイコンボードの違いは関係なく、TFTライブラリ〜TFTモジュールの問題と考えられる。

 まだ原因は分からないが再現性を高めてみた。Arduino IDE 1.0.5+Arduino UNOで調査。
 約1分で上記写真のようになるスケッチ。
https://gist.github.com/houmei/5dc5fde18425b24e53d8

 TFT.hとTFT.cppはutilityフォルダ以下にあるAdafruit_ST7735とAdafruit_GFXを呼び出している。以前はこれらのライブラリを直接使っていた。Adafruit_ST7735が直接TFT-LCDの制御を行っている。
 SPIのタイミングはどうか、とSPI.setClockDivider(SPI_CLOCK_DIV4);などと変えてみた。結果は発生する時間は伸びたが描画のコマンドを実施した回数は同じと思われた。また、線を引くコマンドの後にdelayを入れても時間が伸びるだけで現象は発生する。
 
 TFTのline()はAdafruit_GFX経由で水平ならAdafruit_ST7735のdrawFastVline()を、垂直ならdrawFastHline()を、斜めならばdrawPixel()で点を描画している。そこでdrawFastVline()を呼び出してさらに低レベルで表示を行うスケッチを書いた。
https://gist.github.com/houmei/e3ed1cb2f2a630b6089e

 drawFastVline()を8個並べたループを10000回。二周目の途中で表示が真っ白になる。プログラムの動作自体は進行しているのでTFTモジュールがコマンドを受け付けない状態になっているように思える。
なお、シリアルコンソールを開くとリセットがかかるが、これはUNOの仕様?
 drawFastVline()の回数をこれより減らすと発生する時間が伸びる。ループが5000回でも発生する時間が伸びる。発生時間は再現性があるので特定のタイミングによってTFTが反応しなくなるように思える。

 今日はここまで。

TFT LCD Library(arduino.cc)
ST7735R datasheet(PDF)
https://github.com/adafruit/Adafruit-ST7735-Library
https://github.com/adafruit/Adafruit-GFX-Library