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ピンを読み取る方法方法も
試しましたが、うまく行きませんでした。
