連載
» 2016年07月26日 07時00分 公開

オンボードされた温湿度センサーからFPGAで値を得るMAX 10 FPGAで学ぶFPGA開発入門(12)(4/7 ページ)

[大原 雄介,MONOist]

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)。

photo09 Photo09:これはドラッグ&ドロップ後。ドロップ時に“CopyするかLinkするか”を聞かれるので、“Copyする”を選ぶ

 このうち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 の中で定義されている。

関連キーワード

アルテラ | FPGA関連 | FPGA


Copyright © ITmedia, Inc. All Rights Reserved.