FPGAによるSPI通信

目次

はじめに

FPGAでSPI通信を使用してMEMSセンサからデータを取得するコード (VHDL) を作成しました。

今回これを作成した理由としては、高精度なジャイロセンサをつくって、最終的にはそれを使って実際に地球の自転を計測してみたいと思っているからです。単純に高精度なジャイロセンサを購入して、計測すればいい話かもしれませんが、それだと面白味がないので、高精度且つ低価格を目指します。

ジャイロセンサには複数の方式があり、一般的には高価なものから順にRLG(リングレーザージャイロ)、FOG(ファイバ光ジャイロ)、そしてMEMS(微小電気機械システム)という分類があります。RLGやFOGは精度が高く、自転を捉えることができますが、非常に高価です。一方でMEMSは低価格で小型ですが、ノイズの影響が大きく、微小な角速度を正確に測定するのが難しいという課題があります。

このノイズの問題に注目し、解決の糸口を探してきました。MEMSセンサに含まれるノイズの多くは「ホワイトノイズ」と呼ばれるもので、ランダムに発生する性質を持っています。ランダムであるがゆえに、単発のデータから真の値を推定するのは困難です。

そこで着目したのが「大数の法則」です。これは確率論の基本的な法則で、「試行回数を増やすことで、データの平均は真の平均値に近づいていく」というものです。この法則を応用すれば、ランダムなノイズが重なった複数のセンサデータを統計的に処理することで、ノイズの影響を減らし、より正確な角速度に近づけることができると考えています。

一度の測定ではノイズに埋もれてしまう小さな信号も、繰り返し測定して平均を取ることで、明確に見えてくるという考え方は非常に興味深く、数学、統計学の美しさを感じる部分でもあります。

今後はこの大数の法則を活用し、実際にノイズを取り除くことができるのかを検証していく予定です。すでにJAXAとSONYが共同で、この法則を応用したMEMS型の慣性計測装置(IMU)を開発している事例もあることから、自分のアプローチにも可能性を感じています。

安価なMEMSセンサに確率統計の力を掛け合わせることで、従来の限界を突破できるのではないか。そんな期待を抱きながら、これからも実験と工夫を重ねていきたいと思います。

今回のプロジェクトでは、複数のセンサから同時にデータを取得する必要があるため、FPGA(Field Programmable Gate Array)を活用することにしました。

FPGAによるセンサデータ取得の確認と構成について

通常のCPUでは、処理を逐次的に行う性質があります。つまり、タスクをひとつずつ順番に実行していくため、センサのデータ取得にはわずかながら時間差が生じます。この時間差が問題となるのは、センサの出力にばらつきがあった場合です。

たとえば、あるセンサが高い角速度を検出していたとしても、その値が本当にその瞬間に起こった現象なのか、それともホワイトノイズによる誤差なのかを見分けるのが困難になります。これは、センサデータの正確なタイミングが不明確になってしまうことによるものであり、特に微細な回転を検出するような場合には致命的な問題となり得ます。

その点、FPGAであれば複数のセンサに対して並列に処理を行うことができるため、各センサからのデータをほぼ同時に取得することが可能です。これによって、時間差による誤差を最小限に抑え、ホワイトノイズとの判別もしやすくなると考えています。

こうした理由から、本プロジェクトではFPGAの活用が適していると判断しました。

今回のステップでは、FPGAを用いてセンサデータを正しく取得できることを確認しました。使用したFPGAはTEI0003-03-QFCR4Aで、書き込みには「Arrow USB Programmer 2」を使用しています(※事前にダウンロードが必要です)。センサには ICM-42688-P を採用しました。構成としては、右から順に以下のようになっています:

  • FPGA
  • レベル変換IC(+3.3V → +1.8V)
  • ICM-42688-P

ICM-42688-Pは本来+3.3Vでも動作するはずですが、今回は+1.8Vでなければ動作しなかったため、レベル変換回路を挿入して対応しました。このように電源電圧の違いによる挙動の変化は、センサの安定動作を得るためにも慎重な検証が必要であると感じました。

今回の確認によって、FPGAを用いたセンサデータ取得が可能であることを実証できました。今後はこの仕組みをもとに、複数センサの並列処理や高精度計測への展開を検討していく予定です。

YouTubeで実際に動かしている様子をアップしています。

目次