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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Arduino

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

Q&A

解決済

2回答

18292閲覧

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

kt.tk.co

総合スコア27

C

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

Arduino

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

0グッド

0クリップ

投稿2015/11/26 01:37

編集2015/11/27 14:14

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

イメージ説明

イメージ説明

イメージ説明

■コード

C

1#include <SPI.h> 2 3//センサの個数を指定 4int HowMenySensor = 5; 5//センサのCS(SS)はArduinoのD10ピンから配置すること。(D10→D9→D8→D7→D6→D5→D4→D3) 6 7//デバイスのレジスタアドレス(センサで取得できる値の格納場所など) 8const byte LPS331AP_WHOAMI = 0x0f;// デバイスの識別ID格納レジスタアドレス 9const byte LPS331AP_CTRL_PRESS = 0x10; // 圧力分解能のモード設定アドレス 10const byte LPS331AP_CTRL1 = 0x20;// 制御レジスタ1の設定レジスタアドレス 11const byte LPS331AP_CTRL2 = 0x21;// 制御レジスタ2の設定レジスタアドレス 12const byte LPS331AP_CTRL3 = 0x22;// 制御レジスタ3の設定レジスタアドレス 13const byte LPS331AP_CTRL_STATUS = 0x27; // ステータス・レジスタアドレス 14const byte LPS331AP_P_LL = 0x28;// 読み出すデータの先頭レジスタアドレス 15const byte LPS331AP_P_L = 0x29; 16const byte LPS331AP_CTRL_AMP = 0x30; // アナログ・フロント・エンド制御レジスタアドレス 17const byte LPS331AP_P_H = 0x2A; 18const byte LPS331AP_T_L = 0x2B; 19const byte LPS331AP_T_H = 0x2C; 20 21const byte LPS331AP_RW = 0x80; 22const byte LPS331AP_MS = 0x40; //使っていない!? 23 24 25//////////////////////////////// 26//センサへデータを書き込む関数//(センサ設定の変更用) 27//////////////////////////////// 28 29void LPS331AP_write(int CS, byte reg, byte val) 30{ 31 digitalWrite(CS, LOW); //LOWにすることで通信開始 32 SPI.transfer(reg); 33 SPI.transfer(val); 34 digitalWrite(CS, HIGH); //HIGHにすることで通信終了 35} 36 37 38////////////////////////////// 39//センサから値を受信する関数// (CSで受信先のセンサを区別。regで取得するデータ(温度or気圧)を指定) 40////////////////////////////// 41 42byte LPS331AP_read(int CS, byte reg) 43{ 44 byte ret = 0; 45 46 digitalWrite(CS, LOW); //LOWにすることで通信開始 47 SPI.transfer(reg | LPS331AP_RW); //読み込むデータを指示 48 ret = SPI.transfer(0); //データを取得 49 digitalWrite(CS, HIGH); //HIGHにすることで通信終了 50 51 return ret; 52} 53 54 55 56//////////// 57//初期設定// 58//////////// 59 60void setup() 61{ 62 // シリアルモニターの設定 63 Serial.begin(9600); 64 Serial.println("\r\nStart"); 65 66 //SPIの初期化 67 SPI.begin() ; // SPIを行う為の初期化 68 SPI.setBitOrder(MSBFIRST) ; // ビットオーダー 69 SPI.setClockDivider(SPI_CLOCK_DIV4); // クロック(CLK)をシステムクロックの1/8で使用(16MHz/8) = 2MHz; (max 10MHz) 70 //SPI.setDataMode(SPI_MODE3) ; // クロック極性0(LOW) クロック位相1(HIGH) 71 72 73 // シリアルストリームが開いていないときには、何もしない: 74 // →シリアルモニタを開いたら、セットアップをやり直す!? 75 while (!Serial) {} 76 77 //センサの個数だけ回す 78 for (int CS_i = 10; CS_i > 10 - HowMenySensor ; CS_i--) { 79 80 pinMode(CS_i, OUTPUT); // 出力に設定 81 82 delay(1000); 83 //センサが認識していることを確かめる。 84 Serial.println(LPS331AP_read(CS_i, LPS331AP_WHOAMI), HEX); //BBと表示されれば、LPS331APを認識している。0なら認識していない。 85 86 //センサの設定を書き換える。 87 LPS331AP_write(CS_i, LPS331AP_CTRL1, B10010000); 88 89 digitalWrite(CS_i, HIGH); //通信終了状態に(CSをOFFに設定) 90 } 91 92 //必要ないかも 93 delay(1000); //確実に設定を完了させるため1秒待つ? 94 95} 96 97 98 99////////////// 100//ループ処理// 101////////////// 102 103void loop() 104{ 105 106 //////////////////////////////////////////////////////////////////// 107 //多めに指定しているので、今後修正 108 unsigned long Pressure_val[14];// 気圧を格納する変数(unsigned long は「符号なしlong整数型」である。つまり、負の値を取らない) 109 short Temperature_val[14]; 110 111 112 //センサの個数だけ回す 113 for (int CS_i = 10; CS_i > 10 - HowMenySensor ; CS_i--) { 114 //////////////浮動小数点型で引き受ける必要があるはず////////////////////////////////////////////////// 115 116 // 気圧を取得する(関数を使う) 117 Pressure_val[CS_i] = GetPressure(CS_i); 118 119 // 温度を取得する(関数を使う) 120 Temperature_val[CS_i] = GetTemperature(CS_i); 121 122 } 123 124 125 //センサの個数だけ回す 126 for (int CS_i = 10; CS_i > 10 - HowMenySensor ; CS_i--) { 127 128 Serial.print("Port = D"); 129 Serial.print(CS_i); 130 Serial.print(" "); 131 132 Serial.print(Pressure_val[CS_i]); // pressure in [mbar]/[hPa] 133 Serial.print("[mbar]/[hPa] "); 134 Serial.print(','); 135 Serial.print(Temperature_val[CS_i]); // temprerature in [`C] 136 Serial.println("[`C]"); 137 138 } 139 140 delay(1000); 141} 142 143 144 145////////////////////////////////////// 146//センサの値に応じて、気圧を返す関数// 147////////////////////////////////////// 148unsigned long GetPressure(int CS) { 149 150 // センサから気圧を読み込む 151 long press_xl = LPS331AP_read(CS, LPS331AP_P_LL); // 気圧の下位バイト 152 long press_l = LPS331AP_read(CS, LPS331AP_P_L); // 気圧の中位バイト 153 long press_h = LPS331AP_read(CS, LPS331AP_P_H); // 気圧の上位バイト 154 155 //センサの値から気圧を計算する 156 unsigned long press_val = (press_h << 16) + (press_l << 8) + (press_xl); 157 158 /* 下記のif分は最上位のビットが"1"の時の処理で、ビットが"0"の時はif分をとばす 159 (最上位のビットが"1"か"0"かによって計算が違う)*/ 160 if (press_val >= 8388608) { 161 press_val = ~ press_val; 162 press_val += 1; 163 } 164 press_val = press_val / 4096.0; //(hPa単位に直すには4096で割る必要がある。) 165 166 return press_val;//返り値に気圧を入れて返す。 167 168} 169 170 171////////////////////////////////////// 172//センサの値に応じて、温度を返す関数// 173////////////////////////////////////// 174 175short GetTemperature(int CS) { 176 177 short Temperature_val; 178 179 // センサから温度を読み込みながら計算する 180 Temperature_val = LPS331AP_read(CS, LPS331AP_T_H); 181 Temperature_val = (Temperature_val << 8) | LPS331AP_read(CS, LPS331AP_T_L); 182 Temperature_val = 42.5 + Temperature_val / 480.0; ////////////////////////////////////Androidに引き渡すときにはコメントアウト 183 184 return Temperature_val;//返り値に温度を入れて返す。 185}

■■■■■■■■■■■■■■■■■■■■■■■■
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つは異常 という状況です。
もうすこしチェックをしてみる予定ですが、本件は「センサの故障」が原因であると考えられます。

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

また何かありましたら追ってご報告いたします。
みなさまのお力添えに感謝しております。
ありがとうございました。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

状況から見て、通信条件が駄目だと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 01:52

編集2015/11/26 02:54
T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt.tk.co

2015/11/26 02: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つで試しております。 よろしくお願いたします。
T.Kanno

2015/11/26 03:01

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

2015/11/26 03:03

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

2015/11/26 03:09

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

2015/11/26 03: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 の部分を変更するということですよね? )
T.Kanno

2015/11/26 03: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 が繋がってるようには見えないんですけど、繋がっていますか?
T.Kanno

2015/11/26 04:01 編集

回答を分けます。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出力になる こんな感じです
kt.tk.co

2015/11/26 04:22

恐ろしく初歩的な間違えをしているかもしれませんので、一度センサ写真と回路図を用意して質問に追加いたします。 (逐次追加していき、追加後には再度ご連絡いたします。) データシートを確認しておりご返信が遅くなりました。 あまりなんでも聞きすぎるのも失礼だと思って確認しておりましたが、ご連絡が遅くなってしまい失礼いたしました。 また、補足ですが、私が使用しているLPS331APは8ピンです。 VDDとVDD_ioが別にあるのは10ピンのモデルだと思っていましたが違いますでしょうか。 回路図・コードについては後ほど(先にデータシートなどをスキャンした後)に必ず確認させていただきます! いつも本当に感謝しております。
T.Kanno

2015/11/26 04:44 編集

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

2015/11/26 04:59

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

2015/11/26 05:07 編集

もともとの質問文で、「D10とD9のみは正常」と記載しておりました。 しかし、只今センサを入れ替えた所、「他のピンソケットが正常で、D10またはD9の値が異常」になることが確認できました。 (センサごとに「正常値を出すもの、異常値を出すもの」の区別が有るわけではないようです) 改めてセンサ入れ替えチェックを行う機会を取るようご指摘頂きありがとうございます。 今から ・プルアップ抵抗、コードの修正 ・回路図の作成 を試してみます。
kt.tk.co

2015/11/26 05:14

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

2015/11/27 14: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]
guest

0

ベストアンサー

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

イメージ説明

投稿2015/11/26 04:05

T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt.tk.co

2015/11/26 04:23

画像ありがとうございます!!
kt.tk.co

2015/11/26 04:43

私も画像を追加しました!
T.Kanno

2015/11/26 05:04

ちょっとネットで調べてみましたが、5V系のArduino と 3.3V系のLPS331APを通信させるには、厳密には信号レベルの変換が必要みたいです。 CSは前述のほうほうでごまかせますが、SCL, MOSI, MISOはなかなか難しそうです。 Arduino以外に、3.3V系のボードは選択対象としては無理でしょうかね?
T.Kanno

2015/11/26 05:18

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

2015/11/26 05:18

調べて頂きありがとうございます。 私が調べても理解できず本事例に解釈を当てはめられないため、本当にありがたいです。 CSはプルアップ抵抗でなんとかなるが、SCL, MOSI, MISOは難しいことを確認しました。 目的を実現するためには他のボードに挑戦いたします。 何かお勧めなボードがありましたらお教え頂けますと幸いです。 (お手数ですが「Arduinoでは難しい」とのソースをURLなどでお教え頂けますと幸いです。) よろしくお願い致します。
kt.tk.co

2015/11/26 05:24 編集

失礼します。 MM-TXS03 は 気圧・温度センサのようなので、LPS331APの代わりに使うという形でしょうか。 (または、MM-TXS03 は Arduinoと LPS331APを繋げるために間に挟む?) Arduinoのソースコードをそのまま使えそうなので、MM-TXS03を8つ購入することを検討いたします。 よろしくお願いします。
T.Kanno

2015/11/26 05:43

おそらくレベル変換機を解して、今手持ちの LPS331APをそのまま使う事も出来るかも知れませんが、回路の工夫が必要になると思います。 ことによると、いくつかのモジュールは既に壊れているかもしれません。 たぶん、一番簡単なのは MM-TXS03 や POLOLU-2126 等の 5Vの Arduinoと直接つなげられるモジュールに交換するの良いと思います。これらは、3.3Vではなく5Vで動くLPS331AP とみなせるはずです。 もし、手持ちのセンサを大量に仕入れてしまっているのでなければ、上記の信号レベルコンバータ内蔵のセンサモジュールに交換するのが、一番障壁が小さいと思います。
T.Kanno

2015/11/26 05:53

(^.^;;;  お疲れ様でした~♪ 今回、ネットで調べると Arduino に LPS331AP が直接つなげられると言い切っているページが多いのにちょっと驚きました。Arduinoから3.3V電源が直接供給できるってだけで、信号レベルの変換が必要な事は大きく書いていないのが多いのですね。 ただ、LPS331APチップの仕様を見ると1.71~3.6Vで使用とされていますが、瞬間?の絶対最大定格(なんぞや!)として4.8Vとありますので、5Vでもラッキーなら動く事はあったかもしれませんね。
kt.tk.co

2015/11/27 00:49

長らくお付き合いいただきありがとうございました。 レベル変換機という発想がなかっため、試す活路を見出すことができました! 他にもプルアップ抵抗や、代替のセンサなどをわかりやすく噛み砕いて説明いただき助かりました。 ご指摘の通りネットのページを参考にしていため、信号レベルの変換をするアイデアはありませんでした。 一度試してみることに致します! 解決しましたら報告させていただきます。
kt.tk.co

2015/11/27 00:53

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

2015/11/27 00:53

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

2015/11/27 03:41

壊れてる可能性があるとしてもセンサ側なので、Kannoさんがおっしゃるようにモジュール交換できれば一番手っ取り早いかもしれませんね。Arduino側はほぼ大丈夫です。 それと、写真見て思ったのですが、センサ沢山繋げるならば、ブレッドボード側の電源にもパスコン(電解コンなど)入れてあげましょう。センサもかなりアナログチックな部品なので、電源によって出力がけっこう変わることがあります。(本件には関係ないとは思いますが・・・) ネットで製作されている方の記事ですが、こちら http://morimori2008.web.fc2.com/contents/Arduino/scp1000_Arduino.html センサモジュールは違いますが、 電源・GNDの線も複数あり、パスコン入れてることが見て取れると思います。 それではご検討をお祈りします。
kt.tk.co

2015/11/27 12:49

libra様 ご回答頂きありがとうございます。 Arduino側のチェックをして頂き幸いです。 センサの故障の可能性については、再度センサを1つずつチェックして試してみる次第です。 バイパスコンデンサについては知識だけは知っていましたが、こういった状況になると必要なるのですね。勉強になります。 本件について関係あることを願って、その点も修正したいと考えております。 参考サイトを載せて頂き幸いです。 電源・GNDの線が複数あるのは、「その線とセンサの間にパスコンを挟むから」という理由で間違いないでしょうか。 ご確認頂けますと幸いです。 改めて、ご回答いただき有り難うございました。
kt.tk.co

2015/11/27 12:54

補足です。 「センサLPS331APに複数の出力モードがあり、その設定がおかしい」 という可能性を疑っております。 (例:センサへの設定書き込みによって、信号レベルが変化するがうまく設定できていない) 現在データシートやアプリケーションノートを確認しております。 なにか心当たりがありましたらご回答頂けますと幸いです。
kt.tk.co

2015/11/27 12:55

また、センサが故障していた場合、その故障の原因は何なのでしょうか。 また壊してしまいそうで不安です。 一般論で構いませんのでご指摘頂けますと幸いです。
libra

2015/11/27 13:00

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

2015/11/27 13:02

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

2015/11/27 13:16

なるほど! 言われてみればたくさん電流を流せますね! 早速、電源とGNDを増やすことにします! ありがとうございます。ざっとでも読んで頂けると幸いです。 知識や経験のある方に目を通して頂けるのは本当にありがたいです。 お力を貸して頂いている身なので、細かなことでも分かり次第報告致します。
kt.tk.co

2015/11/27 13:17

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

2015/11/27 13:28

早速、先ほどご提示頂いたwebサイトを参考に 0.1μFのセラミックコンデンサ 1μFの電解コンデンサ をバイパスコンデンサとして接続してみました。 また、GNDのケーブルを2本にしましたが、3.3VのArduino側ピンソケットは1つしかないため増やすことができませんでした。 配線がごちゃごちゃで見にくいと思いますが、写真を追加いたします。 来週の頭にはブレッドボードを大きなものに変更し見やすくする予定です。
kt.tk.co

2015/11/27 14:24

T.Kanno様 libra様 質問本文を追加いたしました。 現在、「センサの故障」という可能性が有力です。 一番初め(この質問を掲載する前)でのセンサのチェック時に、正確でないチェック方法でテストを行っていたことで問題を複雑化してしまったようです。 本当に申し訳ありませんでした。 ただし、おかげさまで学ぶべきことは非常に多くありました。 また、私に時間と手間を掛けていただいたことは本当に感謝してもしきれません。 新たにセンサを購入して試すことにいたします。 追って結果を載せていく予定ですので、何か壁にあたった際にはまたお力添えいただけることを願います。 本事例は「センサの故障」ということで解決とさせていただきます。 ありがとうございました。
kt.tk.co

2015/11/27 14:24

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

2015/11/27 14:36

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

2015/11/30 03:58

ozwk様 ご指摘いただきましてありがとうございます。 もしかするといろいろ試しているうちに5Vを加えていた可能性もあります。 また、故障の心当たりとして、息に反応するかチェックするために、センサへ直接息を吹きかけておりました。 よって湿度の上昇で故障した可能性も考えられます。 以後気を付けて取り扱う次第です。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問