Advertisement
Guest User

Untitled

a guest
Apr 28th, 2025
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. #include <Servo.h>
  2.  
  3. // MUX1制御ピン
  4. const int s0 = 2;
  5. const int s1 = 3;
  6. const int s2 = 4;
  7. const int s3 = 5;
  8.  
  9. // MUX2制御ピン
  10. const int s4 = 10;
  11. const int s5 = 11;
  12. const int s6 = 12;
  13. const int s7 = 13;
  14.  
  15. // MUXのSIGピン
  16. const int muxSig1 = A0; // MUX1から出力される信号
  17. const int muxSig2 = A2; // MUX2から出力される信号
  18.  
  19. // サーボ制御
  20. Servo myServo;
  21. const int servoPin = 8;
  22.  
  23. const int totalSwitches = 16; // 各MUXにスイッチ16個ずつ
  24. const int muxCount = 2; // MUXが2個
  25. const int totalHoles = totalSwitches * muxCount; // 総穴数 32個
  26.  
  27. int loseHole = 0; // 外れ穴
  28.  
  29. void setup() {
  30. Serial.begin(9600);
  31. randomSeed(analogRead(A1)); // 乱数のシード用
  32.  
  33. // MUX1制御ピン設定
  34. pinMode(s0, OUTPUT);
  35. pinMode(s1, OUTPUT);
  36. pinMode(s2, OUTPUT);
  37. pinMode(s3, OUTPUT);
  38.  
  39. // MUX2制御ピン設定
  40. pinMode(s4, OUTPUT);
  41. pinMode(s5, OUTPUT);
  42. pinMode(s6, OUTPUT);
  43. pinMode(s7, OUTPUT);
  44.  
  45. // SIGピン設定
  46. pinMode(muxSig1, INPUT_PULLUP);
  47. pinMode(muxSig2, INPUT_PULLUP);
  48.  
  49. // サーボモータ初期化
  50. myServo.attach(servoPin);
  51. myServo.write(0);
  52.  
  53. // ランダムでloseHoleを決定
  54. loseHole = random(1, totalHoles + 1);
  55. Serial.print("Lose hole: ");
  56. Serial.println(loseHole);
  57. }
  58.  
  59. void loop() {
  60. // --- MUX1スキャン ---
  61. for (int i = 0; i < totalSwitches; i++) {
  62. selectMux1(i);
  63. delayMicroseconds(550);
  64.  
  65. if (digitalRead(muxSig1) == LOW) {
  66. int hole = i + 1; // 1~16
  67. Serial.print("[MUX1] 刺さった:");
  68. Serial.println(hole);
  69.  
  70. if (hole == loseHole) {
  71. boomAction();
  72. }
  73.  
  74. delay(500);
  75. while (digitalRead(muxSig1) == LOW); // 押しっぱなし防止
  76. }
  77. }
  78.  
  79. // --- MUX2スキャン ---
  80. for (int i = 0; i < totalSwitches; i++) {
  81. selectMux2(i);
  82. delayMicroseconds(550);
  83.  
  84. if (digitalRead(muxSig2) == LOW) {
  85. int hole = i + 1 + totalSwitches; // 17~32
  86. Serial.print("[MUX2] 刺さった:");
  87. Serial.println(hole);
  88.  
  89. if (hole == loseHole) {
  90. boomAction();
  91. }
  92.  
  93. delay(500);
  94. while (digitalRead(muxSig2) == LOW); // 押しっぱなし防止
  95. }
  96. }
  97. }
  98.  
  99. // --- MUX1のチャンネル切り替え ---
  100. void selectMux1(int channel) {
  101. int controlPins[4] = {s0, s1, s2, s3};
  102. int muxTable[16][4] = {
  103. {0,0,0,0}, {1,0,0,0}, {0,1,0,0}, {1,1,0,0},
  104. {0,0,1,0}, {1,0,1,0}, {0,1,1,0}, {1,1,1,0},
  105. {0,0,0,1}, {1,0,0,1}, {0,1,0,1}, {1,1,0,1},
  106. {0,0,1,1}, {1,0,1,1}, {0,1,1,1}, {1,1,1,1}
  107. };
  108. for (int i = 0; i < 4; i++) {
  109. digitalWrite(controlPins[i], muxTable[channel][i]);
  110. }
  111. }
  112.  
  113. // --- MUX2のチャンネル切り替え ---
  114. void selectMux2(int channel) {
  115. int controlPins[4] = {s4, s5, s6, s7};
  116. int muxTable[16][4] = {
  117. {0,0,0,0}, {1,0,0,0}, {0,1,0,0}, {1,1,0,0},
  118. {0,0,1,0}, {1,0,1,0}, {0,1,1,0}, {1,1,1,0},
  119. {0,0,0,1}, {1,0,0,1}, {0,1,0,1}, {1,1,0,1},
  120. {0,0,1,1}, {1,0,1,1}, {0,1,1,1}, {1,1,1,1}
  121. };
  122. for (int i = 0; i < 4; i++) {
  123. digitalWrite(controlPins[i], muxTable[channel][i]);
  124. }
  125. }
  126.  
  127. // --- サーボ動作 ---
  128. void boomAction() {
  129. Serial.println("BOOM!");
  130. myServo.write(90);
  131. delay(1000);
  132. myServo.write(0);
  133. }
  134.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement