[電子工作]電子工作のパーツ電子工作を行う時によく使うパーツについて、注意点をまとめてみました。
1.ILI9341採用240x320、18bit色、液晶パネルILI9341を採用した液晶パネルは、各社から様々なサイズのものが出ています。 インタフェースに、パラレルとSPIの2種類がありますが、最近のマイコンに接続する 場合、絶対にSPIをお勧めします。使用する端子が少なく、高速です。 SPIであれば、基本的には、ピンアサインだけ変更すれば、ライブラリに互換性があります。 Arduino IDEのライブラリで多数提供されていますので、お好きなものをお使い下さい。 私のお勧めは次の通り。(上記の方法で、ライブラリを検索し、ダウンロードして下さい。) ・Adafruit ILI9341 : ILI9341の初期化、制御ライブラリ。 ・Adafruit GFX Library : Adafruitのグラフィックライブラリ。LCD、OLEDなど様々なパネルで 使えます。 注意.プログラムを実行すると妙にフリッカーしていて焼き付きを起こします。明らかにVCOMが ずれているのですが、なんと、Adafruit ILI9341の初期化でVCOMをわざとずらしているようです。 わざとフリッカーさせて視野角を改善しているのだと思います。(この原理は液晶の特性による もので、ここには書きません。)しかし焼き付きは問題だし、私はフリッカーが苦手なので、 修正方法を書いておきます。 「Adafruit_ILI9341.cpp」の次の行の0x86を0x80に変更します。これで、VCOMが標準に戻ります。 ILI9341_VMCTR2 , 1, 0x86, → ILI9341_VMCTR2 , 1, 0x80, 注意.この液晶パネルを横長で見ると、左右の目で見え方が異なり、目が疲れます。これは、長手方向 の視野角が悪いのが原因です。短辺方向は視野角が良いので、極力、縦長で使いましょう。 注意.+3.3Vのレギュレータが搭載されているパネルでは、VCCに+5Vを接続する必要があります。 VCCに+3.3Vを接続すると、動作が不安定になったり、SPIを高速にすると表示できない場合があります。
2.STMPE610タッチパネル抵抗被膜式タッチパネルなので、爪やつまようじのようなものでも操作できます。 でも、静電方式より力が必要で、精度も悪い感じです。また、1点しか検出できないと思われます。 私のお勧めは次の通り。(上記の方法で、ライブラリを検索し、ダウンロードして下さい。) ・Adafruit STMPE610 : Adafruitのライブラリ。使用上の注意は、次の通り。 検出される座標がずれている場合は、次の値を変更ください。 #define TS_MINX 150 #define TS_MINY 130 #define TS_MAXX 3800 #define TS_MAXY 4000 タッチされた座標を1点だけ読み出したい場合は、touchedコマンドを使って、次のようにする 必要があります。 void loop(){ if (ts.touched()){ // タッチされたのを検出 if (ts.bufferEmpty()) { // タッチされていても座標が入っていない場合は抜ける delay(50); return; } }else{ ts.getPoint(); // タッチされていなくても、座標データが残っている場合があるので、読み捨てる delay(50); return; } p = ts.getPoint(); // タッチされた座標の読み出し p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.height()); p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.width()); }
3.ADS7843、XPT2046、HR2046等タッチパネルSTMPE610タッチパネルと同じく抵抗被膜式タッチパネルなので、爪やつまようじのようなものでも 操作できます。 ADS7843、XPE2046、HR2046共に単なるSPIインタフェースのA/Dコンバータです。でも、下記の ライブラリを使用することで、STMPE610タッチパネルと同様に使えました。(上記の方法で、 ライブラリを検索し、ダウンロードして下さい。) ・PaulStoffregen XPT2046_Touchscreen : Adafruitのライブラリと互換性のあるライブラリ
4.SDカードの読み出しAdafruit製2.8型TFTタッチシールドには、Micro SDカードスロットが付いているので、そのライブラリを 使うのが簡単でしょう。 ESP32でSDカードを使用する時は、こちらを参照ください。 ・Adafruit ImageReader Library : MicroSDカードのBMPファイルを読み出し、液晶パネルに 表示するサンプル。(但し、ファイル名は、英数字8文字まで) 注意.自作する場合、SDカードの電源及びI/Oの電圧は+3.3Vですので、NucleやESP32なら直接接続可能 ですが、Arduino UNOの場合はレベル変換が必要です。 注意.SDカードと他のデバイスでSPI端子を共有すると、途中でモードや速度を切り替える必要 があり、予期せぬエラーが発生したりして苦労しました。SDモードはもちろんですが、SPIモード でも、SDカードには専用の端子を割り振ることを推奨致します。 注意.SPIモードで使用する場合、MISOはプルアップする必要があります。(CSもプルアップする方がベター)
5.SSD1306搭載OLEDSSD1306を搭載した白色又は青色の有機EL(OLED)パネルで、I2C又はSPI接続で、色と 解像度の異なる製品が各社から発売されています。 私のお勧めは次の通り。(上記の方法で、ライブラリを検索し、ダウンロードして下さい。) ・Adafruit SSD1306 : SSD1306の初期化、制御ライブラリ。 ・Adafruit GFX Library : Adafruitのグラフィックライブラリ。 I2Cの場合、パネルによってアドレスが異なるので、0x3C又は0x3Dを書き換えて下さい。 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); : 私が買ったパネルはこちら display.begin(SSD1306_SWITCHCAPVCC, 0x3D); : Adafruit社製のシールドはこちら
6.ILI9163採用128x160、16bit色、液晶パネル1.77型、128x160のカラーLCDパネルが安価に売られていたのですが、AdafruitのGFXと互換性が あって表示できるライブラリがありませんでしたので、自作してみました。 ・ILI9163 : Adafruit GFX Libraryで使えるILI9163ライブラリです。ここからダウンロードして展開し、 上記の方法で手でライブラリに追加ください。 ・Adafruit GFX Library : Adafruitのグラフィックライブラリ。 注意.この液晶パネルも横長で見ると、左右の目で見え方が異なり、目が疲れます。これは、長手方向 の視野角が悪いのが原因です。短辺方向は視野角が良いので、極力、縦長で使いましょう。 注意.秋月電子通商でATM0177B3Aと呼ばれるLCDパネルが売られていますが、電源及びI/Oが +3.3Vですので、Nucleoとは直接接続可能ですが、Arduino UNOに接続する場合はレベル変換 が必要です。また、フルカラーで動画表示するためには40,960ByteのRAMが必要ですので、 80KB以上のメモリを搭載したNucleoやESP32を推奨します。(下記の写真は、Nucleo STM32L476RGと TrueSTUDIOで作成したゲームの場面。Arduino UNOではこのソフトは動作しません。)
7.ST7735R採用128x160、16bit色、液晶パネル基板にKMR-1.8と書かれた1.77型、128x160のカラーLCDパネルが安価に売られていました。 私が作成したILI9163のライブラリで表示は可能ですが、VCOMが不安定なようで映像によっては ノイズが表示されるし、SPIのレートは12MHzが上限でしたので、お勧めしません。 aitendoで買った更に安価なパネル(M018C7735SPI)は、ノイズは無いし、SPIのレートも40MHz でも問題ありませんでした。但し、私が作成したILI9163のライブラリでは、R/Bが逆になりますので、 setRotationの設定を書き換える必要があります。 ・ILI9136 : Adafruit GFX Libraryで使えるILI9136ライブラリです。ここからダウンロードして展開し、 上記の方法で手でライブラリに追加ください。 ・Adafruit GFX Library : Adafruitのグラフィックライブラリ。 注意.この液晶パネルも横長で見ると、左右の目で見え方が異なり、目が疲れます。これは、長手方向 の視野角が悪いのが原因です。短辺方向は視野角が良いので、極力、縦長で使いましょう。 注意.高速なマイコンを使う場合、SPIの速度をディフォルト(40MHz程度)で使用すると、正常に表示 できない製品があります。その場合、初期化する時、 ILI9163 tft = ILI9163(TFT_CS, TFT_DC, TFT_RST); tft.begin(4000000); のように、begin(SPIレート)で、SPIのレートを、4MHz〜16MHzに落として下さい。 注意.製品によっては、R/Bのフィルタや、上下、左右が逆になる場合があります。 その場合は、ILI9163::setRotation関数のmの値を変更して下さい。具体的には、次のように MADCTL_RGB又はMADCTL_BGRで色を合わせ、MADCTL_MXとMADCTL_MYとMADCTL_MV の組み合わせで向きを合わせます。 m = (MADCTL_RGB); m = (MADCTL_BGR); m = (MADCTL_MX | MADCTL_BGR); m = (MADCTL_MX | MADCTL_MY | MADCTL_BGR); m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); などを試してみて、正しく表示できる組み合わせを見つけて下さい。
Arduinoの紹介はこちら。「STM32の性能を発揮するには?」はこちら。
ESP32の詳細はこちら。 |