Q's ToyBox

「よQ」のおもちゃ箱

MENU

ST7789 CS無しLCDをM5Stack Atom S3で使ってみる

M5Stack Atom S3 Lite買ったった。

ST7789 240x240 TFTを使ってやろうとおもったら

AdafruitのST7789ライブラリを使ってはまったので備忘録に。

まずこのライブラリはHard SPIとSoft SPIを選べ、どちらかでTFTを制御する。

 

Hard SPIは書き込みスピードが速いが、SPIの端子が拘束され指定できない。

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

Soft SPIは自由に端子が選べるが、遅いしどうやらSPI MODE0固定ぽい。

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

それじゃAtom S3 Liteで使えないやない。

と思ったらSPIのオブジェクトを参照渡しする方法があるのに気づいた。

Adafruit_ST7789 tft = Adafruit_ST7789(spi0, TFT_CS, TFT_DC, TFT_RST);

 

で、こうやったらできた。※tft.initの引数SPI_MODE3も必須ポイントです。

#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
 
#define TFT_CS -1
#define TFT_RST 7
#define TFT_DC 8
#define TFT_MISO -1
#define TFT_MOSI 6 // Data out
#define TFT_SCLK 5 // Clock out
SPIClass* spi0 = &SPI;
Adafruit_ST7789 tft = Adafruit_ST7789(spi0, TFT_CS, TFT_DC, TFT_RST);
 
void setup(void) {
SPI.begin(TFT_SCLK, TFT_MISO, TFT_MOSI, TFT_CS);
tft.init(240, 240, SPI_MODE3);
exampleのgraphictestにある
tft.fillScreen(ST77XX_BLACK);
黒塗り潰しに掛かる時間はHard SPIは41msec/Soft SPI(画はでないけど)は1383msecで
Hard SPIの圧勝!

 

Logicoolマウスの修理

LogicoolマウスAnywhere MXの修理をしてみた。

■調子が悪いところ

ボタンを一度しか押していないのに複数回押されたことになる

例えばある文字列を選択してコピーしたいなと思って左ボタンで

文字を選択しながらマウスを移動、ここまでの文字列というところで

ボタンから手を離すと選択が解除されてしまう。

またファイル選択をするとダブルクリックしたことになって、

アプリが起動してしまう。

いわゆるチャタリングを原因とする症状。

■webを漁ると大方2つの改善方法があるらしい

■でも私のマウスは

  • マイクロスイッチが面実装品でアマゾンとかでは入手難
  • 新品のマイクロスイッチが高価(新しいマウス買えるやん)
  • マイクロスイッチは見た目分解できそうにない
  • そもそもボタンの部品がスイッチに届かなくなっている感じ

■でやってみたこと

  • スイッチとボタンの間に薄い板をいれ確実にスイッチをON させる

   厚いとボタン押してないのに押されっぱなしになるので、

   試しながら適度な厚みになるよう調整。写真青で囲った部分

   最初0.01uFを入れたら、ボタン押されっぱなしに。

   5分待ってもダメ。

   Logicoolさん最小負荷電流守ってる?大丈夫か?

   電池を持たせる為か?ボタン押されぱなしだと電流カット?

   仕方がないので0.01uFを外したら、なんと解決!

   ハンダコテの熱でクリーニングされてしまった様。

   とこのままにして再発するのもイヤなので33pFをつけた。

   オシロスコープ使って波形をみたいね。

   写真赤で囲った部分

 

これで、症状はなくなった。しばらく様子見。もやもやするなぁ。

でも快調!!

 

そうだVolumioにCS無しST7789LCDを使おう

Pirate AudioのPluginを使わせていただきました。

Pluginのインストールはこの記事では触れません。

 

表示はデーモン化されているようです。

$ systemctl list-units | grep volumio

でサービスを確認。pirateaudio.serviceとなっています。

/etc/systemd/systemのpirateaudio.serviceの中を見ると

ExecStart=/usr/bin/python3 /data/plugins/miscellanea/pirateaudio/display.py

このdisplay.pyを修正しましょう。

 

まず、インスタンス生成部分の修正。

引数cs=1はcs=0へ変更します

引数rst=26,を行追加にします

 このCS無しLCDはReset端子を制御する必要がある様です。

 gpio26に割り当てました。pin37です。

 

インスタンスメンバに対し

disp._spi.mode=3を行追加して、SPIのモードをMODE3へ

 本当はライブラリのコンストラクタへ入れておきたいですが。

disp.reset()を行追加して、リセット。

disp._init()を行追加して、初期化。

 

# Create ST7789 LCD display class.
disp = ST7789.ST7789(
    height=240, #v0.0.6
    width=240, #v0.0.6
    rotation=90,  # Needed to display the right way up on Pirate Audio
    port=0,       # SPI port
    cs=0, 
    dc=9,         # BCM pin used for data/command
    rst=26,
    backlight=13,
    spi_speed_hz=80 * 1000 * 1000,
    offset_left=0, #v0.0.6
    offset_top=0 #v0.0.6
)
disp._spi.mode=3
disp.reset()
disp._init()

 

以上

VESAマウントを便利につかう

ディスプレイを背面から固定されるVESAマウントという規格があります。

それを使ってラズパイとか便利に使いたい。

ダイソーにデザインボードというのがありました。

これを選んだのは、穴が25mmピッチであらかじめあいていること!

穴あけしなくてもVESAマウント規格に合うのです。

f:id:yoque8107:20211115000858p:plain

4mm径のネジ、ナットも購入

f:id:yoque8107:20211115001322p:plain

いざ取り付け。あらかじめアルミの箱も25mmピッチで加工済み。

f:id:yoque8107:20211115001741p:plain

f:id:yoque8107:20211115002513p:plain

モバイルディスプレイをラズパイの手前に置きました。

f:id:yoque8107:20211115002707p:plain

参考になれば。

以上

ST7789 CS無し LCDにコンソールを

ST7789 LCD 240x240 1.3インチのちっちゃいところにRaspberry Piのコンソールを表示したい。

同じことを考えている人はいる様ですが、CS(ChipSelect)がない!カーネルバージョンがBusterから5.xに上がってしまった!との声が。

でもやりたいね。

いろいろ読み進めると、以下の2点がキーであることがわかりました。

・Pimoroni Pirate Audio Headphone Amp for Raspberry Pi

・ST7789のCS無しはSPI MODE3で動かす

 

経緯から

Webで見つけたあっきぃさんのページ

akkiesoft.hatenablog.jp

でも、僕のLCDモジュールにはCSがないのです。

あっきぃさんの通りにやってもダメでした。

forums.pimoroni.com

Pimoroniの"DeviceTreeを使う"これは基本的に正解(でした)。

ここからCS無しを対応しましょう。

1. Install “buster-lite” and run “sudo apt update” but DO NOT run “sudo apt upgrade”

2. run “sudo raspi-config” and enable “SSH”, “SPI”, and “I2C” within “Interfacing Options” then reboot.

3. login as the pi user.

4. run “wget
https://gist.githubusercontent.com/hgroll/2731ae6d05350df663b123615f765bf5/raw/f8fe3829136296c20ba670dcd572e8a5c60da995/pidi-overlay.dts

5. run “dtc -@ -I dts -O dtb -o pidi.dtbo pidi-overlay.dts”

6. run “sudo cp pidi.dtbo /boot/overlays/”

7. edit “/boot/config.txt” and add the line “dtoverlay=pidi”

8. edit “/boot/cmdline.txt” and append " fbcon=map:10 fbcon=font:VGA8x16" (with the beginning space) to the 1st line after the word “rootwait”

9. run “sudo dpkg-reconfigure console-setup” then select “UTF8”, “Guess optimal…”, “Let the system select…”, “8x16”, “Ok”

10. run “sudo reboot”

違うのは4.でgetしたdtsファイルの編集です。

修正前
reg = <0>;
pinctrl-names = "default";

led-gpios = <&gpio 13 1>;

このregとpinctrl-namesの間に「MODE3で動いてね」を挿入し、

Backlight LEDの値も1から0へ変更します。

編集後
reg = <0>;
spi-cpol = <1>;
spi-cpha = <1>;
pinctrl-names = "default";

led-gpios = <&gpio 13 0>;

この2行だけ付け加えて5.から先を進めましょう。

raspi-configでSPIを有効にするのを忘れずに。

f:id:yoque8107:20211112010625p:plain

配線 Raspberry Pi                                               LCDモジュール
1pin(3.3V)    ----------------------------- VCC
9pin(GND)   ----------------------------- GND
17pin(3.3V)  ----------------------------- RES
19pin(MOSI) ----------------------------- SDA
21pin(DC)     ----------------------------- DC
23pin(SCLK) ----------------------------- SCL
26pin(CS)     ----------(open)
33pin(BackLight) ------------------------ BLK

以上

お試しブレッドボードワイヤ作成

半田付けする前にお試ししたくて、ワイヤーを作りました。

材料はSunhayatoのスルーホール用テストワイヤTTW-200と

QIコネクタとその圧着端子です。

TTW-200は5色2本づつなので1色づつ半分に切断し

片側にQIコネクタの圧着端子を圧着し設けます。

f:id:yoque8107:20210412003223p:plain

とりあえず、目的のArduino Pro Mini(互換)ボードのお試し。

f:id:yoque8107:20210412003449p:plain

半田付けする前にお試し&ソフト書き込み出来るので便利!