質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • C

    4517questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    672questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Arduinoで複数センサの値をSPI通信で受信したい。(大気圧・温度センサ)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 8,965

kt.tk.co

score 19

Arduinoで複数センサの値をSPI通信で受信したい。大気圧・温度センサ(LPS331AP)

●目的・理想
SPI通信で8つの大気圧・温度センサ(LPS331AP)から値を取得したいです。

●現状
センサが2つまでであれば正常な値を取得できますが、3つ以上になるとセンサの値がおかしいです。

気圧:1668[mbar]/[hPa]  , 温度:110[`C] など

●疑った部分
おそらくセンサの個数が問題ではなく、Arduinoのデジタルピンの制御の問題なのではないかと考えています。
SPI通信を行うためにセンサのCS(SS)ポートの配線先が、ArduinoのD10,D9であれば問題なく、D8,D7,D6であれば問題有るようです。
→再度試した所、ピンソケットの番号ではなく、2つ以上設置すると発生する模様!?(下記に記載)

●試行錯誤
  • センサや配線 : センサや配線,配線の取り回しなどを変更しても、決まってD8,D7,D6の値がおかしいです。
  • プルアップ抵抗 : 抵抗を付けてみましたが、改善なし。(正しく付けられていない可能性が高いです)
ソースコードのCS(SS)ポートの設定 : 初期設定が必要かもしれませんが、調べてみてもよくわからず。
SPIのクロックやモードなどの設定 : 調べてみてもよくわからず。適当に値を変更してみましたが変化なし。

(下2つの可能性が有力でしょうか?)


●現状
1週間近く試してみましたが、改善策が思い浮かばなくなりお手上げ状態です。
お力添え頂けますと幸いです。


■シリアルポートの出力値  (写真撮影後に、センサを5つに変更して試した結果)
Port = D10  1006[mbar]/[hPa] ,27[`C]
Port = D9  1002[mbar]/[hPa] ,26[`C]
Port = D8  1668[mbar]/[hPa] ,110[`C]
Port = D7  1278[mbar]/[hPa] ,110[`C]
Port = D6  423[mbar]/[hPa] ,37[`C]
…(以下、同様の値でループ)



■配線 (動作テストのため今はセンサが5つだけ)
(fritzingで配線図を書こうとしましたが、LPS331APのセンサが見つからず断念)

[ケーブル色:役割 = ピンソケット番号]
黄色:SCK = D13
白色:MISO = D12
灰色:MOSI = D11
オレンジ色:CS = D9~D6


イメージ説明
イメージ説明
イメージ説明




■コード
#include <SPI.h>

//センサの個数を指定
int HowMenySensor = 5;
//センサのCS(SS)はArduinoのD10ピンから配置すること。(D10→D9→D8→D7→D6→D5→D4→D3)

//デバイスのレジスタアドレス(センサで取得できる値の格納場所など)
const byte LPS331AP_WHOAMI = 0x0f;// デバイスの識別ID格納レジスタアドレス
const byte LPS331AP_CTRL_PRESS = 0x10;       // 圧力分解能のモード設定アドレス
const byte LPS331AP_CTRL1 = 0x20;// 制御レジスタ1の設定レジスタアドレス
const byte LPS331AP_CTRL2 = 0x21;// 制御レジスタ2の設定レジスタアドレス
const byte LPS331AP_CTRL3 = 0x22;// 制御レジスタ3の設定レジスタアドレス
const byte LPS331AP_CTRL_STATUS = 0x27;       // ステータス・レジスタアドレス
const byte LPS331AP_P_LL = 0x28;// 読み出すデータの先頭レジスタアドレス
const byte LPS331AP_P_L  = 0x29;
const byte LPS331AP_CTRL_AMP = 0x30;       // アナログ・フロント・エンド制御レジスタアドレス
const byte LPS331AP_P_H  = 0x2A;
const byte LPS331AP_T_L  = 0x2B;
const byte LPS331AP_T_H  = 0x2C;

const byte LPS331AP_RW = 0x80;
const byte LPS331AP_MS = 0x40; //使っていない!?


////////////////////////////////
//センサへデータを書き込む関数//(センサ設定の変更用)
////////////////////////////////

void LPS331AP_write(int CS, byte reg, byte val)
{
  digitalWrite(CS, LOW);      //LOWにすることで通信開始
  SPI.transfer(reg);
  SPI.transfer(val);
  digitalWrite(CS, HIGH);    //HIGHにすることで通信終了
}


//////////////////////////////
//センサから値を受信する関数// (CSで受信先のセンサを区別。regで取得するデータ(温度or気圧)を指定)
//////////////////////////////

byte LPS331AP_read(int CS, byte reg)
{
  byte ret = 0;

  digitalWrite(CS, LOW);               //LOWにすることで通信開始
  SPI.transfer(reg | LPS331AP_RW);    //読み込むデータを指示
  ret = SPI.transfer(0);              //データを取得
  digitalWrite(CS, HIGH);             //HIGHにすることで通信終了

  return ret;
}



////////////
//初期設定//
////////////

void setup()
{
  // シリアルモニターの設定
  Serial.begin(9600);
  Serial.println("\r\nStart");

  //SPIの初期化
  SPI.begin() ;                           // SPIを行う為の初期化
  SPI.setBitOrder(MSBFIRST) ;             // ビットオーダー
  SPI.setClockDivider(SPI_CLOCK_DIV4);    // クロック(CLK)をシステムクロックの1/8で使用(16MHz/8) = 2MHz; (max 10MHz)
  //SPI.setDataMode(SPI_MODE3) ;         // クロック極性0(LOW) クロック位相1(HIGH)
  

  // シリアルストリームが開いていないときには、何もしない:
  // →シリアルモニタを開いたら、セットアップをやり直す!?
  while (!Serial) {}

  //センサの個数だけ回す
  for (int CS_i = 10; CS_i > 10 - HowMenySensor ; CS_i--) {

    pinMode(CS_i, OUTPUT);    // 出力に設定

    delay(1000);
    //センサが認識していることを確かめる。
    Serial.println(LPS331AP_read(CS_i, LPS331AP_WHOAMI), HEX); //BBと表示されれば、LPS331APを認識している。0なら認識していない。

    //センサの設定を書き換える。
    LPS331AP_write(CS_i, LPS331AP_CTRL1, B10010000);

    digitalWrite(CS_i, HIGH); //通信終了状態に(CSをOFFに設定)
  }

  //必要ないかも
  delay(1000); //確実に設定を完了させるため1秒待つ?

}



//////////////
//ループ処理//
//////////////

void loop()
{

  ////////////////////////////////////////////////////////////////////
  //多めに指定しているので、今後修正
  unsigned long Pressure_val[14];// 気圧を格納する変数(unsigned long は「符号なしlong整数型」である。つまり、負の値を取らない)
  short Temperature_val[14];


  //センサの個数だけ回す
  for (int CS_i = 10; CS_i > 10 - HowMenySensor ; CS_i--) {
    //////////////浮動小数点型で引き受ける必要があるはず//////////////////////////////////////////////////

    // 気圧を取得する(関数を使う)
    Pressure_val[CS_i] = GetPressure(CS_i);

    // 温度を取得する(関数を使う)
    Temperature_val[CS_i] = GetTemperature(CS_i);

  }


  //センサの個数だけ回す
  for (int CS_i = 10; CS_i > 10 - HowMenySensor ; CS_i--) {

    Serial.print("Port = D");
    Serial.print(CS_i);
    Serial.print("  ");

    Serial.print(Pressure_val[CS_i]);  // pressure in [mbar]/[hPa]
    Serial.print("[mbar]/[hPa] ");
    Serial.print(',');
    Serial.print(Temperature_val[CS_i]);  // temprerature in [`C]
    Serial.println("[`C]");

  }

  delay(1000);
}



//////////////////////////////////////
//センサの値に応じて、気圧を返す関数//
//////////////////////////////////////
unsigned long GetPressure(int CS) {

  // センサから気圧を読み込む
  long press_xl = LPS331AP_read(CS, LPS331AP_P_LL); // 気圧の下位バイト
  long press_l = LPS331AP_read(CS, LPS331AP_P_L); // 気圧の中位バイト
  long press_h = LPS331AP_read(CS, LPS331AP_P_H); // 気圧の上位バイト

  //センサの値から気圧を計算する
  unsigned long press_val = (press_h << 16) + (press_l << 8) + (press_xl);

  /* 下記のif分は最上位のビットが"1"の時の処理で、ビットが"0"の時はif分をとばす
  (最上位のビットが"1"か"0"かによって計算が違う)*/
  if (press_val >= 8388608) {
    press_val = ~ press_val;
    press_val += 1;
  }
  press_val = press_val / 4096.0; //(hPa単位に直すには4096で割る必要がある。)

  return press_val;//返り値に気圧を入れて返す。

}


//////////////////////////////////////
//センサの値に応じて、温度を返す関数//
//////////////////////////////////////

short GetTemperature(int CS) {

  short Temperature_val;

  // センサから温度を読み込みながら計算する
  Temperature_val = LPS331AP_read(CS, LPS331AP_T_H);
  Temperature_val = (Temperature_val << 8) | LPS331AP_read(CS, LPS331AP_T_L);
  Temperature_val = 42.5 + Temperature_val / 480.0; ////////////////////////////////////Androidに引き渡すときにはコメントアウト

  return Temperature_val;//返り値に温度を入れて返す。
}






■■■■■■■■■■■■■■■■■■■■■■■■
20151126追加
センサの資料
■■■■■■■■■■■■■■■■■■■■■■■■

たしかネットにPDFがあったと思いますが、すぐに見つからないのでスキャンしました。
イメージ説明イメージ説明

「センサのピンごとの配線先」 と 「プルアップ抵抗の設置場所の確認」
イメージ説明



|
|
|
|
|
|
|
|
|
|
|
|
|
|




■■■■■■■■■■■■■■■■■■■■■■■■
20151127変更
プルアップ抵抗の追加
バイパスコンデンサの追加
GNDの配線追加
■■■■■■■■■■■■■■■■■■■■■■■■

イメージ説明イメージ説明
結果:センサ値に変化なし

Port = D10  432[mbar]/[hPa] ,36[`C]
Port = D9  1010[mbar]/[hPa] ,24[`C]
Port = D8  1012[mbar]/[hPa] ,24[`C]
Port = D7  1293[mbar]/[hPa] ,110[`C]
Port = D6  1677[mbar]/[hPa] ,110[`C]






|
|
|
|
|
|
|
|
|
|
|
|
|
|




■■■■■■■■■■■■■■■■■■■■■■■■
20151127チェック
センサチェック
■■■■■■■■■■■■■■■■■■■■■■■■

センサをチェックしたところ、センサの故障の可能性が高まりました。
今までのチェックでは、シリアルポートからデータを取得している状態でセンサを外し、他のセンサへと付け替えていました。
そうすると、外したソケットの値が
760[mbar]/[hPa] ,42[`C]
に固定されてしまっていたようでした。
(考えてみるとセンサの初期設定を行えていないので当たり前ですが、頭が回っておりませんでした。)


Port = D10  760[mbar]/[hPa] ,42[`C] ←ここ
Port = D9  1012[mbar]/[hPa] ,26[`C]
Port = D8  1013[mbar]/[hPa] ,26[`C]
Port = D7  940[mbar]/[hPa] ,110[`C]
Port = D6  1011[mbar]/[hPa] ,27[`C]


しかし、センサを付け替えた後にシリアルポートを再度出すことで、異なるセンサの値が出ていることが確認できました。

Port = D10  1010[mbar]/[hPa] ,24[`C] ←ここ
Port = D9  1011[mbar]/[hPa] ,25[`C]
Port = D8  1013[mbar]/[hPa] ,25[`C]
Port = D7  940[mbar]/[hPa] ,110[`C]
Port = D6  1010[mbar]/[hPa] ,25[`C]

いままでは手元にある8つのセンサの内、2つまでしか正常な値を確認できておりませんでした。
しかし、4つまで正常な値を出すことができました!!!

すべて(8つ)をチェックした所、4つは正常、4つは異常 という状況です。
もうすこしチェックをしてみる予定ですが、本件は「センサの故障」が原因であると考えられます。

みなさま長らくお付き合いいただき有り難うございました。
予めチェックの工程なども細かく掲載しておけば、早くご指摘頂けたのではないかと反省しております。

また何かありましたら追ってご報告いたします。
みなさまのお力添えに感謝しております。
ありがとうございました。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

詳しく見ていないのですけど、

状況から見て、通信条件が駄目だとD10,D9も駄目なはずなので、原因はSSっぽいですね。
一番怪しいチェックポイントとしては、
・SSに使用するD8,D7,D6が出力ポート設定になっているか?
(ソース上は出力にされているように見えますが、他のファンクションの設定でマルチファンクションピンで、他の優先順位の高いピンに割り当てられていないか?)


競合しそうなのはPWMですけど、使ってる形跡はありませんねぇ。

ちょっと気になったのですけど、
LPS331APの電源はFTからの3Vで駆動しているように見えますが、
これをArduinoの5Vのポートで駆動するとLPS331APの入力のマックスVDD_io+0.3Vを超えませんか?

SSを ポート出力で HIGH/LOWコントロールするよりは、LPS331APの電源にプルアップされたCSに対して、Arduino側で入力モード(HIGHインピーダンスでH=非選択)、出力モードでLOW な感じで切り替えるのが安全に思えます。

あと、LPS331APはかなりセンシティブなモジュールの記憶がありますが、壊れていませんかね? D10とD6のモジュールを交換しても動作は同じでしょうか?

オシロかロジアナがあると原因を究明しやすいんですけどもね。


投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/26 11:57

    T.Kanno様

    前回に引き続きご回答いただき幸いです。

    >>状況から見て、通信条件が駄目だとD10,D9も駄目なはずなので、原因はSSっぽいですね。
    「- SPIのクロックやモードなどの設定」がおそらく問題ないであろう
    という理解で間違えないでしょうか。


    また、ご指摘頂いた出力ポートについてですが、以下のfor文ではなく平文で指定しても同様の症状でした。

    ■for文
    //センサの個数だけ回す
    for (int CS_i = 10; CS_i > 10 - HowMenySensor ; CS_i--) {
    pinMode(CS_i, OUTPUT); // 出力に設定
     //……………省略……………
    }

    ■平文
    pinMode(10, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(6, OUTPUT);




    >>(ソース上は出力にされているように見えますが、他のファンクションの設定でマルチファンクションピンで、他の優先順位の高いピンに割り当てられていないか?)
    D8,D7,D&がうまくSSに指定されておらず、他の役割を持ってしまっているという理解で間違えないでしょうか。
    「他の優先順位の高いピンに割り当てられていないか?」という部分で、”他のピン”という点が理解できなかったため、私の解釈が間違えておりましたらご指摘ください。
    (D8,D7,D6以外のピンを使ってみたほうが良いという意味でしょうか)



    また、Arduinoは
    Arduino MEGA ADK
    Arduino duemilanove
    の2つで試しております。


    よろしくお願いたします。

    キャンセル

  • 2015/11/26 12:01

    マルチファンクションのアサインにつきましては、競合しそうなのはPWMとシリアルでしたが、見た感じ競合はしていなさそうですね。なので、Arduino側の使用法は合っているっぽいきがします。

    キャンセル

  • 2015/11/26 12:03

    ありがとうございます。

    現在の知識量では理解できない点があるため、よく読み込んで試して見ることにします。
    本日中にセンサを交換した状態での出力を記載いたします。
    またお力添えいただけますと幸いです。

    キャンセル

  • 2015/11/26 12:09

    申し訳ありませんが、オシロ , ロジアナ ともに手元にございません。

    キャンセル

  • 2015/11/26 12:26

    >>LPS331APの電源はFTからの3Vで駆動しているように見えますが、
    >>これをArduinoの5Vのポートで駆動するとLPS331APの入力のマックスVDD_io+0.3Vを超えませんか?

    現在LPS331APの電源はArduinoの3.3Vに接続しております。
    申し訳ありませんが、「FTからの3Vで駆動」という部分について調べても理解できませんでした。
    勉強不足で申し訳ありませんが、”FT”とは何を指しているかお教えいただけないでしょうか。




    >>SSを ポート出力で HIGH/LOWコントロールするよりは、LPS331APの電源にプルアップされたCSに対して、Arduino側で入力モード(HIGHインピーダンスでH=非選択)、出力モードでLOW な感じで切り替えるのが安全に思えます。

    SSとCSは同じものとして考えておりましたが、別のものなのでしょうか。

    申し訳ありませんが、回路図をイメージできておりません。
    LPS331AP電源とセンサごとのCSを10kΩでつなぎ、切り替えはプログラムで行うということでしょうか。
    その場合、切り替えはどのようなコードで行うことが必要となるのでしょうか。
    ( digitalWrite(CS, LOW);  や HIGH の部分を変更するということですよね? )

    キャンセル

  • 2015/11/26 12:42

    FTはFT232RLの事です。Arduinoの回路図を見ると、USBからの5VをFT232RL内のDC-DCで変換された3V3出力(3.3V)をArduinoのVCC30(なぜに30かは不明?)に接続されていますね。と言うことで、LPS331APはArduinoから3.3Vで駆動されています。
    この時、IOの入力電圧のマックスがVDD_io+0.3Vなので、Arduinoの5Vポートの出力を直接つなげたら3.3+0.3=3.6 の3.6Vを超えてしまうんじゃないかなと…

    と、ここまで書いて良く写真を眺めたら、VDD_io が繋がってるようには見えないんですけど、繋がっていますか?

    キャンセル

  • 2015/11/26 12:56 編集

    回答を分けます。CSもSSもどちら側から見たかの違いで、実質同じです。

    回路のイメージとしては、(LPS331APの)VDDとVDD_IOに3.3Vを給電。
    CSをVDDもしくはVDD_IO にプルアップ(10K程度の抵抗でVDDとCSを繋ぐ)。
    そうする事で、Arduino側でOUTPUTデータを常にLOWにして、INPUT設定にするとハイインピーダンスになり、LPS331APからH入力に見えます。
    Arduino側が OUTPUT設定でLOWにすると、LPS331APからL入力に見えます。
    このような回路構成で、OUTPUTでH出力をしないようにすると、オーバー電圧をかけないコントロールが出来るようになります。

    digitalWrite(CS, LOW);
    digitalWrite(CS, HIGH);
    では無く
    digitalWrite(CS, LOW);  の状態で

    pinMode(CS,INPUT); ←これでH出力になる
    pinMode(CS,OUTPUT); ←これでL出力になる

    こんな感じです

    キャンセル

  • 2015/11/26 13:22

    恐ろしく初歩的な間違えをしているかもしれませんので、一度センサ写真と回路図を用意して質問に追加いたします。
    (逐次追加していき、追加後には再度ご連絡いたします。)



    データシートを確認しておりご返信が遅くなりました。
    あまりなんでも聞きすぎるのも失礼だと思って確認しておりましたが、ご連絡が遅くなってしまい失礼いたしました。

    また、補足ですが、私が使用しているLPS331APは8ピンです。
    VDDとVDD_ioが別にあるのは10ピンのモデルだと思っていましたが違いますでしょうか。


    回路図・コードについては後ほど(先にデータシートなどをスキャンした後)に必ず確認させていただきます!
    いつも本当に感謝しております。

    キャンセル

  • 2015/11/26 13:44 編集

    すみません、使った事のある奴と同じと思い込みで話してました。
    小さいのが出てるんですねぇ

    キャンセル

  • 2015/11/26 13:59

    ご確認いただきありがとうございます!!
    VDD_ioの謎が解決して嬉しく思います!
    引き続きお力を貸して頂けますと幸いです。

    キャンセル

  • 2015/11/26 14:02 編集

    もともとの質問文で、「D10とD9のみは正常」と記載しておりました。
    しかし、只今センサを入れ替えた所、「他のピンソケットが正常で、D10またはD9の値が異常」になることが確認できました。
    (センサごとに「正常値を出すもの、異常値を出すもの」の区別が有るわけではないようです)

    改めてセンサ入れ替えチェックを行う機会を取るようご指摘頂きありがとうございます。

    今から
    ・プルアップ抵抗、コードの修正
    ・回路図の作成
    を試してみます。

    キャンセル

  • 2015/11/26 14:14

    質問文のセンサ値を更新しました。
    規則性がなさそうです・・・

    キャンセル

  • 2015/11/27 23:15

    質問本文が掲載可能な文字数を超過してしまいました。
    そのため、一部をこちらへ移動いたします。


    ■■■■■■■■■■■■■■■■■■■■■■■■
    20151126テスト
    センサの入れ替えチェック
    ■■■■■■■■■■■■■■■■■■■■■■■■

    ●シリアルポート出力 (Before)

    Start
    BB
    BB
    BB
    BB
    BB
    Port = D10 1001[mbar]/[hPa] ,24[`C]
    Port = D9 999[mbar]/[hPa] ,24[`C]
    Port = D8 1668[mbar]/[hPa] ,110[`C]
    Port = D7 1280[mbar]/[hPa] ,110[`C]
    Port = D6 420[mbar]/[hPa] ,36[`C]
    …(以下、同様の値でループ)




    ●シリアルポート出力 (After1)
    ★変更点
    D6(異常値)のセンサを抜き取り、D10の場所へ設置
    D9(正常値)のセンサを抜き取り、D6の場所へ設置
    D7,D8,D9 の場所にはセンサを未設置
    (念のためプログラムをマイコンボード:Arduino に書き直し)

    Start
    BB
    0
    0
    0
    BB
    Port = D10 419[mbar]/[hPa] ,37[`C]
    Port = D9 0[mbar]/[hPa] ,42[`C]
    Port = D8 0[mbar]/[hPa] ,42[`C]
    Port = D7 0[mbar]/[hPa] ,42[`C]
    Port = D6 1276[mbar]/[hPa] ,110[`C]
    …(以下、同様の値でループ)


    ●シリアルポート出力 (After2)
    ★変更点
    センサを適当に入れ替え

    Start
    BB
    BB
    BB
    BB
    BB
    Port = D10 419[mbar]/[hPa] ,36[`C]
    Port = D9 1277[mbar]/[hPa] ,110[`C]
    Port = D8 999[mbar]/[hPa] ,25[`C]
    Port = D7 1771[mbar]/[hPa] ,110[`C]
    Port = D6 1000[mbar]/[hPa] ,25[`C]
    …(以下、同様の値でループ)



    ●シリアルポート出力 (After3)
    ★変更点
    After2の結果を元に
    D6とD7を入れ替え
    D8のセンサ → D10
    D9のセンサ → D8
    D10のセンサ → D9

    Start
    BB
    BB
    BB
    BB
    0
    Port = D10 999[mbar]/[hPa] ,24[`C]
    Port = D9 419[mbar]/[hPa] ,36[`C]
    Port = D8 1278[mbar]/[hPa] ,110[`C]
    Port = D7 1000[mbar]/[hPa] ,25[`C]
    Port = D6 1771[mbar]/[hPa] ,110[`C]
    Port = D10 999[mbar]/[hPa] ,24[`C]
    …(以下、同様の値でループ)



    ●シリアルポート出力 (After3)
    ★変更点
    After3の結果を元に
    D6とD7を入れ替え

    Start
    BB
    BB
    BB
    BB
    BB
    Port = D10 999[mbar]/[hPa] ,25[`C]
    Port = D9 419[mbar]/[hPa] ,36[`C]
    Port = D8 1277[mbar]/[hPa] ,110[`C]
    Port = D7 1758[mbar]/[hPa] ,110[`C]
    Port = D6 1000[mbar]/[hPa] ,25[`C]
    Port = D10 999[mbar]/[hPa] ,24[`C]


    キャンセル

checkベストアンサー

+1

すみません、画像の貼り付けが出来ないので回答を分けます。
CSのプルアップのイメージはこんな感じです。

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/26 13:23

    画像ありがとうございます!!

    キャンセル

  • 2015/11/26 13:43

    私も画像を追加しました!

    キャンセル

  • 2015/11/26 14:04

    ちょっとネットで調べてみましたが、5V系のArduino と 3.3V系のLPS331APを通信させるには、厳密には信号レベルの変換が必要みたいです。
    CSは前述のほうほうでごまかせますが、SCL, MOSI, MISOはなかなか難しそうです。

    Arduino以外に、3.3V系のボードは選択対象としては無理でしょうかね?

    キャンセル

  • 2015/11/26 14:18

    MM-TXS03と言う、5V系のArduinoに直接つなげられる LPS331AP とレベル変換機内蔵のモジュールがあるようですが、いかがでしょうか?

    キャンセル

  • 2015/11/26 14:18

    調べて頂きありがとうございます。
    私が調べても理解できず本事例に解釈を当てはめられないため、本当にありがたいです。

    CSはプルアップ抵抗でなんとかなるが、SCL, MOSI, MISOは難しいことを確認しました。
    目的を実現するためには他のボードに挑戦いたします。
    何かお勧めなボードがありましたらお教え頂けますと幸いです。

    (お手数ですが「Arduinoでは難しい」とのソースをURLなどでお教え頂けますと幸いです。)
    よろしくお願い致します。

    キャンセル

  • 2015/11/26 14:20 編集

    失礼します。

    MM-TXS03 は 気圧・温度センサのようなので、LPS331APの代わりに使うという形でしょうか。
    (または、MM-TXS03 は Arduinoと LPS331APを繋げるために間に挟む?)

    Arduinoのソースコードをそのまま使えそうなので、MM-TXS03を8つ購入することを検討いたします。

    よろしくお願いします。

    キャンセル

  • 2015/11/26 14:43

    おそらくレベル変換機を解して、今手持ちの LPS331APをそのまま使う事も出来るかも知れませんが、回路の工夫が必要になると思います。

    ことによると、いくつかのモジュールは既に壊れているかもしれません。

    たぶん、一番簡単なのは MM-TXS03 や POLOLU-2126 等の 5Vの Arduinoと直接つなげられるモジュールに交換するの良いと思います。これらは、3.3Vではなく5Vで動くLPS331AP とみなせるはずです。



    もし、手持ちのセンサを大量に仕入れてしまっているのでなければ、上記の信号レベルコンバータ内蔵のセンサモジュールに交換するのが、一番障壁が小さいと思います。



    キャンセル

  • 2015/11/26 14:53

    (^.^;;;  お疲れ様でした~♪

    今回、ネットで調べると Arduino に LPS331AP が直接つなげられると言い切っているページが多いのにちょっと驚きました。Arduinoから3.3V電源が直接供給できるってだけで、信号レベルの変換が必要な事は大きく書いていないのが多いのですね。

    ただ、LPS331APチップの仕様を見ると1.71~3.6Vで使用とされていますが、瞬間?の絶対最大定格(なんぞや!)として4.8Vとありますので、5Vでもラッキーなら動く事はあったかもしれませんね。

    キャンセル

  • 2015/11/27 09:49

    長らくお付き合いいただきありがとうございました。
    レベル変換機という発想がなかっため、試す活路を見出すことができました!
    他にもプルアップ抵抗や、代替のセンサなどをわかりやすく噛み砕いて説明いただき助かりました。

    ご指摘の通りネットのページを参考にしていため、信号レベルの変換をするアイデアはありませんでした。
    一度試してみることに致します!

    解決しましたら報告させていただきます。

    キャンセル

  • 2015/11/27 09:53

    teratailでコメントを記入する際に「Tabキー」を使用していたところ、「回答の評価」を下げてしまったようです。
    急いで評価を上げましたが、もし他になにか誤って設定していたらご指摘ください。
    すぐに訂正致します。

    キャンセル

  • 2015/11/27 09:53

    本当にありがとうございました。

    キャンセル

  • 2015/11/27 12:41

    壊れてる可能性があるとしてもセンサ側なので、Kannoさんがおっしゃるようにモジュール交換できれば一番手っ取り早いかもしれませんね。Arduino側はほぼ大丈夫です。
    それと、写真見て思ったのですが、センサ沢山繋げるならば、ブレッドボード側の電源にもパスコン(電解コンなど)入れてあげましょう。センサもかなりアナログチックな部品なので、電源によって出力がけっこう変わることがあります。(本件には関係ないとは思いますが・・・)

    ネットで製作されている方の記事ですが、こちら
    http://morimori2008.web.fc2.com/contents/Arduino/scp1000_Arduino.html
    センサモジュールは違いますが、
    電源・GNDの線も複数あり、パスコン入れてることが見て取れると思います。

    それではご検討をお祈りします。

    キャンセル

  • 2015/11/27 21:49

    libra様

    ご回答頂きありがとうございます。
    Arduino側のチェックをして頂き幸いです。
    センサの故障の可能性については、再度センサを1つずつチェックして試してみる次第です。
    バイパスコンデンサについては知識だけは知っていましたが、こういった状況になると必要なるのですね。勉強になります。
    本件について関係あることを願って、その点も修正したいと考えております。

    参考サイトを載せて頂き幸いです。
    電源・GNDの線が複数あるのは、「その線とセンサの間にパスコンを挟むから」という理由で間違いないでしょうか。
    ご確認頂けますと幸いです。

    改めて、ご回答いただき有り難うございました。

    キャンセル

  • 2015/11/27 21:54

    補足です。

    「センサLPS331APに複数の出力モードがあり、その設定がおかしい」
    という可能性を疑っております。
    (例:センサへの設定書き込みによって、信号レベルが変化するがうまく設定できていない)

    現在データシートやアプリケーションノートを確認しております。
    なにか心当たりがありましたらご回答頂けますと幸いです。

    キャンセル

  • 2015/11/27 21:55

    また、センサが故障していた場合、その故障の原因は何なのでしょうか。
    また壊してしまいそうで不安です。

    一般論で構いませんのでご指摘頂けますと幸いです。

    キャンセル

  • 2015/11/27 22:00

    線が沢山あるのは、その方が沢山電流を流せるからです。
    データシート等については、私も時間があればちょっと調べてみますが、何かわかったことがあったら、再度報告はお願いしますね。
    (3.3Vとかも)

    キャンセル

  • 2015/11/27 22:02

    故障の原因としてはラッチアップだと思います。
    この辺僕もあまり詳しくないので、皆様のご意見もお聞きしたいところです。

    キャンセル

  • 2015/11/27 22:16

    なるほど!
    言われてみればたくさん電流を流せますね!
    早速、電源とGNDを増やすことにします!

    ありがとうございます。ざっとでも読んで頂けると幸いです。
    知識や経験のある方に目を通して頂けるのは本当にありがたいです。
    お力を貸して頂いている身なので、細かなことでも分かり次第報告致します。

    キャンセル

  • 2015/11/27 22:17

    ラッチアップは初めて聞きました。
    後学のためにも抑えておきます。

    キャンセル

  • 2015/11/27 22:28

    早速、先ほどご提示頂いたwebサイトを参考に
    0.1μFのセラミックコンデンサ
    1μFの電解コンデンサ
    をバイパスコンデンサとして接続してみました。

    また、GNDのケーブルを2本にしましたが、3.3VのArduino側ピンソケットは1つしかないため増やすことができませんでした。

    配線がごちゃごちゃで見にくいと思いますが、写真を追加いたします。
    来週の頭にはブレッドボードを大きなものに変更し見やすくする予定です。

    キャンセル

  • 2015/11/27 23:24

    T.Kanno様
    libra様

    質問本文を追加いたしました。
    現在、「センサの故障」という可能性が有力です。
    一番初め(この質問を掲載する前)でのセンサのチェック時に、正確でないチェック方法でテストを行っていたことで問題を複雑化してしまったようです。
    本当に申し訳ありませんでした。

    ただし、おかげさまで学ぶべきことは非常に多くありました。
    また、私に時間と手間を掛けていただいたことは本当に感謝してもしきれません。
    新たにセンサを購入して試すことにいたします。

    追って結果を載せていく予定ですので、何か壁にあたった際にはまたお力添えいただけることを願います。
    本事例は「センサの故障」ということで解決とさせていただきます。
    ありがとうございました。

    キャンセル

  • 2015/11/27 23:24

    センサの故障の原因などがわかりましたら、お教え頂けますと幸いです。

    キャンセル

  • 2015/11/27 23:36

    3.3V動作のセンサに5Vかければ
    故障の原因としては充分に怪しいです。

    キャンセル

  • 2015/11/30 12:58

    ozwk様

    ご指摘いただきましてありがとうございます。

    もしかするといろいろ試しているうちに5Vを加えていた可能性もあります。
    また、故障の心当たりとして、息に反応するかチェックするために、センサへ直接息を吹きかけておりました。
    よって湿度の上昇で故障した可能性も考えられます。

    以後気を付けて取り扱う次第です。
    ありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • C

    4517questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    672questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。