IoT装置の頭脳となるMCU(Micro Controller Unit)の種類が豊富だとお話ししました。ちょっと専門的ですがどのような開発を行うのか見ていきます。ハードウェアについては以前の投稿を参考にしてください。このハードに合わせて開発する環境も言語も変わってくるので少々厄介です。装置に組み込まれて電源を入れたら動作し続けるこのMCUを制御するソフトウェアを組み込みソフトウェアといいます。MCU毎にソフトウェアも異なるのがざっくりですが紹介します。
省電力なのでバッテリ駆動するには一番のものです。
Microchip ATMEGA4809 8-bit AVR CPU core Clock 20MHz、
Program Flash 48Kbyte
EEPROM 256 byte
Data SRAM 6kbyte
I/O 41pin
開発環境はMicrochip Atmel Studio 7を利用します。これは統合化された環境でウィザード形式(問い合わせ形式)によりCPUの種類や動作速度の指定、pinの接続インターフェースなどしていると必要なライブラリが組み込まれたプロジェクトを生成します。開発は標準ではC++言語を使用して作成します。別の言語もATMELに対応したものであれば利用できます。同じ環境の中でコードを書いてコンパイルボタンを押すだけ実行用のファイルが作成されるのでPCと開発用のインターフェースで接続したMCUに対して書き込みができます。Program Flashが実行するプログラムが格納されていて、電源を入れると自動的に呼び出されて実行します。プログラムが動的に扱えるデータサイズがData SRAMの6Kbyteまででこれ以上大きなデータ、例えば画像などは扱う事ができません。他にもプログラム内の値を格納するので純粋にデータとして使えるのは1/3程度になります。充実しているように見ていますがライブラリはサンプルと提供されただけで動作保証はされていません。そのため時としてまともに動作しないこともあります。OSはありませんので作成したプログラムがシステムとなります。工数的にはWebソフトの倍ほどかかります。
初心者でも扱えるようにした8Bit MCUボード Arduino UNO R3
Microchip ATMEGA328P 8-bit AVR CPU core Clock 16MHz、
Program Flash 32Kbyte
EEPROM 1Kbyte
Data SRAM 2kbyte
I/O 14pin(ユーザ利用)
先ほどよりCPUスペクは落ちますがすでにPCと接続できる状態のボードとして供給されており、開発環境も専用のArudino IDEがあのます。CPUの能力を細かく利用する事はできませんがそのかわりに非常に扱いやすくなっています。開発はC++をベースにした専用言語になります。IoT装置に必要なUART,I2Cと言った通信規格もライブラリが用意され
小規模の開発や試作に向いた環境と言えます。
MCUユニットでありながらWiFiやBluetoothが搭載されていて、使いやすいArudinoを
実行できるESP32シリーズがあります。多くのラインナップからESP-WROOM-32を使用したESP32-DevKitC-32Dをピックアップします。
Tensilica LX6 32bitデュアルコア、240 MHz
Program Flash 4 MB
Data SRAM 520 KB
Wi-Fi:802.11 b/g/n
Bluetooth:Classic、BLE 4.2
I/O 21pin(ユーザ利用制限有り)
開発環境はArudinoと同じものが利用できます。WiFiなどの拡張機能は専用のライブラリが供給されているので簡単に通信処理を書く事ができます。Arudinoの手軽さと高速処理と通信できる点を考えると魅力的な選択になります。手が届かないところはC++で作成して連携させることも可能です。ただ言語の幅が無いのとI/Oが限られるので注意が必要です。
MCUとして最上級の物としてRaspberry piになります。これはイングランドの教育用コンピュータとして開発された経緯を持つものでIoT端末としてはフルスペックとなります。最新のRaspberry Pi 4 Model Bを例にとると
Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC 1.5GHz
Data SRAM Max8GB
Wi-Fi:802.11 ac/n/b/g/b
Bluetooth:Classic、BLE 5
USB3.0×2/USB2.0×2
RJ-45×1(1000/100/10BASE-T)
microHDMI×2
ちょっと前のPC並み能です。OSはLinux系のRaspberry Pi OSが利用できます。子供向けの開発環境Scratchが搭載されており教育用のパソコンとしても機能するようになっています。最初からLCDやカメラインターフェースが搭載されており組み込み装置を開発するには最適なものです。頑張れば冷帯電話の作成も不可能ではありません。ただ、消費電力が高いのでAC電源への接続図必要となります。それ以外であればカメラを使ったAIでの顔認識程度は軽くこなせる性能を持っています。開発言語はLinuxで動作するものであればすべて利用できますが、最近のプロジェクトではPythonを利用することが多くなっています。
MCUには通信モジュールやセンサが接続されているのでどのように情報を取得するかです。最近のセンサはインテリジェント化されており、I2C(アイ・スクエア・シー: (Inter-Integrated Circuit)インターフェースを備えています。これはセンサとシリアル通信してデータを交換するための規格になります。この企画は2本の線で複数のセンサが接続できる規格なので複数のセンサを接続しても2本の線で賄えるのでハードウェアの作成もしやすくなります。昔からあるPCとセンサの接続に使われる規格にRS232cが標準でしたが等々の機能としてUARTも多くあります。ハード的には5Vや3.3Vで動作するようにしたものです。そのため通信モジュールはこの規格が使われています。通信モジュールはPCを電話回線でサーバーに接続するために使用したモデム(modem)の時代から続くATコマンドで制御します。このATコマンドは1981年に Hayse Microcomputer Productsが発売したパソコン向けモデムSmartmodem 300の制御コマンドでコマンドの文字列がATから始まる文字列だったのでATコマンドと呼ばれるようになりました。Hayseはなくなってしまいましたが今でも通信制御用として残っています。
組み込みソフトウェアとして忘れてはならないのが無人で運用されることを前提に考えることです。当たり前ですが、PCやスマホも調子が悪くなると再起動して状態をリセットしますが、IoT装置の調子が悪いからと言ってリセットしてくれる人はいません。そのためにハードで定期的に強制リセットするか、MCUに用意されているウォッチドッグタイマ(watchdog timer)機能を利用します。アプリケーションが定期的にMCUに対して信号を送り続けることでプログラムが動作していると認識します。信号が途切れると何か異常が発生したとしてMCUはリセットをする機構です。すべての不具合は救えないのですがある程度防ぐことが可能となります。最強なのは定期的にハードリセットをすることです。
ハードと組み込みソフトの組み合わせで安定して動作させるには試験期間も必要となります。温度特性や電源電圧の変動など単なるソフトウェア作成だけでは知りえない状況が発生することもあり作って動いたから完了といかないのが組み込みソフトの大変な点でもあります。これらを対処するプログラマもなかなか忍耐が必要な作業になります。
ATMEGA4809
https://www.mouser.jp/new/microchip/microchip-atmega4809-microcontroller/
ARDUINO
https://www.arduino.cc/
ESP32
https://www.espressif.com/en/products/socs/esp32
Raspberry Pi
https://www.raspberrypi.com/
I2C規格
https://ja.wikipedia.org/wiki/I2C
Hayse Smartmodem 300
https://ascii.jp/elem/000/001/429/1429710/
最近作ったソフトです。