M5Stack CM4Stack 開発キットを試してみた

![IMG_0428.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/7ea812af-566e-027f-a682-20c11b162389.jpeg)

# はじめに
先日スイッチサイエンス社で販売が始まった M5Stack CM4Stack 開発キットを入手しました。
https://www.switch-science.com/products/8863

CM4StackはRaspberry Pi CM4（CM4104032）を搭載した、M5Stack が提供する開発キットです。CM4は Raspberry Pi 4 Model B の産業・組み込み用途向けモデルで試してみたかったのですが、そのままでは利用できないなど、使いにくいモジュールで提供されていました。

**Rapberry Pi 財団の CM4 の写真**
![IMG_0428.jpg](https://images.prismic.io/rpf-products/bfe15853-d10f-4ed9-b9f0-32540bd76e55_CM4%20Featured%20Image.jpg)

CM4Stack 開発キットはこのCM4を M5Stack らしいコンパクトな筐体に、電源やLAN、USB、LCDなどをまとめて使いやすそうな開発キットにしています。今回こちらを購入して試しましたので、備忘録を兼ねてこちらに記録しました。

# OSを設定するまで
CM4のストレージ (eMMC)に最初からOSがインストールされていますので、起動するとセットアップが開始します。
但し、トップの写真のように筐体のLCDにはセットアップ画面が表示されません。HDMIモニタとUSBマウス・キーボードを準備してから起動すると、HDMIモニタに以下が表示されてセットアップが可能になります。

![IMG_0429.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/5d4ef507-ae50-3a4e-46b0-4ac4a19cf436.jpeg)

私のUSBキーボードはCM4のUSBに差し込んでも認識されず、USB HUB経由で利用すると使えるようになりました。USB機器には相性問題がありそうですので、注意が必要です。

セットアップに失敗して元に戻したい場合は、以下を参考にOSを焼き込み直すことも可能なようです。
https://docs.m5stack.com/en/quick_start/cm4stack/arduino

セットアップは Raspberry pi 使いには馴染みの Raspbian 画面で、いつもの手順で進めることができます。
念のため OS を確認すると以下のとおりでした。

```shell
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
```
いつものように sudo raspi-config で好みの環境に ssh 有効化などの設定を行えました。

# リモートディスクトップの設定（要注意）
セットアップ後には X Window が表示されますが、普段はHDMIでモニタにつなぐのは面倒で、リモートディスクトップを sudo apt-get install xrdp でインストールしました。

インストール後はリモートデスクトップ接続のログインまでは問題ないのですが、その後画面がまっ青のまま応答がありません。仕方なく同じ現象がないか検索すると、以下の情報を見つけました。

**Raspberry Piへリモートデスクトップ(xrdp)しようとしたら画面がまっ青のまま応答がない**
https://pokug.net/entry/2022/04/12/235916

こちらの説明通り、セットアップで作成した初期ユーザーをvideoグループとrenderグループから外して、sudo raspi-config で Desktop 起動に設定すると、無事リモートデスクトップ接続で表示できました。

ですが、色々試すために設定を変更しているうちに、画面がまっ青のまま応答がない状態に戻り、上記手順で復旧できなくなりました。LCDとHDMIモニタの切替えと関連したトラブルかな？と思いますが、発売当初はこういうトラブルは多いですよね。

# 固定IPの設定
普段のssh作業は固定IPが楽なので、有線LANとwifiを固定IPで使えるように /etc/dhcpcd.conf に以下の設定を追加しました。

```shell
interface eth0
static ip_address=192.168.XXX.XX1/24
static routers=192.168.XXX.XX2
static domain_name_servers=192.168.XXX.XX2 8.8.8.8 8.8.4.4

interface wlan0
static ip_address=192.168.XXX.XX3/24
static routers=192.168.XXX.XX2
static domain_name_servers=192.168.XXX.XX2 8.8.8.8 8.8.4.4
```

有線LAN、wifi それぞれの固定IPの設定は問題なく利用できました。
以下はwifi利用時の状態です。

```shell
$ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether e4:5f:01:xx:xx:xx  txqueuelen 1000  (イーサネット)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (ローカルループバック)
        RX packets 54  bytes 6761 (6.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 54  bytes 6761 (6.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.XXX.XX3  netmask 255.255.255.0  broadcast 192.168.XXX.255
        inet6 240f:aa:3947:1:dd83:6169:faf:c6a7  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::a8cc:4d7e:a305:d294  prefixlen 64  scopeid 0x20<link>
        ether e4:5f:01:xx:xx:xx  txqueuelen 1000  (イーサネット)
        RX packets 2344  bytes 589998 (576.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1078  bytes 231198 (225.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

有線LAN、wifiのネットワーク回りの設定は問題なさそうです。

# SORACOM air の設定
ちょうど SORACOM air のSIMを積んだUSBドングル HUAWEI MS2372 が手元にあったので、こちらから SORACOM に接続できるか試してみました。

先ず、USBドングル HUAWEI MS2372 を差し込んで認識するか確認しましたが、全く問題ありませんでした。

```shell
$ lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ ls -la /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0  4月 11 22:50 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1  4月 11 22:50 /dev/ttyUSB1
crw-rw---- 1 root dialout 188, 2  4月 11 22:51 /dev/ttyUSB2
```

SORACOM さんの以下を参考に setup_air.sh をダウンロード、セットアップを実行すると特に問題なく完了。
https://users.soracom.io/ja-jp/guides/usb-dongles/ms2372h-607/raspberrypi/

完了後リブートすると、ppp0 の接続と pong.soracom.io への ping の応答が確認できました。

```shell
$ ifconfig ppp0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1464
        inet 10.199.95.234  netmask 255.255.255.255  destination 10.64.64.64
        ppp  txqueuelen 3  (Point-to-Pointプロトコル)
        RX packets 58  bytes 5948 (5.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 71  bytes 4821 (4.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ netstat -nr
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ   MSS Window  irtt インタフェース
0.0.0.0         0.0.0.0         0.0.0.0         U         0 0          0 ppp0
0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 wlan0
10.64.64.64     0.0.0.0         255.255.255.255 UH        0 0          0 ppp0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 wwan0
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 wlan0

$ ping pong.soracom.io
PING pong.soracom.io (100.127.100.127) 56(84) bytes of data.
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=1 ttl=64 time=58.6 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=2 ttl=64 time=56.7 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=3 ttl=64 time=55.7 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=4 ttl=64 time=54.7 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=5 ttl=64 time=53.7 ms
^C64 bytes from 100.127.100.127: icmp_seq=6 ttl=64 time=52.7 ms

--- pong.soracom.io ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5006ms
rtt min/avg/max/mdev = 52.693/55.344/58.591/1.947 ms
```

# LCDに何か表示してみる
CM4Stackには折角 320 x 240 の2インチLCDが搭載されいるので、こちらの表示を試してみました。

## X Window の表示（失敗）
先ず最初に X Window を表示したくて、raspi-config などで関連しそうな設定の組み合わせを試してみました。が、あえなくギブアップ。こちらは M5Stack からの情報更新を待ってから挑戦することに。結果、当初やりたかった python-tk のLCD画面表示は、一旦あきらめました。

## QtDemo の表示
つづいて、M5Stack の github にあった 以下の Qtライブラリィを使ったサンプル表示を試してみました。

**CM4Stack_QtDemo**
https://github.com/m5stack/m5stack-linux-dtoverlays/tree/main/examples/QT/SimpleClock

手順通り進めるのですが、ビルド中に以下のエラーが発生。

```
CMake Error at /usr/lib/x86_64-linux-gnu/cmake/Qt5/Qt5Config.cmake:26 (find_package):
  Could not find a package configuration file provided by "Qt5Quick" with any
  of the following names:

    Qt5QuickConfig.cmake
    qt5quick-config.cmake
```

以下の情報を参考に sudo apt-get install qtdeclarative5-dev を行った後に、再度ビルドを実行。

**Colcon build gives Qt5quick error**
https://answers.ros.org/question/392702/colcon-build-gives-qt5quick-error/

以下を実行すると無事表示できる筈、、、おやおや、またトラブルに遭遇。

```shell
$ export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb$(cat /proc/fb | grep fb_st7789v | awk '{print $1}')
$ /home/pi/CM4Stack_QtDemo/build/cm4QtDemo &
$ Failed to open framebuffer /dev/fb0 (Permission denied)
linuxfb: Failed to initialize screen
Cannot create window: no screens available

[1]+  中止                  /home/pi/CM4Stack_QtDemo/build/cm4QtDemo
```

先のリモートディスクトップ表示のため、セットアップで作成した初期ユーザーをvideoグループとrenderグループから外したのが怪しそうに思えたので、再度グループに追加して再起動することで以下のように表示できました。（でも、この後からリモートディスクトップが真っ青な画面に逆戻りして復旧すらしなくなりましたが。）

![IMG_0435.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/289f1fc4-1af8-db3b-5d87-527c85837dd6.jpeg)

この後起動したままで問題が発生しないか試験をしますが、LCDに何も表示がないのは味気ないので、cron の @reboot でcm4QtDemo を自動起動するように、以下の start.sh を設定。

```start.sh
#!/bin/sh
sleep 30
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb$(cat /proc/fb | grep fb_st7789v | awk '{print $1}')
/home/kataoka/CM4Stack_QtDemo/build/cm4QtDemo &
```

sleep 30 は cm4QtDemo をそのまま自動起動すると失敗するので、試しに追加してみて自動起動に無事成功。30秒の設定はもう少し短時間で良いかもしれません。cron 起動時に、何等かの影響するサービスがまだ起動していないのが原因ではと推測しています。

# その他
M5Stack CM4Stack 開発キットの情報はまだまだ少なくて、その他は以下を参考にファンの設定も行いました。

CM4Stack headless setup
https://zenn.dev/tunefs/articles/6f958d5312b8ad

小さい筐体ですが、以外とファンの音は気になるんですよね。

# まとめ

以上を試したうえで、起動したまま放置してトラブルが発生しないか確認している段階です。
2023/04/13 現在では、ネットワーク関連は問題なさそうですが、LCDなどまだ不明な事が多いです。
あとはセンサ計測を試してみるぐらいはできるかもしれませんが、とにかく M5Stack さんのサイトに情報がアップされるのを待っています。

こういうお試しが好きな方以外は、まだ使い始めるのは早いかもしれないですね。