Cmod A7ボード(FPGA)を使って、オリジナル16ビットCPUコアMoscoviumの開発を進めています。
前回までに、Cmod A7ボードとBlockly for Moscoviumを使って、SPI-TFTやI2C通信モジュールへのアクセスができるよう、開発環境を整えました。
今回は、気圧センサBMP180モジュールを応用して、気象情報表示器を作って見たいと思います。
BMP180モジュールを制御して、気温と気圧値を測定する方法については以下記事に解説があります。
「#31-1 気圧の測定」
「#32-8 気圧と標高(理論)」
「#32-9 気圧と標高(実践)」
SPI-TFTをCmod A7ボードで使用する方法については以下記事を公開済みです。
「#32-10 SPI-TFTをPMODに繋ぐ(変換基板)」
「#33-1 SPI-TFTをPMODに繋ぐ(論理設計)」
「#33-2 SPI-TFTをBlocklyで使う」
このように、基本的な所は他のマイコンボードなどを使って実施済みですので、今回は淡々とMoscovium用に適用して行くだけです。
BMP180モジュールから取得可能な気象情報は、気温と気圧の2項目です。これを簡素に、128×160[ドット]表示のSPI-TFTへ、ドン!と、大きな文字で表示しようと思います。
1行目: 2行目: 3行目: 4行目: |
気温[℃] +24.6 気圧[hPa] 1013.25 |
5文字 5文字 7文字 7文字 |
「大きな文字」と言っても、Moscovium用に準備のある日本語フォントFONTJPユニットは、8×8[ドット]の小さなフォントです。128×160[ドット]のSPI-TFTに描画した場合、上の情報量ではスカスカになってしまいます。
大きなフォントデータを作成して対処するのは面倒なので、8×8[ドット]フォントを拡大して描画する方法で対処しようと思います。
各行の文字数がSPI-TFTの横幅(128ドット)いっぱいに表示されるよう、拡大率を設定可能とします。縦方向も、高さ(160ドット)に合わせて拡大描画します。
また、気温と気圧の値に従って、以下の様な色を使って表現しようと思います。
気温: | 18℃(青) | ⇔ | 25℃(白) | ⇔ | 32℃(赤) | |
気圧: | 993hPa(赤) | ⇔ | 1,013hPa(白) | ⇔ | 1,033hPa(青) |
天気予報などで使われている色を参考に決めました。
なお、お住まいの地域の標高次第では、気象庁発表の気圧(海抜0m換算値)よりも低めな気圧が観測されます。上の表では1気圧1,013.25hPaを基準(中央値)としていますが、必要に応じて色指定の範囲を加減してお使いください。
地域の標高が既知の場合、こちらの計算式を使って、BMP180で測定した気圧値を海抜0mに換算した上で表示しても良いと思います(必要に応じて各自対応)。
FONTJPユニットの持つ8×8[ドット]フォントを任意のドットサイズで拡大描画する関数をBlocklyで作成して使おうと思います。以下に目標仕様をまとめます。
目標仕様:
BMP180から気温と気圧を求めるためには、BMP180データシートに記載された方法で数値計算が必要な事は解説済みです。
データシートの計算式は、32ビット符号付整数と、一部32ビット符号無整数演算が混在しています。よって、今回のアプリケーションは、Moscoviumシリーズの中からオリジナル32ビットCPUコアNihonium専用とします。
さらに、Blockly for Moscoviumの整数演算は符号付であるため、32ビット符号無整数演算が必要だった計算式だけは、インラインアセンブラを使ってコーディングしました(下図は該当部分の抜粋)。
詳細は、次節にリンクする完成プログラムでご確認ください。
完成したプログラムを以下にリンクします。
完成プログラム:blky_weath_info.xml
※ブラウザによっては、XMLファイルをレンダリングして表示してしまうので、「右クリック ⇒ リンク先を保存」などしてください。
Blockly for MoscoviumのXMLタブに貼り付けて、ご利用ください。アセンブルに必要なINCLファイルは、こちらからダウンロード可能です。
比較的大きなプログラムのため、Blockly.XML→Moscovium.ASM変換と、その後のアセンブルには結構時間がかかります。気長😴にお待ちくださいm(1__)m。
以下に、シリアルモニタから受け付けるコマンド仕様を解説します。
シリアルモニタコマンド仕様:
Cmod A7ボードにSPI-TFTを接続しておくと、シリアルモニタ無しで自立します。逆に、SPI-TFTを接続しない場合、シリアルモニタからBMP180モジュールの測定値を読み出すことができます。
今回の応用では、Nihoniumコア、I2C通信、SPI-TFT等、必要なユニットが複数あります(以下など)。
今回以外の応用でも、Blocklyの機能を最大限活用可能なマイコンとして、以下の機能も追加して、新しいマイコンを起こしておこうと思います。
型名をNHOC113DB9808としました。型名規則はこちらをご確認ください。
Cmod A7ボード等、XilinxのFPGAに書き込むのに必要な、Moscoviumマイコンの設計データ(Vivadoのプロジェクトファイル一式を含む)はGitHubで提供しています。以下バナーよりアクセスしてください。
デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。
NHOC113DB9808のコンパイル(論理合成・配置配線)結果を以下に示します。
コンパイル結果:
本当は、スーパスケイラ版Nihonium-SSが一番だったのだけど、デュアルコア化するにはLUT数が足りず、断念しました(※)。今回の応用ではシングルコアしか使っていないのですが、将来の応用を見据えてデュアルコア化を優先しました。
※Nihonium-SSのデュアルコアでもギリギリで、最大LUT数に収まるかもしれないのですが、ちょっとした設計変更やI/Oユニット追加で溢れるような際どい設定は避けた方が良いという判断です。
マイコンは、こちらで新規に起こしたNHOC113DB9808をコンパイルしてCmod A7ボード(FPGA)へ書き込んでください。その上で、こちらのプログラムをNihoniumマイコンの命令ROMへ書き込んでください。
Cmod A7ボード(FPGA)、BMP180モジュール、SPI-TFT(+アダプタボード)を以下接続表に従って接続したら、実験準備完了です。
BMP180 モジュール |
接続 | Cmod A7ボード | 接続 |
SPI-TFT アダプタボード |
VIN | ← | VU (5V) | ||
GND | ⇔ | GND | ||
SCL | ⇔ | stws_scl | ||
SDA | ⇔ | stws_sda | ||
PMODコネクタ | ⇔ | PMODピンヘッダ |
以下図は実験中の様子です。
実験を進めて行きましょう。
実験サンプル:【 】内はシリアルモニタからの送信データ
【meas】
OK: meas temp=229*0.1 [degC], pres=101015 [Pa]
BMP180モジュールから読み出した気温と気圧が表示されました(22.9℃と1,010.15hPa)。それぞれ常識的に考えて、それらしい値になっていることが確認できたらOKとします。気象庁発表の数値等とも比較してみてください。お住まいの地域の標高次第では、気象庁発表の気圧(海抜0m換算値)よりも低めな気圧が観測される事にも留意して、整合性を確認してみてください。
シリアルモニタから確認できるのは、こんな所です。
SPI-TFTには、拡大描画されたフォントで、リアルタイムに測定データが表示されているはずです。そちらも確認して見てください(下図)。
「ドット」を強調した拡大描画が、良い味を出していると思われませんかo(1^−^)o?
「気温」「気圧」等のタイトル行と、数値表示行とでは、縦方向のドットサイズが少し異なっています。数値の方が重要な情報なので、少し大きめに設定しています。
また、「気温」と「気圧」を見比べると、1行に表示すべき文字数が異なるため、文字数が少ない「気温」の方が、横方向のドット数が大きく設定されています。縦/横方向のドット数を任意に指定可能とした拡大描画関数の仕様が活かされています(自画自賛)。
今回のテーマは、「BMP180を使った気象情報がどうの」と言う事よりも、「Blocklyなら、比較的簡単に拡大描画関数だって作り込めるんだよ〜」と言うところを見ていただくことが第一義でした。