前回、PharoのCRCクラスを使ってCRC16とCRC32を計算してみました。しかし、「マイコンなどを扱うことが多いお惚け老人」には肝心要な計算を確かめてません。CRC8ね。それも機種にスペシフィックなやつ。今回はAHT21B温湿度センサ、とPIC16F18855 MCU搭載CRC計算機向けを計算してみます。
※Pharo関係記事の投稿順Indexは こちら
※Smalltalkの法灯を継ぐモダンな処理系Pharo様を練習してます。今回の動作確認には、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。
AHT21BセンサのCRC8
AHT21Bは、I2Cバス接続の温湿度センサです。3V電源でも5V電源でも動作可能。秋月電子殿などでも入手可能なお手軽なセンサです。製品ページが以下に。
http://www.aosong.com/en/products-62.html
このセンサは測定した温度湿度をI2Cバスで返してくるのですが、一応、CRC8で検査できるようになってます。CRCの検査でエラーになったら再度測定してね、という感じか。
このAHT21Bを、みんな大好きラズベリーパイに接続し、Pythonで読み取ったときにCRCチェック入れているのが以下の別シリーズの過去回記事です。
部品屋根性(77) AHT21B、CRC8でのデータ検査を追加。ラズパイPython
AHT21BのCRC8はDallas-Maxim式の特性方程式を採用しているのですが、通常と初期値が異なります。こちらを以降勝手にCRC8/AHT21Bと呼称します。
PIC16F18855のCRC8
PICマイコンは、米国MicroChip社製の人気のマイコンシリーズです。その中で、PIC16F18855はミッドレンジクラスのお求め安くて使いやすい品種ではないかと。製品ページが以下に。
https://www.microchip.com/en-us/product/pic16f18855
小型のマイコンですが、搭載している周辺回路は充実。その中にはCRCのハードウエア計算器も搭載しております。多分、意図せぬファームウエアの改ざんを検出するなどのためかと。勿論、センサなどとの通信データの整合性をチェックするのにも使えそうです。
PIC16F18855搭載のCRC計算器をCRC8のデフォルトで設定した時の計算を取り扱っておりますのが、以下の別シリーズの過去回記事です。
PIC三昧(18) CRC、データ配列のCRC8をハードで計算、PIC16F18855
こちらの方の設定はCRC-8/DVB-S2に準拠しているみたいです。DVBということは昔デジタルビデオの伝送規格を定めたときに含まれていた伝統の方式じゃないかと思います。PIC16FのCRC計算機も各種のパラメータに対応しているみたいですが、デフォルトでこの規格なのでそれを計算してみてます。
Pharoでの実装
Pharo様のCRCクラスを継承するMyCrc8クラスというのを、過去回で作ってあったMyTrainingRoomというパッケージ内に設けてみました。
そして各スペシフィックなCRC8に対応させるためのインスタンスメソッドを以下のように設けてみました。
Pharo上での実行とその確認
まずはAHT21Bの実験。2文字、スペース(0x20)と!マーク(0x21)の計算。
計算結果は0xEAです。
例によって、以下のウエブ上のCRC計算機を使って確認してみます。
お答えはあっているようだね。
つづいてDVB-S2です。CRC8計算するのは「いつもの」’some message’ 文字列です。まずはPharo上。
これもOKみたいね。
まあ、CRCクラスに都度パラメータを与えても計算できるけれども、よく使う奴らはPharo様に覚えてもらっておくと便利だと。ホントか?