3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ARDUINO で気圧と温度をSPIバスで読む

Last updated at Posted at 2018-10-22

ArduinoMicro でSPIバスを使う

はじめに

  • 今回は
  • Arduinoを使っていろいろなセンサの値を読んで使いたいので練習。
  • 昔購入した STmicroelectronics 社のLPS331AP (pressure/temperature sensor)があったので、これを使う
  • 必要なプロセスをできるだけ理解しながら行いたい
  • SPI (serial Peripheral Interface)を利用する(初利用!!)

(多分)一般的な作業工程

  • センサーの仕様書をもってきて、何をどれくらい読めるかを確認する
  • ピン配置を整理して、接続を考える
  • センサーの設定、データの読み込みを実装する
  • データの読み方をbrush up する。(今回はできていない)

ピン配置

仕様書を入手

  • 使用しているのは、LPS331APです。秋月電子のページ(ここ )に何とメーカーのDataSheet と Design Tip "How to interpret the LPS331AP pressure and temperature readings"があり、これをじっくり読むことが大切。と言いながら、自分は読みませんでした。^^;)
  • 入手: 私はマルチパーツ館の大気圧センサ・モジュール MLPS331-MOD なるもので、某雑誌の別売り部品セットに含まれていたもので、古いもののようですが、まだ買えるようです。(ここなどで)
  • 24bit の圧力値と16bit の温度をレジスタに持ち、値をI2CやSPIで読むことができます。

SPI (Serial Peripheral Interface) について

  • SPIについてのざっくりとした流れの理解

  • Master と Slave がいる。Master はクロックは流す。CLK

  • Master がCS(chip select)ピンをLOWにすると読みか書き込みの信号を送受信し、終わったらHIGHに戻す。CSでなくSS(slave select)とも呼ぶらしい。

  • Masterからslave のレジスタにデータを書くには、CSをLOWにしたのち、書き込み用の通信線でデータ通信してレジスタ値と値を送る。

  • MasterがSlaveのレジスタ値を読むには、CSをLOWにしたのち、読むための通信線(MISO)を利用して最初に1byte 書き込み、それから、目的のslaveのレジスタ値を読む。

  • 最低限の通信は CLK(clock), CS(chip select)、MISO(master in slave out)、MOSI(master out slave in)の4線になる。

 - WikiPediaより:image.png
 - 今回はまずこの4つの線をつないで読み書きの動作確認を行った。

ArduinoMicroについて

  • はまったその1: で使えるSPIはICSPのピンであった。ここでCLK, MISO, MOSIが用意されている。
  • はまったその2:CSに使えるGPIOピンが、プログラム上で指定するピンの番号とどのような関係にあるかわからなかった。結局D2のピンの番号が2, D11は11で良いと分かった。
  • その他3.3Vに注意。
    以上から、いかのようなにピンを接続させた。
    image.png

実装については、先ほどのSPI通信をそのまま。センサーのレジスタ値にデータを書くには、

void spi_write(byte reg, byte val)
{
  digitalWrite(CS_PIN, LOW);
  SPI.transfer(reg);
  SPI.transfer(val);
  digitalWrite(CS_PIN, HIGH);
}

データを読むには

byte spi_read(byte reg)
{
  byte ret = 0;

  digitalWrite(CS_PIN, LOW);
  SPI.transfer(reg | REG_RW);
  ret = SPI.transfer(0);
  digitalWrite(CS_PIN, HIGH);
  return ret;
}

とすればよい。初期化はSPIの設定でbaudrate を指定する。ここでは1MHzにしている。
また、CSに使用するピンを出力設定にする。Arduinoのsetup()の中では、この後で必要な設定をレジスタ値に書き込む。

  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4); // 8MHz/8 = 1MHz; (max 10MHz)
  pinMode(CS_PIN, OUTPUT);// Chip select pin

とりあえず、今回はこれで動いた。
スケッチをアップロードしてリンクを貼ろうとした方法が分からん。
整理したら、githubにuploadするとかしてみたいな。

参考にしたページ

いろいろ参考にさせていただきました。

多謝

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?