質問編集履歴

2

追記

2018/11/27 04:41

投稿

morleyrobertson
morleyrobertson

スコア12

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  コードは
16
16
 
17
- ```C
17
+ ```C++
18
18
 
19
19
  void setup() {
20
20
 
@@ -36,12 +36,16 @@
36
36
 
37
37
  if(res2>200) {Serial.print("26 is "); Serial.println(res2);}
38
38
 
39
+ }
40
+
39
- }```
41
+ ```
40
42
 
41
43
  です。
42
44
 
43
45
  この時、ピエゾセンサーを1回ずつ叩くと、
44
46
 
47
+ ```C++
48
+
45
49
  25 is 2855 //25ピンにつながったピエゾセンサーを1回叩きます
46
50
 
47
51
  25 is 4095
@@ -250,11 +254,15 @@
250
254
 
251
255
  26 is 202 //ここまで
252
256
 
257
+ ```
258
+
253
259
  このようにお互いの値が混ざることなく出力されます。
254
260
 
255
261
  同じことをGPI32ピンとGPI33ピンの組み合わせですると、結果はこうなりました。
256
262
 
257
- (叩いてないのに出力されているセンサーの値を太字にします。)
263
+ (叩いてないのに出力されているセンサーの値を**で囲みます。)
264
+
265
+ ```C++
258
266
 
259
267
  32 is 3895 //32ピンにつながったピエゾセンサーを1回叩きます。
260
268
 
@@ -582,8 +590,282 @@
582
590
 
583
591
  33 is 208 //ここまで
584
592
 
593
+ ```
594
+
585
595
  25ピン、26ピン以外のほとんどのアナログピンを試しましたが、
586
596
 
587
597
  正常に出力してくれたのは25ピン、26ピンだけで、他は値が混ざってしまっていました。
588
598
 
589
599
  何故このようなことが起こるのか、どなたかご説明頂くことは可能でしょうか。
600
+
601
+
602
+
603
+ 【11月26日追記】
604
+
605
+ 検証の方がまだ全て終わってないのですが、試行錯誤の結果、
606
+
607
+ とりあえず許せる範囲で制御できてきましたので、一旦途中経過をご報告していきます。
608
+
609
+ まず、最初に実験していた回路は以下の通りです。(手書きで済みません)
610
+
611
+ ![![ピエゾ素子と回路](9707342d530f425b86991500bca7406e.jpeg)]
612
+
613
+ 最初の実験ではピエゾセンサーをデコピンのように中指でバチンと弾いていました。
614
+
615
+ 上記の結果はその時の実験のものです。その結果を見てみると、
616
+
617
+ 大きい値が出ている前後(最大値の4095付近)で値が混ざってしまっていたので、
618
+
619
+ 試しにピエゾセンサーを棒で軽くコツンと叩いてみますと、
620
+
621
+ 200より大きい値は混ざらないことが分かりました。
622
+
623
+
624
+
625
+ また、板の裏にピエゾセンサーを貼り付けて、板を上から叩いた時は
626
+
627
+ GPIO0、2、GPI36、GPI39以外のアナログピンで正常に入力してくれました。
628
+
629
+ GPIO0、2は良いとしても、GPI36、GPI39は何度やっても値が混ざってしまいました。
630
+
631
+ GPI36、GPI39が特殊なピンだからなのかも知れません。
632
+
633
+
634
+
635
+ 結論としては、強い衝撃が加わった時に値が混ざる不具合が出てしまうようなので、
636
+
637
+ ピエゾセンサーを直接叩かず、板などの緩衝材を挟むのが吉という結論に至りました。
638
+
639
+
640
+
641
+ 次にBluetoothの設定をsetup()内でした時に、GPI32~39以外のアナログピンが
642
+
643
+ 常に4095となってしまう問題は、スイッチサイエンスさんのサイトによりますと、
644
+
645
+ WiFi機能を使う時も同様に該当のアナログピンの値が常に4095となってしまうとのことですので、
646
+
647
+ 製造元の修正を待ちたいところです。
648
+
649
+ [スイッチサイエンスさんのサイトのリンクです。アナログ入力の箇所をご覧下さい。](https://trac.switch-science.com/wiki/esp32_tips)
650
+
651
+
652
+
653
+ というわけで、Bluetooth使用時にピエゾセンサーを繋げるアナログピンは
654
+
655
+ GPI32、GPI33、GPI34、GPI35の4ピンとなります。
656
+
657
+ ここに6つのピエゾセンサーを繋ぎたいので、やはりマルチプレクサを使います。
658
+
659
+ ただ、普通に4051の0~5ピンに6つのピエゾセンサーを繋ぎますと、
660
+
661
+ 正常に動いてくれていたはずのGPI32、GPI33、GPI34、GPI35でも値が混ざってしまいました。
662
+
663
+ そこで、1~6ピンにずらしますと、1279の値を超えた値が混ざることはなくなった上に、
664
+
665
+ 使えないと思っていたGPI36、GPI39でも正常に値を受け取れています。
666
+
667
+ 謎は残るものの、とりあえず使える範囲には来たかなと思います。これで少し様子を見ます。
668
+
669
+ 以下、その回路図とコードです。(手書きで済みません)
670
+
671
+ ![![イメージ説明](6d88793e8b3454e9e51257f2fda85bd3.jpeg)]
672
+
673
+
674
+
675
+ ```C++
676
+
677
+ #include <BLEDevice.h>
678
+
679
+ #include <BLEServer.h>
680
+
681
+ #include <BLEUtils.h>
682
+
683
+ #include <BLE2902.h>
684
+
685
+
686
+
687
+ BLECharacteristic *pCharacteristic;
688
+
689
+ #define THRESHOLD 1279
690
+
691
+ //Mux control pins
692
+
693
+ byte s0 = 21;
694
+
695
+ byte s1 = 22;
696
+
697
+ byte s2 = 23;
698
+
699
+ byte controlPin[] = {s0, s1, s2};
700
+
701
+ byte muxChannel[8][3] = {
702
+
703
+ {0, 0, 0}, //channel 0
704
+
705
+ {1, 0, 0}, //channel 1
706
+
707
+ {0, 1, 0}, //channel 2
708
+
709
+ {1, 1, 0}, //channel 3
710
+
711
+ {0, 0, 1}, //channel 4
712
+
713
+ {1, 0, 1}, //channel 5
714
+
715
+ {0, 1, 1}, //channel 6
716
+
717
+ {1, 1, 1}, //channel 7
718
+
719
+ };
720
+
721
+ byte loop_0_7 = 0;
722
+
723
+ void setup() {
724
+
725
+ pinMode(s0, OUTPUT);
726
+
727
+ pinMode(s1, OUTPUT);
728
+
729
+ pinMode(s2, OUTPUT);
730
+
731
+
732
+
733
+ digitalWrite(s0, LOW);
734
+
735
+ digitalWrite(s1, LOW);
736
+
737
+ digitalWrite(s2, LOW);
738
+
739
+
740
+
741
+ Serial.begin(115200);
742
+
743
+  BLEDevice::init("M1");
744
+
745
+
746
+
747
+ // Create the BLE Server
748
+
749
+ BLEServer *pServer = BLEDevice::createServer();
750
+
751
+ BLEDevice::setEncryptionLevel((esp_ble_sec_act_t)ESP_LE_AUTH_REQ_SC_BOND);
752
+
753
+
754
+
755
+ // Create the BLE Service
756
+
757
+ BLEService *pService = pServer->createService(BLEUUID(MIDI_SERVICE_UUID));
758
+
759
+
760
+
761
+ // Create a BLE Characteristic
762
+
763
+ pCharacteristic = pService->createCharacteristic(
764
+
765
+ BLEUUID(MIDI_CHARACTERISTIC_UUID),
766
+
767
+ BLECharacteristic::PROPERTY_READ |
768
+
769
+ BLECharacteristic::PROPERTY_NOTIFY |
770
+
771
+ BLECharacteristic::PROPERTY_WRITE
772
+
773
+ );
774
+
775
+ pCharacteristic->setCallbacks(new MyCallbacks());
776
+
777
+
778
+
779
+ // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
780
+
781
+ // Create a BLE Descriptor
782
+
783
+ pCharacteristic->addDescriptor(new BLE2902());
784
+
785
+
786
+
787
+ // Start the service
788
+
789
+ pService->start();
790
+
791
+
792
+
793
+ // Start advertising
794
+
795
+
796
+
797
+ BLESecurity *pSecurity = new BLESecurity();
798
+
799
+ pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_BOND);
800
+
801
+ pSecurity->setCapability(ESP_IO_CAP_NONE);
802
+
803
+ pSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);
804
+
805
+
806
+
807
+ pServer->getAdvertising()->addServiceUUID(MIDI_SERVICE_UUID);
808
+
809
+ pServer->getAdvertising()->start();
810
+
811
+ }
812
+
813
+ void loop() {
814
+
815
+ if(1<=loop_0_7&&loop_0_7<=6){
816
+
817
+ for (int i = 0; i < 3; i ++) {
818
+
819
+ if(muxChannel[loop_0_7][i]) {
820
+
821
+ if(i==0) GPIO.out_w1ts = ((uint32_t)1 << s0);
822
+
823
+ else if(i==1) GPIO.out_w1ts = ((uint32_t)1 << s1);
824
+
825
+ else if(i==2) GPIO.out_w1ts = ((uint32_t)1 << s2);
826
+
827
+ }else{
828
+
829
+ if(i==0) GPIO.out_w1tc = ((uint32_t)1 << s0);
830
+
831
+ else if(i==1) GPIO.out_w1tc = ((uint32_t)1 << s1);
832
+
833
+ else if(i==2) GPIO.out_w1tc = ((uint32_t)1 << s2);
834
+
835
+ }
836
+
837
+ }
838
+
839
+ //delay(1);
840
+
841
+ //GPI32、GPI33、GPI34、GPI35、GPI36、GPI39 are available for analogRead
842
+
843
+ int res = analogRead(39);
844
+
845
+ if(res>THRESHOLD&&loop_0_7==1){Serial.print("1 is "); Serial.println(res);}
846
+
847
+ if(res>THRESHOLD&&loop_0_7==2){Serial.print("2 is "); Serial.println(res);}
848
+
849
+ if(res>THRESHOLD&&loop_0_7==3){Serial.print("3 is "); Serial.println(res);}
850
+
851
+ if(res>THRESHOLD&&loop_0_7==4){Serial.print("4 is "); Serial.println(res);}
852
+
853
+ if(res>THRESHOLD&&loop_0_7==5){Serial.print("5 is "); Serial.println(res);}
854
+
855
+ if(res>THRESHOLD&&loop_0_7==6){Serial.print("6 is "); Serial.println(res);}
856
+
857
+ }
858
+
859
+ if(loop_0_7==7) loop_0_7=0;
860
+
861
+ else loop_0_7++;
862
+
863
+ }
864
+
865
+
866
+
867
+ ```
868
+
869
+ 念のため、WriteとReadの間にdelay(1);を挟み、4051の0~5ピンを読み取る方法方法も
870
+
871
+ 試しましたが、うまく行きませんでした。

1

補足

2018/11/27 04:41

投稿

morleyrobertson
morleyrobertson

スコア12

test CHANGED
File without changes
test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  です。
42
42
 
43
- この時、ピエゾセンサーを1回ずつ交互に叩くと、
43
+ この時、ピエゾセンサーを1回ずつ叩くと、
44
44
 
45
45
  25 is 2855 //25ピンにつながったピエゾセンサーを1回叩きます
46
46