オンボードされた温湿度センサーからFPGAで値を得る:MAX 10 FPGAで学ぶFPGA開発入門(12)(4/7 ページ)
FPGA「MAX 10」搭載開発ボード「MAX 10 NEEK」には各周辺機器が備えられており、そこにはTI製の温湿度センサーも含まれる。サンプルプログラムを元に、オンボードされたデバイスの制御を試みる。
Eclipseでの作業
さて、ここからはEclipseを使ってソフト側である。今回は7セグメントLED 2桁と10個のLEDを使って、温度を0.1℃単位で表示する仕組みを入れてみたい。またスイッチ2つを使い、ON(温度を0.5秒毎に表示)、OFF(LEDの表示を全部消す。温度測定もしない)を切り替えられるようにしたいと思う。ということで、
- (7) 前回同様、Ecripseから“Nios II Application and BSP from Template”を選んで、アプリケーションを生成する。テンプレートはまたしても“Hello, World”、プロジェクト名はtemp_dispとした。
- (8) Terasicが提供する「MAX 10 NEEK System CD」(筆者はv1.0.7を利用している)のDemonstrations\humidity_temperature_lcd\software\humidity_temperature_lcd\terasic_libというフォルダに、
「 I2C.c 」「 I2C.h 」「 Temp_RH.c 」「 Temp_RH.h 」「 teraic_includes.h 」の5つのファイルがある。このうち「 I2C.c 」「 I2C.h 」「 teraic_includes.h 」の3つを、そのままEclipseのProject Explolerの下にあるtemp_dispプロジェクトにドラッグ&ドロップして追加する(Photo09)。
このうちI2C.cは名前の通り、NIOS IIのPIOポートを使ってI2Cの通信を行うためのものである。ちなみにこのソースはTerasiが提供するものだが、Terasicの開発ボード上で利用する限り、利用や改変は自由ということになっているので、有難く使わせて頂いた。I2C.hはI2C.cで定義された関数を利用するためのヘッダファイルで、この2つは変更なくそのまま利用している。
一方、terasic_includes.hはList 3のようになっており、わざわざインクルードしなくても必要な指定と定義だけソースにコピーしても良かったのだが、一応こちらもそのままとした。ただ、先に述べた通り今回はタイマー関数を使ってない関係で、sys/alt_alarm.h や sys/alt_timestamp.h はインクルードするとエラーになる。そこでこの2つだけはコメントアウトしている(List 4)。
- (9) hello_world.cを変更する。最終的なソースはList 5の様になった。LEDの表示周りに関しては、前回のストップウォッチのソースをかなり流用している。関数毎に簡単に説明すると
関数 | 概要 |
---|---|
LEDR_out() | numの値にあわせて該当するポジションのLEDを点灯。ちなみにnumが負の場合には全LEDを消灯する機能を追加。 |
HEX_out() | numの値にあわせて7セグメントLEDを点灯。ちなみにnumが負の場合には全LEDを消灯する機能を追加。digitは0(1の位)か1(10の位)のどちらか。 |
Read_Configuration() | Terasicの提供するTemp_RH.cから流用。I2C経由でHDC1000からConfiguration情報を取得する関数。RH_Temp_Sensor_init()内でのみ利用される。 |
Write_Configuration() | Terasicの提供するTemp_RH.cから流用。I2C経由でHDC1000にConfigurationを設定する関数。RH_Temp_Sensor_init()内でのみ利用される。 |
RH_Temp_Sensor_init() | Terasicの提供するTemp_RH.cから流用。HDC1000の初期化を行うもの。 |
main() | LEDの全消灯とHDC1000の初期化が終った後は、0.5秒毎にキーの状態を確認し、KEY_STARTが押されていたらFLAG=1、KEY_STOPが押されていたらFLAG=0をそれぞれ設定する。次いでFLAG=1の場合はHDC1000からI2C経由で温度のデータを取得し、それを変換したのち、LEDに表示する。 |
ちなみに温度変換の所で利用するロジックはHDC1000のDatasheetに記載されているものそのままである。正確には16bitの値を2^16で割ったものに165を掛けて40を引くというもので、HDC1000は−40℃で0x0000、125℃で0xFFFFを返すので、これを実温度に変換するのがこうした仕組みである。またこの変換の際に、謎のdouble型のtempという変数が利用されるが、これは teraic_includes.h の中で定義されている。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 「MAX 10 NEEK」でストップウォッチを開発し、内蔵メモリから起動する
アルテラのFPGA「MAX 10」を搭載した開発ボード「MAX 10 NEEK」にはLEDやフラッシュメモリなどの各周辺機器が備えられている。今回はLEDを使ったストップウォッチを開発し、内蔵メモリから起動する。 - 「MAX 10 NEEK」に搭載されたDDR3メモリを使う
MAX10搭載開発ボード「MAX 10 NEEK」には各周辺機器が備えられており、その中にはDDR3メモリも含まれる。ソフトコアCPU「Nios II」からの利用も含めて手順を紹介する。 - 「MAX 10 NEEK」へソフトコアCPUを組み込む
周辺機器の充実したMAX10搭載開発ボード「MAX 10 NEEK」に、ソフトコアCPU「NIOS II」を組み込み、ソフトコアCPUからボード搭載LEDの制御までを紹介する。 - 周辺機器の充実した「MAX 10 NEEK」で本格的な開発を目指す
FPGA開発において周辺機器(回路)は見落とせない要素の1つ。タッチパネルや各種出入力などを備えた「MAX 10 NEEK」を導入して、本格的な開発を目指す。 - FPGAのソフトコアCPUをベンチマークで測定する
FPGA「MAX10」に「NIOS II」と呼ばれるソフトIPコアを導入することで、ソフトコアCPUを構築できる。ではその処理能力はどれほどか。ベンチマークソフトで測定してみよう。