SOLID未分類 SOLID for Raspberry Pi 4 (連載11)

SOLID for Raspberry Pi 4 (連載11)

(2023/1/23)

Rustでアプリケーション

前回までにRust言語についていろいろと学んできたことを、ここからは実践してみたいと思います。

SOLID-OS上で動くアプリケーションを書いていきます。

1. せっかくなのでクレートを使いたい

実践するにあたっては、Rustっぽく、クレートを使ってI/Oをアクセスするような格好いいプログラムを書いてみたいところです。

以前、GPIOを操作しLチカするアプリをRustで書いたときに、I/Oアクセス用のPACを使用した記憶があります。

ここで再度、PACを見てみましょう。
https://github.com/KyotoMicrocomputer/solid-rapi4-examples/tree/main/common/bcm2711_pac

srcフォルダの中も見てみましょう。
https://github.com/KyotoMicrocomputer/solid-rapi4-examples/tree/main/common/bcm2711_pac/src

沢山ありますね!
センサの接続としては、SPIあたりが使えそうです。

という事で、せっかくなので、SPIを使って何かセンサをアクセスするようなプログラムを書いてみます。

2.アクセス対象とするセンサ

SPI I/Fを持っているセンサを何か選定したい。

しかし温湿度センサでは、リアルタイムOSであるSOLID-OSでアクセスする必要性を感じません。Linuxでやればいいじゃん、と言われそうです。

あ、そうだ。
加速度センサではどうでしょうか。

1ms間隔で、x, y, zの値を読めば、物体の動作をきめ細かく把握する事ができそうです。

3.Linux側の役目を決める

SOLID-OS側アプリで読む、大量のx, y, zの値を、どこにどうしましょうか。

ここで、思い出すのは、SOLID-OSとLinuxのCPU間通信のこと。
SOLID-OSは、ネットワークソケット機能を提供しており、それは、Linuxのネットワークドライバを使用して実現しています。

それなら、このネットワークソケット機能を使用して、センサデータを送ってみましょう!

という事で、Linuxの役目は、
「ネットワーク機能を提供すること」
に決まり!です。

SOLID-OS側で高速にセンサを読む役目をリアルタイムOSに専念してもらい、ネットワーク送信の役目をLinuxに課すことで、Dual-OSのメリットが出せそうです。

4.SOLID-OSのネットワークソケット機能

SOLID-OSには、ソケット機能が備わっています。
http://solid.kmckk.com/doc/skit/current/os/sockets/index.html#

こちらを使ったRustのサンプルがありますので、ありがたく使わせていただきましょう。
https://github.com/KyotoMicrocomputer/solid-rapi4-examples/tree/main/rust-server-tcpecho-std

TCP/IPのサーバです。
PC側がクライアントとなります。

5.構成決定

という事で、以下のようなデモを作成したいと思います。

[ハードウェア構成]

Raspberry pi 4Bの各端子について今回使用する設定と、対応する加速度センサADXL345との結線は以下となります。

Raspberry Pi端子番号 bcm2711 GPIO番号 使用する端子機能 Function select No. ADXL345端子名
19 GPIO10 SPI0_MOSI ALT0 SDI
21 GPIO9 SPI0_MISO ALT0 SDO
23 GPI11 SPI0_SCLK ALT0 SCLK
24 GPIO8 SPI0_CE0# ALT0 CS

※Function select No.とは、bcm2711に設定するための端子マルチプレクス設定番号です。

[ソフトウェア構成]

・Windows PC側

簡単なTCP/IPクライアントをC#で書く

・Raspberry pi 側

以下のようなソフトウェアブロックになる

作っている途中、何かに気が付いたら柔軟に仕様変更をしつつ、作り上げていきたいと思いますので、長くなりそうですがお付き合いいただければ嬉しいです。