これまでの経緯
以前垂直同期信号にタイミングを合わせて+5V/0Vを切り替えるものを作りました。
この時は実際にコンパネに取り付けるところまでいかずに、オシロによる単体での確認止まりでした。
連射装置を作る①
実際にどう取り付ければいいのだろう、と考えていく中で、負論理(off:+5V/on:0V)で作らなくてはならないことに気づきます。
とても参考になるサイトも見つけることができました。
修正する
ちょっと作りも良くないと思うので本当は最初から作り直したかったのですが、他に作りたいものもあったので、とりあえず手間をかけずに動くものにしてしまおうかと簡単な修正にしています。
- 負論理用に修正した(配列renとdigitalWrite())
- 複数の連射速度に対応させるため変数やロジックをコピペで増やした(超安易な方法)
秒間30発は表/裏を出力できるようにしたので、交互連としても使えるはずです。
この連射装置はバトルガレッガで使用する予定なのですが、自分は秒間12発/15発/30発(ボム連)しか使いません。
開幕はショット12発/sで始め、途中で15発/sに切り替えるのですが、ダイヤル連だとダイヤルを回すのを忘れてしまうことがあるんですよね~。
そこで、試しに12発/sと15発/sを別ボタンに割り当ててみることにしました。
そのためロータリースイッチはつけずに、連射速度ごとに別のGPIOピンから信号を出すようにしています。
接続図
ソース(修正版)
V-SYNC割込みで飛ぶルーチンは限られた時間で処理しなくてはならないため、少しでも余分なロジックは通さない方が良いかと、使わない連射速度の箇所はコメントアウトしています。(それでも無駄が多いですが…)
※シリアルモニターで簡単に確認はしましたが、オシロやゲームでの確認はまだできていないので、あくまで机上で直した参考レベルのものです。
実績ができたらまた記事を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | // 連射装置() //GPIO pinアサイン int button_8 = 5; int button_10 = 6; int button_12 = 7; int button_15 = 8; int button_20 = 9; int button_30a = 10; int button_30b = 11; //現在の連射速度(6:7.5発,5:10発,4:12発,3:15発,2:20発,1:30発) volatile int ren_sp8 = 6; volatile int ren_sp10 = 5; volatile int ren_sp12 = 4; volatile int ren_sp15 = 3; volatile int ren_sp20 = 2; volatile int ren_sp30 = 1; //現在のボタン状況 volatile int button_now8 = 1; volatile int button_now10 = 1; volatile int button_now12 = 1; volatile int button_now15 = 1; volatile int button_now20 = 1; volatile int button_now30 = 1; //現在の要素番号 volatile int ren_elem8 = 0; volatile int ren_elem10 = 0; volatile int ren_elem12 = 0; volatile int ren_elem15 = 0; volatile int ren_elem20 = 0; volatile int ren_elem30 = 0; volatile int ren[] = {0,1,1,1,1,1,1}; volatile unsigned long time_p = 0; volatile unsigned long time_a = 0; volatile unsigned long time_prev = 0,time_now; volatile unsigned long time_chat = 8; // 0.5F volatile int count = 0; void setup() { pinMode(button_8,OUTPUT); pinMode(button_10,OUTPUT); pinMode(button_12,OUTPUT); pinMode(button_15,OUTPUT); pinMode(button_20,OUTPUT); pinMode(button_30a,OUTPUT); pinMode(button_30b,OUTPUT); attachInterrupt(0, V_SYNC, FALLING); } void loop() { } void V_SYNC() { time_now = millis(); if ( time_now - time_prev > time_chat ) { //チャタリング対策 // 30発 if (ren[ren_elem30] != button_now30 ) { button_now30 = ren[ren_elem30]; } if (button_now30 == 0) { digitalWrite(button_30a, LOW); digitalWrite(button_30b, HIGH); } if (button_now30 == 1) { digitalWrite(button_30a, HIGH); digitalWrite(button_30b, LOW); } if ( ren_elem30 >= ren_sp30 ) { //配列をラップさせる時の判定 ren_elem30 = 0; } else { ren_elem30 = ren_elem30 + 1; } // 20発 /* if (ren[ren_elem20] != button_now20 ) { button_now20 = ren[ren_elem20]; } if (button_now20 == 0) { digitalWrite(button_20, LOW); } if (button_now20 == 1) { digitalWrite(button_20, HIGH); } if ( ren_elem20 >= ren_sp20 ) { ren_elem20 = 0; } else { ren_elem20 = ren_elem20 + 1; } */ // 15発 if (ren[ren_elem15] != button_now15 ) { button_now15 = ren[ren_elem15]; } if (button_now15 == 0) { digitalWrite(button_15, LOW); } if (button_now15 == 1) { digitalWrite(button_15, HIGH); } if ( ren_elem15 >= ren_sp15 ) { ren_elem15 = 0; } else { ren_elem15 = ren_elem15 + 1; } // 12発 if (ren[ren_elem12] != button_now12 ) { button_now12 = ren[ren_elem12]; } if (button_now12 == 0) { digitalWrite(button_12, LOW); } if (button_now12 == 1) { digitalWrite(button_12, HIGH); } if ( ren_elem12 >= ren_sp12 ) { ren_elem12 = 0; } else { ren_elem12 = ren_elem12 + 1; } // 10発 /* if (ren[ren_elem10] != button_now10 ) { button_now10 = ren[ren_elem10]; } if (button_now10 == 0) { digitalWrite(button_10, LOW); } if (button_now10 == 1) { digitalWrite(button_10, HIGH); } if ( ren_elem10 >= ren_sp10 ) { ren_elem10 = 0; } else { ren_elem10 = ren_elem10 + 1; } */ // 7.5発 /* if (ren[ren_elem8] != button_now8 ) { button_now8 = ren[ren_elem8]; } if (button_now8 == 0) { digitalWrite(button_8, LOW); } if (button_now8 == 1) { digitalWrite(button_8, HIGH); } if ( ren_elem8 >= ren_sp8 ) { ren_elem8 = 0; } else { ren_elem8 = ren_elem8 + 1; } */ } time_prev = time_now; } |