まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

TFT

86Duino+SainSmartの1.8"TFT

 前回調べた86DuinoのICSP端子(と呼ぶのは正確ではないと思うが)、Digital I/Oとして使うには以下の番号を指定するとよい。
86DuinoICSP
 さて、ここを使ってAdafruit 1.8" TFT Shieldと同じTFT、ST7735Rを使っているSainSmartのモジュールを使ってみる。Amazonで買えて1590円と安価。キャラクタ液晶の代わりとしてどうだろうか。

SainSmart 1.8 ST7735R TFT LCD Module with MicroSD LED Backlight For Arduino Raspberry Pi

Adafruit/SainSmart 1.8" TFT LCD display for Raspberry Pi

 このモジュールはmicroSDカードとTFT部分のインターフェースが独立しているので別々のSPIで使用可能。

201486duinoTFT1 
 さて、 TFTのCSをENC0_A(42)、RS/DCをENC0_B(43)、SDAをSPIDOに接続、あとはVcc/GND/SCLK/RESETを対応する場所に接続してハードウェアSPI制御にする。
スケッチは以下のとおり。
https://gist.github.com/houmei/3c4cf9613f20c755b911

SPIクロックの指定は、86Duinoだと100MHz÷(2×設定値)となっている。実力ではn=2(25MHz)まで動作した。もし動かなければ以下の部分を書き換えて大きな数値にする。
SPI.setClockDivider(2);
 
201486duinoTFT2 
 動作状態でICSP端子のVcc-GND間を測定したら4.46Vだった。


サインスマート(SainSmart) 1.8サインスマート(SainSmart) 1.8" TFT カラー LCD ディスプレイ モジュール SPI インタフェース & MicroSD 付き for Arduino UNO MEGA R3

サインスマート(SainSmart)
売り上げランキング : 18506

Amazonで詳しく見る
by G-Tools

Adafruit 1.8" TFT Shield用ゲタ

 Adafruitの1.8" TFT Shield、SPI関係の信号線をICSP端子からではなくArduino UNOのD13、D11から取っているのでそのままではArduino LeonardoやDueで動かない。そこで端子を変換するゲタを作った。

2014tftshield1


(1)Arduinoのバニラシールドは、ICSP端子の部分が使えるものを選ぶ。秋月電子扱いのものは該当部分に穴がない。
(2)ピンヘッダのうち、D13(SCLK)、D11(MOSI)、D10(CS)はピンを曲げて下のシールドに刺さらないようにする。
(3)バニラシールド上のD13をICSP端子のSCLK、D11をMOSIに接続。D10はD9にハンダ付け。
※D10はD9とICSP端子の横にジャンパで接続が切り替えられるようにしているが、これは86DuinoのハードウェアCSに繋ごうと思ったため。
※手抜きでメッキ線の空中配線しています。


2014tftshield2


 このようにArduino DueでハードウェアによるSPIで動作。Arduino DueはSPI.setClockDivider()の指定が数値で、SPI.setClockDivider(2);とすると動作クロック÷2=42MHzとなる。しかし、Adafruit 1.8" Shieldのレベルコンバータの仕様で10MHzが上限とあった。動作クロックは観測していない。

Arduino Due Hardware SPI (The 21st Century Digital Home)

 なお、Arduino Leonardo、86Duinoでの動作も確認できた。
2014tft86duino



Arduino用バニラシールド基板ver.2(黒)Arduino用バニラシールド基板ver.2(黒)

スイッチサイエンス
売り上げランキング : 204199

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(赤)Arduino用バニラシールド基板ver.2(赤)

スイッチサイエンス
売り上げランキング : 298693

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(緑)Arduino用バニラシールド基板ver.2(緑)

スイッチサイエンス
売り上げランキング : 349393

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(青)Arduino用バニラシールド基板ver.2(青)

スイッチサイエンス
売り上げランキング : 125733

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(白)Arduino用バニラシールド基板ver.2(白)

スイッチサイエンス
売り上げランキング : 134964

Amazonで詳しく見る
by G-Tools

メモ:Arduino TFTライブラリの調査 →解決 SDカードのせい

 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

Adafruit 1.8" TFT ShieldをLeonardoで使う(SoftSPI)

※サンプルスケッチをしばらく実行しているとハングします※
→解決 microSDカードのせい http://blog.livedoor.jp/hardyboy/archives/7270159.html

 TFTシールドの続き。Arduino UNOではそのまま動くがLeonardoでは動かない。シールドの端子がハードウェアSPIに決め打ちになっているせい。これをソフトウェアSPIでやった。

Adafruit 1.8" 18-bit Color TFT Shield w/microSD and Joystick

シールドでの端子は以下の様になっている。
#define sclk 13
#define mosi 11
#define cs   10
#define dc   8
#define rst  0
#define sd_cs 4
ジョイスティックはアナログポートA3。


さて、以下のように書くとエラーになってしまう。TFT.hとTFT.cppはAdafruit_ST7735.hを呼び出しているが、ソフトウェアSPIを呼び出す5引数の部分の記述がないから。
TFT screen = TFT(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
以下に差し替え用のTFT.hとTFT.cpp、画面に線を引くサンプルを作った。

https://gist.github.com/houmei/1ec877f60f20c9d45a6e

 ソフトによるSPIは遅そうなので描画時間を測定した。線1本を引く時間はこのような差があった。

 Arduino UNO / ハードウェアSPI 8.65ms
Arduino Leonardo / ソフトウェアSPI 39.5ms 

2014SPIline 

追記:サンプルのスケッチ、Leonardo用はSerialコンソールを開いてないと先に進みません
ー以下解決ー
追記2:Arduino IDE1.5.6-r2にてMEGA2560互換機(Sinesmart)、Arduino DueはソフトSPIにて動作。
ただし両方共しばらく経つとハングする。(Leonardoも)

 ハングするとこうなる。Arduino Leonardoで4分46秒後に発生。
 Arduino UNO / ハードウェアによるSPIでも約1分で発生し、再起動するような挙動。TFTライブラリ?
2014softTFThang
 

Adafruit 1.8インチTFTシールド

スイッチサイエンスで扱っているAdafruit 1.8インチTFTシールドをとりあえず使ってみた。

Adafruit 1.8インチTFTシールド
(スイッチサイエンス)

Adafruit 1.8" 18-bit Color TFT Shield w/microSD and Joystick(Adafruit)

 ST7735R 128×160ドット 18bit色のディスプレイ、おおよそ33mm×40mmの大きさで、ウォークマンW用の液晶保護シートがぴったり貼れる。microSDカードスロット付き。上下左右と押しこむ操作のスティック付き。あと、バックライトを制御できそうなことが書いてあった(何もしないとON)。
 使用ピンはSPI接続でpin13,11,10,8。microSDカードを使う場合は加えて12と4。スティックはアナログ出力でA4。このシールドは3.3V/5V対応なのでGR-SAKURAに使えるかもしれん。

#define sclk  13  
#define mosi  11
#define sd_cs  4
#define lcd_cs 10
#define dc     8
#define rst    0  


 ライブラリはAdafruit-ST7735-LibraryとAdafruit-GFX-Libraryが必要。Adafruit-GFX-Libraryは同社のOLEDでも使われている。

https://github.com/adafruit/Adafruit-ST7735-Library

https://github.com/adafruit/Adafruit-GFX-Library

 これらをgithubのzipでダウンロードするボタンを押して、Arduino IDEのライブラリに展開すればいいんだけどそのままのフォルダ名だと半角英数字以外使えんといったエラーメッセージが出るので、-masterは削除しハイフン(-)はアンダースコア(_)に変えた。

 以下、ArduinoIDE1.0.3、MacOSX、Arduino UNO R3で確認。
2013tft1

 サンプルでついてくるshieldtestを開いて実行。スティックを動かすと画面に向きを表示。押しこむとmicroSDカードにあるparrot.bmpを開いて表示するらしいのだが、手元にないので適当に用意する。サンプルのparott.bmpを適当にリネームし、用意した128x160サイズのBMP画像のファイル名に合わせる(実際には128x171サイズ)。この時ファイル名は8+3文字の制限があるみたい。シリアルには以下の様に出力され、画像が液晶画面に表示される。

Button read analog = 3.34
Button read analog = 3.34
Button read analog = 0.59
Button read analog = 0.59
Button read analog = 3.34
Button read analog = 3.34
Button read analog = 3.34
Button read analog = 1.05
Initializing SD card...
Loading image 'sakura.bmp'
File size: 65718
Image Offset: 54
Header size: 40
Bit Depth: 24
Image size: 128x171
Loaded in 1111 ms

2013tft2


こんな感じです。
記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ