まごころせいじつ堂

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

2014年05月

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

86Duinoのその他の端子を使ってみる

 ArduinoのICSP端子に相当する86Duinoの端子は拡張されて10ピンになっている。
http://www.86duino.com/wp-content/uploads/2014/03/86Duino-ZERO_Pinout_M.jpg

86duino_icsp

   こんな具合に従来のSPI関連以外にSPICS,EMC0_A,ENC0_B,ENC0_Zが追加されている。これらを使えばSPIで接続するTFT液晶がこの端子だけを使って動かせるのではないかと思ったのだがピン番号はどう割り当ててあるんだろうか?

 86Duino ZeroはArduino UNO、86Duino ONEはArduino Due相当とピン割り当てが合わせてあるのでより大きな86Duino ONEの回路図で調べてみた。
Circuits Schematics for DM-222 (Daughter Board)[PDF]

86duino_pindefine
 
 うーんこれだけではわからんのでソースに当たる。
hardware/86duino/x86/cores/arduino/parduino.hを見てみると:
#define PINS    (45) static int pinMap[PINS] = {11, 10, 39, 23, 37, 20, 19, 35, 33, 17,
                                                                          28, 27, 32, 25, 12, 13, 14, 15, 24, 26,
                                                                          29, 47, 46, 45, 44, 43, 42, 41, 40,  1,
                                                                            3,  4, 31,  0,  2,  5, 22, 30,  6, 38,
                                                                          36, 34, 16, 18, 21};  
 ここでArduino IDE相当のピン番号を86Duino内の番号に置き換えているらしい。その割当ルールだけど、0,1,2,3,...が GP00,GP01,...,GP07,GP10,GP11,...,GP17,GP20,... に対応しているようだ。

確認してみた。
https://gist.github.com/houmei/5def00298417a19cb5f3

ENC0_A,ENC0_Z端子にLEDをつないでチカチカさせてみた。

201486duino_icsp



 OK。これで86Duinoで拡張した端子も利用することができた。
 

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 Shieldを標準のライブラリで使う

 以前トライしたAdafruit 1.8" TFT Shield、Arduino1.0.5や1.5.6-r2では標準のライブラリとしてあらかじめ入っている。

前回の実験はこれ:Adafruit 1.8インチTFTシールド

Adafruit 1.8インチTFTシールド(スイッチサイエンス)
Adafruit 1.8" 18-bit Color TFT Shield w/microSD and Joystick

サンプルスケッチを開くと今後はTFT.hだけをincludeすれば良いらしい。arduino.ccでTFTライブラリの解説を見ると5個の引数もOKなのだが、やってみるとエラーとなった。
TFTLibrary > TFT

これは TFT.h が
#include "utility/Adafruit_GFX.h"
#include "utility/Adafruit_ST7735.h"
とラップしているのだが、その下で
class TFT : public Adafruit_ST7735 {
public:
  TFT(uint8_t CS, uint8_t RS, uint8_t RST);

  void begin();  
}; 
と3引数だけを宣言しているのが原因と思われる。この中に

TFT(uint8_t CS, uint8_t RS, uint8_t SID, uint8_t SCLK, uint8_t RST); 

を追加すればエラーはなくなる。

 さて、標準のライブラリで何か表示させようにもチュートリアルはTFTモジュールのブレイクアウト基板とシールドの説明が一緒になっているのでややわかりにくい。
1.8" TFT Display Breakout and Shield

シールドでの端子は以下の様になっている。
#define sclk 13
#define mosi 11
#define cs   10
#define dc   8
#define rst  0
#define sd_cs 4

ジョイスティックはアナログポートA3。

 サンプルスケッチもシールド用にはそのまま使えないので何かデモはないかと探したら、互換シールドを作っている所にあった。
Arduino Colour TFT Shield
 が、なぜかジョイスティックがアナログポートA0でポジションの設定も全然互換でないので、ちょっといじった。スイッチのポジションは面倒なので正しく合わせてありません。
https://gist.github.com/houmei/621481ad3260b088a7eb

2014TFTshield

Arduino UNO / Crowduino(5V/3.3V)で動作確認。
いきなりArduino Dueや86Duino(これにも互換ライブラリがある)でやろうとしてうまく行かなかったのでArduino UNOで実験。リファレンス用の板大事。

追記:
Arduino Dueではダメだった。ハードSPIがUNOと違う&任意端子で指定しても動かず。arduinoのフォーラムでも動作例なし。
Intel Galileoではどうかとやってみたが、TFT.hが呼び出すAVR固有のヘッダがないのでコンパイルエラー。 

86DuinoのGPIO速度

 Intel GalileoのGPIOスイッチング速度は約200Hzと遅かった。86Duinoはどうか。
GalileoのGPIOは遅い

 pin0〜pin19の出力を10101010..と変化させるスケッチを書き、86Duinoの動作周波数200MHz,300MHz,400MHzで観測した。

2014GPIO86Duino

 このようにおおよそ5μsで変化している。200KHzくらい。 結果は以下のとおり。

pin 200MHz 300MHz 400MHz
#1 6.124us 5.708us 6.758us
#2 5.542us 5.082us 6.082us
#3 6.124us 5.708us 6.758us
#4 5.542us 5.082us 6.082us
#5 6.124us 5.708us 6.758us
#6 6.124us 5.708us 6.758us
#7 5.542us 5.082us 6.082us
#8 5.542us 5.082us 6.082us
#9 6.124us 5.708us 6.758us
#10 6.124us 5.708us 6.758us
#11 6.124us 5.708us 6.758us
#12 5.542us 5.082us 6.082us
#13 6.124us 5.708us 6.758us
#14 6.124us 5.708us 6.758us
#15 6.124us 5.708us 6.758us
#16 6.124us 5.708us 6.758us
#17 6.124us 5.708us 6.758us
#18 6.124us 5.708us 6.758us
#19 6.124us 5.708us 6.758us

 pin2,4,7,8,12が他のピンよりも速い。回路図を確認したら、これらはP4 GPIO40〜47に接続されている。400MHzでの速度が300,200MHzよりも遅いのは不明。

http://www.86duino.com/wp-content/uploads/2013/08/DM222_SCH.pdf 


 86Duinoの400MHz設定は今のところ「裏ワザ」だけど、モジュールSOM-128-EX自体は400MHz動作を保証している。

http://blog.livedoor.jp/hardyboy/archives/7227219.html#comments 

 
記事検索
プロフィール

hardyboy

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