DE0-Nanoで、Niosから加速度センサーADXL345にアクセスする

FPGA

FPGAボードのDE0-Nanoには、アナログデバイス社製の3軸加速度センサーADXL345が実装されています。

今回はNiosから加速度センサーADXL345のデータを読み取り、コンソールウインドウに表示させてみたいと思います。

スポンサーリンク

DE0-Nanoボード上の、FPGAとADXL345のインターフェース

まず、ADXL345のインターフェースですが、ホストとの通信はSPI(3線式または4線式)およびI2Cになります。

一方、DE0-Nanoボードですが、FPGAと加速度センサーは下図のようになっています。(以下は、DE0-NanoのUser Manualからの抜粋です。)

同じくDE0-NanoのUser Manualには以下の記載があります。

SPI (3-wire) or I2C (2-wire) digital interface

ということで、ADXL345は、3と4線式のSPIおよびI2Cに対応していますが、DE0-Nanoでは、ハードウェアが4線式のSPIに対応していません。

そのため、DE0-Nanoで、ADXL345にアクセスするためには、3線式SPIかI2Cの2択になります。

ちなみに、私は4線式SPIは知っていましたが、3線式SPIは初めて知りました。まだ3線式SPIの仕様を理解していませんが、I2Cみたいに1本の信号線でデータの入出力を行うんですかね???

加速度センサーADXL345へのアクセスはIntel(Altera)のIPを使用

FPGAからADXL345へのアクセスは、3線式SPIかI2Cになりますが、そのためのロジックは組まず、Intel(Altera)のIPを使用したいと思います。

Niosも使用したいので、今回はNiosとADXL345用のIPの組み合わせになります。

Platform Designerを使ってハードウェア設計

では、QuartusのPlatform Designerを使って必要なハードウェアを追加していきます。

まずは、以下の基本機能を追加します。

  • Nios II Processor
  • On-Chip Memory (RAM or ROM) Intel FPGA IP
  • JTAG UART Intel FPGA IP

QuartusのPlatform Designerの使い方は、以下の記事を参考にしてください。

次に、ADXL345にアクセスするためのIPを追加します。

追加するのは、下図の”Accelerometer SPI Mode”です。

追加が終わったら、下図のように結線します。(IPの名前は変更しています)

結線が終わったら、HDL(ここではVHDL)を生成します。

ここでは、以下のようにVHDLモジュールを作成しました。

library ieee;
use ieee.std_logic_1164.all;

entity nios_gsen is
	port(
	CLK50M  : in std_logic;
	IRQ          : in std_logic;
	SDAT        : inout std_logic;
	CS            : out std_logic;
	SCLK        : out std_logic
	);
end nios_gsen;

architecture rtl of nios_gsen is

  component gsensor_qsys is
    port (
      accelerometer_spi_external_interface_I2C_SDAT  : inout std_logic := 'X'; -- I2C_SDAT
      accelerometer_spi_external_interface_I2C_SCLK  : out   std_logic;  -- I2C_SCLK
      accelerometer_spi_external_interface_G_SENSOR_CS_N  : out   std_logic;  -- G_SENSOR_CS_N
      accelerometer_spi_external_interface_G_SENSOR_INT  : in    std_logic := 'X'; -- G_SENSOR_INT
      clk_clk  : in  std_logic := 'X'  -- clk
    );
  end component gsensor_qsys;

begin
		
  u0 : component gsensor_qsys
    port map (
      accelerometer_spi_external_interface_I2C_SDAT  => SDAT,  -- 
 accelerometer_spi_external_interface.I2C_SDAT
      accelerometer_spi_external_interface_I2C_SCLK  => SCLK,  --  .I2C_SCLK
      accelerometer_spi_external_interface_G_SENSOR_CS_N	=> CS,  --  .G_SENSOR_CS_N
      accelerometer_spi_external_interface_G_SENSOR_INT	=> IRQ,  --  .G_SENSOR_INT
      clk_clk  => CLK50M	--  clk.clk
		);
		
end rtl;

HDLの生成など、詳細は”第2回 Nios IIで遊ぼう Quartus Platform Designer編“の記事を参照してください。

私は設計階層のトップは回路図にするのが好きなので、生成したVHDLをシンボル化し、階層トップを以下のようにしました。

ピンの割付けを行い、コンパイルでエラーが出ないことを確認します。

それが終わったら、FPGAに書き込みを行っておきます。

Nios II Software Build Tools for Eclipseを使ってソフトウェア設計

FPGAへの書き込みが終わったら、次にソフトウェア設計を行います。

FPGAへの書き込み先がRAMの場合には、DE0-Nanoの電源を落とさないままソフトウェア設計を行います。電源を落とすと書き込みデータが消えてしまうので。

ソフトウェア設計は、”Nios II Software Build Tools for Eclipse”を使います。

QuartusメニューのTools -> Nios II Software Build Tools for Eclipseを選択します。

Eclipseが立ち上がったら、以下の記事を参考に、プロジェクト生成や初期設定を行ってください。

準備ができたらソースコードです。

今回は以下のようにしました。

#include "sys/alt_stdio.h"
#include "system.h"
#include "altera_up_avalon_accelerometer_spi.h"
#include <stdio.h>
#include <unistd.h>


int main()
{
	alt_up_accelerometer_spi_dev * acc_dev;
	alt_32 xData = 0;
	alt_32 yData = 0;
	alt_32 zData = 0;
	alt_u8 data;


	int ret;

   alt_printf("Hello ADXL345 !!\n");

   acc_dev = alt_up_accelerometer_spi_open_dev("/dev/accelerometer_spi");

   if(acc_dev == NULL){
	   alt_printf("error\n");
   }
   else{
	   alt_printf("ok\n");
   }


   ret = alt_up_accelerometer_spi_read(acc_dev, 0x00, &data);

   if(ret == 0){
	   alt_printf("ID=%x\n", data);
   }
   else{
	   alt_printf("ID Error\n");
   }



   while(1){
	   alt_up_accelerometer_spi_read_x_axis(acc_dev, &xData);
	   alt_up_accelerometer_spi_read_y_axis(acc_dev, &yData);
	   alt_up_accelerometer_spi_read_z_axis(acc_dev, &zData);
	   alt_printf("%x %x %x\n", xData, yData,zData);
	   usleep(100000);
   }
   return (0);
}

以下は、ADXL345のデバイスIDを読み込んでいます。デバイスIDは、アドレス0x00に設定されており、その値は”1110 0101(0xE5)”です。

alt_up_accelerometer_spi_read(acc_dev, 0x00, &data);

以下は、x,y,z軸のデータを読み取り、コンソールウインドウに表示させ、ウェイトしています。

alt_up_accelerometer_spi_read_x_axis(acc_dev, &xData);
alt_up_accelerometer_spi_read_y_axis(acc_dev, &yData);
alt_up_accelerometer_spi_read_z_axis(acc_dev, &zData);
alt_printf("%x %x %x\n", xData, yData,zData);
usleep(100000);

実行

それでは、実行して、ADXL345からデータを読み取ってみたいと思います。

まずは、DE0-Nanoを机の上に置いた状態で実行します。

その場合の、コンソールウインドウに表示された結果です。

アドレス0x00に設定されたデバイスIDはちゃんと読み込めていそうです。

x,y,z軸のデータはどうなんでしょう???あっているのか? 

試しにDE0-Nanoを右や左、上や下に振ってみました。

その結果がこちら。

机の上に置いていた時とはデータが変わりました。

なので、おそらくデータは読み込めているでしょう。

まとめ

とりあえず、何となく加速度センサーADXL345からデータを読み込むことができました。

しかし、まだADXL345がどういう機能を持ったICなのか理解できていません。

加速度を計測するものだと思うのですが、傾きとかも計測できるのかな???

しかも、読み込んだ数値の意味もわかりません。

それは今後の課題とします。

タイトルとURLをコピーしました