Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Servo.h>
- // MUX1制御ピン
- const int s0 = 2;
- const int s1 = 3;
- const int s2 = 4;
- const int s3 = 5;
- // MUX2制御ピン
- const int s4 = 10;
- const int s5 = 11;
- const int s6 = 12;
- const int s7 = 13;
- // MUXのSIGピン
- const int muxSig1 = A0; // MUX1から出力される信号
- const int muxSig2 = A2; // MUX2から出力される信号
- // サーボ制御
- Servo myServo;
- const int servoPin = 8;
- const int totalSwitches = 16; // 各MUXにスイッチ16個ずつ
- const int muxCount = 2; // MUXが2個
- const int totalHoles = totalSwitches * muxCount; // 総穴数 32個
- int loseHole = 0; // 外れ穴
- void setup() {
- Serial.begin(9600);
- randomSeed(analogRead(A1)); // 乱数のシード用
- // MUX1制御ピン設定
- pinMode(s0, OUTPUT);
- pinMode(s1, OUTPUT);
- pinMode(s2, OUTPUT);
- pinMode(s3, OUTPUT);
- // MUX2制御ピン設定
- pinMode(s4, OUTPUT);
- pinMode(s5, OUTPUT);
- pinMode(s6, OUTPUT);
- pinMode(s7, OUTPUT);
- // SIGピン設定
- pinMode(muxSig1, INPUT_PULLUP);
- pinMode(muxSig2, INPUT_PULLUP);
- // サーボモータ初期化
- myServo.attach(servoPin);
- myServo.write(0);
- // ランダムでloseHoleを決定
- loseHole = random(1, totalHoles + 1);
- Serial.print("Lose hole: ");
- Serial.println(loseHole);
- }
- void loop() {
- // --- MUX1スキャン ---
- for (int i = 0; i < totalSwitches; i++) {
- selectMux1(i);
- delayMicroseconds(550);
- if (digitalRead(muxSig1) == LOW) {
- int hole = i + 1; // 1~16
- Serial.print("[MUX1] 刺さった:");
- Serial.println(hole);
- if (hole == loseHole) {
- boomAction();
- }
- delay(500);
- while (digitalRead(muxSig1) == LOW); // 押しっぱなし防止
- }
- }
- // --- MUX2スキャン ---
- for (int i = 0; i < totalSwitches; i++) {
- selectMux2(i);
- delayMicroseconds(550);
- if (digitalRead(muxSig2) == LOW) {
- int hole = i + 1 + totalSwitches; // 17~32
- Serial.print("[MUX2] 刺さった:");
- Serial.println(hole);
- if (hole == loseHole) {
- boomAction();
- }
- delay(500);
- while (digitalRead(muxSig2) == LOW); // 押しっぱなし防止
- }
- }
- }
- // --- MUX1のチャンネル切り替え ---
- void selectMux1(int channel) {
- int controlPins[4] = {s0, s1, s2, s3};
- int muxTable[16][4] = {
- {0,0,0,0}, {1,0,0,0}, {0,1,0,0}, {1,1,0,0},
- {0,0,1,0}, {1,0,1,0}, {0,1,1,0}, {1,1,1,0},
- {0,0,0,1}, {1,0,0,1}, {0,1,0,1}, {1,1,0,1},
- {0,0,1,1}, {1,0,1,1}, {0,1,1,1}, {1,1,1,1}
- };
- for (int i = 0; i < 4; i++) {
- digitalWrite(controlPins[i], muxTable[channel][i]);
- }
- }
- // --- MUX2のチャンネル切り替え ---
- void selectMux2(int channel) {
- int controlPins[4] = {s4, s5, s6, s7};
- int muxTable[16][4] = {
- {0,0,0,0}, {1,0,0,0}, {0,1,0,0}, {1,1,0,0},
- {0,0,1,0}, {1,0,1,0}, {0,1,1,0}, {1,1,1,0},
- {0,0,0,1}, {1,0,0,1}, {0,1,0,1}, {1,1,0,1},
- {0,0,1,1}, {1,0,1,1}, {0,1,1,1}, {1,1,1,1}
- };
- for (int i = 0; i < 4; i++) {
- digitalWrite(controlPins[i], muxTable[channel][i]);
- }
- }
- // --- サーボ動作 ---
- void boomAction() {
- Serial.println("BOOM!");
- myServo.write(90);
- delay(1000);
- myServo.write(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement