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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

Q&A

3回答

3755閲覧

ESP32でピエゾセンサーの値を読み取る際の不具合ついて

morleyrobertson

総合スコア12

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

1グッド

2クリップ

投稿2018/11/18 10:33

編集2018/11/27 04:41

ESP32-DevKitCと2つのピエゾセンサーをつないで、
ピエゾセンサーを叩いてその値を読み取ろうとしているのですが、
特定のアナログピンに接続した場合、叩いてもないピエゾセンサーの値が混ざってしまいます。
GPIO25ピン、GPIO26ピンの組み合わせですと、期待通りの結果を出してくれるので、
まずそちらから示しますと、回路は
ピエゾセンサー
緑の線がGPIO25ピンに、黄色の線がGPIO26ピンにつながっています。抵抗は1MΩです。
コードは

C++

1void setup() { 2 Serial.begin(115200); 3} 4void loop() { 5 int res1 = analogRead(25); 6 int res2 = analogRead(26); 7 //ピエゾセンサーに触れていなくても200より小さな値を出力してしまっているため、 8 //しきい値を200とし、それより下はカットします。 9 if(res1>200) {Serial.print("25 is "); Serial.println(res1);} 10 if(res2>200) {Serial.print("26 is "); Serial.println(res2);} 11}

です。
この時、ピエゾセンサーを1回ずつ叩くと、

C++

125 is 2855 //25ピンにつながったピエゾセンサーを1回叩きます 225 is 4095 325 is 4095 425 is 4095 525 is 3437 625 is 811 725 is 4095 825 is 4095 925 is 4095 1025 is 3131 1125 is 2319 1225 is 4095 1325 is 1967 1425 is 3503 1525 is 3519 1625 is 3541 1725 is 3003 1825 is 3475 1925 is 3159 2025 is 2607 2125 is 1626 2225 is 1159 2325 is 1480 2425 is 1294 2525 is 272 2625 is 272 2725 is 269 2825 is 374 2925 is 684 3025 is 2491 3125 is 2515 3225 is 1834 3325 is 1492 3425 is 1487 3525 is 1445 3625 is 1244 3725 is 1535 3825 is 1040 3925 is 881 4025 is 976 4125 is 788 4225 is 739 4325 is 938 4425 is 768 4525 is 464 4625 is 441 4725 is 480 4825 is 465 4925 is 404 5025 is 326 5125 is 264 5225 is 212 //ここまで 5326 is 2799 //次に26ピンにつながったピエゾセンサーを一回叩きます 5426 is 2287 5526 is 4095 5626 is 4095 5726 is 1754 5826 is 4095 5926 is 4095 6026 is 2559 6126 is 2639 6226 is 1005 6326 is 3771 6426 is 4095 6526 is 4095 6626 is 441 6726 is 1275 6826 is 1002 6926 is 4095 7026 is 2359 7126 is 1136 7226 is 454 7326 is 240 7426 is 464 7526 is 654 7626 is 298 7726 is 202 7826 is 296 7926 is 448 8026 is 761 8126 is 801 8226 is 612 8326 is 412 8426 is 363 8526 is 284 8626 is 336 8726 is 469 8826 is 656 8926 is 862 9026 is 1038 9126 is 1130 9226 is 1392 9326 is 1360 9426 is 1531 9526 is 1584 9626 is 1237 9726 is 938 9826 is 650 9926 is 519 10026 is 405 10126 is 332 10226 is 272 10326 is 238 10426 is 202 //ここまで

このようにお互いの値が混ざることなく出力されます。
同じことをGPI32ピンとGPI33ピンの組み合わせですると、結果はこうなりました。
(叩いてないのに出力されているセンサーの値を**で囲みます。)

C++

132 is 3895 //32ピンにつながったピエゾセンサーを1回叩きます。 2**33 is 664** 332 is 4095 4**33 is 1189** 5**33 is 584** 6**33 is 642** 7**33 is 661** 832 is 4095 9**33 is 1477** 10**33 is 976** 11**33 is 1008** 12**33 is 1030** 1332 is 4095 14**33 is 2515** 1532 is 4095 16**33 is 2746** 1732 is 1171 18**33 is 2335** 1932 is 4095 20**33 is 1999** 2132 is 2093 22**33 is 1712** 2332 is 224 24**33 is 1456** 2532 is 1895 26**33 is 1252** 2732 is 4095 28**33 is 1730** 2932 is 1268 30**33 is 1511** 3132 is 452 32**33 is 1291** 3332 is 248 34**33 is 1094** 3532 is 220 36**33 is 932** 37**33 is 794** 38**33 is 733** 39**33 is 680** 40**33 is 628** 41**33 is 580** 42**33 is 532** 43**33 is 491** 4432 is 240 45**33 is 452** 4632 is 272 47**33 is 434** 4832 is 264 49**33 is 328** 5032 is 217 51**33 is 256** 52**33 is 208** 5332 is 344 5432 is 667 5532 is 336 5632 is 276 5732 is 554 5832 is 458 5932 is 240 6032 is 201 6132 is 212 6232 is 206 6332 is 210 6432 is 228 6532 is 208 6632 is 240 6732 is 240 6832 is 208 //ここまで 6933 is 415 //次に33ピンにつながったピエゾセンサーを1回叩きます。 70**32 is 668** 7133 is 4095 7233 is 256 7333 is 372 7433 is 2645 7533 is 3791 76**32 is 289** 7733 is 4095 7833 is 4095 79**32 is 369** 8033 is 4095 8133 is 1209 8233 is 1439 8333 is 1301 8433 is 3743 8533 is 3999 8633 is 1050 8733 is 272 8833 is 1871 8933 is 2163 9033 is 1184 9133 is 228 9233 is 240 9333 is 272 9433 is 805 9533 is 1348 9633 is 1651 9733 is 1520 9833 is 957 99**32 is 704** 10033 is 4095 10133 is 2640 10233 is 4095 10333 is 4095 10433 is 3919 10533 is 3031 10633 is 2877 10733 is 3007 10833 is 2887 10933 is 2501 11033 is 2167 11133 is 1959 11233 is 1834 11333 is 1726 11433 is 1648 11533 is 1535 11633 is 1423 11733 is 1328 11833 is 1307 11933 is 1313 12033 is 1296 12133 is 1285 12233 is 1252 12333 is 1185 12433 is 1121 12533 is 1064 12633 is 997 12733 is 936 12833 is 872 12933 is 800 13033 is 740 13133 is 688 13233 is 617 13333 is 563 13433 is 516 13533 is 468 13633 is 2207 13733 is 1987 13833 is 1105 13933 is 503 14033 is 508 14133 is 645 14233 is 624 14333 is 524 14433 is 482 14533 is 448 14633 is 384 14733 is 304 14833 is 262 14933 is 208 15033 is 201 15133 is 204 15233 is 204 15333 is 240 15433 is 208 15533 is 208 15633 is 202 15733 is 204 15833 is 204 15933 is 201 16033 is 201 16133 is 209 16233 is 208 16333 is 208 //ここまで

25ピン、26ピン以外のほとんどのアナログピンを試しましたが、
正常に出力してくれたのは25ピン、26ピンだけで、他は値が混ざってしまっていました。
何故このようなことが起こるのか、どなたかご説明頂くことは可能でしょうか。

【11月26日追記】
検証の方がまだ全て終わってないのですが、試行錯誤の結果、
とりあえず許せる範囲で制御できてきましたので、一旦途中経過をご報告していきます。
まず、最初に実験していた回路は以下の通りです。(手書きで済みません)
![ピエゾ素子と回路]
最初の実験ではピエゾセンサーをデコピンのように中指でバチンと弾いていました。
上記の結果はその時の実験のものです。その結果を見てみると、
大きい値が出ている前後(最大値の4095付近)で値が混ざってしまっていたので、
試しにピエゾセンサーを棒で軽くコツンと叩いてみますと、
200より大きい値は混ざらないことが分かりました。

また、板の裏にピエゾセンサーを貼り付けて、板を上から叩いた時は
GPIO0、2、GPI36、GPI39以外のアナログピンで正常に入力してくれました。
GPIO0、2は良いとしても、GPI36、GPI39は何度やっても値が混ざってしまいました。
GPI36、GPI39が特殊なピンだからなのかも知れません。

結論としては、強い衝撃が加わった時に値が混ざる不具合が出てしまうようなので、
ピエゾセンサーを直接叩かず、板などの緩衝材を挟むのが吉という結論に至りました。

次にBluetoothの設定をsetup()内でした時に、GPI32~39以外のアナログピンが
常に4095となってしまう問題は、スイッチサイエンスさんのサイトによりますと、
WiFi機能を使う時も同様に該当のアナログピンの値が常に4095となってしまうとのことですので、
製造元の修正を待ちたいところです。
スイッチサイエンスさんのサイトのリンクです。アナログ入力の箇所をご覧下さい。

というわけで、Bluetooth使用時にピエゾセンサーを繋げるアナログピンは
GPI32、GPI33、GPI34、GPI35の4ピンとなります。
ここに6つのピエゾセンサーを繋ぎたいので、やはりマルチプレクサを使います。
ただ、普通に4051の0~5ピンに6つのピエゾセンサーを繋ぎますと、
正常に動いてくれていたはずのGPI32、GPI33、GPI34、GPI35でも値が混ざってしまいました。
そこで、1~6ピンにずらしますと、1279の値を超えた値が混ざることはなくなった上に、
使えないと思っていたGPI36、GPI39でも正常に値を受け取れています。
謎は残るものの、とりあえず使える範囲には来たかなと思います。これで少し様子を見ます。
以下、その回路図とコードです。(手書きで済みません)
![イメージ説明]

C++

1#include <BLEDevice.h> 2#include <BLEServer.h> 3#include <BLEUtils.h> 4#include <BLE2902.h> 5 6BLECharacteristic *pCharacteristic; 7#define THRESHOLD 1279 8//Mux control pins 9byte s0 = 21; 10byte s1 = 22; 11byte s2 = 23; 12byte controlPin[] = {s0, s1, s2}; 13byte muxChannel[8][3] = { 14 {0, 0, 0}, //channel 0 15 {1, 0, 0}, //channel 1 16 {0, 1, 0}, //channel 2 17 {1, 1, 0}, //channel 3 18 {0, 0, 1}, //channel 4 19 {1, 0, 1}, //channel 5 20 {0, 1, 1}, //channel 6 21 {1, 1, 1}, //channel 7 22}; 23byte loop_0_7 = 0; 24void setup() { 25 pinMode(s0, OUTPUT); 26 pinMode(s1, OUTPUT); 27 pinMode(s2, OUTPUT); 28 29 digitalWrite(s0, LOW); 30 digitalWrite(s1, LOW); 31 digitalWrite(s2, LOW); 32 33 Serial.begin(115200); 34 BLEDevice::init("M1"); 35 36 // Create the BLE Server 37 BLEServer *pServer = BLEDevice::createServer(); 38 BLEDevice::setEncryptionLevel((esp_ble_sec_act_t)ESP_LE_AUTH_REQ_SC_BOND); 39 40 // Create the BLE Service 41 BLEService *pService = pServer->createService(BLEUUID(MIDI_SERVICE_UUID)); 42 43 // Create a BLE Characteristic 44 pCharacteristic = pService->createCharacteristic( 45 BLEUUID(MIDI_CHARACTERISTIC_UUID), 46 BLECharacteristic::PROPERTY_READ | 47 BLECharacteristic::PROPERTY_NOTIFY | 48 BLECharacteristic::PROPERTY_WRITE 49 ); 50 pCharacteristic->setCallbacks(new MyCallbacks()); 51 52 // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml 53 // Create a BLE Descriptor 54 pCharacteristic->addDescriptor(new BLE2902()); 55 56 // Start the service 57 pService->start(); 58 59 // Start advertising 60 61 BLESecurity *pSecurity = new BLESecurity(); 62 pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_BOND); 63 pSecurity->setCapability(ESP_IO_CAP_NONE); 64 pSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); 65 66 pServer->getAdvertising()->addServiceUUID(MIDI_SERVICE_UUID); 67 pServer->getAdvertising()->start(); 68} 69void loop() { 70 if(1<=loop_0_7&&loop_0_7<=6){ 71 for (int i = 0; i < 3; i ++) { 72 if(muxChannel[loop_0_7][i]) { 73 if(i==0) GPIO.out_w1ts = ((uint32_t)1 << s0); 74 else if(i==1) GPIO.out_w1ts = ((uint32_t)1 << s1); 75 else if(i==2) GPIO.out_w1ts = ((uint32_t)1 << s2); 76 }else{ 77 if(i==0) GPIO.out_w1tc = ((uint32_t)1 << s0); 78 else if(i==1) GPIO.out_w1tc = ((uint32_t)1 << s1); 79 else if(i==2) GPIO.out_w1tc = ((uint32_t)1 << s2); 80 } 81 } 82 //delay(1); 83 //GPI32、GPI33、GPI34、GPI35、GPI36、GPI39 are available for analogRead 84 int res = analogRead(39); 85 if(res>THRESHOLD&&loop_0_7==1){Serial.print("1 is "); Serial.println(res);} 86 if(res>THRESHOLD&&loop_0_7==2){Serial.print("2 is "); Serial.println(res);} 87 if(res>THRESHOLD&&loop_0_7==3){Serial.print("3 is "); Serial.println(res);} 88 if(res>THRESHOLD&&loop_0_7==4){Serial.print("4 is "); Serial.println(res);} 89 if(res>THRESHOLD&&loop_0_7==5){Serial.print("5 is "); Serial.println(res);} 90 if(res>THRESHOLD&&loop_0_7==6){Serial.print("6 is "); Serial.println(res);} 91 } 92 if(loop_0_7==7) loop_0_7=0; 93 else loop_0_7++; 94} 95

念のため、WriteとReadの間にdelay(1);を挟み、4051の0~5ピンを読み取る方法方法も
試しましたが、うまく行きませんでした。

TaroToyotomi👍を押しています

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

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

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

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

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

tmp

2018/11/21 03:50

静電容量の影響をうけるかどうかの確認の為、叩かず手を近づけて変化するか確認しましょう。説明にないICも移ってますし、回路図はないでしょうか?
morleyrobertson

2018/11/21 13:03

tmpさん、ご回答いただきましてありがとうございます。前回のボタンの件に対するtmpさんのコメントが本当に助かりました。ありがとうざいます。今回はピエゾセンサーなのですが、風邪が治り次第、アドバイス頂いた静電容量の件を検証してみます。また、紛らわしいICが写りこんでしまっていてすみません。このICは74HC4051Bのアナログマルチプレクサでして、6個のピエゾセンサーをESP32に接続したいのに、ピエゾセンサーが使えるアナログピンが25と26しかない(34と35は大丈夫かも)と分かってきた段階で、マルチプレクサでIOピンを拡張して6個のピエゾセンサーをつないで、結果を25か26で受け取れば良いかと考えてやってみたのですが、確かうまくいきませんでした。体調が優れない時に実験してしまったため、結果がうろ覚えの状態なので、マルチプレクサを使用する方法も落ち着いてから再度検討してみます。もう1点、これもうろ覚えなのですが、ESP32でBluetooth接続した際に、32~39以外のアナログピンの値が常に4095を出力してしまい、使い物にならなくなってしまう謎の現象も発生していた気がします。こちらものちに検証してみます。
morleyrobertson

2018/11/27 04:43

tmpさん、上の質問にその後の検証の結果を追記いたしました。お時間のあるときにご覧いただければ幸いです。
ozwk

2018/11/29 06:47 編集

ピエゾと1Mの接点からアナログマルチプレクサのピンまでのルートに510~1kぐらいの抵抗を入れるとどうなりますか?
morleyrobertson

2018/11/30 12:31

ozwkさん、アドバイス頂きましてありがとうございます。510~1kの抵抗を持ち合わせておりませんでしたので、今週末に試してみます。結果が出次第、お伝えします。
morleyrobertson

2018/12/03 10:22

ozwkさん、先日はアドバイス頂きましてありがとうございました。1kの抵抗を買ってきて、実験しようとしたのですが、どういう訳か不具合が直ってまして・・・アナログマルチプレクサの0~5ピンを1~6ピンにずらさなければならなかった問題もほぼ解決していました。この状態ですと1Kの抵抗を入れても入れなくても結果に変化はありませんでした(どちらも期待通りの結果となりました)。なぜ問題が解決したのかは検証してみる必要がありますが、今のところうまくいっていますので、様子を見てみます。
guest

回答3

0

ESP32-DevKitCの32ピンと33ピンは、静電容量タッチインターフェース用のピンですからハイインピーダンスになっています。
そのため、センサに導電体(指も導電体です)が接触したり、帯電した物(人体を含む)近づいたりすれば影響が出ます。(あと8本ある静電容量タッチインターフェース用のピンでも同様)

静電容量タッチインターフェース用のピンではないADコンバータのピンである、25ピンと26ピンを使うのが正解です。

投稿2018/11/20 07:23

coco_bauer

総合スコア6915

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

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

morleyrobertson

2018/11/21 12:40

coco_bauerさん、ご回答いただきましてありがとうございます。静電容量タッチインターフェースの件、非常に参考になりました。実を言いますと、6個のピエゾセンサーをESP32に接続してガジェットを作ろうとしていたのですが、どうしても触れていないピエゾセンサーが反応してしまい、うまく制御できていなかったため、2個のピエゾセンサーにして原因を検証していたところでした。アドバイス頂いた静電容量タッチインターフェースで溜飲が下がりました。体調が回復して落ち着いてから、アドバイスいただいたことを参考に6個のピエゾセンサーを接続するにはどうしたら良いか考えてみようと思います。本当にありがとうございました。
coco_bauer

2018/11/22 00:26

arduinoのDACピンのインピーダンスが高く、そこに接続するピエゾセンサーもインピーダンスが高いために、ノイズの問題が生じるのだと思います。ピエゾセンサーとArduinoのADCピンの間に、電圧フォロワ回路(OPアンプ1つで作れます。詳細はhttp://www.nahitech.com/nahitafu/mame/mame3/voltage.html などの記事を参照してください。)を入れるのが確実な解決方法だと思います。電圧フォロワー回路の出力インピーダンスは1kΩ以下ですから。
guest

0

4051を使った場合、ESP32のRev.0にはエラッタがあり、ESP32のRevを確認する必要があります。
この前の質問から、あなたのお持ちのスイッチサイエンスのボートはRev.0の可能性が高いです。
今回のout_w1tsがそれに該当すると思われます。対処方法もリンク先に書いてあります。
ESP32 GPIOのErrata

ピエゾセンサーは、使ったことないのでわかりませんが、
ツェナーダイオードは、いらないのですか?

投稿2018/11/28 10:23

tmp

総合スコア277

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

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

morleyrobertson

2018/11/30 13:40

tmpさん、アドバイス頂きましてありがとうございます。リンク先を以前見たことがあったのですが、ESP32の購入時期からてっきりリビジョン1だと思い込んでいましたが、確かにRev.0の可能性もありますね。急ぎ確認してみます。リンクありがとうございました。あと、ピエゾセンサーの回路はこちらのサイトhttp://hackist.jp/?p=4247の回路図を参考にさせていただきました。ツェナーダイオードは使われていないようです。
guest

0

まずは、一つだけのポートで接続して値をチェックしてみましょう。
そこではどんな値が出るでしょうか。
次に、2つのポートでつないで値を出します。
で、そこでどんな結果が出るのかみてみましょう。

そして、接続はそのままにして、一つだけのポートで値をチェックしてみることです。
それでどういう結果が出るでしょうか。

投稿2018/11/18 13:42

y_waiwai

総合スコア87774

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

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

morleyrobertson

2018/11/19 11:05

y_waiwaiさん、ご回答いただきましてありがとうございます。アドバイス頂いたことを参考に、検証してまみす。結果が出次第、追記しますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問