161006: TFT カラー液晶 ST7735s に挑戦
※ ぐちゃぐちゃで読みにくいと思いますが、僕が迷った記録として残したいのと整理する努力をしていないためです…悪しからず
※ 記事が長くなったのでマイコン別に分けました。
ST7735s は ESP-WROOM-02、ESP-WROOM-32 でも使うことができました。
普通 Arduino が欲しい場合ネットでポチしますが札幌で Arduino を売っているショップがあるとのことで梅澤無線へ。札幌で電子工作してて行った事ないというのはもぐりすぎですし、前から見てみたかったショップなのでさっそくレッツゴー。ただし残念なことに Arduino は品切れでした…
仕方なく TFT シールドとピンヘッダ(足が無駄に長い…)だけ買って帰りました。このシールドは aitendo というところのものらしいです。悪評高い感じが見受けられるショップですね。梅澤無線は関係ないんですけど、個人的な記憶を正直に言うとデビュー戦はあまり後味よくなくて悔しいですね。
開封
さて、そのブツです。※あてがっている定規は 1 mm スケール。
ジャンクみたいなものなので異議申し立てみたいなことはしないのですが、次の通りつかまされた感があります。
- サイズ、2.6 インチとあるが実際は 1.8 インチ。
- 配線(後述)
一言で言うと「つ つかえねぇー!!!」です。ただしそのままでは使えないってだけなのがまた、こう、心をくすぐりますよね。ただ何と表現して良いのか、サイズ感を知らなかったのが少し悔やまれます。2.6 インチは 6.6 cm、1.8 インチは 4.6 cm だそうです。サイズ感をつかんだ今なら 1.8 インチと知ってこれ買わないですね(あ、あの…表示器に一番大事なのは数字じゃなくて見た目ですよ…)
それと今見ると「for Arduino UNO」とあります。「for Arduino UNO R3」ではないですね。ん、でも R3 からピンが増えてそれに対応しているのでこれは R3 対応品で、…。…、んー???(http://trac.switch-science.com/wiki/Arduino-diff)
大事な事
画面に保護シールが貼ってありますよね、ありますよね。あったんです。これのつまみ(ベロ)の色には意味があって、TFT の初期化の定数がその剥離用のベロの色で決まると。そういう事らしいです(詳しくは http://blog.boochow.com/article/423965515.html )。これには緑色のベロがついておりましたので GREEN という定数を使うはずなのですが、このドライバでは BLACK でないと画面の端がおかしくなりました。どんとこいです。
こいつはドライバが非力なので動画を表示するには不向きです。文字の表示もかなり遅いです。(← のちに Arduino 328P が遅いという事を知りました)線だけだとまぁまぁちゃかちゃか表示できる感じです。このへんは目的によりますね。
この大きさという事もあり、機敏なアニメーションを表示するわけでなく、せいぜいカラフルに GUI を表示させられたら大満足ってものだと思います(そりゃ応答は速い方がいいですけどね)。
調べます!
書かれている型番を aitendo のページで検索してみます。このサイトは商品の扱いを中止するとページが消失するようなので念のためスクリーンショットを…
http://www.aitendo.com/product/9482
「Arduino で使える LCD カラーディスプレイ」という点以外、悲しいことにもう何から何までまったく違いますね。
少し頭をひねって「TFT 液晶モジュール」で検索し、これじゃないかというパネルを見つけられました。
http://www.aitendo.com/product/11455
端子の数はもちろん同じ。FFC(フレキシブル フラット ケーブル)形状も極めて似ています。ただし…
手元の LCD にはチップコンデンサのランド(C1 ~ 3)があるんですよね…。素人目に見てもこれはどう見てもチップコンデンサが未実装です。「互換性のある FFC を使っているだけ」か「設計上、安定のため必要」なのか判断に迷ったんですけど、表面実装はんだ作業の機会と思って一応やってみました。
Youtube で見た表面実装のやり方を見たことがあるのでたぶんできるでしょという事で、300 円のドライバーセットに入っていたピンセット(原価 is おいくら)を片手に、いざ。まぁこんなもんでしょう。
はんだ付けといえば某野瀬氏ですね。
話を戻して。必要なコンデンサの容量とか分かるわけもなく目見当で選んだのですが、どちらも一回り大きいような気がします。内部で重要な回路として結線されていないことを祈るばかりです。しかしコンデンサの役割からして、無くても大丈夫なんですよね。実際さぐりを入れているしばらくの間は未実装で動かしていましたし、どんとこいです。
ディスプレイドライバ
「液晶パネルそのものだけを正規品のように売り付けられた~」「わ~掴まされた~」って思っていたんですけど、調べるうちにドライバが組み込まれていると分かってきて少しテンション上がりました(単純)。こんな薄くて小さなパネルのどこにドライバが組み込まれているのか動いているいまでも見当がつきません(脳がローテク)。
<追記> 画面の下の方にある黒いゴムっぽいところに細長い CPU みたいなのが1個入ってます。パソコンモニタも、まわりにぐるっとついてますね。TFT ってのはそうやって動かすみたいです。
製品名はでたらめなので、検索で見つけたもの(Z180SN009)の ST7735s がディスプレイドライバです。もし違うとしても初期化手順が違ったりするだけで、信号が違って壊れはしないと信じてやるしかないです。接続が違ったり配線がずれていたりといろいろやっていましたが、壊れていないようです。思ったより丈夫で助かりました。
接続すると壊れる(?!)との情報
基板をじっくり眺めていると、「ここにはこの手持ちの疑似ロータリーエンコーダーがつくに違いない!」というスルーホールに気づきました。そこで Arduino でロータリーエンコーダーを使う基板(シールド)を画像検索して、数少ないヒット数のうち一件だけこの基板と同じ基板の写真を見つけ記事を読み進めると、ある重大な問題点を指摘しています。なんと 3.3 V に 5 V が流れ、あっという間に破壊されるとの事(http://plaza.rakuten.co.jp/aisuke37/diary/201511290000/)
しかし手元の基板では 5 V ピンは Reset 端子と、接続しない ICSP の 5 V につながっているだけで LCD に作用するようにはなっていません。端子が違うと言及していないので、この方が使っている Arduino と僕のは違うのかもしれません。もしかすると見た目が同じで、基板のバージョンが違うのかもしれません。
あとこれ関係ないですけど、この方はシールドによっては干渉によってショートして本体が壊れてしまう経験を指摘してくれています(http://chum-up.blogspot.jp/2014/03/24-240x320-color-lcd-with-touch-screen_26.html)
これとは別に、信号出力が何ボルトか知らなかったので、もしかしてディスプレイドライバへの信号入力の 5 V
がまずいのか、とも思いましたがこれは大丈夫なのです。
<161225> それがまずいんですよ。Arduino の信号出力は 5 V、TFT は 3.3 V 駆動なのだから。
同じ基板をインターネットに上げている人がほかにいなかったですし、初接続の時は壊れる覚悟をしました。こういう致命的な障害情報が事前に手に入ったり、「危ないかもしれないぞ」という事を知れるのはとてもありがたい事ですね。幸運でした。情報を残してくれた両氏に感謝です。
ピンの接続
何から何まででたらめな事が分かったのでピンの接続もパターンを読んでいきましょう。TFT 端子 → Arduino 端子のどことつながっているのかを調べました。案の定、パターンはでたらめでした。
FFC 番号 → Arduino ピン
1, 14 → NC
2, 3(LED-), 5, 13 → GND
4(LED+), 10(VCC), 11(IOVCC) → 3.3 V
6 /RESET → Digital 8 × 正しくは Digital 9
7 A0 → Digital 12 × 正しくは Digital 8
8 SDA → Digital 11 〇
9 SCK → Digital 13 〇
12 CS → Digital 10 〇
また、ディスプレイの PDF にあるピン番号が Arduino のものではないのでどうしても一致せず苦戦しました。
豆知識
A0 は DC、SDA は MOSI と表記されることがあるよ。RST → /RESET とか SCK → SCLK みたいに連想しやすいのはいいけど A0 とか SDA なんて言われたらもう総当たりしか…
わからない事はやはり作った人に聞くのが一番!(といっても偶然見つけただけです)。なんとかようやくピンアサインが手に入りました。
http://www.aitendo.com/product/11590
見比べてみると、ところどころあっています。
SPI 通信
このディスプレイは高速な SPI 通信という 10~13 ピンを使うとのこと。
Digital 10 : SS
Digital 11 : MOSI
Digital 12 : MISO
Digital 13 : SCK
http://wiki.onakasuita.org/pukiwiki/?Arduino%2Fピン配置
この MOSI とか MISO とかが脳内で別のものと結びつき、さらに端子の名前は違うわで一日つぶれました。頭の防爆弁がオープンしましたが時間が経てば閉じるし、丈夫になるのが人間の良いところですね(?)
※ MasterOutSlaveIn, MasterInSlaveOut の略で、ツイッターで見た事なので裏は取ってないですが TX / RX が紛らわしいので接続の関係で付けた明瞭な名前だそうです。<170306>
一応使えました!!
型番が分からなかったのでロータリーエンコーダーから検索可能でなければ道はなかった気がします。この商品はきっと「LCD パネルに適当なボードを付けてやるからあとはそっちでよろしく」というスタイルだったのでは、と思っています。2.6 インチかどうかはみりゃわかるだろと。そんなのいちいち計ってられるかよと。目に物を見ろよ、見たら気づけよ、と。きっとそういう事だったんだと思います。
テキトーな事やってても点くものです。直したピンは三か所。
しかし…これ実は I/O ピン(Digital 8, 9, 10, 11, 13)にしかつながっていません。なんでかこれだけで動いてしまうし、GND につなぐとなぜか画面がほぼ真っ白になってしまいます(解明済み・追記しました)。信号線でドライブ?ちょっとよくわからないことになっています。
Arduino は 1 ピン 40 mA までなのでおそらく大丈夫だと思いますが、この辺は引き続き調べていきます。 ここもネットの情報が混乱してます(ソースはネットな鳥頭)
- 1ピンあたり 20 mA(328P のデータシートによれば 40 mA です)。
- 40 mA 以上流すと壊れる(GPIO ピンです。電源ピンはもう少し大きいです)。
- 合計出力は 100 mA 以下
こうなっています。初心者のうちの失敗ってだいたいは大電流を流して壊す事じゃないかと思います。どんなことがあっても無抵抗で GND と Vcc はつないじゃダメです。1 kΩ の抵抗、1/4 W も 1/2 W も秋月だと 100 本で 100 円(送料別)なのでもう湯水のように使うスタイルでいく所存です。
テストとして電圧グラフを表示させてみましたが、思ったより遅くないです。が、画面の論理回転を使っている所為か、電圧がかかるほど上の方(正位置における左端、写真では上部)の描画が遅くなり、また写真右部でくっきりと半ピクセル上にずれるような感じで う~ん…、今のところほんとに「とりあえず動く」程度です。
でもですね。分からなくて調べて実は違うことが分かって、壊れるのか不安もありながら何とか大丈夫で、と、ちょっとした冒険に出かけていた気分ですね。最初は 2268 円どぶに捨てた~と思っていましたが少し調べると TFT でなく文字表示専用の LCD でもほとんど値段変わらないです。モノによってはこっちの方が安いです。というかモノによっては Arduino 本体より…(http://umezawa-sendai.shop-pro.jp/?pid=40569304)。ただの 4 桁セグメントでも千円ちょっとしたりするので、かえって得したんじゃないかと今は思っています。Arduino 用ユニバーサル基板も 600 円だかするので、そのほかあずかり知らぬ経費だの含めたうえで勉強代も込みだとするとこれは文句言うどころか、良~い買い物だったんじゃないかなと、画面はすごく小さいのですが。と今だから思うことができたりします。
あまり出来の良くない自分にしてはよく頑張れたと思っています。もちろんすべてはインターネットのおかげなんですけどね。皆様ありがとうございました。
可視化は楽しいですね~。Arduino でまだ何一つ作っていないうちからやろうと目指してしまい、こんな無計画状態で動かせたのはここ最近でトップクラスのエキサイティングな体験でした。
参考・リファレンス
ST7735 ライブラリ
https://github.com/adafruit/Adafruit-ST7735-Library
通販ページではありますが、Arduino の入出力とは、ピンの役割とは、何ができるのか、動作、仕様といった概要が一通り記述されていて便利。
https://www.switch-science.com/catalog/789/
http://www.fabxfab.com/?pid=53456245
そのほか、パネルの特定、スケッチのヘッダファイル、パネルの利用方法について参考になったページの一部です(夢中で調べていたので他にも見ていたと思います)
http://www.aitendo.com/product/11590
http://blog.livedoor.jp/hardyboy/archives/6282999.html
http://minkara.carview.co.jp/userid/1372590/blog/32257723/
<161220>
電源をつなぐと真っ白になる理由
スクショの範囲にロジック / LED ともに 3.3 V って書いてありますね。しばらくずっと使ってるけど壊れてないんじゃなくて一瞬で壊れたのかもしれないですね…
※ 壊れてないです。運がよかった。<161225>
ふと電圧が違うんだ(Arduino の信号出力は 5 V で、この TFT のディスプレイドライバは 3.3 V 駆動なんだ)という事に気づき実験してみた時の感動のショットです。信号に抵抗をかませ、電源を接続しても白くならない!成功だ!やった!!(いや…その…まだわかってないようだけど、抵抗では思ったように電圧は下がりませんよ)
同じ回路になるようにカッターでパターンを切って、チップ抵抗を載せてみたところです。どんとこい。
しかしこれはうまくいきませんでした。DON'T 来い(うるさいな)
丸写ししただけのはずが、なぜか表示が黒でも白でもなく灰色になりました。元の木阿弥よりひどいです。すごく落ち込んだのですが、ここはデバッグ精神(?)で一個ずつ潰していこうという事ではんだ汚くなって良いじゃん実験ボードだもの!!って事で、このようにして…
ごちゃごちゃやっていって、ふと点く瞬間があり、なんやかんやもう必死でしたので写真も記憶もありません。妖精さんが作ってくれたんじゃないですかね???なんか気づいたら使えるようになっていました。
てのは冗談ですが、このチップ抵抗は基板から取ったものなのでこの中の一つに、端子が剥げていて導通していなかったものがあった というしょーーーーもないオチでした。接触不良は最悪なネタだと思いまーす。
こういう紛らわしい事になるし熱で抵抗値もおかしくなったりするから、チップ抵抗を剥がして使うのはやめろ というわけです。
それからま~だダメなところがあって、もうさんざんやってしまったので仕方がないのですが「電圧を下げるために抵抗を直列にしてもだめ」なんですよ。電流と電圧はオームの法則をどうぞです。信号が 5 V トレラントなんじゃないかというのに期待してこのまま使う事になります(そっ.pdf)
LED の電流制限抵抗
(接写すると気づきますが、はんだに含まれるフラックスですごく汚い…)
LED も電流を制限するのがセオリーなのでここもパターンをカットして 10 Ω を挟みました。計算すると 330 mA というどえらい数値になりますが、まじめに計算した値だと暗すぎるのでこれで良いとおもいます(あぁ、電流値測ればよかった…) これが正しい直列抵抗の使い方ですね。
この 3.3 V をカットしたら具合が良くなった気がしますが今となっては何が画面が白くなる理由だったのかは分からずじまいです。いやしかし運が良かったですね~
<170306>
※ どえらい数値にはなりません。なるならば Arduino が壊れるかポリスイッチが切れます。これは LED のルール [ Vin-Vf ] が分からないと論ずることはできません。3.3 V の電源に 10 Ω なので、白色 LED の Vf は少なく見積もって 2.3 V とすると
(3.3-2.3) / 10= 0.1 A、つまり 100 mA という事になります。
……
ダメの裏打ちしてどうするんじゃー!!!!!!!!!!!
<170324>
このページを基板警察していたりリンクを見たり全体的に手直ししていて気づきました。GPIO ピンの出力が MAX 40 mA なんです ( 328P の Datasheet PDF )
5 V だったらまた違ったと思うんですけど(たぶん USB とかレギュレータから直接もらえば良いのでマイコンでなくそちら側の絶対定格に準ずる)、3.3 V の場合は絶対定格 200 mA(正確には少なくなるはず)までという事みたいなので、100 mA だとすれば 50 % 程度、おそらく許容範囲でしょう。
Arduino の 3.3 V は誰が作ってるんでしょう。328P?分かったら追記したいです。
決着!
これで電源ピン( 3.3 V、GND )へ接続しても画面が白ちゃける事もなく、よ~~~やく、ちゃんと使えるようになりました。本当は明るくきれいな液晶でした。
今回分かった事によってどのような差がでるのかは、デジタルカメラでは光ものを写しにくいのでパッと見では分からないかもしれませんが、こう、なんかキレイでしょ!僕にしか分からない苦難(?)がこいつには詰まっているんですよ!!
これのあとに ESP-WROOM-02 を組み立てている最中にレベル変換を理解できたのでちょっと遅足ではありますが、オペアンプへの入力信号やこういった信号など、電流がさほど必要のない回路では所望の電圧は抵抗分圧で作るのがベター(楽)みたいです。電源の話で抵抗分圧は使えないと読みましたが、あくまでも電源においては、です。
抵抗分圧というカードを捨てる決め手は「電流が必要な場合」です。ザ☆知識の汎用性の無さ。でもまぁこれで得た知識はこれからどんどん役に立ちますね。長い戦いでした…どんときますね。
<170321>
ESP-WROOM-02 (ESP8266) でも使えます。こちら にまとめました。
<170324>
ESP-WROOM-32 (ESP32) でも動かせるようになりました。こちら にまとめました。
ベンチマーク
ESP-WROOM-02 で試したスケッチを走らせてみました。
FPS: 2510 @boxSize= 1
FPS: 2416 @boxSize= 2
FPS: 2516 @boxSize= 1FPS: 2414 @boxSize= 2
FPS: 2099 @boxSize= 4
FPS: 1380 @boxSize= 8
FPS: 586 @boxSize= 16
FPS: 178 @boxSize= 32
FPS: 47 @boxSize= 64
あれ?まぁまぁな速度出てますね… fillRect だけだからですね。TextOut がすごく遅かった記憶がありますので、ちゃんと全種類試せるスケッチ書きます…